@sapui5/sap.fe.core 1.108.2 → 1.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -9
  3. package/src/.eslintrc +7 -0
  4. package/src/sap/fe/core/.library +39 -37
  5. package/src/sap/fe/core/.supportrc +3 -3
  6. package/src/sap/fe/core/ActionRuntime.js +72 -27
  7. package/src/sap/fe/core/ActionRuntime.ts +104 -21
  8. package/src/sap/fe/core/AppComponent.js +102 -120
  9. package/src/sap/fe/core/AppComponent.ts +148 -45
  10. package/src/sap/fe/core/AppStateHandler.js +105 -91
  11. package/src/sap/fe/core/AppStateHandler.ts +85 -23
  12. package/src/sap/fe/core/BaseController.js +5 -20
  13. package/src/sap/fe/core/BaseController.ts +11 -2
  14. package/src/sap/fe/core/CommonUtils.js +770 -1079
  15. package/src/sap/fe/core/CommonUtils.ts +750 -491
  16. package/src/sap/fe/core/ExtensionAPI.js +69 -96
  17. package/src/sap/fe/core/ExtensionAPI.ts +15 -17
  18. package/src/sap/fe/core/PageController.js +21 -46
  19. package/src/sap/fe/core/PageController.ts +11 -2
  20. package/src/sap/fe/core/TemplateComponent.js +6 -51
  21. package/src/sap/fe/core/TemplateComponent.ts +27 -16
  22. package/src/sap/fe/core/TemplateModel.js +18 -24
  23. package/src/sap/fe/core/TemplateModel.ts +25 -6
  24. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
  25. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
  30. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
  31. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
  32. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
  33. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
  34. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
  35. package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
  36. package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
  37. package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
  38. package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
  39. package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
  40. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
  41. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  42. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
  43. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
  44. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
  46. package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
  48. package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
  50. package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
  51. package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
  53. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
  54. package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
  55. package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
  56. package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
  57. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
  58. package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
  59. package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
  60. package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
  61. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/Share.js +53 -98
  63. package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
  64. package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
  65. package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
  66. package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
  67. package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
  70. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
  71. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
  72. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
  74. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
  75. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
  76. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
  80. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
  82. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
  90. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
  91. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
  92. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
  93. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
  94. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
  95. package/src/sap/fe/core/controls/Any.js +1 -1
  96. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  97. package/src/sap/fe/core/controls/CommandExecution.js +4 -26
  98. package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
  99. package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
  100. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
  101. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
  102. package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
  103. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
  104. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
  105. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
  106. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
  107. package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
  108. package/src/sap/fe/core/controls/FileWrapper.js +51 -136
  109. package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
  110. package/src/sap/fe/core/controls/FilterBar.js +19 -54
  111. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
  112. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  113. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
  114. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
  115. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
  116. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
  117. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
  118. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
  119. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
  120. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
  121. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
  122. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
  123. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
  124. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
  125. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
  126. package/src/sap/fe/core/converters/ConverterContext.js +44 -98
  127. package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
  128. package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
  129. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
  130. package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
  131. package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
  132. package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
  133. package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
  134. package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
  135. package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
  136. package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
  137. package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
  138. package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
  139. package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
  140. package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
  141. package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
  142. package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
  143. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
  145. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
  147. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
  148. package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
  158. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
  160. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
  162. package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
  163. package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
  164. package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
  166. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
  168. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
  170. package/src/sap/fe/core/converters/helpers/ID.js +3 -17
  171. package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
  172. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
  173. package/src/sap/fe/core/converters/helpers/Key.js +10 -19
  174. package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
  175. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
  176. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
  177. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
  178. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
  179. package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
  180. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
  181. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
  182. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
  183. package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
  184. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
  185. package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
  186. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
  187. package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
  188. package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
  189. package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
  190. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
  191. package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
  192. package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
  193. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
  194. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
  195. package/src/sap/fe/core/fpm/Component.js +2 -17
  196. package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
  197. package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
  198. package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
  199. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  200. package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
  201. package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
  202. package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
  203. package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
  204. package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
  205. package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
  206. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
  207. package/src/sap/fe/core/helpers/EditState.js +2 -5
  208. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
  209. package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
  210. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
  211. package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
  212. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
  213. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
  214. package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
  215. package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
  216. package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
  217. package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
  218. package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
  219. package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
  220. package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
  221. package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
  222. package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
  223. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
  224. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
  225. package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
  226. package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
  227. package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
  228. package/src/sap/fe/core/helpers/Synchronization.js +1 -8
  229. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
  230. package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
  231. package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
  232. package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
  233. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
  234. package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
  235. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
  236. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
  237. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
  238. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
  239. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  240. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
  241. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  242. package/src/sap/fe/core/library.js +9 -48
  243. package/src/sap/fe/core/library.support.js +3 -2
  244. package/src/sap/fe/core/library.support.ts +3 -1
  245. package/src/sap/fe/core/library.ts +3 -8
  246. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
  247. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
  248. package/src/sap/fe/core/messagebundle.properties +113 -67
  249. package/src/sap/fe/core/messagebundle_ar.properties +20 -3
  250. package/src/sap/fe/core/messagebundle_bg.properties +22 -5
  251. package/src/sap/fe/core/messagebundle_ca.properties +21 -4
  252. package/src/sap/fe/core/messagebundle_cs.properties +21 -4
  253. package/src/sap/fe/core/messagebundle_cy.properties +22 -5
  254. package/src/sap/fe/core/messagebundle_da.properties +20 -3
  255. package/src/sap/fe/core/messagebundle_de.properties +38 -21
  256. package/src/sap/fe/core/messagebundle_el.properties +20 -3
  257. package/src/sap/fe/core/messagebundle_en.properties +38 -21
  258. package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
  259. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
  260. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
  261. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
  262. package/src/sap/fe/core/messagebundle_es.properties +40 -23
  263. package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
  264. package/src/sap/fe/core/messagebundle_et.properties +20 -3
  265. package/src/sap/fe/core/messagebundle_fi.properties +20 -3
  266. package/src/sap/fe/core/messagebundle_fr.properties +21 -4
  267. package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
  268. package/src/sap/fe/core/messagebundle_hi.properties +20 -3
  269. package/src/sap/fe/core/messagebundle_hr.properties +22 -5
  270. package/src/sap/fe/core/messagebundle_hu.properties +20 -3
  271. package/src/sap/fe/core/messagebundle_id.properties +20 -3
  272. package/src/sap/fe/core/messagebundle_it.properties +23 -6
  273. package/src/sap/fe/core/messagebundle_iw.properties +20 -3
  274. package/src/sap/fe/core/messagebundle_ja.properties +22 -5
  275. package/src/sap/fe/core/messagebundle_kk.properties +21 -4
  276. package/src/sap/fe/core/messagebundle_ko.properties +20 -3
  277. package/src/sap/fe/core/messagebundle_lt.properties +20 -3
  278. package/src/sap/fe/core/messagebundle_lv.properties +20 -3
  279. package/src/sap/fe/core/messagebundle_ms.properties +20 -3
  280. package/src/sap/fe/core/messagebundle_nl.properties +20 -3
  281. package/src/sap/fe/core/messagebundle_no.properties +20 -3
  282. package/src/sap/fe/core/messagebundle_pl.properties +21 -4
  283. package/src/sap/fe/core/messagebundle_pt.properties +20 -3
  284. package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
  285. package/src/sap/fe/core/messagebundle_ro.properties +20 -3
  286. package/src/sap/fe/core/messagebundle_ru.properties +20 -3
  287. package/src/sap/fe/core/messagebundle_sh.properties +20 -3
  288. package/src/sap/fe/core/messagebundle_sk.properties +20 -3
  289. package/src/sap/fe/core/messagebundle_sl.properties +26 -9
  290. package/src/sap/fe/core/messagebundle_sv.properties +20 -3
  291. package/src/sap/fe/core/messagebundle_th.properties +21 -4
  292. package/src/sap/fe/core/messagebundle_tr.properties +20 -3
  293. package/src/sap/fe/core/messagebundle_uk.properties +23 -6
  294. package/src/sap/fe/core/messagebundle_vi.properties +20 -3
  295. package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
  296. package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
  297. package/src/sap/fe/core/operationsHelper.js +74 -101
  298. package/src/sap/fe/core/operationsHelper.ts +113 -44
  299. package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
  300. package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
  301. package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
  302. package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
  303. package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
  304. package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
  305. package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
  308. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
  309. package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
  310. package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
  311. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
  312. package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
  313. package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
  314. package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
  315. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
  316. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
  317. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
  318. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
  319. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
  320. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
  321. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  322. package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
  323. package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
  324. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
  327. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
  328. package/src/sap/fe/core/support/CommonHelper.js +7 -16
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -10
  330. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
  332. package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
  333. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
  334. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
  335. package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
  336. package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
  337. package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
  338. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
  339. package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
  340. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
  341. package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
  342. package/src/sap/fe/core/templating/FilterHelper.js +40 -111
  343. package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
  344. package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
  345. package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
  346. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
  347. package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
  348. package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
  349. package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
  350. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
  351. package/src/sap/fe/core/templating/UIFormatters.js +40 -180
  352. package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
  353. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
  354. package/src/sap/fe/core/type/Email.js +1 -10
  355. package/src/sap/fe/core/type/TypeUtil.js +1 -11
  356. package/ui5.yaml +0 -1
  357. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
  358. package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
  359. package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
@@ -2,21 +2,19 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingToolkit", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, BindingToolkit, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/TypeGuards", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, ConfigurableObject, BindingToolkit, TypeGuards, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
6
6
  "use strict";
7
7
 
8
8
  function _forOf(target, body, check) {
9
9
  if (typeof target[_iteratorSymbol] === "function") {
10
10
  var iterator = target[_iteratorSymbol](),
11
- step,
12
- pact,
13
- reject;
14
-
11
+ step,
12
+ pact,
13
+ reject;
15
14
  function _cycle(result) {
16
15
  try {
17
16
  while (!(step = iterator.next()).done && (!check || !check())) {
18
17
  result = body(step.value);
19
-
20
18
  if (result && result.then) {
21
19
  if (_isSettledPact(result)) {
22
20
  result = result.v;
@@ -26,7 +24,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
26
24
  }
27
25
  }
28
26
  }
29
-
30
27
  if (pact) {
31
28
  _settle(pact, 1, result);
32
29
  } else {
@@ -36,9 +33,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
36
33
  _settle(pact || (pact = new _Pact()), 2, e);
37
34
  }
38
35
  }
39
-
40
36
  _cycle();
41
-
42
37
  if (iterator.return) {
43
38
  var _fixup = function (value) {
44
39
  try {
@@ -46,49 +41,38 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
46
41
  iterator.return();
47
42
  }
48
43
  } catch (e) {}
49
-
50
44
  return value;
51
45
  };
52
-
53
46
  if (pact && pact.then) {
54
47
  return pact.then(_fixup, function (e) {
55
48
  throw _fixup(e);
56
49
  });
57
50
  }
58
-
59
51
  _fixup();
60
52
  }
61
-
62
53
  return pact;
63
- } // No support for Symbol.iterator
64
-
65
-
54
+ }
55
+ // No support for Symbol.iterator
66
56
  if (!("length" in target)) {
67
57
  throw new TypeError("Object is not iterable");
68
- } // Handle live collections properly
69
-
70
-
58
+ }
59
+ // Handle live collections properly
71
60
  var values = [];
72
-
73
61
  for (var i = 0; i < target.length; i++) {
74
62
  values.push(target[i]);
75
63
  }
76
-
77
64
  return _forTo(values, function (i) {
78
65
  return body(values[i]);
79
66
  }, check);
80
67
  }
81
-
82
68
  function _forTo(array, body, check) {
83
69
  var i = -1,
84
- pact,
85
- reject;
86
-
70
+ pact,
71
+ reject;
87
72
  function _cycle(result) {
88
73
  try {
89
74
  while (++i < array.length && (!check || !check())) {
90
75
  result = body(i);
91
-
92
76
  if (result && result.then) {
93
77
  if (_isSettledPact(result)) {
94
78
  result = result.v;
@@ -98,7 +82,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
98
82
  }
99
83
  }
100
84
  }
101
-
102
85
  if (pact) {
103
86
  _settle(pact, 1, result);
104
87
  } else {
@@ -108,27 +91,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
108
91
  _settle(pact || (pact = new _Pact()), 2, e);
109
92
  }
110
93
  }
111
-
112
94
  _cycle();
113
-
114
95
  return pact;
115
96
  }
116
-
117
97
  var _iteratorSymbol = /*#__PURE__*/typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
118
-
119
98
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
120
-
121
99
  var _exports = {};
100
+ var isFunctionArray = TypeGuards.isFunctionArray;
101
+ var isContext = TypeGuards.isContext;
102
+ var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
122
103
  var compileExpression = BindingToolkit.compileExpression;
123
-
124
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
125
-
126
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
127
-
128
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
129
-
130
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
131
-
104
+ var Placement = ConfigurableObject.Placement;
132
105
  function _settle(pact, state, value) {
133
106
  if (!pact.s) {
134
107
  if (value instanceof _Pact) {
@@ -136,56 +109,45 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
136
109
  if (state & 1) {
137
110
  state = value.s;
138
111
  }
139
-
140
112
  value = value.v;
141
113
  } else {
142
114
  value.o = _settle.bind(null, pact, state);
143
115
  return;
144
116
  }
145
117
  }
146
-
147
118
  if (value && value.then) {
148
119
  value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
149
120
  return;
150
121
  }
151
-
152
122
  pact.s = state;
153
123
  pact.v = value;
154
124
  var observer = pact.o;
155
-
156
125
  if (observer) {
157
126
  observer(pact);
158
127
  }
159
128
  }
160
129
  }
161
-
162
130
  var _Pact = /*#__PURE__*/function () {
163
131
  function _Pact() {}
164
-
165
132
  _Pact.prototype.then = function (onFulfilled, onRejected) {
166
133
  var result = new _Pact();
167
134
  var state = this.s;
168
-
169
135
  if (state) {
170
136
  var callback = state & 1 ? onFulfilled : onRejected;
171
-
172
137
  if (callback) {
173
138
  try {
174
139
  _settle(result, 1, callback(this.v));
175
140
  } catch (e) {
176
141
  _settle(result, 2, e);
177
142
  }
178
-
179
143
  return result;
180
144
  } else {
181
145
  return this;
182
146
  }
183
147
  }
184
-
185
148
  this.o = function (_this) {
186
149
  try {
187
150
  var value = _this.v;
188
-
189
151
  if (_this.s & 1) {
190
152
  _settle(result, 1, onFulfilled ? onFulfilled(value) : value);
191
153
  } else if (onRejected) {
@@ -197,38 +159,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
197
159
  _settle(result, 2, e);
198
160
  }
199
161
  };
200
-
201
162
  return result;
202
163
  };
203
-
204
164
  return _Pact;
205
165
  }();
206
-
207
166
  function _isSettledPact(thenable) {
208
167
  return thenable instanceof _Pact && thenable.s & 1;
209
168
  }
210
-
211
169
  function _for(test, update, body) {
212
170
  var stage;
213
-
214
171
  for (;;) {
215
172
  var shouldContinue = test();
216
-
217
173
  if (_isSettledPact(shouldContinue)) {
218
174
  shouldContinue = shouldContinue.v;
219
175
  }
220
-
221
176
  if (!shouldContinue) {
222
177
  return result;
223
178
  }
224
-
225
179
  if (shouldContinue.then) {
226
180
  stage = 0;
227
181
  break;
228
182
  }
229
-
230
183
  var result = body();
231
-
232
184
  if (result && result.then) {
233
185
  if (_isSettledPact(result)) {
234
186
  result = result.s;
@@ -237,64 +189,47 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
237
189
  break;
238
190
  }
239
191
  }
240
-
241
192
  if (update) {
242
193
  var updateValue = update();
243
-
244
194
  if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
245
195
  stage = 2;
246
196
  break;
247
197
  }
248
198
  }
249
199
  }
250
-
251
200
  var pact = new _Pact();
252
-
253
201
  var reject = _settle.bind(null, pact, 2);
254
-
255
202
  (stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
256
203
  return pact;
257
-
258
204
  function _resumeAfterBody(value) {
259
205
  result = value;
260
-
261
206
  do {
262
207
  if (update) {
263
208
  updateValue = update();
264
-
265
209
  if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
266
210
  updateValue.then(_resumeAfterUpdate).then(void 0, reject);
267
211
  return;
268
212
  }
269
213
  }
270
-
271
214
  shouldContinue = test();
272
-
273
215
  if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {
274
216
  _settle(pact, 1, result);
275
-
276
217
  return;
277
218
  }
278
-
279
219
  if (shouldContinue.then) {
280
220
  shouldContinue.then(_resumeAfterTest).then(void 0, reject);
281
221
  return;
282
222
  }
283
-
284
223
  result = body();
285
-
286
224
  if (_isSettledPact(result)) {
287
225
  result = result.v;
288
226
  }
289
227
  } while (!result || !result.then);
290
-
291
228
  result.then(_resumeAfterBody).then(void 0, reject);
292
229
  }
293
-
294
230
  function _resumeAfterTest(shouldContinue) {
295
231
  if (shouldContinue) {
296
232
  result = body();
297
-
298
233
  if (result && result.then) {
299
234
  result.then(_resumeAfterBody).then(void 0, reject);
300
235
  } else {
@@ -304,7 +239,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
304
239
  _settle(pact, 1, result);
305
240
  }
306
241
  }
307
-
308
242
  function _resumeAfterUpdate() {
309
243
  if (shouldContinue = test()) {
310
244
  if (shouldContinue.then) {
@@ -317,45 +251,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
317
251
  }
318
252
  }
319
253
  }
320
-
321
254
  function _catch(body, recover) {
322
255
  try {
323
256
  var result = body();
324
257
  } catch (e) {
325
258
  return recover(e);
326
259
  }
327
-
328
260
  if (result && result.then) {
329
261
  return result.then(void 0, recover);
330
262
  }
331
-
332
263
  return result;
333
264
  }
334
-
335
265
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
336
-
337
266
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
338
-
339
267
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
340
-
341
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
342
-
343
268
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
344
-
345
269
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
346
-
270
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
271
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
272
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
273
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
274
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
275
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
276
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
347
277
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
348
-
349
278
  var processBuildingBlock = function (buildingBlockDefinition, oNode, oVisitor) {
350
279
  var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
351
-
352
280
  try {
353
- var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.name);
281
+ var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
354
282
  var sName = "this";
355
283
  var mContexts = {};
356
284
  var oMetadataContexts = {};
357
- var oSettings = oVisitor.getSettings(); // TODO 0001 Move this elsewhere this is weird :)
358
-
285
+ var oSettings = oVisitor.getSettings();
286
+ // TODO 0001 Move this elsewhere this is weird :)
359
287
  if (oSettings.models["sap.fe.i18n"]) {
360
288
  oSettings.models["sap.fe.i18n"].getResourceBundle().then(function (oResourceBundle) {
361
289
  ResourceModel.setApplicationI18nBundle(oResourceBundle);
@@ -363,303 +291,288 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
363
291
  Log.error(error);
364
292
  });
365
293
  }
294
+ var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen, buildingBlockDefinition.apiVersion);
366
295
 
367
- var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen); //Inject storage for macros
368
-
296
+ //Inject storage for macros
369
297
  if (!oSettings[sFragmentName]) {
370
298
  oSettings[sFragmentName] = {};
371
- } // First of all we need to visit the attributes to resolve the properties and the metadata contexts
372
-
299
+ }
373
300
 
301
+ // First of all we need to visit the attributes to resolve the properties and the metadata contexts
374
302
  return Promise.resolve(processProperties(oMetadata, oNode, isPublic, oVisitor, buildingBlockDefinition.apiVersion)).then(function (propertyValues) {
375
- return Promise.resolve(processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
376
- var mMissingContext = _ref.mMissingContext,
377
- extraPropertyValues = _ref.propertyValues;
378
- propertyValues = Object.assign(propertyValues, extraPropertyValues);
379
- var initialKeys = Object.keys(propertyValues);
380
-
381
- var _temp18 = _catch(function () {
382
- // Aggregation and complex type support
383
- return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
384
- function _temp17() {
385
- if (oPreviousMacroInfo) {
386
- //restore macro info if available
387
- oSettings["_macroInfo"] = oPreviousMacroInfo;
388
- } else {
389
- delete oSettings["_macroInfo"];
390
- }
391
- }
392
-
393
- var oInstance;
394
- var oControlConfig = {};
395
-
396
- if (oSettings.models.viewData) {
397
- // Only used in the Field macro and even then maybe not really useful
398
- oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
303
+ var _processContexts = processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts),
304
+ mMissingContext = _processContexts.mMissingContext,
305
+ extraPropertyValues = _processContexts.propertyValues;
306
+ propertyValues = Object.assign(propertyValues, extraPropertyValues);
307
+ var initialKeys = Object.keys(propertyValues);
308
+ var _temp18 = _catch(function () {
309
+ // Aggregation and complex type support
310
+ return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
311
+ function _temp17() {
312
+ if (oPreviousMacroInfo) {
313
+ //restore macro info if available
314
+ oSettings["_macroInfo"] = oPreviousMacroInfo;
315
+ } else {
316
+ delete oSettings["_macroInfo"];
399
317
  }
400
-
401
- var processedPropertyValues = propertyValues;
402
-
403
- if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
404
- processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
405
- Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
406
- if (oMetadata.metadataContexts[sMetadataName].computed === true) {
407
- mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
408
- }
409
- });
410
- Object.keys(mMissingContext).forEach(function (sContextName) {
411
- if (processedPropertyValues.hasOwnProperty(sContextName)) {
412
- mContexts[sContextName] = processedPropertyValues[sContextName];
413
- }
414
- });
415
- } else if (buildingBlockDefinition.apiVersion === 2) {
416
- Object.keys(propertyValues).forEach(function (propName) {
417
- var oData = propertyValues[propName];
418
-
419
- if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
420
- propertyValues[propName] = oData.getObject();
421
- }
422
- });
423
- var BuildingBlockClass = buildingBlockDefinition;
424
- propertyValues.isPublic = isPublic;
425
- oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
426
- /*, oControlConfig, oSettings, oAggregations, isPublic*/
427
- );
428
- processedPropertyValues = oInstance.getProperties();
429
- Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
430
- if (processedPropertyValues.hasOwnProperty(sContextName)) {
431
- var targetObject = processedPropertyValues[sContextName];
432
-
433
- if (typeof targetObject === "object" && !targetObject.getObject) {
434
- var sAttributeValue = storeValue(targetObject);
435
- var sContextPath = "".concat(sAttributeValue);
436
- oSettings.models.converterContext.setProperty(sContextPath, targetObject);
437
- targetObject = oSettings.models.converterContext.createBindingContext(sContextPath);
438
- delete myStore[sAttributeValue];
439
- mContexts[sContextName] = targetObject;
440
- } else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
441
- mContexts[sContextName] = targetObject;
442
- }
318
+ }
319
+ var oInstance;
320
+ var oControlConfig = {};
321
+ if (oSettings.models.viewData) {
322
+ // Only used in the Field macro and even then maybe not really useful
323
+ oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
324
+ }
325
+ var processedPropertyValues = propertyValues;
326
+ if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
327
+ processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
328
+ Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
329
+ if (oMetadata.metadataContexts[sMetadataName].computed === true) {
330
+ mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
331
+ }
332
+ });
333
+ Object.keys(mMissingContext).forEach(function (sContextName) {
334
+ if (processedPropertyValues.hasOwnProperty(sContextName)) {
335
+ mContexts[sContextName] = processedPropertyValues[sContextName];
336
+ }
337
+ });
338
+ } else if (buildingBlockDefinition.apiVersion === 2) {
339
+ Object.keys(propertyValues).forEach(function (propName) {
340
+ var _buildingBlockDefinit;
341
+ var oData = propertyValues[propName];
342
+ //check for additional processing function to validate / overwrite parameters
343
+ var originalDefinition = buildingBlockDefinition === null || buildingBlockDefinition === void 0 ? void 0 : (_buildingBlockDefinit = buildingBlockDefinition.metadata) === null || _buildingBlockDefinit === void 0 ? void 0 : _buildingBlockDefinit.properties[propName];
344
+ if (originalDefinition !== null && originalDefinition !== void 0 && originalDefinition.validate) {
345
+ oData = originalDefinition.validate(oData) || oData;
346
+ }
347
+ if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
348
+ propertyValues[propName] = oData.getObject();
349
+ }
350
+ });
351
+ var BuildingBlockClass = buildingBlockDefinition;
352
+ propertyValues.isPublic = isPublic;
353
+ oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
354
+ /*, oControlConfig, oSettings, oAggregations, isPublic*/);
355
+
356
+ processedPropertyValues = oInstance.getProperties();
357
+ Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
358
+ if (processedPropertyValues.hasOwnProperty(sContextName)) {
359
+ var targetObject = processedPropertyValues[sContextName];
360
+ if (typeof targetObject === "object" && !isContext(targetObject)) {
361
+ var sAttributeValue = storeValue(targetObject);
362
+ var sContextPath = "".concat(sAttributeValue);
363
+ oSettings.models.converterContext.setProperty(sContextPath, targetObject);
364
+ var newContext = oSettings.models.converterContext.createBindingContext(sContextPath);
365
+ delete myStore[sAttributeValue];
366
+ mContexts[sContextName] = newContext;
367
+ } else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
368
+ mContexts[sContextName] = targetObject;
443
369
  }
444
- });
445
- }
446
-
447
- var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
448
- mContexts[sName] = oAttributesModel.createBindingContext("/");
449
- var oPreviousMacroInfo; // Keep track
450
-
451
- if (TraceInfo.isTraceInfoActive()) {
452
- var oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
453
-
454
- if (oTraceInfo) {
455
- oPreviousMacroInfo = oSettings["_macroInfo"];
456
- oSettings["_macroInfo"] = oTraceInfo.macroInfo;
457
370
  }
371
+ });
372
+ }
373
+ var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
374
+ mContexts[sName] = oAttributesModel.createBindingContext("/");
375
+ var oPreviousMacroInfo;
376
+
377
+ // Keep track
378
+ if (TraceInfo.isTraceInfoActive()) {
379
+ var oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
380
+ if (oTraceInfo && oTraceInfo.macroInfo) {
381
+ oPreviousMacroInfo = oSettings["_macroInfo"];
382
+ oSettings["_macroInfo"] = oTraceInfo.macroInfo;
458
383
  }
459
-
460
- validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
461
- var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
462
- var oParent = oNode.parentNode;
463
- var iChildIndex;
464
- var oPromise;
465
- var processCustomData = true;
466
-
467
- var _temp16 = function () {
468
- if (oParent) {
469
- iChildIndex = Array.from(oParent.children).indexOf(oNode);
470
-
471
- if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
472
- var oTemplate;
473
- var addDefaultNamespace = false;
474
-
475
- if (buildingBlockDefinition.apiVersion === 2) {
476
- oTemplate = oInstance.getTemplate();
477
-
478
- if (buildingBlockDefinition.isRuntime === true) {
479
- for (var myStoreKey in myStore) {
480
- var oData = myStore[myStoreKey];
481
- var sContextPath = "".concat(myStoreKey);
482
- oSettings.models.converterContext.setProperty(sContextPath, oData);
483
- delete myStore[myStoreKey];
484
- }
384
+ }
385
+ validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
386
+ var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
387
+ var oParent = oNode.parentNode;
388
+ var iChildIndex;
389
+ var oPromise;
390
+ var processCustomData = true;
391
+ var _temp16 = function () {
392
+ if (oParent) {
393
+ iChildIndex = Array.from(oParent.children).indexOf(oNode);
394
+ if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
395
+ var templateString;
396
+ var addDefaultNamespace = false;
397
+ if (buildingBlockDefinition.apiVersion === 2 && oInstance !== undefined) {
398
+ templateString = oInstance.getTemplate(oNode);
399
+ if (buildingBlockDefinition.isRuntime === true) {
400
+ for (var myStoreKey in myStore) {
401
+ var oData = myStore[myStoreKey];
402
+ var sContextPath = "".concat(myStoreKey);
403
+ oSettings.models.converterContext.setProperty(sContextPath, oData);
404
+ delete myStore[myStoreKey];
485
405
  }
486
-
487
- addDefaultNamespace = true;
488
- } else if (buildingBlockDefinition.getTemplate) {
489
- oTemplate = buildingBlockDefinition.getTemplate(processedPropertyValues);
490
406
  }
491
-
492
- var hasError = "";
493
-
494
- if (oTemplate) {
495
- if (!oTemplate.firstElementChild) {
496
- oTemplate = parseXMLString(oTemplate, addDefaultNamespace); // For safety purpose we try to detect trailing text in between XML Tags
497
-
498
- var iter = document.createNodeIterator(oTemplate, NodeFilter.SHOW_TEXT);
407
+ addDefaultNamespace = true;
408
+ } else if (buildingBlockDefinition.getTemplate) {
409
+ templateString = buildingBlockDefinition.getTemplate(processedPropertyValues);
410
+ }
411
+ var hasError = "";
412
+ if (templateString) {
413
+ var _oNode;
414
+ var hasParseError = false;
415
+ var parsedTemplate = parseXMLString(templateString, addDefaultNamespace);
416
+ // For safety purpose we try to detect trailing text in between XML Tags
417
+ var _iterator5 = _createForOfIteratorHelper(parsedTemplate),
418
+ _step5;
419
+ try {
420
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
421
+ var _element = _step5.value;
422
+ var iter = document.createNodeIterator(_element, NodeFilter.SHOW_TEXT);
499
423
  var textnode = iter.nextNode();
500
-
424
+ if (_element.localName === "parsererror") {
425
+ hasParseError = true;
426
+ }
501
427
  while (textnode) {
502
428
  if (textnode.textContent && textnode.textContent.trim().length > 0) {
503
429
  hasError = textnode.textContent;
504
430
  }
505
-
506
431
  textnode = iter.nextNode();
507
432
  }
508
433
  }
509
-
510
- if (oTemplate.localName === "parsererror") {
511
- // If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
512
- // Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
513
- // If an error is found it's returned instead of the normal fragment
514
- Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
515
-
516
- try {
517
- var _oInstance;
518
-
519
- isTraceMode = true;
520
- oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBlockDefinition.getTemplate(processedPropertyValues);
521
- oTemplate = parseXMLString(oTemplate, true);
522
- } finally {
523
- isTraceMode = false;
524
- }
525
- } else if (hasError.length > 0) {
526
- // If there is trailing text we create a standard error and display it.
527
- Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
528
- var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
529
- oTemplate = parseXMLString(oErrorText, true);
434
+ } catch (err) {
435
+ _iterator5.e(err);
436
+ } finally {
437
+ _iterator5.f();
438
+ }
439
+ if (hasParseError) {
440
+ // If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
441
+ // Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
442
+ // If an error is found it's returned instead of the normal fragment
443
+ Log.error("Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name));
444
+ try {
445
+ var _oInstance;
446
+ isTraceMode = true;
447
+ var initialTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate(oNode) : buildingBlockDefinition.getTemplate(processedPropertyValues);
448
+ parsedTemplate = parseXMLString(initialTemplate, true);
449
+ } finally {
450
+ isTraceMode = false;
530
451
  }
531
-
532
- oNode.replaceWith(oTemplate);
533
- oNode = oParent.children[iChildIndex];
534
- processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
535
- processCustomData = false;
536
- oPromise = oContextVisitor.visitNode(oNode);
537
- } else {
538
- oNode.remove();
539
- oPromise = Promise.resolve();
452
+ } else if (hasError.length > 0) {
453
+ // If there is trailing text we create a standard error and display it.
454
+ Log.error("Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name));
455
+ var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.xmlTag || buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], parsedTemplate.map(function (template) {
456
+ return template.outerHTML;
457
+ }).join("\n"));
458
+ parsedTemplate = parseXMLString(oErrorText, true);
540
459
  }
460
+ (_oNode = oNode).replaceWith.apply(_oNode, _toConsumableArray(parsedTemplate));
461
+ oNode = oParent.children[iChildIndex];
462
+ processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
463
+ processCustomData = false;
464
+ oPromise = oContextVisitor.visitNode(oNode);
541
465
  } else {
542
- oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
466
+ oNode.remove();
467
+ oPromise = Promise.resolve();
543
468
  }
544
-
545
- return Promise.resolve(oPromise).then(function () {
546
- var oMacroElement = oParent.children[iChildIndex];
547
- processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
548
-
549
- if (oMacroElement !== undefined) {
550
- var oRemainingSlots = oMacroElement.querySelectorAll("slot");
551
- oRemainingSlots.forEach(function (oSlotElement) {
552
- oSlotElement.remove();
553
- });
554
- }
555
- });
556
- }
557
- }();
558
-
559
- return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
560
- });
561
- }, function (e) {
562
- // In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
563
- var traceDetails = {
564
- initialProperties: {},
565
- resolvedProperties: {},
566
- missingContexts: mMissingContext
567
- };
568
-
569
- var _iterator = _createForOfIteratorHelper(initialKeys),
570
- _step;
571
-
572
- try {
573
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
574
- var _propertyName = _step.value;
575
- var _propertyValue = propertyValues[_propertyName];
576
-
577
- if (_propertyValue && _propertyValue.isA && _propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
578
- traceDetails.initialProperties[_propertyName] = {
579
- path: _propertyValue.getPath(),
580
- value: _propertyValue.getObject()
581
- };
582
469
  } else {
583
- traceDetails.initialProperties[_propertyName] = _propertyValue;
470
+ oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
584
471
  }
472
+ return Promise.resolve(oPromise).then(function () {
473
+ var oMacroElement = oParent.children[iChildIndex];
474
+ processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
475
+ if (oMacroElement !== undefined) {
476
+ var oRemainingSlots = oMacroElement.querySelectorAll("slot");
477
+ oRemainingSlots.forEach(function (oSlotElement) {
478
+ oSlotElement.remove();
479
+ });
480
+ }
481
+ });
482
+ }
483
+ }();
484
+ return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
485
+ });
486
+ }, function (e) {
487
+ var _oNode2;
488
+ // In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
489
+ var traceDetails = {
490
+ initialProperties: {},
491
+ resolvedProperties: {},
492
+ missingContexts: mMissingContext
493
+ };
494
+ var _iterator6 = _createForOfIteratorHelper(initialKeys),
495
+ _step6;
496
+ try {
497
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
498
+ var _propertyName = _step6.value;
499
+ var _propertyValue = propertyValues[_propertyName];
500
+ if (isContext(_propertyValue)) {
501
+ traceDetails.initialProperties[_propertyName] = {
502
+ path: _propertyValue.getPath(),
503
+ value: _propertyValue.getObject()
504
+ };
505
+ } else {
506
+ traceDetails.initialProperties[_propertyName] = _propertyValue;
585
507
  }
586
- } catch (err) {
587
- _iterator.e(err);
588
- } finally {
589
- _iterator.f();
590
508
  }
591
-
592
- for (var propertyName in propertyValues) {
593
- var propertyValue = propertyValues[propertyName];
594
-
595
- if (!initialKeys.includes(propertyName)) {
596
- if (propertyValue && propertyValue.isA && propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
597
- traceDetails.resolvedProperties[propertyName] = {
598
- path: propertyValue.getPath(),
599
- value: propertyValue.getObject()
600
- };
601
- } else {
602
- traceDetails.resolvedProperties[propertyName] = propertyValue;
603
- }
509
+ } catch (err) {
510
+ _iterator6.e(err);
511
+ } finally {
512
+ _iterator6.f();
513
+ }
514
+ for (var propertyName in propertyValues) {
515
+ var propertyValue = propertyValues[propertyName];
516
+ if (!initialKeys.includes(propertyName)) {
517
+ if (isContext(propertyValue)) {
518
+ traceDetails.resolvedProperties[propertyName] = {
519
+ path: propertyValue.getPath(),
520
+ value: propertyValue.getObject()
521
+ };
522
+ } else {
523
+ traceDetails.resolvedProperties[propertyName] = propertyValue;
604
524
  }
605
525
  }
606
-
607
- var errorAny = e;
608
- Log.error(errorAny, errorAny);
609
- var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name)], oNode.outerHTML, traceDetails, errorAny.stack);
610
- var oTemplate = parseXMLString(oError, true);
611
- oNode.replaceWith(oTemplate);
612
- });
613
-
614
- if (_temp18 && _temp18.then) return _temp18.then(function () {});
526
+ }
527
+ Log.error(e, e);
528
+ var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name)], oNode.outerHTML, traceDetails, e.stack);
529
+ var oTemplate = parseXMLString(oError, true);
530
+ (_oNode2 = oNode).replaceWith.apply(_oNode2, _toConsumableArray(oTemplate));
615
531
  });
532
+ if (_temp18 && _temp18.then) return _temp18.then(function () {});
616
533
  });
617
534
  } catch (e) {
618
535
  return Promise.reject(e);
619
536
  }
620
537
  };
621
-
622
538
  var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues, apiVersion) {
623
539
  try {
624
540
  var oAggregations = {};
625
-
626
541
  var _temp10 = function () {
627
542
  if (oNode.firstElementChild !== null) {
628
543
  function _temp11() {
629
544
  _oFirstElementChild = oNode.firstElementChild;
630
-
631
545
  var _temp6 = _for(function () {
632
546
  return _oFirstElementChild !== null;
633
547
  }, void 0, function () {
634
548
  function _temp5() {
635
549
  _oFirstElementChild = oNextChild;
636
550
  }
637
-
638
551
  var oNextChild = _oFirstElementChild.nextElementSibling;
639
552
  var sChildName = _oFirstElementChild.localName;
640
553
  var sAggregationName = sChildName;
641
-
642
554
  if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
643
555
  // not a sub aggregation, go back to default Aggregation
644
556
  sAggregationName = oMetadata.defaultAggregation || "";
645
557
  }
646
-
647
558
  var _temp4 = function () {
648
559
  if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic === true)) {
649
560
  var _temp13 = function () {
650
561
  if (apiVersion === 2) {
651
562
  var aggregationDefinition = oMetadata.aggregations[sAggregationName];
652
-
653
563
  var _temp14 = function () {
654
564
  if (!aggregationDefinition.slot && _oFirstElementChild !== null && _oFirstElementChild.children.length > 0) {
655
565
  return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
656
566
  var childDefinition = _oFirstElementChild.firstElementChild;
657
-
658
567
  while (childDefinition) {
659
- var oNewChild = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
660
568
  var nextChild = childDefinition.nextElementSibling;
661
- oNewChild.appendChild(childDefinition);
662
- oAggregations[childDefinition.getAttribute("key")] = oNewChild;
569
+ if (!aggregationDefinition.hasVirtualNode) {
570
+ var childWrapper = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
571
+ childWrapper.appendChild(childDefinition);
572
+ oAggregations[childDefinition.getAttribute("key")] = childWrapper;
573
+ } else {
574
+ oAggregations[childDefinition.getAttribute("key")] = childDefinition;
575
+ }
663
576
  childDefinition.removeAttribute("key");
664
577
  childDefinition = nextChild;
665
578
  }
@@ -670,14 +583,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
670
583
  var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
671
584
  oAggregations[sAggregationName] = oNewChild;
672
585
  }
673
-
674
586
  oAggregations[sAggregationName].appendChild(_oFirstElementChild);
675
587
  } else {
676
588
  oAggregations[sAggregationName] = _oFirstElementChild;
677
589
  }
678
590
  }
679
591
  }();
680
-
681
592
  if (_temp14 && _temp14.then) return _temp14.then(function () {});
682
593
  } else {
683
594
  return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
@@ -685,7 +596,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
685
596
  });
686
597
  }
687
598
  }();
688
-
689
599
  if (_temp13 && _temp13.then) return _temp13.then(function () {});
690
600
  } else {
691
601
  var _temp15 = function () {
@@ -693,85 +603,108 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
693
603
  return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
694
604
  if (oMetadata.properties[sAggregationName].type === "object") {
695
605
  // Object Type properties
696
- propertyValues[sAggregationName] = {};
697
-
698
- for (var _i2 = 0, _Object$keys = Object.keys(_oFirstElementChild.attributes); _i2 < _Object$keys.length; _i2++) {
699
- var attributeIndex = _Object$keys[_i2];
700
- propertyValues[sAggregationName][_oFirstElementChild.attributes[attributeIndex].localName] = _oFirstElementChild.attributes[attributeIndex].value;
606
+ var aggregationPropertyValues = {};
607
+ var attributeNames = _oFirstElementChild.getAttributeNames();
608
+ var _iterator2 = _createForOfIteratorHelper(attributeNames),
609
+ _step2;
610
+ try {
611
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
612
+ var attributeName = _step2.value;
613
+ aggregationPropertyValues[attributeName] = _oFirstElementChild.getAttribute(attributeName);
614
+ }
615
+ } catch (err) {
616
+ _iterator2.e(err);
617
+ } finally {
618
+ _iterator2.f();
701
619
  }
620
+ if (_oFirstElementChild.children.length) {
621
+ //retrieve one level subObject properties
622
+ for (var childIndex = 0; childIndex < _oFirstElementChild.children.length; childIndex++) {
623
+ var subChild = _oFirstElementChild.children[childIndex];
624
+ var subObjectKey = subChild.localName;
625
+ var subObject = {};
626
+ var subChildAttributeNames = subChild.getAttributeNames();
627
+ var _iterator3 = _createForOfIteratorHelper(subChildAttributeNames),
628
+ _step3;
629
+ try {
630
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
631
+ var subChildAttributeName = _step3.value;
632
+ subObject[subChildAttributeName] = subChild.getAttribute(subChildAttributeName);
633
+ }
634
+ } catch (err) {
635
+ _iterator3.e(err);
636
+ } finally {
637
+ _iterator3.f();
638
+ }
639
+ aggregationPropertyValues[subObjectKey] = subObject;
640
+ }
641
+ }
642
+ propertyValues[sAggregationName] = aggregationPropertyValues;
702
643
  } else if (oMetadata.properties[sAggregationName].type === "array") {
703
644
  if (_oFirstElementChild !== null && _oFirstElementChild.children.length > 0) {
704
645
  var children = _oFirstElementChild.children;
705
646
  var oOutObjects = [];
706
-
707
647
  for (var childIdx = 0; childIdx < children.length; childIdx++) {
708
- var childDefinition = children[childIdx]; // non keyed child, just add it to the aggregation
709
-
648
+ var childDefinition = children[childIdx];
649
+ // non keyed child, just add it to the aggregation
710
650
  var myChild = {};
711
-
712
- for (var _i3 = 0, _Object$keys2 = Object.keys(childDefinition.attributes); _i3 < _Object$keys2.length; _i3++) {
713
- var _attributeIndex = _Object$keys2[_i3];
714
- myChild[childDefinition.attributes[_attributeIndex].localName] = childDefinition.attributes[_attributeIndex].value;
651
+ var _attributeNames = childDefinition.getAttributeNames();
652
+ var _iterator4 = _createForOfIteratorHelper(_attributeNames),
653
+ _step4;
654
+ try {
655
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
656
+ var _attributeName = _step4.value;
657
+ myChild[_attributeName] = childDefinition.getAttribute(_attributeName);
658
+ }
659
+ } catch (err) {
660
+ _iterator4.e(err);
661
+ } finally {
662
+ _iterator4.f();
715
663
  }
716
-
717
664
  oOutObjects.push(myChild);
718
665
  }
719
-
720
666
  propertyValues[sAggregationName] = oOutObjects;
721
667
  }
722
668
  }
723
669
  });
724
670
  }
725
671
  }();
726
-
727
672
  if (_temp15 && _temp15.then) return _temp15.then(function () {});
728
673
  }
729
674
  }();
730
-
731
675
  return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
732
676
  });
733
-
734
677
  if (_temp6 && _temp6.then) return _temp6.then(function () {});
735
678
  }
736
-
737
679
  var _oFirstElementChild = oNode.firstElementChild;
738
-
739
680
  if (apiVersion === 2) {
740
681
  while (_oFirstElementChild !== null) {
741
682
  var sChildName = _oFirstElementChild.localName;
742
683
  var sAggregationName = sChildName;
743
-
744
684
  if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
745
685
  // not a sub aggregation, go back to default Aggregation
746
686
  sAggregationName = oMetadata.defaultAggregation || "";
747
687
  }
748
-
749
688
  var aggregationDefinition = oMetadata.aggregations[sAggregationName];
750
-
751
689
  if (aggregationDefinition !== undefined && !aggregationDefinition.slot) {
752
- var parsedAggregation = parseAggregation(_oFirstElementChild);
753
- oAggregations[sAggregationName] = parsedAggregation;
754
-
690
+ var parsedAggregation = parseAggregation(_oFirstElementChild, aggregationDefinition.processAggregations);
691
+ propertyValues[sAggregationName] = parsedAggregation;
755
692
  for (var parsedAggregationKey in parsedAggregation) {
756
693
  oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
757
694
  }
758
695
  }
759
-
760
696
  _oFirstElementChild = _oFirstElementChild.nextElementSibling;
761
697
  }
762
698
  }
763
-
764
699
  var _temp12 = function () {
765
700
  if (apiVersion !== 2) {
766
701
  // If there are aggregation we need to visit the childNodes to resolve templating instructions
767
702
  return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {});
768
703
  }
769
704
  }();
770
-
771
705
  return _temp12 && _temp12.then ? _temp12.then(_temp11) : _temp11(_temp12);
772
706
  }
773
707
  }();
774
-
775
708
  return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(function () {
776
709
  return oAggregations;
777
710
  }) : oAggregations);
@@ -779,67 +712,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
779
712
  return Promise.reject(e);
780
713
  }
781
714
  };
782
-
783
- /**
784
- * Parse the incoming XML node and try to resolve the binding contexts defined inside.
785
- *
786
- * @param oMetadata The metadata for the building block
787
- * @param oSettings The settings object
788
- * @param oNode The XML node to parse
789
- * @param isPublic Whether the building block is used in a public context or not
790
- * @param oVisitor The visitor instance
791
- * @param mContexts The contexts to be used
792
- * @param oMetadataContexts The metadata contexts to be used
793
- */
794
- var processContexts = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
795
- try {
796
- oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
797
- var mMissingContext = {};
798
- var propertyValues = {};
799
- var oDefinitionContexts = oMetadata.metadataContexts;
800
- var aDefinitionContextsKeys = Object.keys(oDefinitionContexts); // Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
801
-
802
- var contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
803
-
804
- if (contextPathIndex !== -1) {
805
- // If it is defined we extract it and reinsert it in the first position of the array
806
- var contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
807
- aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
808
- }
809
-
810
- for (var _i = 0, _aDefinitionContextsK = aDefinitionContextsKeys; _i < _aDefinitionContextsK.length; _i++) {
811
- var sAttributeName = _aDefinitionContextsK[_i];
812
- var bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
813
-
814
- var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
815
-
816
- if (oMetadataContext) {
817
- oMetadataContext.name = sAttributeName;
818
- addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
819
-
820
- if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
821
- oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
822
- }
823
-
824
- if (sAttributeName === "contextPath") {
825
- oSettings.currentContextPath = mContexts[sAttributeName];
826
- }
827
-
828
- propertyValues[sAttributeName] = mContexts[sAttributeName];
829
- } else {
830
- mMissingContext[sAttributeName] = true;
831
- }
832
- }
833
-
834
- return Promise.resolve({
835
- mMissingContext: mMissingContext,
836
- propertyValues: propertyValues
837
- });
838
- } catch (e) {
839
- return Promise.reject(e);
840
- }
841
- };
842
-
843
715
  /**
844
716
  * Parse the incoming XML node and try to resolve the properties defined there.
845
717
  *
@@ -851,18 +723,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
851
723
  */
852
724
  var processProperties = function (oMetadata, oNode, isPublic, oVisitor, apiVersion) {
853
725
  try {
854
- var oDefinitionProperties = oMetadata.properties; // Retrieve properties values
726
+ var oDefinitionProperties = oMetadata.properties;
855
727
 
728
+ // Retrieve properties values
856
729
  var aDefinitionPropertiesKeys = Object.keys(oDefinitionProperties);
857
730
  var propertyValues = {};
858
-
859
731
  var _temp22 = _forOf(aDefinitionPropertiesKeys, function (sKeyValue) {
860
732
  if (oDefinitionProperties[sKeyValue].type === "object") {
861
733
  propertyValues[sKeyValue] = deepClone(oDefinitionProperties[sKeyValue].defaultValue || {}); // To avoid values being reused across macros
862
734
  } else {
863
735
  propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
864
736
  }
865
-
866
737
  var _temp20 = function () {
867
738
  if (oNode.hasAttribute(sKeyValue) && isPublic && oDefinitionProperties[sKeyValue].isPublic === false) {
868
739
  Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
@@ -871,33 +742,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
871
742
  if (oNode.hasAttribute(sKeyValue)) {
872
743
  return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
873
744
  var vValue = oNode.getAttribute(sKeyValue);
874
-
875
- if (vValue !== undefined) {
745
+ if (vValue !== undefined && vValue !== null) {
746
+ var resolvedValue = vValue;
876
747
  if (apiVersion === 2 && typeof vValue === "string" && !vValue.startsWith("{")) {
877
748
  switch (oDefinitionProperties[sKeyValue].type) {
878
749
  case "boolean":
879
- vValue = vValue === "true";
750
+ resolvedValue = vValue === "true";
880
751
  break;
881
-
882
752
  case "number":
883
- vValue = Number(vValue);
753
+ resolvedValue = Number(vValue);
884
754
  break;
885
755
  }
886
756
  }
887
-
888
- propertyValues[sKeyValue] = vValue;
757
+ vValue = vValue === null ? undefined : vValue;
758
+ propertyValues[sKeyValue] = resolvedValue;
889
759
  }
890
760
  });
891
761
  }
892
762
  }();
893
-
894
763
  if (_temp23 && _temp23.then) return _temp23.then(function () {});
895
764
  }
896
765
  }();
897
-
898
766
  if (_temp20 && _temp20.then) return _temp20.then(function () {});
899
767
  });
900
-
901
768
  return Promise.resolve(_temp22 && _temp22.then ? _temp22.then(function () {
902
769
  return propertyValues;
903
770
  }) : propertyValues);
@@ -905,11 +772,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
905
772
  return Promise.reject(e);
906
773
  }
907
774
  };
908
-
775
+ /**
776
+ * Parse the incoming XML node and try to resolve the binding contexts defined inside.
777
+ *
778
+ * @param oMetadata The metadata for the building block
779
+ * @param oSettings The settings object
780
+ * @param oNode The XML node to parse
781
+ * @param isPublic Whether the building block is used in a public context or not
782
+ * @param oVisitor The visitor instance
783
+ * @param mContexts The contexts to be used
784
+ * @param oMetadataContexts The metadata contexts to be used
785
+ * @returns The processed and missing contexts
786
+ */
909
787
  var LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockRuntime";
910
788
  var DOMParserInstance = new DOMParser();
911
789
  var isTraceMode = false;
912
-
913
790
  /**
914
791
  * Typeguard for checking if a building block use API 1.
915
792
  *
@@ -919,49 +796,56 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
919
796
  function isV1MacroDef(buildingBlockDefinition) {
920
797
  return buildingBlockDefinition.apiVersion === undefined || buildingBlockDefinition.apiVersion === 1;
921
798
  }
922
-
923
799
  function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
924
800
  var oContext = mContexts[sKey];
925
801
  var oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
926
-
927
802
  if (oContextSettings.required === true && (!oContext || oContextObject === null)) {
928
803
  throw new Error("".concat(sName, ": Required metadataContext '").concat(sKey, "' is missing"));
929
804
  } else if (oContextObject) {
930
805
  // If context object has $kind property, $Type should not be checked
931
806
  // Therefore remove from context settings
932
- if (oContextObject.hasOwnProperty("$kind") && oContextSettings.$kind) {
807
+ if (oContextObject.hasOwnProperty("$kind") && oContextObject.$kind !== undefined && oContextSettings.$kind !== undefined) {
933
808
  // Check if the $kind is part of the allowed ones
934
- if (oContextSettings.$kind.indexOf(oContextObject["$kind"]) === -1) {
809
+ if (oContextSettings.$kind.indexOf(oContextObject.$kind) === -1) {
935
810
  throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$kind' '").concat(oContextSettings["$kind"], "' but is '").concat(oContextObject.$kind, "': ").concat(oContext.getPath()));
936
811
  }
937
- } else if (oContextObject.hasOwnProperty("$Type") && oContextSettings.$Type) {
812
+ } else if (oContextObject.hasOwnProperty("$Type") && oContextObject.$Type !== undefined && oContextSettings.$Type) {
938
813
  // Check only $Type
939
- if (oContextSettings.$Type.indexOf(oContextObject["$Type"]) === -1) {
814
+ if (oContextSettings.$Type.indexOf(oContextObject.$Type) === -1) {
940
815
  throw new Error("".concat(sName, ": '").concat(sKey, "' must be '$Type' '").concat(oContextSettings["$Type"], "' but is '").concat(oContextObject.$Type, "': ").concat(oContext.getPath()));
941
816
  }
942
817
  }
943
818
  }
944
819
  }
945
-
946
820
  function validateMacroSignature(sName, oMetadata, mContexts, oNode) {
947
821
  var aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [],
948
- aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
949
- oAttributeNames = {}; // collect all attributes to find unchecked properties
822
+ aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
823
+ oAttributeNames = {};
950
824
 
951
- Object.keys(oNode.attributes).forEach(function (iKey) {
952
- var sKey = oNode.attributes[iKey].name;
953
- oAttributeNames[sKey] = true;
954
- }); //Check metadataContexts
825
+ // collect all attributes to find unchecked properties
826
+ var attributeNames = oNode.getAttributeNames();
827
+ var _iterator = _createForOfIteratorHelper(attributeNames),
828
+ _step;
829
+ try {
830
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
831
+ var attributeName = _step.value;
832
+ oAttributeNames[attributeName] = true;
833
+ }
955
834
 
835
+ //Check metadataContexts
836
+ } catch (err) {
837
+ _iterator.e(err);
838
+ } finally {
839
+ _iterator.f();
840
+ }
956
841
  aMetadataContextKeys.forEach(function (sKey) {
957
842
  var oContextSettings = oMetadata.metadataContexts[sKey];
958
843
  validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey);
959
844
  delete oAttributeNames[sKey];
960
- }); //Check properties
961
-
845
+ });
846
+ //Check properties
962
847
  aProperties.forEach(function (sKey) {
963
848
  var oPropertySettings = oMetadata.properties[sKey];
964
-
965
849
  if (!oNode.hasAttribute(sKey)) {
966
850
  if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
967
851
  throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
@@ -969,8 +853,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
969
853
  } else {
970
854
  delete oAttributeNames[sKey];
971
855
  }
972
- }); // Unchecked properties
856
+ });
973
857
 
858
+ // Unchecked properties
974
859
  Object.keys(oAttributeNames).forEach(function (sKey) {
975
860
  // no check for properties which start with underscore "_" or contain a colon ":" (different namespace), e.g. xmlns:trace, trace:macroID, unittest:id
976
861
  if (sKey.indexOf(":") < 0 && !sKey.startsWith("xmlns")) {
@@ -978,31 +863,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
978
863
  }
979
864
  });
980
865
  }
981
-
982
866
  _exports.validateMacroSignature = validateMacroSignature;
983
867
  var SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
984
868
  var SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
869
+
985
870
  /**
986
871
  * Ensures that the metadata for the building block are properly defined.
987
872
  *
988
873
  * @param buildingBlockMetadata The metadata received from the input
989
874
  * @param isOpen Whether the building block is open or not
875
+ * @param apiVersion
990
876
  * @returns A set of completed metadata for further processing
991
877
  */
992
-
993
878
  function prepareMetadata(buildingBlockMetadata) {
994
879
  var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
995
-
880
+ var apiVersion = arguments.length > 2 ? arguments[2] : undefined;
996
881
  if (buildingBlockMetadata) {
997
882
  var oProperties = {};
998
883
  var oAggregations = {
999
- "dependents": {
884
+ dependents: {
1000
885
  type: SAP_UI_CORE_ELEMENT
1001
886
  },
1002
- "customData": {
887
+ customData: {
1003
888
  type: SAP_UI_CORE_ELEMENT
1004
889
  }
1005
890
  };
891
+ if (apiVersion === 2) {
892
+ oAggregations.dependents.slot = "dependents";
893
+ }
1006
894
  var oMetadataContexts = {};
1007
895
  var foundDefaultAggregation;
1008
896
  Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
@@ -1011,24 +899,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1011
899
  } else {
1012
900
  oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
1013
901
  }
1014
- }); // Merge events into properties as they are handled identically
1015
-
902
+ });
903
+ // Merge events into properties as they are handled identically
1016
904
  if (buildingBlockMetadata.events !== undefined) {
1017
905
  Object.keys(buildingBlockMetadata.events).forEach(function (sEventName) {
1018
- oProperties[sEventName] = buildingBlockMetadata.events[sEventName];
906
+ oProperties[sEventName] = _objectSpread({
907
+ type: "Function"
908
+ }, buildingBlockMetadata.events[sEventName]);
1019
909
  });
1020
910
  }
1021
-
1022
911
  if (buildingBlockMetadata.aggregations !== undefined) {
1023
912
  Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
1024
913
  oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
1025
-
1026
914
  if (oAggregations[sPropertyName].isDefault) {
1027
915
  foundDefaultAggregation = sPropertyName;
1028
916
  }
1029
917
  });
1030
918
  }
1031
-
1032
919
  return {
1033
920
  properties: oProperties,
1034
921
  aggregations: oAggregations,
@@ -1040,10 +927,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1040
927
  return {
1041
928
  metadataContexts: {},
1042
929
  aggregations: {
1043
- "dependents": {
930
+ dependents: {
1044
931
  type: SAP_UI_CORE_ELEMENT
1045
932
  },
1046
- "customData": {
933
+ customData: {
1047
934
  type: SAP_UI_CORE_ELEMENT
1048
935
  }
1049
936
  },
@@ -1052,49 +939,42 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1052
939
  };
1053
940
  }
1054
941
  }
942
+
1055
943
  /**
1056
944
  * Checks the absolute or context paths and returns an appropriate MetaContext.
1057
945
  *
1058
946
  * @param oSettings Additional settings
1059
947
  * @param sAttributeValue The attribute value
1060
- * @returns {MetaDataContext} The meta data context object
948
+ * @returns The meta data context object
1061
949
  */
1062
-
1063
-
1064
950
  function _checkAbsoluteAndContextPaths(oSettings, sAttributeValue) {
1065
951
  var sMetaPath;
1066
-
1067
952
  if (sAttributeValue && sAttributeValue.startsWith("/")) {
1068
953
  // absolute path - we just use this one
1069
954
  sMetaPath = sAttributeValue;
1070
955
  } else {
1071
956
  var sContextPath = oSettings.currentContextPath.getPath();
1072
-
1073
957
  if (!sContextPath.endsWith("/")) {
1074
958
  sContextPath += "/";
1075
959
  }
1076
-
1077
960
  sMetaPath = sContextPath + sAttributeValue;
1078
961
  }
1079
-
1080
962
  return {
1081
963
  model: "metaModel",
1082
964
  path: sMetaPath
1083
965
  };
1084
966
  }
967
+
1085
968
  /**
1086
969
  * This method helps to create the metadata context in case it is not yet available in the store.
1087
970
  *
1088
971
  * @param oSettings Additional settings
1089
972
  * @param sAttributeName The attribute name
1090
973
  * @param sAttributeValue The attribute value
1091
- * @returns {MetaDataContext} The meta data context object
974
+ * @returns The meta data context object
1092
975
  */
1093
-
1094
-
1095
976
  function _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue) {
1096
977
  var returnContext;
1097
-
1098
978
  if (sAttributeValue.startsWith("/uid--")) {
1099
979
  var oData = myStore[sAttributeValue];
1100
980
  oSettings.models.converterContext.setProperty(sAttributeValue, oData);
@@ -1117,17 +997,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1117
997
  path: oSettings.bindingContexts.entitySet ? oSettings.bindingContexts.entitySet.getPath(sAttributeValue) : sAttributeValue
1118
998
  };
1119
999
  }
1120
-
1121
1000
  return returnContext;
1122
1001
  }
1123
-
1124
1002
  function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, isOpen) {
1125
1003
  var oMetadataContext;
1126
-
1127
1004
  if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
1128
1005
  var sAttributeValue = oNode.getAttribute(sAttributeName);
1129
1006
  oMetadataContext = BindingParser.complexParser(sAttributeValue);
1130
-
1131
1007
  if (!oMetadataContext) {
1132
1008
  oMetadataContext = _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue);
1133
1009
  }
@@ -1148,89 +1024,117 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1148
1024
  return undefined;
1149
1025
  }
1150
1026
  }
1151
-
1152
1027
  return oMetadataContext;
1153
1028
  }
1154
-
1155
- function parseAggregation(oAggregation) {
1029
+ function processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
1030
+ oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
1031
+ var mMissingContext = {};
1032
+ var propertyValues = {};
1033
+ var oDefinitionContexts = oMetadata.metadataContexts;
1034
+ var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
1035
+ // Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
1036
+ var contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
1037
+ if (contextPathIndex !== -1) {
1038
+ // If it is defined we extract it and reinsert it in the first position of the array
1039
+ var contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
1040
+ aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
1041
+ }
1042
+ for (var _i = 0, _aDefinitionContextsK = aDefinitionContextsKeys; _i < _aDefinitionContextsK.length; _i++) {
1043
+ var sAttributeName = _aDefinitionContextsK[_i];
1044
+ var bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
1045
+ var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
1046
+ if (oMetadataContext) {
1047
+ oMetadataContext.name = sAttributeName;
1048
+ addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
1049
+ if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
1050
+ oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
1051
+ }
1052
+ if (sAttributeName === "contextPath") {
1053
+ oSettings.currentContextPath = mContexts[sAttributeName];
1054
+ }
1055
+ propertyValues[sAttributeName] = mContexts[sAttributeName];
1056
+ } else {
1057
+ mMissingContext[sAttributeName] = true;
1058
+ }
1059
+ }
1060
+ return {
1061
+ mMissingContext: mMissingContext,
1062
+ propertyValues: propertyValues
1063
+ };
1064
+ }
1065
+ function parseAggregation(oAggregation, processAggregations) {
1156
1066
  var oOutObjects = {};
1157
-
1158
1067
  if (oAggregation && oAggregation.children.length > 0) {
1159
1068
  var children = oAggregation.children;
1160
-
1161
1069
  for (var childIdx = 0; childIdx < children.length; childIdx++) {
1162
1070
  var childDefinition = children[childIdx];
1163
1071
  var childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
1164
-
1165
1072
  if (childKey) {
1166
1073
  childKey = "InlineXML_".concat(childKey);
1167
1074
  childDefinition.setAttribute("key", childKey);
1168
- oOutObjects[childKey] = {
1075
+ var aggregationObject = {
1169
1076
  key: childKey,
1170
1077
  position: {
1171
- placement: childDefinition.getAttribute("placement"),
1172
- anchor: childDefinition.getAttribute("anchor")
1078
+ placement: childDefinition.getAttribute("placement") || Placement.After,
1079
+ anchor: childDefinition.getAttribute("anchor") || undefined
1173
1080
  },
1174
1081
  type: "Slot"
1175
1082
  };
1083
+ if (processAggregations) {
1084
+ aggregationObject = processAggregations(childDefinition, aggregationObject);
1085
+ }
1086
+ oOutObjects[aggregationObject.key] = aggregationObject;
1176
1087
  }
1177
1088
  }
1178
1089
  }
1179
-
1180
1090
  return oOutObjects;
1181
1091
  }
1182
-
1183
1092
  function processSlots(oAggregations, oMetadataAggregations, oNode) {
1184
1093
  var processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1185
-
1186
1094
  if (Object.keys(oAggregations).length > 0) {
1187
1095
  Object.keys(oAggregations).forEach(function (sAggregationName) {
1188
1096
  var oAggregationElement = oAggregations[sAggregationName];
1189
-
1190
1097
  if (oNode !== null && oNode !== undefined && oAggregationElement) {
1191
1098
  // slots can have :: as keys which is not a valid aggregation name therefore replacing them
1192
- var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
1193
1099
  var oElementChild = oAggregationElement.firstElementChild;
1194
-
1195
- while (oElementChild) {
1196
- var oNextChild = oElementChild.nextElementSibling;
1197
- oNewChild.appendChild(oElementChild);
1198
- oElementChild = oNextChild;
1199
- }
1200
-
1201
1100
  if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
1202
1101
  var sSlotName = oMetadataAggregations[sAggregationName] !== undefined && oMetadataAggregations[sAggregationName].slot || sAggregationName;
1203
1102
  var oTargetElement = oNode.querySelector("slot[name='".concat(sSlotName, "']"));
1204
-
1205
1103
  if (oTargetElement !== null) {
1206
- oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
1104
+ var oNewChild = prepareAggregationElememnt(oNode, sAggregationName, oElementChild);
1105
+ oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children)); // Somehow TS doesn't like this but the documentation says is should work
1207
1106
  }
1208
- } else if (processCustomData && oNewChild.children.length > 0) {
1209
- oNode.appendChild(oNewChild);
1107
+ } else if (processCustomData && oElementChild !== null) {
1108
+ var _oNewChild = prepareAggregationElememnt(oNode, sAggregationName, oElementChild);
1109
+ oNode.appendChild(_oNewChild);
1210
1110
  }
1211
1111
  }
1212
1112
  });
1213
1113
  }
1214
1114
  }
1215
-
1115
+ function prepareAggregationElememnt(oNode, sAggregationName, oElementChild) {
1116
+ var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
1117
+ while (oElementChild) {
1118
+ var oNextChild = oElementChild.nextElementSibling;
1119
+ oNewChild.appendChild(oElementChild);
1120
+ oElementChild = oNextChild;
1121
+ }
1122
+ return oNewChild;
1123
+ }
1216
1124
  function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
1217
1125
  var sKey = oCtx.name || oCtx.model || undefined;
1218
-
1219
1126
  if (oMetadataContexts[sKey]) {
1220
1127
  return; // do not add twice
1221
1128
  }
1222
1129
 
1223
1130
  try {
1224
1131
  var sContextPath = oCtx.path;
1225
-
1226
1132
  if (oCtx.model != null) {
1227
1133
  sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
1228
1134
  }
1229
-
1230
1135
  var mSetting = oVisitor.getSettings();
1231
-
1232
1136
  if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
1233
- mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path, mSetting.bindingContexts[oCtx.model]); // add the context to the visitor
1137
+ mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path /*, mSetting.bindingContexts[oCtx.model]*/); // add the context to the visitor
1234
1138
  } else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
1235
1139
  mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
1236
1140
  } else {
@@ -1238,61 +1142,53 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1238
1142
  }
1239
1143
 
1240
1144
  oMetadataContexts[sKey] = mContexts[sKey]; // make it available inside metadataContexts JSON object
1241
- } catch (ex) {//console.error(ex);
1145
+ } catch (ex) {
1146
+ //console.error(ex);
1242
1147
  // ignore the context as this can only be the case if the model is not ready, i.e. not a preprocessing model but maybe a model for
1243
1148
  // providing afterwards
1244
1149
  // TODO 0002 not yet implemented
1245
1150
  //mContexts["_$error"].oModel.setProperty("/" + sKey, ex);
1246
1151
  }
1247
1152
  }
1153
+
1248
1154
  /**
1249
1155
  * Register a building block definition to be used inside the xml template processor.
1250
1156
  *
1251
1157
  * @param buildingBlockDefinition The building block definition
1252
1158
  */
1253
-
1254
-
1255
1159
  function registerBuildingBlock(buildingBlockDefinition) {
1256
1160
  XMLPreprocessor.plugIn(function (oNode, oVisitor) {
1257
1161
  return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor);
1258
1162
  }, buildingBlockDefinition.namespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
1259
-
1260
1163
  if (buildingBlockDefinition.publicNamespace) {
1261
1164
  XMLPreprocessor.plugIn(function (oNode, oVisitor) {
1262
1165
  return processBuildingBlock(buildingBlockDefinition, oNode, oVisitor, true);
1263
1166
  }, buildingBlockDefinition.publicNamespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
1264
1167
  }
1265
1168
  }
1266
-
1267
1169
  _exports.registerBuildingBlock = registerBuildingBlock;
1268
-
1269
1170
  function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
1270
1171
  var errorLabels = errorMessages.map(function (errorMessage) {
1271
1172
  return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXMLAttributeValue(errorMessage));
1272
1173
  });
1273
1174
  var errorStack = "";
1274
-
1275
1175
  if (stack) {
1276
1176
  var stackFormatted = btoa("<pre>".concat(stack, "</pre>"));
1277
1177
  errorStack = xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<m:FormattedText htmlText=\"", "\" />"])), "{= BBF.base64Decode('".concat(stackFormatted, "') }"));
1278
1178
  }
1279
-
1280
1179
  var additionalText = "";
1281
-
1282
1180
  if (additionalData) {
1283
1181
  additionalText = xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"Trace Info\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"json\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>"])), "{= BBF.base64Decode('".concat(btoa(JSON.stringify(additionalData, null, 4)), "') }"));
1284
1182
  }
1285
-
1286
1183
  return xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\" core:require=\"{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}\">\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t<grid:CSSGrid gridTemplateRows=\"fr\" gridTemplateColumns=\"repeat(2,1fr)\" gridGap=\"1rem\" xmlns:grid=\"sap.ui.layout.cssgrid\" >\n\t\t\t\t\t<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"How the building block was called\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"xml\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</grid:CSSGrid>\n\t\t\t</m:VBox>"])), errorLabels, errorStack, "{= BBF.base64Decode('".concat(btoa(xmlFragment.replaceAll("&gt;", ">")), "') }"), additionalText);
1287
1184
  }
1288
-
1289
1185
  var myStore = {};
1290
-
1291
1186
  function storeValue(values) {
1292
1187
  var propertyUID = "/uid--".concat(uid());
1293
1188
  myStore[propertyUID] = values;
1294
1189
  return propertyUID;
1295
1190
  }
1191
+
1296
1192
  /**
1297
1193
  * Parse an XML string and return the associated document.
1298
1194
  *
@@ -1300,52 +1196,46 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1300
1196
  * @param addDefaultNamespaces Whether or not we should add default namespace
1301
1197
  * @returns The XML document.
1302
1198
  */
1303
-
1304
-
1305
1199
  function parseXMLString(xmlString) {
1200
+ var _output2, _output3;
1306
1201
  var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1307
-
1308
1202
  if (addDefaultNamespaces) {
1309
1203
  xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:macros=\"sap.fe.macros\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:mdc=\"sap.ui.mdc\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
1310
1204
  }
1311
-
1312
1205
  var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
1313
1206
  var output = xmlDocument.firstElementChild;
1314
-
1315
1207
  while (((_output = output) === null || _output === void 0 ? void 0 : _output.localName) === "template") {
1316
1208
  var _output;
1317
-
1318
1209
  output = output.firstElementChild;
1319
1210
  }
1320
-
1321
- return output;
1211
+ var children = (_output2 = output) !== null && _output2 !== void 0 && _output2.parentElement ? (_output3 = output) === null || _output3 === void 0 ? void 0 : _output3.parentElement.children : [output];
1212
+ return Array.from(children);
1322
1213
  }
1214
+
1323
1215
  /**
1324
1216
  * Escape an XML attribute value.
1325
1217
  *
1326
1218
  * @param value The attribute value to escape.
1327
1219
  * @returns The escaped string.
1328
1220
  */
1329
-
1330
-
1331
1221
  _exports.parseXMLString = parseXMLString;
1332
-
1333
1222
  function escapeXMLAttributeValue(value) {
1334
1223
  return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
1335
1224
  }
1336
-
1337
1225
  _exports.escapeXMLAttributeValue = escapeXMLAttributeValue;
1338
-
1339
1226
  function renderInTraceMode(outStr) {
1227
+ var _xmlResult$;
1340
1228
  var xmlResult = parseXMLString(outStr, true);
1341
-
1342
- if (xmlResult !== undefined && (xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.localName) === "parsererror") {
1343
- var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
1229
+ if (xmlResult.length > 0 !== undefined && ((_xmlResult$ = xmlResult[0]) === null || _xmlResult$ === void 0 ? void 0 : _xmlResult$.localName) === "parsererror") {
1230
+ var errorMessage = xmlResult[0].innerText || xmlResult[0].innerHTML;
1344
1231
  return createErrorXML([errorMessage.split("\n")[0]], outStr);
1345
1232
  } else {
1346
1233
  return outStr;
1347
1234
  }
1348
1235
  }
1236
+ function isBuildingBlockBase(bb) {
1237
+ return (bb === null || bb === void 0 ? void 0 : bb.getTemplate) !== undefined;
1238
+ }
1349
1239
  /**
1350
1240
  * Create a string representation of the template literal while handling special object case.
1351
1241
  *
@@ -1353,40 +1243,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1353
1243
  * @param values The values part of the template literal
1354
1244
  * @returns The XML string document representing the string that was used.
1355
1245
  */
1356
-
1357
-
1358
1246
  var xml = function (strings) {
1359
1247
  var outStr = "";
1360
1248
  var i;
1361
-
1362
1249
  for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
1363
1250
  values[_key - 1] = arguments[_key];
1364
1251
  }
1365
-
1366
1252
  for (i = 0; i < values.length; i++) {
1367
- outStr += strings[i]; // Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
1253
+ outStr += strings[i];
1368
1254
 
1255
+ // Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
1369
1256
  var value = values[i];
1370
-
1371
1257
  if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
1372
1258
  outStr += value.flat(5).join("\n").trim();
1373
- } else if (Array.isArray(value) && value.length > 0 && typeof value[0] === "function") {
1259
+ } else if (isFunctionArray(value)) {
1374
1260
  outStr += value.map(function (valuefn) {
1375
1261
  return valuefn();
1376
1262
  }).join("\n");
1377
- } else if (value !== null && value !== void 0 && value._type) {
1263
+ } else if (isBindingToolkitExpression(value)) {
1378
1264
  var compiledExpression = compileExpression(value);
1379
1265
  outStr += escapeXMLAttributeValue(compiledExpression);
1380
- } else if (value !== null && value !== void 0 && value.getTemplate) {
1266
+ } else if (isBuildingBlockBase(value)) {
1381
1267
  outStr += value.getTemplate();
1382
1268
  } else if (typeof value === "undefined") {
1383
1269
  outStr += "{this>undefinedValue}";
1384
1270
  } else if (typeof value === "function") {
1385
1271
  outStr += value();
1386
1272
  } else if (typeof value === "object" && value !== null) {
1387
- var _value$isA;
1388
-
1389
- if ((_value$isA = value.isA) !== null && _value$isA !== void 0 && _value$isA.call(value, "sap.ui.model.Context")) {
1273
+ if (isContext(value)) {
1390
1274
  outStr += value.getPath();
1391
1275
  } else {
1392
1276
  var propertyUId = storeValue(value);
@@ -1398,18 +1282,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
1398
1282
  outStr += value;
1399
1283
  }
1400
1284
  }
1401
-
1402
1285
  outStr += strings[i];
1403
1286
  outStr = outStr.trim();
1404
-
1405
1287
  if (isTraceMode) {
1406
1288
  return renderInTraceMode(outStr);
1407
1289
  }
1408
-
1409
1290
  return outStr;
1410
1291
  };
1411
-
1412
1292
  _exports.xml = xml;
1413
1293
  return _exports;
1414
1294
  }, false);
1415
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJhcGlWZXJzaW9uIiwicHJvcGVydHlWYWx1ZXMiLCJwcm9jZXNzQ29udGV4dHMiLCJtTWlzc2luZ0NvbnRleHQiLCJleHRyYVByb3BlcnR5VmFsdWVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5pdGlhbEtleXMiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wTmFtZSIsIm9EYXRhIiwiaXNBIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJnZXRNb2RlbCIsImdldE9iamVjdCIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsImdldFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJzQXR0cmlidXRlVmFsdWUiLCJzdG9yZVZhbHVlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJteVN0b3JlIiwidW5kZWZpbmVkIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9Db250ZXh0VmlzaXRvciIsIndpdGgiLCJvUGFyZW50IiwicGFyZW50Tm9kZSIsImlDaGlsZEluZGV4Iiwib1Byb21pc2UiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImlzUnVudGltZSIsIm15U3RvcmVLZXkiLCJoYXNFcnJvciIsImZpcnN0RWxlbWVudENoaWxkIiwicGFyc2VYTUxTdHJpbmciLCJpdGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwidGV4dG5vZGUiLCJuZXh0Tm9kZSIsInRleHRDb250ZW50IiwidHJpbSIsImxvY2FsTmFtZSIsImlzVHJhY2VNb2RlIiwib0Vycm9yVGV4dCIsImNyZWF0ZUVycm9yWE1MIiwib3V0ZXJIVE1MIiwicmVwbGFjZVdpdGgiLCJwcm9jZXNzU2xvdHMiLCJhZ2dyZWdhdGlvbnMiLCJ2aXNpdE5vZGUiLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc2VydEZyYWdtZW50Iiwib01hY3JvRWxlbWVudCIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsIm9OZXh0Q2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJzQ2hpbGROYW1lIiwic0FnZ3JlZ2F0aW9uTmFtZSIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwic2xvdCIsImNoaWxkRGVmaW5pdGlvbiIsIm9OZXdDaGlsZCIsImNyZWF0ZUVsZW1lbnROUyIsIm5hbWVzcGFjZVVSSSIsImdldEF0dHJpYnV0ZSIsIm5leHRDaGlsZCIsImFwcGVuZENoaWxkIiwicmVtb3ZlQXR0cmlidXRlIiwicHJvcGVydGllcyIsInR5cGUiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlSW5kZXgiLCJvT3V0T2JqZWN0cyIsImNoaWxkSWR4IiwibXlDaGlsZCIsInBhcnNlZEFnZ3JlZ2F0aW9uIiwicGFyc2VBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5IiwidmlzaXRDaGlsZE5vZGVzIiwiY3VycmVudENvbnRleHRQYXRoIiwiYmluZGluZ0NvbnRleHRzIiwiY29udGV4dFBhdGgiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJjb250ZXh0UGF0aEluZGV4IiwiY29udGV4dFBhdGhEZWZpbml0aW9uIiwic3BsaWNlIiwic0F0dHJpYnV0ZU5hbWUiLCJiRG9Ob3RSZXNvbHZlIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0Iiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInNLZXlWYWx1ZSIsImRlZXBDbG9uZSIsImRlZmF1bHRWYWx1ZSIsInZpc2l0QXR0cmlidXRlIiwiZ2V0TmFtZWRJdGVtIiwidlZhbHVlIiwic3RhcnRzV2l0aCIsIk51bWJlciIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwidmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dCIsIm9Db250ZXh0U2V0dGluZ3MiLCJzS2V5Iiwib0NvbnRleHQiLCJvQ29udGV4dE9iamVjdCIsInJlcXVpcmVkIiwiRXJyb3IiLCIka2luZCIsIiRUeXBlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJhUHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImlLZXkiLCJvUHJvcGVydHlTZXR0aW5ncyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwib1Byb3BlcnRpZXMiLCJmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbiIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwiaXNEZWZhdWx0IiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJzTWV0YVBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwiX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQiLCJyZXR1cm5Db250ZXh0IiwiZW50aXR5U2V0IiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJnZXRDb250ZXh0Iiwib0FnZ3JlZ2F0aW9uIiwiY2hpbGRLZXkiLCJzZXRBdHRyaWJ1dGUiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsImFuY2hvciIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJyZXBsYWNlIiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwieG1sVGFnIiwicHVibGljTmFtZXNwYWNlIiwiZXJyb3JNZXNzYWdlcyIsInhtbEZyYWdtZW50IiwiYWRkaXRpb25hbERhdGEiLCJlcnJvckxhYmVscyIsIm1hcCIsImVycm9yTWVzc2FnZSIsInhtbCIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwiZXJyb3JTdGFjayIsInN0YWNrRm9ybWF0dGVkIiwiYnRvYSIsImFkZGl0aW9uYWxUZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2VBbGwiLCJwcm9wZXJ0eVVJRCIsInVpZCIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJyZW5kZXJJblRyYWNlTW9kZSIsIm91dFN0ciIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Iiwic3RyaW5ncyIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsInZhbHVlZm4iLCJfdHlwZSIsImNvbXBpbGVkRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwicHJvcGVydHlVSWQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgQXR0cmlidXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tCYXNlLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBUcmFjZUluZm8gZnJvbSBcIi4vVHJhY2VJbmZvXCI7XG5cbmNvbnN0IExPR0dFUl9TQ09QRSA9IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MuQnVpbGRpbmdCbG9ja1J1bnRpbWVcIjtcbmNvbnN0IERPTVBhcnNlckluc3RhbmNlID0gbmV3IERPTVBhcnNlcigpO1xubGV0IGlzVHJhY2VNb2RlID0gZmFsc2U7XG5cbnR5cGUgUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+O1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG5cdGlzT3BlbjogYm9vbGVhbjtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbnR5cGUgSUNhbGxiYWNrID0ge1xuXHRnZXRTZXR0aW5ncygpOiBhbnk7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZyYWdtZW50TmFtZVxuXHQgKiAgIHRoZSBmcmFnbWVudCdzIHJlc29sdmVkIG5hbWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS51dGlsLl93aXRofSBvV2l0aENvbnRyb2xcblx0ICogICB0aGUgcGFyZW50J3MgXCJ3aXRoXCIgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogYW55KTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGUob05vZGU6IEVsZW1lbnQsIG9BdHRyaWJ1dGU6IEF0dHIpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdENoaWxkTm9kZXMob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogSW50ZXJwcmV0cyB0aGUgZ2l2ZW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBiaW5kaW5nIGFuZCByZXR1cm5zIHRoZVxuXHQgKiByZXN1bHRpbmcgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVmFsdWVcblx0ICogICBBbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IFtvRWxlbWVudF1cblx0ICogICBUaGUgWE1MIERPTSBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgdmFsdWUgYmVsb25ncyB0byAobmVlZGVkIG9ubHkgZm9yXG5cdCAqICAgd2FybmluZ3Mgd2hpY2ggYXJlIGxvZ2dlZCB0byB0aGUgY29uc29sZSlcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfG51bGx9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHRpbmcgdmFsdWUsIG9yIGlzIHJlamVjdGVkIHdpdGggYVxuXHQgKiAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgKGZvciBleGFtcGxlLCBhbiBlcnJvciB0aHJvd24gYnkgYSBmb3JtYXR0ZXIpIG9yXG5cdCAqICAgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgYmluZGluZyBpcyBub3QgcmVhZHkgKGJlY2F1c2UgaXQgcmVmZXJzIHRvIGFcblx0ICogICBtb2RlbCB3aGljaCBpcyBub3QgYXZhaWxhYmxlKSAoc2luY2UgMS41Ny4wKVxuXHQgKi9cblx0Z2V0UmVzdWx0KHNWYWx1ZTogc3RyaW5nLCBlbGVtZW50PzogRWxlbWVudCk6IFByb21pc2U8YW55PiB8IG51bGw7XG5cdGdldENvbnRleHQoc1BhdGg6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlICh7QGxpbmsgc2FwLnVpLm1vZGVsLkNvbnRleHR9KVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnMge3NhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFja31cblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBhbnksIGJSZXBsYWNlPzogYm9vbGVhbik6IElDYWxsYmFjaztcbn07XG5cbi8qKlxuICogVHlwZWd1YXJkIGZvciBjaGVja2luZyBpZiBhIGJ1aWxkaW5nIGJsb2NrIHVzZSBBUEkgMS5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNpbmcgQVBJIDEuXG4gKi9cbmZ1bmN0aW9uIGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBpcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxIHtcblx0cmV0dXJuIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAxO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChcblx0c05hbWU6IHN0cmluZyxcblx0bUNvbnRleHRzOiBhbnksXG5cdG9Db250ZXh0U2V0dGluZ3M6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRzS2V5OiBzdHJpbmdcbikge1xuXHRjb25zdCBvQ29udGV4dCA9IG1Db250ZXh0c1tzS2V5XTtcblx0Y29uc3Qgb0NvbnRleHRPYmplY3QgPSBvQ29udGV4dD8uZ2V0T2JqZWN0KCk7XG5cblx0aWYgKG9Db250ZXh0U2V0dGluZ3MucmVxdWlyZWQgPT09IHRydWUgJiYgKCFvQ29udGV4dCB8fCBvQ29udGV4dE9iamVjdCA9PT0gbnVsbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBSZXF1aXJlZCBtZXRhZGF0YUNvbnRleHQgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdC8vIElmIGNvbnRleHQgb2JqZWN0IGhhcyAka2luZCBwcm9wZXJ0eSwgJFR5cGUgc2hvdWxkIG5vdCBiZSBjaGVja2VkXG5cdFx0Ly8gVGhlcmVmb3JlIHJlbW92ZSBmcm9tIGNvbnRleHQgc2V0dGluZ3Ncblx0XHRpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIka2luZFwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRraW5kKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgJGtpbmQgaXMgcGFydCBvZiB0aGUgYWxsb3dlZCBvbmVzXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4ka2luZC5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJGtpbmRcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3NbXCIka2luZFwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJFR5cGVcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4kVHlwZSkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJFR5cGUuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRUeXBlXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRUeXBlJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJFR5cGVcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzTmFtZTogYW55LCBvTWV0YWRhdGE6IGFueSwgbUNvbnRleHRzOiBhbnksIG9Ob2RlOiBhbnkpIHtcblx0Y29uc3QgYU1ldGFkYXRhQ29udGV4dEtleXMgPSAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpKSB8fCBbXSxcblx0XHRhUHJvcGVydGllcyA9IChvTWV0YWRhdGEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykpIHx8IFtdLFxuXHRcdG9BdHRyaWJ1dGVOYW1lczogYW55ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9Ob2RlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGlLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IHNLZXkgPSBvTm9kZS5hdHRyaWJ1dGVzW2lLZXldLm5hbWU7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW3NLZXldID0gdHJ1ZTtcblx0fSk7XG5cblx0Ly9DaGVjayBtZXRhZGF0YUNvbnRleHRzXG5cdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuY29uc3QgU0FQX1VJX01PREVMX0NPTlRFWFQgPSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCI7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcGFyYW0gaXNPcGVuIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIG9wZW4gb3Igbm90XG4gKiBAcmV0dXJucyBBIHNldCBvZiBjb21wbGV0ZWQgbWV0YWRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICovXG5mdW5jdGlvbiBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhPzogQnVpbGRpbmdCbG9ja01ldGFkYXRhLCBpc09wZW4gPSBmYWxzZSk6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhIHtcblx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRpb25zOiBhbnkgPSB7XG5cdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHR9LFxuXHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cdFx0bGV0IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXS50eXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dHNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBNZXJnZSBldmVudHMgaW50byBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHlcblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdFx0Zm91bmREZWZhdWx0QWdncmVnYXRpb24gPSBzUHJvcGVydHlOYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uOiBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbixcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzLFxuXHRcdFx0aXNPcGVuOiBpc09wZW5cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge1xuXHRcdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMge01ldGFEYXRhQ29udGV4dH0gVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3M6IGFueSwgc0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcpOiBNZXRhRGF0YUNvbnRleHQge1xuXHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0cGF0aDogc01ldGFQYXRoXG5cdH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaGVscHMgdG8gY3JlYXRlIHRoZSBtZXRhZGF0YSBjb250ZXh0IGluIGNhc2UgaXQgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBvU2V0dGluZ3MgQWRkaXRpb25hbCBzZXR0aW5nc1xuICogQHBhcmFtIHNBdHRyaWJ1dGVOYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZVxuICogQHBhcmFtIHNBdHRyaWJ1dGVWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlXG4gKiBAcmV0dXJucyB7TWV0YURhdGFDb250ZXh0fSBUaGUgbWV0YSBkYXRhIGNvbnRleHQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0KG9TZXR0aW5nczogYW55LCBzQXR0cmlidXRlTmFtZTogc3RyaW5nLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSkge1xuXHRcdGNvbnN0IG9EYXRhID0gbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQXR0cmlidXRlVmFsdWUsIG9EYXRhKTtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0XHRkZWxldGUgbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRyZXR1cm5Db250ZXh0ID0gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzLCBzQXR0cmlidXRlVmFsdWUpO1xuXHR9IGVsc2UgaWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRwYXRoOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0ID8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpIDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gcmV0dXJuQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIGFwaVZlcnNpb24gVGhlIEFQSSB2ZXJzaW9uIG9mIHRoZSBidWlsZGluZyBibG9ja1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0Zm9yIChjb25zdCBzS2V5VmFsdWUgb2YgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cykge1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gZGVlcENsb25lKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSB8fCB7fSk7IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uaXNQdWJsaWMgPT09IGZhbHNlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZWYWx1ZTogYW55ID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKGFwaVZlcnNpb24gPT09IDIgJiYgdHlwZW9mIHZWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdlZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHR2VmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0dlZhbHVlID0gTnVtYmVyKHZWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gdlZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlWYWx1ZXM7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgYmluZGluZyBjb250ZXh0cyBkZWZpbmVkIGluc2lkZS5cbiAqXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBvTWV0YWRhdGFDb250ZXh0c1x0VGhlIG1ldGFkYXRhIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b01ldGFkYXRhQ29udGV4dHM6IGFueVxuKSB7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0Y29uc3QgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Ly8gU2luY2UgdGhlIG1ldGFQYXRoIGFuZCBvdGhlciBwcm9wZXJ0eSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHRQYXRoIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29udGV4dFBhdGggZmlyc3Rcblx0Y29uc3QgY29udGV4dFBhdGhJbmRleCA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLmluZGV4T2YoXCJjb250ZXh0UGF0aFwiKTtcblx0aWYgKGNvbnRleHRQYXRoSW5kZXggIT09IC0xKSB7XG5cdFx0Ly8gSWYgaXQgaXMgZGVmaW5lZCB3ZSBleHRyYWN0IGl0IGFuZCByZWluc2VydCBpdCBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGFycmF5XG5cdFx0Y29uc3QgY29udGV4dFBhdGhEZWZpbml0aW9uID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKGNvbnRleHRQYXRoSW5kZXgsIDEpO1xuXHRcdGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNwbGljZSgwLCAwLCBjb250ZXh0UGF0aERlZmluaXRpb25bMF0pO1xuXHR9XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQsIG9NZXRhZGF0YUNvbnRleHRzKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpICYmXG5cdFx0XHRcdCFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IHByb3BlcnR5VmFsdWVzIH07XG59XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQpIHtcblx0Y29uc3Qgb091dE9iamVjdHM6IGFueSA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdG9PdXRPYmplY3RzW2NoaWxkS2V5XSA9IHtcblx0XHRcdFx0XHRrZXk6IGNoaWxkS2V5LFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIiksXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIilcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHR5cGU6IFwiU2xvdFwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgYXMgRWxlbWVudCB8IG51bGw7XG5cdFx0aWYgKGFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhcGlWZXJzaW9uICE9PSAyKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyB0byByZXNvbHZlIHRlbXBsYXRpbmcgaW5zdHJ1Y3Rpb25zXG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdH1cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0ge307XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0udmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwiYXJyYXlcIikge1xuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb091dE9iamVjdHMgPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhjaGlsZERlZmluaXRpb24uYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2NoaWxkRGVmaW5pdGlvbi5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24uYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGE6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Ly8gc2xvdHMgY2FuIGhhdmUgOjogYXMga2V5cyB3aGljaCBpcyBub3QgYSB2YWxpZCBhZ2dyZWdhdGlvbiBuYW1lIHRoZXJlZm9yZSByZXBsYWNpbmcgdGhlbVxuXHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdFx0XHRcdGxldCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyBhbnkpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb05ld0NoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvTm9kZS5hcHBlbmRDaGlsZChvTmV3Q2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0J1aWxkaW5nQmxvY2soXG5cdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbikge1xuXHRjb25zdCBzRnJhZ21lbnROYW1lID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZnJhZ21lbnQgfHwgYCR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlfS4ke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YDtcblxuXHRjb25zdCBzTmFtZSA9IFwidGhpc1wiO1xuXG5cdGNvbnN0IG1Db250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBhbnkgPSB7fTtcblx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0Ly8gVE9ETyAwMDAxIE1vdmUgdGhpcyBlbHNld2hlcmUgdGhpcyBpcyB3ZWlyZCA6KVxuXHRpZiAob1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdKSB7XG5cdFx0b1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdXG5cdFx0XHQuZ2V0UmVzb3VyY2VCdW5kbGUoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFJlc291cmNlTW9kZWwuc2V0QXBwbGljYXRpb25JMThuQnVuZGxlKG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjb25zdCBvTWV0YWRhdGEgPSBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubWV0YWRhdGEsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3Blbik7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0bGV0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uKTtcblxuXHRjb25zdCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IGV4dHJhUHJvcGVydHlWYWx1ZXMgfSA9IGF3YWl0IHByb2Nlc3NDb250ZXh0cyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRwcm9wZXJ0eVZhbHVlcyA9IE9iamVjdC5hc3NpZ24ocHJvcGVydHlWYWx1ZXMsIGV4dHJhUHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXHRcdGlmIChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZSkge1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5jcmVhdGUuY2FsbChcblx0XHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzLFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0XHRvQWdncmVnYXRpb25zLFxuXHRcdFx0XHRpc1B1YmxpY1xuXHRcdFx0KTtcblx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdLmNvbXB1dGVkID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc01ldGFkYXRhTmFtZV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bGV0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgIXRhcmdldE9iamVjdC5nZXRPYmplY3QpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gdGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik7XG5cdFx0bUNvbnRleHRzW3NOYW1lXSA9IG9BdHRyaWJ1dGVzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdGxldCBvUHJldmlvdXNNYWNyb0luZm86IGFueTtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBvVGVtcGxhdGU7XG5cdFx0XHRcdGxldCBhZGREZWZhdWx0TmFtZXNwYWNlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gb0luc3RhbmNlLmdldFRlbXBsYXRlKCk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0XHRcdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2U7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHByb2Nlc3NDdXN0b21EYXRhKTtcblx0XHRcdGlmIChvTWFjcm9FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3Qgb1JlbWFpbmluZ1Nsb3RzID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic2xvdFwiKTtcblx0XHRcdFx0b1JlbWFpbmluZ1Nsb3RzLmZvckVhY2goZnVuY3Rpb24gKG9TbG90RWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgYW55LFxuXHRcdFx0cmVzb2x2ZWRQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRtaXNzaW5nQ29udGV4dHM6IG1NaXNzaW5nQ29udGV4dFxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgaW5pdGlhbEtleXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoU0FQX1VJX01PREVMX0NPTlRFWFQpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGVycm9yQW55ID0gZSBhcyBhbnk7XG5cdFx0TG9nLmVycm9yKGVycm9yQW55LCBlcnJvckFueSk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWBdLFxuXHRcdFx0b05vZGUub3V0ZXJIVE1MLFxuXHRcdFx0dHJhY2VEZXRhaWxzLFxuXHRcdFx0ZXJyb3JBbnkuc3RhY2tcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlIGFzIGFueSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9DdHg6IGFueSwgb01ldGFkYXRhQ29udGV4dHM6IGFueSkge1xuXHRjb25zdCBzS2V5ID0gb0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkO1xuXG5cdGlmIChvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPSBudWxsKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBgJHtvQ3R4Lm1vZGVsfT4ke3NDb250ZXh0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBtU2V0dGluZyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdFx0aWYgKG9DdHgubW9kZWwgPT09IFwiY29udmVydGVyQ29udGV4dFwiICYmIG9DdHgucGF0aC5sZW5ndGggPiAwKSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0uZ2V0Q29udGV4dChvQ3R4LnBhdGgsIG1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSAmJiBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QsIHN0YWNrPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgZXJyb3JMYWJlbHMgPSBlcnJvck1lc3NhZ2VzLm1hcCgoZXJyb3JNZXNzYWdlKSA9PiB4bWxgPG06TGFiZWwgdGV4dD1cIiR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBlcnJvclN0YWNrID0gXCJcIjtcblx0aWYgKHN0YWNrKSB7XG5cdFx0Y29uc3Qgc3RhY2tGb3JtYXR0ZWQgPSBidG9hKGA8cHJlPiR7c3RhY2t9PC9wcmU+YCk7XG5cdFx0ZXJyb3JTdGFjayA9IHhtbGA8bTpGb3JtYXR0ZWRUZXh0IGh0bWxUZXh0PVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtzdGFja0Zvcm1hdHRlZH0nKSB9YH1cIiAvPmA7XG5cdH1cblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0YWRkaXRpb25hbFRleHQgPSB4bWxgPG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJUcmFjZSBJbmZvXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwianNvblwiICB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYShKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsRGF0YSwgbnVsbCwgNCkpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHQ8L206VkJveD5gO1xuXHR9XG5cdHJldHVybiB4bWxgPG06VkJveCB4bWxuczptPVwic2FwLm1cIiB4bWxuczpjb2RlPVwic2FwLnVpLmNvZGVlZGl0b3JcIiBjb3JlOnJlcXVpcmU9XCJ7QkJGOidzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrRm9ybWF0dGVyJ31cIj5cblx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0JHtlcnJvclN0YWNrfVxuXHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdFx0JHthZGRpdGlvbmFsVGV4dH1cblx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHQ8L206VkJveD5gO1xufVxuXG5jb25zdCBteVN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5mdW5jdGlvbiBzdG9yZVZhbHVlKHZhbHVlczogYW55KSB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYC91aWQtLSR7dWlkKCl9YDtcblx0bXlTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZXM7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIGFkZERlZmF1bHROYW1lc3BhY2VzIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhZGQgZGVmYXVsdCBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnQge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb3V0cHV0IGFzIEVsZW1lbnQ7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdmFsdWU/LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJmFwb3M7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZykge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgeG1sUmVzdWx0Py5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdCBhcyBhbnkpLmlubmVySFRNTDtcblx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG91dFN0cjtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBhbnlbXSkgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiAoZGV0ZXJtaW5lZCBieSBfdHlwZSkgdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUuZmxhdCg1KS5qb2luKFwiXFxuXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5tYXAoKHZhbHVlZm4pID0+IHZhbHVlZm4oKSkuam9pbihcIlxcblwiKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlPy5fdHlwZSkge1xuXHRcdFx0Y29uc3QgY29tcGlsZWRFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24odmFsdWUpO1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNvbXBpbGVkRXhwcmVzc2lvbik7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZT8uZ2V0VGVtcGxhdGUpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gXCJ7dGhpcz51bmRlZmluZWRWYWx1ZX1cIjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKHZhbHVlLmlzQT8uKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikpIHtcblx0XHRcdFx0b3V0U3RyICs9IHZhbHVlLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5VUlkID0gc3RvcmVWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIiZsdDtcIikpIHtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdHJldHVybiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHIpO1xuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBd0tPLGdCQUFnQkEsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQztJQUMzQyxJQUFJLE9BQU9GLE1BQU0saUJBQWIsS0FBbUMsVUFBdkMsRUFBbUQ7TUFDbEQs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
1295
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJ4bWxUYWciLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwiYXBpVmVyc2lvbiIsInByb2Nlc3NQcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZXMiLCJwcm9jZXNzQ29udGV4dHMiLCJtTWlzc2luZ0NvbnRleHQiLCJleHRyYVByb3BlcnR5VmFsdWVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5pdGlhbEtleXMiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wTmFtZSIsIm9EYXRhIiwib3JpZ2luYWxEZWZpbml0aW9uIiwicHJvcGVydGllcyIsInZhbGlkYXRlIiwiaXNBIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJnZXRNb2RlbCIsImdldE9iamVjdCIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsImdldFByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJpc0NvbnRleHQiLCJzQXR0cmlidXRlVmFsdWUiLCJzdG9yZVZhbHVlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibXlTdG9yZSIsInVuZGVmaW5lZCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIlRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIiwib1RyYWNlSW5mbyIsInRyYWNlTWFjcm9DYWxscyIsIm1hY3JvSW5mbyIsInZhbGlkYXRlTWFjcm9TaWduYXR1cmUiLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIm9Qcm9taXNlIiwicHJvY2Vzc0N1c3RvbURhdGEiLCJBcnJheSIsImZyb20iLCJjaGlsZHJlbiIsImluZGV4T2YiLCJnZXRUZW1wbGF0ZSIsInRlbXBsYXRlU3RyaW5nIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImlzUnVudGltZSIsIm15U3RvcmVLZXkiLCJoYXNFcnJvciIsImhhc1BhcnNlRXJyb3IiLCJwYXJzZWRUZW1wbGF0ZSIsInBhcnNlWE1MU3RyaW5nIiwiZWxlbWVudCIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwibG9jYWxOYW1lIiwidGV4dENvbnRlbnQiLCJ0cmltIiwiaXNUcmFjZU1vZGUiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJtYXAiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJyZXBsYWNlV2l0aCIsInByb2Nlc3NTbG90cyIsImFnZ3JlZ2F0aW9ucyIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwib1JlbWFpbmluZ1Nsb3RzIiwicXVlcnlTZWxlY3RvckFsbCIsIm9TbG90RWxlbWVudCIsInRyYWNlRGV0YWlscyIsImluaXRpYWxQcm9wZXJ0aWVzIiwicmVzb2x2ZWRQcm9wZXJ0aWVzIiwibWlzc2luZ0NvbnRleHRzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlWYWx1ZSIsInBhdGgiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJzbG90IiwiY2hpbGREZWZpbml0aW9uIiwibmV4dENoaWxkIiwiaGFzVmlydHVhbE5vZGUiLCJjaGlsZFdyYXBwZXIiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJnZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsInR5cGUiLCJhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzIiwiYXR0cmlidXRlTmFtZXMiLCJnZXRBdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWUiLCJjaGlsZEluZGV4Iiwic3ViQ2hpbGQiLCJzdWJPYmplY3RLZXkiLCJzdWJPYmplY3QiLCJzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzIiwic3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIiwib091dE9iamVjdHMiLCJjaGlsZElkeCIsIm15Q2hpbGQiLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlQWdncmVnYXRpb24iLCJwcm9jZXNzQWdncmVnYXRpb25zIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJ2aXNpdENoaWxkTm9kZXMiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwic0tleVZhbHVlIiwiZGVlcENsb25lIiwiZGVmYXVsdFZhbHVlIiwiaGFzQXR0cmlidXRlIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidlZhbHVlIiwicmVzb2x2ZWRWYWx1ZSIsInN0YXJ0c1dpdGgiLCJOdW1iZXIiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXJJbnN0YW5jZSIsIkRPTVBhcnNlciIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCIkVHlwZSIsImFNZXRhZGF0YUNvbnRleHRLZXlzIiwiYVByb3BlcnRpZXMiLCJvQXR0cmlidXRlTmFtZXMiLCJvUHJvcGVydHlTZXR0aW5ncyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwib1Byb3BlcnRpZXMiLCJkZXBlbmRlbnRzIiwiY3VzdG9tRGF0YSIsImZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uIiwic1Byb3BlcnR5TmFtZSIsImV2ZW50cyIsInNFdmVudE5hbWUiLCJpc0RlZmF1bHQiLCJfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyIsInNNZXRhUGF0aCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImVuZHNXaXRoIiwibW9kZWwiLCJfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dCIsInNBdHRyaWJ1dGVOYW1lIiwicmV0dXJuQ29udGV4dCIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJiRG9Ob3RSZXNvbHZlIiwib01ldGFkYXRhQ29udGV4dCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiZ2V0Q29udGV4dCIsImNvbnRleHRQYXRoIiwib0RlZmluaXRpb25Db250ZXh0cyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwiY29udGV4dFBhdGhJbmRleCIsImNvbnRleHRQYXRoRGVmaW5pdGlvbiIsInNwbGljZSIsImFkZFNpbmdsZUNvbnRleHQiLCJvQWdncmVnYXRpb24iLCJjaGlsZEtleSIsInNldEF0dHJpYnV0ZSIsImFnZ3JlZ2F0aW9uT2JqZWN0Iiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImFuY2hvciIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVtbnQiLCJyZXBsYWNlIiwib0N0eCIsIm1TZXR0aW5nIiwiZXgiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJwdWJsaWNOYW1lc3BhY2UiLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwieG1sU3RyaW5nIiwiYWRkRGVmYXVsdE5hbWVzcGFjZXMiLCJ4bWxEb2N1bWVudCIsInBhcnNlRnJvbVN0cmluZyIsIm91dHB1dCIsInBhcmVudEVsZW1lbnQiLCJyZW5kZXJJblRyYWNlTW9kZSIsIm91dFN0ciIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0IiwiaXNCdWlsZGluZ0Jsb2NrQmFzZSIsImJiIiwic3RyaW5ncyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1J1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBpc0NvbnRleHQsIGlzRnVuY3Rpb25BcnJheSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBfUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvLCBUcmFjZU1ldGFkYXRhQ29udGV4dCB9IGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5sZXQgaXNUcmFjZU1vZGUgPSBmYWxzZTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+O1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG5cdGlzT3BlbjogYm9vbGVhbjtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGN1cnJlbnRDb250ZXh0UGF0aDogQ29udGV4dDtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiAmIHtcblx0XHRjb252ZXJ0ZXJDb250ZXh0OiBKU09OTW9kZWw7XG5cdFx0dmlld0RhdGE6IEpTT05Nb2RlbDtcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdFwic2FwLmZlLmkxOG5cIj86IF9SZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0ZyYWdtZW50TmFtZVxuXHQgKiAgIHRoZSBmcmFnbWVudCdzIHJlc29sdmVkIG5hbWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS51dGlsLl93aXRofSBvV2l0aENvbnRyb2xcblx0ICogICB0aGUgcGFyZW50J3MgXCJ3aXRoXCIgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlICh7QGxpbmsgc2FwLnVpLm1vZGVsLkNvbnRleHR9KVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnMge3NhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFja31cblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiwgYlJlcGxhY2U/OiBib29sZWFuKTogSVZpc2l0b3JDYWxsYmFjaztcbn07XG5cbi8qKlxuICogVHlwZWd1YXJkIGZvciBjaGVja2luZyBpZiBhIGJ1aWxkaW5nIGJsb2NrIHVzZSBBUEkgMS5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNpbmcgQVBJIDEuXG4gKi9cbmZ1bmN0aW9uIGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBpcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxIHtcblx0cmV0dXJuIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAxO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChcblx0c05hbWU6IHN0cmluZyxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b0NvbnRleHRTZXR0aW5nczogQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdHNLZXk6IHN0cmluZ1xuKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gbUNvbnRleHRzW3NLZXldO1xuXHRjb25zdCBvQ29udGV4dE9iamVjdCA9IG9Db250ZXh0Py5nZXRPYmplY3QoKSBhcyB7XG5cdFx0JFR5cGU/OiBzdHJpbmc7XG5cdFx0JGtpbmQ/OiBzdHJpbmc7XG5cdH07XG5cblx0aWYgKG9Db250ZXh0U2V0dGluZ3MucmVxdWlyZWQgPT09IHRydWUgJiYgKCFvQ29udGV4dCB8fCBvQ29udGV4dE9iamVjdCA9PT0gbnVsbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBSZXF1aXJlZCBtZXRhZGF0YUNvbnRleHQgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdC8vIElmIGNvbnRleHQgb2JqZWN0IGhhcyAka2luZCBwcm9wZXJ0eSwgJFR5cGUgc2hvdWxkIG5vdCBiZSBjaGVja2VkXG5cdFx0Ly8gVGhlcmVmb3JlIHJlbW92ZSBmcm9tIGNvbnRleHQgc2V0dGluZ3Ncblx0XHRpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIka2luZFwiKSAmJiBvQ29udGV4dE9iamVjdC4ka2luZCAhPT0gdW5kZWZpbmVkICYmIG9Db250ZXh0U2V0dGluZ3MuJGtpbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdC4ka2luZCkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRraW5kXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJiBvQ29udGV4dE9iamVjdC4kVHlwZSAhPT0gdW5kZWZpbmVkICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3QuJFR5cGUpID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3NbXCIkVHlwZVwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKFxuXHRzTmFtZTogc3RyaW5nLFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTm9kZTogRWxlbWVudFxuKSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb05vZGUuZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0fVxuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuY29uc3QgU0FQX1VJX01PREVMX0NPTlRFWFQgPSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCI7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcGFyYW0gaXNPcGVuIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIG9wZW4gb3Igbm90XG4gKiBAcGFyYW0gYXBpVmVyc2lvblxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKFxuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzT3BlbiA9IGZhbHNlLFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj4gPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPiA9IHtcblx0XHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fSxcblx0XHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0b0FnZ3JlZ2F0aW9ucy5kZXBlbmRlbnRzLnNsb3QgPSBcImRlcGVuZGVudHNcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj4gPSB7fTtcblx0XHRsZXQgZm91bmREZWZhdWx0QWdncmVnYXRpb247XG5cdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdLnR5cGUgIT09IFNBUF9VSV9NT0RFTF9DT05URVhUKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKHNFdmVudE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzRXZlbnROYW1lXSA9IHsgdHlwZTogXCJGdW5jdGlvblwiLCAuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRpZiAob0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXS5pc0RlZmF1bHQpIHtcblx0XHRcdFx0XHRmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbiA9IHNQcm9wZXJ0eU5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvcGVydGllczogb1Byb3BlcnRpZXMsXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRkZWZhdWx0QWdncmVnYXRpb246IGZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHNNZXRhUGF0aCA9IHNBdHRyaWJ1dGVWYWx1ZTtcblx0fSBlbHNlIHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aC5nZXRQYXRoKCk7XG5cdFx0aWYgKCFzQ29udGV4dFBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHNNZXRhUGF0aCA9IHNDb250ZXh0UGF0aCArIHNBdHRyaWJ1dGVWYWx1ZTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdHBhdGg6IHNNZXRhUGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGhlbHBzIHRvIGNyZWF0ZSB0aGUgbWV0YWRhdGEgY29udGV4dCBpbiBjYXNlIGl0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlTmFtZSBUaGUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRzQXR0cmlidXRlVmFsdWU6IHN0cmluZ1xuKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHJldHVybkNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dDtcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpKSB7XG5cdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW3NBdHRyaWJ1dGVWYWx1ZV07XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgb0RhdGEpO1xuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRwYXRoOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHRcdGRlbGV0ZSBteVN0b3JlW3NBdHRyaWJ1dGVWYWx1ZV07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBzQXR0cmlidXRlTmFtZSwgc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBhcGlWZXJzaW9uIFRoZSBBUEkgdmVyc2lvbiBvZiB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGFwaVZlcnNpb24/OiBudW1iZXJcbikge1xuXHRjb25zdCBvRGVmaW5pdGlvblByb3BlcnRpZXMgPSBvTWV0YWRhdGEucHJvcGVydGllcztcblxuXHQvLyBSZXRyaWV2ZSBwcm9wZXJ0aWVzIHZhbHVlc1xuXHRjb25zdCBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMob0RlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IGRlZXBDbG9uZShvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgfHwge30pOyAvLyBUbyBhdm9pZCB2YWx1ZXMgYmVpbmcgcmV1c2VkIGFjcm9zcyBtYWNyb3Ncblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYyA9PT0gZmFsc2UpIHtcblx0XHRcdExvZy5lcnJvcihgUHJvcGVydHkgJHtzS2V5VmFsdWV9IHdhcyBpZ25vcmVkIGFzIGl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIHVzYWdlYCk7XG5cdFx0fSBlbHNlIGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSkge1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGUob05vZGUsIG9Ob2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKHNLZXlWYWx1ZSkgYXMgQXR0cik7XG5cdFx0XHRsZXQgdlZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQgJiYgdlZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdGxldCByZXNvbHZlZFZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyID0gdlZhbHVlO1xuXHRcdFx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMiAmJiB0eXBlb2YgdlZhbHVlID09PSBcInN0cmluZ1wiICYmICF2VmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZSA9IE51bWJlcih2VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dlZhbHVlID0gdlZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gcmVzb2x2ZWRWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9TZXR0aW5ncyBUaGUgc2V0dGluZ3Mgb2JqZWN0XG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gbUNvbnRleHRzIFRoZSBjb250ZXh0cyB0byBiZSB1c2VkXG4gKiBAcGFyYW0gb01ldGFkYXRhQ29udGV4dHNcdFRoZSBtZXRhZGF0YSBjb250ZXh0cyB0byBiZSB1c2VkXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIGFuZCBtaXNzaW5nIGNvbnRleHRzXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb250ZXh0cyhcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD5cbikge1xuXHRvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoID0gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5jb250ZXh0UGF0aDtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiBvRGVmaW5pdGlvbkNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXS5pc1B1YmxpYyA9PT0gZmFsc2UgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQsIHByb2Nlc3NBZ2dyZWdhdGlvbnM/OiBGdW5jdGlvbikge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdGxldCBhZ2dyZWdhdGlvbk9iamVjdDogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogKGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIikgYXMgUGxhY2VtZW50KSB8fCBQbGFjZW1lbnQuQWZ0ZXIsXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIikgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocHJvY2Vzc0FnZ3JlZ2F0aW9ucykge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uT2JqZWN0ID0gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhjaGlsZERlZmluaXRpb24sIGFnZ3JlZ2F0aW9uT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvT3V0T2JqZWN0c1thZ2dyZWdhdGlvbk9iamVjdC5rZXldID0gYWdncmVnYXRpb25PYmplY3Q7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+LFxuXHRhcGlWZXJzaW9uPzogbnVtYmVyXG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCAmJiAhYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbiA9IHBhcnNlQWdncmVnYXRpb24ob0ZpcnN0RWxlbWVudENoaWxkLCBhZ2dyZWdhdGlvbkRlZmluaXRpb24ucHJvY2Vzc0FnZ3JlZ2F0aW9ucyk7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYXBpVmVyc2lvbiAhPT0gMikge1xuXHRcdFx0Ly8gSWYgdGhlcmUgYXJlIGFnZ3JlZ2F0aW9uIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGNoaWxkTm9kZXMgdG8gcmVzb2x2ZSB0ZW1wbGF0aW5nIGluc3RydWN0aW9uc1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRDaGlsZE5vZGVzKG9Ob2RlKTtcblx0XHR9XG5cdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgb05leHRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5pc1B1YmxpYyA9PT0gdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdHdoaWxlIChjaGlsZERlZmluaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dENoaWxkID0gY2hpbGREZWZpbml0aW9uLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRXcmFwcGVyLmFwcGVuZENoaWxkKGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZERlZmluaXRpb247XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24ucmVtb3ZlQXR0cmlidXRlKFwia2V5XCIpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24gPSBuZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IHNDaGlsZE5hbWUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmFwcGVuZENoaWxkKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNBZ2dyZWdhdGlvbk5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHQvLyBPYmplY3QgVHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyIHwgUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPj4gPSB7fTtcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9GaXJzdEVsZW1lbnRDaGlsZC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlc1thdHRyaWJ1dGVOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvL3JldHJpZXZlIG9uZSBsZXZlbCBzdWJPYmplY3QgcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViQ2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bY2hpbGRJbmRleF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN1Yk9iamVjdEtleSA9IHN1YkNoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN1YkNoaWxkQXR0cmlidXRlTmFtZXMgPSBzdWJDaGlsZC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IHN1YkNoaWxkQXR0cmlidXRlTmFtZSBvZiBzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3ViT2JqZWN0W3N1YkNoaWxkQXR0cmlidXRlTmFtZV0gPSBzdWJDaGlsZC5nZXRBdHRyaWJ1dGUoc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzW3N1Yk9iamVjdEtleV0gPSBzdWJPYmplY3Q7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0fSBlbHNlIGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcImFycmF5XCIpIHtcblx0XHRcdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjtcblx0XHRcdFx0XHRcdGNvbnN0IG9PdXRPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+W10gPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0XHRcdG15Q2hpbGRbYXR0cmlidXRlTmFtZV0gPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pixcblx0b01ldGFkYXRhQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPixcblx0b05vZGU6IEVsZW1lbnQsXG5cdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2Vcbikge1xuXHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRpZiAob05vZGUgIT09IG51bGwgJiYgb05vZGUgIT09IHVuZGVmaW5lZCAmJiBvQWdncmVnYXRpb25FbGVtZW50KSB7XG5cdFx0XHRcdC8vIHNsb3RzIGNhbiBoYXZlIDo6IGFzIGtleXMgd2hpY2ggaXMgbm90IGEgdmFsaWQgYWdncmVnYXRpb24gbmFtZSB0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZW1cblx0XHRcdFx0Y29uc3Qgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVtbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHByb2Nlc3NDdXN0b21EYXRhICYmIG9FbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW1udChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbW50KG9Ob2RlOiBFbGVtZW50LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcsIG9FbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsKSB7XG5cdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUucmVwbGFjZSgvOi9naSwgXCJfXCIpKTtcblx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHR9XG5cdHJldHVybiBvTmV3Q2hpbGQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPVxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8XG5cdFx0YCR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlfS4ke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHQvLyBUT0RPIDAwMDEgTW92ZSB0aGlzIGVsc2V3aGVyZSB0aGlzIGlzIHdlaXJkIDopXG5cdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHQob1NldHRpbmdzLm1vZGVsc1tcInNhcC5mZS5pMThuXCJdLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxuXHRjb25zdCBvTWV0YWRhdGEgPSBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubWV0YWRhdGEsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3BlbiwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbik7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0bGV0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uKTtcblxuXHRjb25zdCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IGV4dHJhUHJvcGVydHlWYWx1ZXMgfSA9IHByb2Nlc3NDb250ZXh0cyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRwcm9wZXJ0eVZhbHVlcyA9IE9iamVjdC5hc3NpZ24ocHJvcGVydHlWYWx1ZXMsIGV4dHJhUHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBCdWlsZGluZ0Jsb2NrQmFzZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGxldCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHRcdC8vY2hlY2sgZm9yIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byB2YWxpZGF0ZSAvIG92ZXJ3cml0ZSBwYXJhbWV0ZXJzXG5cdFx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uPy5tZXRhZGF0YT8ucHJvcGVydGllc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChvcmlnaW5hbERlZmluaXRpb24/LnZhbGlkYXRlKSB7XG5cdFx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRhcmdldE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoc0NvbnRleHRQYXRoKSE7XG5cdFx0XHRcdFx0XHRkZWxldGUgbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBuZXdDb250ZXh0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdCBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gS2VlcCB0cmFja1xuXHRcdGlmIChUcmFjZUluZm8uaXNUcmFjZUluZm9BY3RpdmUoKSkge1xuXHRcdFx0Y29uc3Qgb1RyYWNlSW5mbyA9IFRyYWNlSW5mby50cmFjZU1hY3JvQ2FsbHMoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlLCBvVmlzaXRvcik7XG5cdFx0XHRpZiAob1RyYWNlSW5mbyAmJiAob1RyYWNlSW5mbyBhcyBUcmFjZU1ldGFkYXRhQ29udGV4dCkubWFjcm9JbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSAob1RyYWNlSW5mbyBhcyBUcmFjZU1ldGFkYXRhQ29udGV4dCkubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCB0ZW1wbGF0ZVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMiAmJiBvSW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0dGVtcGxhdGVTdHJpbmcgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgaGFzRXJyb3IgPSBcIlwiO1xuXHRcdFx0XHRpZiAodGVtcGxhdGVTdHJpbmcpIHtcblx0XHRcdFx0XHRsZXQgaGFzUGFyc2VFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKHRlbXBsYXRlU3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlKTtcblx0XHRcdFx0XHQvLyBGb3Igc2FmZXR5IHB1cnBvc2Ugd2UgdHJ5IHRvIGRldGVjdCB0cmFpbGluZyB0ZXh0IGluIGJldHdlZW4gWE1MIFRhZ3Ncblx0XHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGFyc2VkVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZXIgPSBkb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdFx0aGFzUGFyc2VFcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR3aGlsZSAodGV4dG5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRleHRub2RlLnRleHRDb250ZW50ICYmIHRleHRub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGFzRXJyb3IgPSB0ZXh0bm9kZS50ZXh0Q29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaGFzUGFyc2VFcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpbml0aWFsVGVtcGxhdGUgPSBvSW5zdGFuY2U/LmdldFRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUob05vZGUpXG5cdFx0XHRcdFx0XHRcdFx0OiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSEocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHRcdFx0XHRwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yVGV4dCA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXHRcdFx0XHRcdG9Ob2RlID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9Ob2RlLCBwcm9jZXNzQ3VzdG9tRGF0YSk7XG5cdFx0XHRcdFx0cHJvY2Vzc0N1c3RvbURhdGEgPSBmYWxzZTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci52aXNpdE5vZGUob05vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZywgZSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9LFxuXHRvTWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dCB8IHVuZGVmaW5lZD5cbikge1xuXHRjb25zdCBzS2V5ID0gKG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZCkgYXMgc3RyaW5nO1xuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHQpO1xuXHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ueG1sVGFnIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCwgc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGVycm9yU3RhY2sgPSBcIlwiO1xuXHRpZiAoc3RhY2spIHtcblx0XHRjb25zdCBzdGFja0Zvcm1hdHRlZCA9IGJ0b2EoYDxwcmU+JHtzdGFja308L3ByZT5gKTtcblx0XHRlcnJvclN0YWNrID0geG1sYDxtOkZvcm1hdHRlZFRleHQgaHRtbFRleHQ9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke3N0YWNrRm9ybWF0dGVkfScpIH1gfVwiIC8+YDtcblx0fVxuXHRsZXQgYWRkaXRpb25hbFRleHQgPSBcIlwiO1xuXHRpZiAoYWRkaXRpb25hbERhdGEpIHtcblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tGb3JtYXR0ZXInfVwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdDxncmlkOkNTU0dyaWQgZ3JpZFRlbXBsYXRlUm93cz1cImZyXCIgZ3JpZFRlbXBsYXRlQ29sdW1ucz1cInJlcGVhdCgyLDFmcilcIiBncmlkR2FwPVwiMXJlbVwiIHhtbG5zOmdyaWQ9XCJzYXAudWkubGF5b3V0LmNzc2dyaWRcIiA+XG5cdFx0XHRcdFx0PG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJ4bWxcIiB2YWx1ZT1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7YnRvYSh4bWxGcmFnbWVudC5yZXBsYWNlQWxsKFwiJmd0O1wiLCBcIj5cIikpfScpIH1gfVwiIGhlaWdodD1cIjMwMHB4XCIgLz5cblx0XHRcdFx0XHQ8L206VkJveD5cblx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHQ8L2dyaWQ6Q1NTR3JpZD5cblx0XHRcdDwvbTpWQm94PmA7XG59XG5cbmNvbnN0IG15U3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5mdW5jdGlvbiBzdG9yZVZhbHVlKHZhbHVlczogdW5rbm93bikge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdG15U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWVzO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBhZGREZWZhdWx0TmFtZXNwYWNlcyBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIGRlZmF1bHQgbmFtZXNwYWNlXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50W10ge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRjb25zdCBjaGlsZHJlbiA9IG91dHB1dD8ucGFyZW50RWxlbWVudCA/IG91dHB1dD8ucGFyZW50RWxlbWVudC5jaGlsZHJlbiA6IFtvdXRwdXQgYXMgRWxlbWVudF07XG5cdHJldHVybiBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cjogc3RyaW5nKSB7XG5cdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdGlmICh4bWxSZXN1bHQubGVuZ3RoID4gMCAhPT0gdW5kZWZpbmVkICYmIHhtbFJlc3VsdFswXT8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuXHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb3V0U3RyO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzQnVpbGRpbmdCbG9ja0Jhc2UoYmI6IEJ1aWxkaW5nQmxvY2tCYXNlIHwgdW5rbm93bik6IGJiIGlzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cmV0dXJuIChiYiBhcyBCdWlsZGluZ0Jsb2NrQmFzZSk/LmdldFRlbXBsYXRlICE9PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBYTUxQcm9jZXNzb3JUeXBlVmFsdWUgPVxuXHR8IHN0cmluZ1xuXHR8IGJvb2xlYW5cblx0fCBudW1iZXJcblx0fCB1bmRlZmluZWRcblx0fCBudWxsXG5cdHwgb2JqZWN0XG5cdHwgQnVpbGRpbmdCbG9ja0Jhc2Vcblx0fCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHR8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPlxuXHR8IEFycmF5PHN0cmluZz5cblx0fCBBcnJheTxGdW5jdGlvbj5cblx0fCBGdW5jdGlvblxuXHR8IENvbnRleHQ7XG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IFhNTFByb2Nlc3NvclR5cGVWYWx1ZVtdKSA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIChkZXRlcm1pbmVkIGJ5IF90eXBlKSB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKGlzQnVpbGRpbmdCbG9ja0Jhc2UodmFsdWUpKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUuZ2V0VGVtcGxhdGUhKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdG91dFN0ciArPSBcInt0aGlzPnVuZGVmaW5lZFZhbHVlfVwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRpZiAoaXNDb250ZXh0KHZhbHVlKSkge1xuXHRcdFx0XHRvdXRTdHIgKz0gdmFsdWUuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlKTtcblx0XHRcdFx0b3V0U3RyICs9IGAke3Byb3BlcnR5VUlkfWA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCI8XCIpICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiJmx0O1wiKSkge1xuXHRcdFx0b3V0U3RyICs9IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlO1xuXHRcdH1cblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0b3V0U3RyID0gb3V0U3RyLnRyaW0oKTtcblx0aWYgKGlzVHJhY2VNb2RlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7RUF3S08sZ0JBQWdCQSxNQUFNLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFO0lBQzNDLElBQUksT0FBT0YsTUFBTSxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7TUFDbEQsSUFBSUcsUUFBUSxHQUFHSCxNQUFNLGlCQUFpQixFQUFFO1FBQUVJLElBQUk7UUFBRUMsSUFBSTtRQUFFQyxNQUFNO01BQzVELFNBQVNDLE1BQU0sQ0FBQ0MsTUFBTSxFQUFFO1FBQ3ZCLElBQUk7VUFDSCxPQUFPLENBQUMsQ0FBQ0osSUFBSSxHQUFHRCxRQUFRLENBQUNNLElBQUksRUFBRSxFQUFFQyxJQUFJLEtBQUssQ0FBQ1IsS0FBSyxJQUFJLENBQUNBLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDOURNLE1BQU0sR0FBR1AsSUFBSSxDQUFDRyxJQUFJLENBQUNPLEtBQUssQ0FBQztZQUN6QixJQUFJSCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0ksSUFBSSxFQUFFO2NBQzFCLElBQUksZUFBZUosTUFBTSxDQUFDLEVBQUU7Z0JBQzNCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssQ0FBQztjQUNsQixDQUFDLE1BQU07Z0JBQ05MLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDTCxNQUFNLEVBQUVELE1BQU0sS0FBS0EsTUFBTSxHQUFHLFFBQVFRLElBQUksQ0FBQyxJQUFJLEVBQUVULElBQUksR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkY7Y0FDRDtZQUNEO1VBQ0Q7VUFDQSxJQUFJQSxJQUFJLEVBQUU7WUFDVCxRQUFRQSxJQUFJLEVBQUUsQ0FBQyxFQUFFRyxNQUFNLENBQUM7VUFDekIsQ0FBQyxNQUFNO1lBQ05ILElBQUksR0FBR0csTUFBTTtVQUNkO1FBQ0QsQ0FBQyxDQUFDLE9BQU9PLENBQUMsRUFBRTtVQUNYLFFBQVFWLElBQUksS0FBS0EsSUFBSSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRVUsQ0FBQyxDQUFDO1FBQzVDO01BQ0Q7TUFDQVIsTUFBTSxFQUFFO01BQ1IsSUFBSUosUUFBUSxDQUFDYSxNQUFNLEVBQUU7UUFDcEIsSUFBSUMsTUFBTSxHQUFHLFVBQVNOLEtBQUssRUFBRTtVQUM1QixJQUFJO1lBQ0gsSUFBSSxDQUFDUCxJQUFJLENBQUNNLElBQUksRUFBRTtjQUNmUCxRQUFRLENBQUNhLE1BQU0sRUFBRTtZQUNsQjtVQUNELENBQUMsQ0FBQyxPQUFNRCxDQUFDLEVBQUUsQ0FDWDtVQUNBLE9BQU9KLEtBQUs7UUFDYixDQUFDO1FBQ0QsSUFBSU4sSUFBSSxJQUFJQSxJQUFJLENBQUNPLElBQUksRUFBRTtVQUN0QixPQUFPUCxJQUFJLENBQUNPLElBQUksQ0FBQ0ssTUFBTSxFQUFFLFVBQVNGLENBQUMsRUFBRTtZQUNwQyxNQUFNRSxNQUFNLENBQUNGLENBQUMsQ0FBQztVQUNoQixDQUFDLENBQUM7UUFDSDtRQUNBRSxNQUFNLEVBQUU7TUFDVDtNQUNBLE9BQU9aLElBQUk7SUFDWjtJQUNBO0lBQ0EsSUFBSSxFQUFFLFFBQVEsSUFBSUwsTUFBTSxDQUFDLEVBQUU7TUFDMUIsTUFBTSxJQUFJa0IsU0FBUyxDQUFDLHdCQUF3QixDQUFDO0lBQzlDO0lBQ0E7SUFDQSxJQUFJQyxNQUFNLEdBQUcsRUFBRTtJQUNmLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHcEIsTUFBTSxDQUFDcUIsTUFBTSxFQUFFRCxDQUFDLEVBQUUsRUFBRTtNQUN2Q0QsTUFBTSxDQUFDRyxJQUFJLENBQUN0QixNQUFNLENBQUNvQixDQUFDLENBQUMsQ0FBQztJQUN2QjtJQUNBLE9BQU8sT0FBT0QsTUFBTSxFQUFFLFVBQVNDLENBQUMsRUFBRTtNQUFFLE9BQU9uQixJQUFJLENBQUNrQixNQUFNLENBQUNDLENBQUMsQ0FBQyxDQUFDO0lBQUUsQ0FBQyxFQUFFbEIsS0FBSyxDQUFDO0VBQ3RFO0VBN0dPLGdCQUFnQnFCLEtBQUssRUFBRXRCLElBQUksRUFBRUMsS0FBSyxFQUFFO0lBQzFDLElBQUlrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQUVmLElBQUk7TUFBRUMsTUFBTTtJQUN4QixTQUFTQyxNQUFNLENBQUNDLE1BQU0sRUFBRTtNQUN2QixJQUFJO1FBQ0gsT0FBTyxFQUFFWSxDQUFDLEdBQUdHLEtBQUssQ0FBQ0YsTUFBTSxLQUFLLENBQUNuQixLQUFLLElBQUksQ0FBQ0EsS0FBSyxFQUFFLENBQUMsRUFBRTtVQUNsRE0sTUFBTSxHQUFHUCxJQUFJLENBQUNtQixDQUFDLENBQUM7VUFDaEIsSUFBSVosTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQUksRUFBRTtZQUMxQixJQUFJLGVBQWVKLE1BQU0sQ0FBQyxFQUFFO2NBQzNCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssQ0FBQztZQUNsQixDQUFDLE1BQU07Y0FDTkwsTUFBTSxDQUFDSSxJQUFJLENBQUNMLE1BQU0sRUFBRUQsTUFBTSxLQUFLQSxNQUFNLEdBQUcsUUFBUVEsSUFBSSxDQUFDLElBQUksRUFBRVQsSUFBSSxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQ25GO1lBQ0Q7VUFDRDtRQUNEO1FBQ0EsSUFBSUEsSUFBSSxFQUFFO1VBQ1QsUUFBUUEsSUFBSSxFQUFFLENBQUMsRUFBRUcsTUFBTSxDQUFDO1FBQ3pCLENBQUMsTUFBTTtVQUNOSCxJQUFJLEdBQUdHLE1BQU07UUFDZDtNQUNELENBQUMsQ0FBQyxPQUFPTyxDQUFDLEVBQUU7UUFDWCxRQUFRVixJQUFJLEtBQUtBLElBQUksR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUVVLENBQUMsQ0FBQztNQUM1QztJQUNEO0lBQ0FSLE1BQU0sRUFBRTtJQUNSLE9BQU9GLElBQUk7RUFDWjtFQXdCTyxJQUFNLGtCQUFrQixhQUFjLE9BQU9tQixNQUFNLEtBQUssV0FBVyxHQUFJQSxNQUFNLENBQUNyQixRQUFRLEtBQUtxQixNQUFNLENBQUNyQixRQUFRLEdBQUdxQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFJLFlBQVk7RUFBQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQTdIeEosaUJBQWlCbkIsSUFBSSxFQUFFb0IsS0FBSyxFQUFFZCxLQUFLLEVBQUU7SUFDM0MsSUFBSSxDQUFDTixJQUFJLENBQUNxQixDQUFDLEVBQUU7TUFDWixJQUFJZixLQUFLLGlCQUFpQixFQUFFO1FBQzNCLElBQUlBLEtBQUssQ0FBQ2UsQ0FBQyxFQUFFO1VBQ1osSUFBSUQsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNkQSxLQUFLLEdBQUdkLEtBQUssQ0FBQ2UsQ0FBQztVQUNoQjtVQUNBZixLQUFLLEdBQUdBLEtBQUssQ0FBQ0UsQ0FBQztRQUNoQixDQUFDLE1BQU07VUFDTkYsS0FBSyxDQUFDZ0IsQ0FBQyxHQUFHLFFBQVFiLElBQUksQ0FBQyxJQUFJLEVBQUVULElBQUksRUFBRW9CLEtBQUssQ0FBQztVQUN6QztRQUNEO01BQ0Q7TUFDQSxJQUFJZCxLQUFLLElBQUlBLEtBQUssQ0FBQ0MsSUFBSSxFQUFFO1FBQ3hCRCxLQUFLLENBQUNDLElBQUksQ0FBQyxRQUFRRSxJQUFJLENBQUMsSUFBSSxFQUFFVCxJQUFJLEVBQUVvQixLQUFLLENBQUMsRUFBRSxRQUFRWCxJQUFJLENBQUMsSUFBSSxFQUFFVCxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEU7TUFDRDtNQUNBQSxJQUFJLENBQUNxQixDQUFDLEdBQUdELEtBQUs7TUFDZHBCLElBQUksQ0FBQ1EsQ0FBQyxHQUFHRixLQUFLO01BQ2QsSUFBTWlCLFFBQVEsR0FBR3ZCLElBQUksQ0FBQ3NCLENBQUM7TUFDdkIsSUFBSUMsUUFBUSxFQUFFO1FBQ2JBLFFBQVEsQ0FBQ3ZCLElBQUksQ0FBQztNQUNmO0lBQ0Q7RUFDRDtFQTlETyxJQUFNLFFBQVEsYUFBYyxZQUFXO0lBQzdDLGlCQUFpQixDQUFDO0lBQ2xCLE1BQU13QixTQUFTLENBQUNqQixJQUFJLEdBQUcsVUFBU2tCLFdBQVcsRUFBRUMsVUFBVSxFQUFFO01BQ3hELElBQU12QixNQUFNLEdBQUcsV0FBVztNQUMxQixJQUFNaUIsS0FBSyxHQUFHLElBQUksQ0FBQ0MsQ0FBQztNQUNwQixJQUFJRCxLQUFLLEVBQUU7UUFDVixJQUFNTyxRQUFRLEdBQUdQLEtBQUssR0FBRyxDQUFDLEdBQUdLLFdBQVcsR0FBR0MsVUFBVTtRQUNyRCxJQUFJQyxRQUFRLEVBQUU7VUFDYixJQUFJO1lBQ0gsUUFBUXhCLE1BQU0sRUFBRSxDQUFDLEVBQUV3QixRQUFRLENBQUMsSUFBSSxDQUFDbkIsQ0FBQyxDQUFDLENBQUM7VUFDckMsQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtZQUNYLFFBQVFQLE1BQU0sRUFBRSxDQUFDLEVBQUVPLENBQUMsQ0FBQztVQUN0QjtVQUNBLE9BQU9QLE1BQU07UUFDZCxDQUFDLE1BQU07VUFDTixPQUFPLElBQUk7UUFDWjtNQUNEO01BQ0EsSUFBSSxDQUFDbUIsQ0FBQyxHQUFHLFVBQVNNLEtBQUssRUFBRTtRQUN4QixJQUFJO1VBQ0gsSUFBTXRCLEtBQUssR0FBR3NCLEtBQUssQ0FBQ3BCLENBQUM7VUFDckIsSUFBSW9CLEtBQUssQ0FBQ1AsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQixRQUFRbEIsTUFBTSxFQUFFLENBQUMsRUFBRXNCLFdBQVcsR0FBR0EsV0FBVyxDQUFDbkIsS0FBSyxDQUFDLEdBQUdBLEtBQUssQ0FBQztVQUM3RCxDQUFDLE1BQU0sSUFBSW9CLFVBQVUsRUFBRTtZQUN0QixRQUFRdkIsTUFBTSxFQUFFLENBQUMsRUFBRXVCLFVBQVUsQ0FBQ3BCLEtBQUssQ0FBQyxDQUFDO1VBQ3RDLENBQUMsTUFBTTtZQUNOLFFBQVFILE1BQU0sRUFBRSxDQUFDLEVBQUVHLEtBQUssQ0FBQztVQUMxQjtRQUNELENBQUMsQ0FBQyxPQUFPSSxDQUFDLEVBQUU7VUFDWCxRQUFRUCxNQUFNLEVBQUUsQ0FBQyxFQUFFTyxDQUFDLENBQUM7UUFDdEI7TUFDRCxDQUFDO01BQ0QsT0FBT1AsTUFBTTtJQUNkLENBQUM7SUFDRDtFQUNELENBQUMsRUFBRztFQTZCRyx3QkFBd0IwQixRQUFRLEVBQUU7SUFDeEMsT0FBT0EsUUFBUSxpQkFBaUIsSUFBSUEsUUFBUSxDQUFDUixDQUFDLEdBQUcsQ0FBQztFQUNuRDtFQTRMTyxjQUFjUyxJQUFJLEVBQUVDLE1BQU0sRUFBRW5DLElBQUksRUFBRTtJQUN4QyxJQUFJb0MsS0FBSztJQUNULFNBQVM7TUFDUixJQUFJQyxjQUFjLEdBQUdILElBQUksRUFBRTtNQUMzQixJQUFJLGVBQWVHLGNBQWMsQ0FBQyxFQUFFO1FBQ25DQSxjQUFjLEdBQUdBLGNBQWMsQ0FBQ3pCLENBQUM7TUFDbEM7TUFDQSxJQUFJLENBQUN5QixjQUFjLEVBQUU7UUFDcEIsT0FBTzlCLE1BQU07TUFDZDtNQUNBLElBQUk4QixjQUFjLENBQUMxQixJQUFJLEVBQUU7UUFDeEJ5QixLQUFLLEdBQUcsQ0FBQztRQUNUO01BQ0Q7TUFDQSxJQUFJN0IsTUFBTSxHQUFHUCxJQUFJLEVBQUU7TUFDbkIsSUFBSU8sTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQUksRUFBRTtRQUMxQixJQUFJLGVBQWVKLE1BQU0sQ0FBQyxFQUFFO1VBQzNCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ2tCLENBQUM7UUFDbEIsQ0FBQyxNQUFNO1VBQ05XLEtBQUssR0FBRyxDQUFDO1VBQ1Q7UUFDRDtNQUNEO01BQ0EsSUFBSUQsTUFBTSxFQUFFO1FBQ1gsSUFBSUcsV0FBVyxHQUFHSCxNQUFNLEVBQUU7UUFDMUIsSUFBSUcsV0FBVyxJQUFJQSxXQUFXLENBQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlMkIsV0FBVyxDQUFDLEVBQUU7VUFDcEVGLEtBQUssR0FBRyxDQUFDO1VBQ1Q7UUFDRDtNQUNEO0lBQ0Q7SUFDQSxJQUFJaEMsSUFBSSxHQUFHLFdBQVc7SUFDdEIsSUFBSUMsTUFBTSxHQUFHLFFBQVFRLElBQUksQ0FBQyxJQUFJLEVBQUVULElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQ2dDLEtBQUssS0FBSyxDQUFDLEdBQUdDLGNBQWMsQ0FBQzFCLElBQUksQ0FBQzRCLGdCQUFnQixDQUFDLEdBQUdILEtBQUssS0FBSyxDQUFDLEdBQUc3QixNQUFNLENBQUNJLElBQUksQ0FBQzZCLGdCQUFnQixDQUFDLEdBQUdGLFdBQVcsQ0FBQzNCLElBQUksQ0FBQzhCLGtCQUFrQixDQUFDLEVBQUU5QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUVOLE1BQU0sQ0FBQztJQUMvSixPQUFPRCxJQUFJO0lBQ1gsU0FBU29DLGdCQUFnQixDQUFDOUIsS0FBSyxFQUFFO01BQ2hDSCxNQUFNLEdBQUdHLEtBQUs7TUFDZCxHQUFHO1FBQ0YsSUFBSXlCLE1BQU0sRUFBRTtVQUNYRyxXQUFXLEdBQUdILE1BQU0sRUFBRTtVQUN0QixJQUFJRyxXQUFXLElBQUlBLFdBQVcsQ0FBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUyQixXQUFXLENBQUMsRUFBRTtZQUNwRUEsV0FBVyxDQUFDM0IsSUFBSSxDQUFDOEIsa0JBQWtCLENBQUMsQ0FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRU4sTUFBTSxDQUFDO1lBQ3pEO1VBQ0Q7UUFDRDtRQUNBZ0MsY0FBYyxHQUFHSCxJQUFJLEVBQUU7UUFDdkIsSUFBSSxDQUFDRyxjQUFjLElBQUssZUFBZUEsY0FBYyxDQUFDLElBQUksQ0FBQ0EsY0FBYyxDQUFDekIsQ0FBRSxFQUFFO1VBQzdFLFFBQVFSLElBQUksRUFBRSxDQUFDLEVBQUVHLE1BQU0sQ0FBQztVQUN4QjtRQUNEO1FBQ0EsSUFBSThCLGNBQWMsQ0FBQzFCLElBQUksRUFBRTtVQUN4QjBCLGNBQWMsQ0FBQzFCLElBQUksQ0FBQzRCLGdCQUFnQixDQUFDLENBQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUVOLE1BQU0sQ0FBQztVQUMxRDtRQUNEO1FBQ0FFLE1BQU0sR0FBR1AsSUFBSSxFQUFFO1FBQ2YsSUFBSSxlQUFlTyxNQUFNLENBQUMsRUFBRTtVQUMzQkEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLENBQUM7UUFDbEI7TUFDRCxDQUFDLFFBQVEsQ0FBQ0wsTUFBTSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0ksSUFBSTtNQUNoQ0osTUFBTSxDQUFDSSxJQUFJLENBQUM2QixnQkFBZ0IsQ0FBQyxDQUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFTixNQUFNLENBQUM7SUFDbkQ7SUFDQSxTQUFTa0MsZ0JBQWdCLENBQUNGLGNBQWMsRUFBRTtNQUN6QyxJQUFJQSxjQUFjLEVBQUU7UUFDbkI5QixNQUFNLEdBQUdQLElBQUksRUFBRTtRQUNmLElBQUlPLE1BQU0sSUFBSUEsTUFBTSxDQUFDSSxJQUFJLEVBQUU7VUFDMUJKLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDNkIsZ0JBQWdCLENBQUMsQ0FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRU4sTUFBTSxDQUFDO1FBQ25ELENBQUMsTUFBTTtVQUNObUMsZ0JBQWdCLENBQUNqQyxNQUFNLENBQUM7UUFDekI7TUFDRCxDQUFDLE1BQU07UUFDTixRQUFRSCxJQUFJLEVBQUUsQ0FBQyxFQUFFRyxNQUFNLENBQUM7TUFDekI7SUFDRDtJQUNBLFNBQVNrQyxrQkFBa0IsR0FBRztNQUM3QixJQUFJSixjQUFjLEdBQUdILElBQUksRUFBRSxFQUFFO1FBQzVCLElBQUlHLGNBQWMsQ0FBQzFCLElBQUksRUFBRTtVQUN4QjBCLGNBQWMsQ0FBQzFCLElBQUksQ0FBQzRCLGdCQUFnQixDQUFDLENBQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUVOLE1BQU0sQ0FBQztRQUMzRCxDQUFDLE1BQU07VUFDTmtDLGdCQUFnQixDQUFDRixjQUFjLENBQUM7UUFDakM7TUFDRCxDQUFDLE1BQU07UUFDTixRQUFRakMsSUFBSSxFQUFFLENBQUMsRUFBRUcsTUFBTSxDQUFDO01BQ3pCO0lBQ0Q7RUFDRDtFQStOTyxnQkFBZ0JQLElBQUksRUFBRTBDLE9BQU8sRUFBRTtJQUNyQyxJQUFJO01BQ0gsSUFBSW5DLE1BQU0sR0FBR1AsSUFBSSxFQUFFO0lBQ3BCLENBQUMsQ0FBQyxPQUFNYyxDQUFDLEVBQUU7TUFDVixPQUFPNEIsT0FBTyxDQUFDNUIsQ0FBQyxDQUFDO0lBQ2xCO0lBQ0EsSUFBSVAsTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQUksRUFBRTtNQUMxQixPQUFPSixNQUFNLENBQUNJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRStCLE9BQU8sQ0FBQztJQUNwQztJQUNBLE9BQU9uQyxNQUFNO0VBQ2Q7RUFBQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLElBNkpjb0Msb0JBQW9CLGFBQ2xDQyx1QkFBZ0QsRUFDaERDLEtBQWMsRUFDZEMsUUFBMEI7SUFBQSxJQUMxQkMsUUFBUSx1RUFBRyxLQUFLO0lBQUEsSUFDZjtNQUNELElBQU1DLGFBQWEsR0FDbEJKLHVCQUF1QixDQUFDSyxRQUFRLGNBQzdCTCx1QkFBdUIsQ0FBQ00sU0FBUyxjQUFJTix1QkFBdUIsQ0FBQ08sTUFBTSxJQUFJUCx1QkFBdUIsQ0FBQ1EsSUFBSSxDQUFFO01BRXpHLElBQU1DLEtBQUssR0FBRyxNQUFNO01BRXBCLElBQU1DLFNBQWtDLEdBQUcsQ0FBQyxDQUFDO01BQzdDLElBQU1DLGlCQUEwQyxHQUFHLENBQUMsQ0FBQztNQUNyRCxJQUFNQyxTQUFTLEdBQUdWLFFBQVEsQ0FBQ1csV0FBVyxFQUFFO01BQ3hDO01BQ0EsSUFBSUQsU0FBUyxDQUFDRSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDbkNGLFNBQVMsQ0FBQ0UsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDQyxpQkFBaUIsRUFBRSxDQUNsRGhELElBQUksQ0FBQyxVQUFVaUQsZUFBK0IsRUFBRTtVQUNoREMsYUFBYSxDQUFDQyx3QkFBd0IsQ0FBQ0YsZUFBZSxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUNERyxLQUFLLENBQUMsVUFBVUMsS0FBYyxFQUFFO1VBQ2hDQyxHQUFHLENBQUNELEtBQUssQ0FBQ0EsS0FBSyxDQUFXO1FBQzNCLENBQUMsQ0FBQztNQUNKO01BQ0EsSUFBTUUsU0FBUyxHQUFHQyxlQUFlLENBQUN2Qix1QkFBdUIsQ0FBQ3dCLFFBQVEsRUFBRXhCLHVCQUF1QixDQUFDeUIsTUFBTSxFQUFFekIsdUJBQXVCLENBQUMwQixVQUFVLENBQUM7O01BRXZJO01BQ0EsSUFBSSxDQUFDZCxTQUFTLENBQUNSLGFBQWEsQ0FBQyxFQUFFO1FBQzlCUSxTQUFTLENBQUNSLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUM5Qjs7TUFFQTtNQUFBLHVCQUMyQnVCLGlCQUFpQixDQUFDTCxTQUFTLEVBQUVyQixLQUFLLEVBQUVFLFFBQVEsRUFBRUQsUUFBUSxFQUFFRix1QkFBdUIsQ0FBQzBCLFVBQVUsQ0FBQyxpQkFBbEhFLGNBQWM7UUFFbEIsdUJBQWlFQyxlQUFlLENBQy9FUCxTQUFTLEVBQ1RWLFNBQVMsRUFDVFgsS0FBSyxFQUNMRSxRQUFRLEVBQ1JELFFBQVEsRUFDUlEsU0FBUyxFQUNUQyxpQkFBaUIsQ0FDakI7VUFST21CLGVBQWUsb0JBQWZBLGVBQWU7VUFBa0JDLG1CQUFtQixvQkFBbkNILGNBQWM7UUFTdkNBLGNBQWMsR0FBR0ksTUFBTSxDQUFDQyxNQUFNLENBQUNMLGNBQWMsRUFBRUcsbUJBQW1CLENBQUM7UUFDbkUsSUFBTUcsV0FBVyxHQUFHRixNQUFNLENBQUNHLElBQUksQ0FBQ1AsY0FBYyxDQUFDO1FBQUMsaUNBQzVDO1VBQ0g7VUFBQSx1QkFDNEJRLGVBQWUsQ0FDMUNuQyxLQUFLLEVBQ0xDLFFBQVEsRUFDUm9CLFNBQVMsRUFDVG5CLFFBQVEsRUFDUnlCLGNBQWMsRUFDZDVCLHVCQUF1QixDQUFDMEIsVUFBVSxDQUNsQyxpQkFQS1csYUFBYTtZQUFBO2NBQUEsSUFvTWZDLGtCQUFrQjtnQkFDckI7Z0JBQ0ExQixTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcwQixrQkFBa0I7Y0FBQztnQkFFN0MsT0FBTzFCLFNBQVMsQ0FBQyxZQUFZLENBQUM7Y0FBQztZQUFBO1lBaE1oQyxJQUFJMkIsU0FBd0M7WUFDNUMsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUV2QixJQUFJNUIsU0FBUyxDQUFDRSxNQUFNLENBQUMyQixRQUFRLEVBQUU7Y0FDOUI7Y0FDQUQsY0FBYyxHQUFHNUIsU0FBUyxDQUFDRSxNQUFNLENBQUMyQixRQUFRLENBQUNDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQztZQUNoRjtZQUNBLElBQUlDLHVCQUF1QixHQUFHZixjQUFjO1lBQzVDLElBQUlnQixZQUFZLENBQUM1Qyx1QkFBdUIsQ0FBQyxJQUFJQSx1QkFBdUIsQ0FBQzZDLE1BQU0sRUFBRTtjQUM1RUYsdUJBQXVCLEdBQUczQyx1QkFBdUIsQ0FBQzZDLE1BQU0sQ0FBQ0MsSUFBSSxDQUM1RDlDLHVCQUF1QixFQUN2QjRCLGNBQWMsRUFDZFksY0FBYyxFQUNkNUIsU0FBUyxFQUNUeUIsYUFBYSxFQUNibEMsUUFBUSxDQUNSO2NBQ0Q2QixNQUFNLENBQUNHLElBQUksQ0FBQ2IsU0FBUyxDQUFDeUIsZ0JBQWdCLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFVBQVVDLGFBQXFCLEVBQUU7Z0JBQ2hGLElBQUkzQixTQUFTLENBQUN5QixnQkFBZ0IsQ0FBQ0UsYUFBYSxDQUFDLENBQUNDLFFBQVEsS0FBSyxJQUFJLEVBQUU7a0JBQ2hFeEMsU0FBUyxDQUFDdUMsYUFBYSxDQUFDLEdBQUdOLHVCQUF1QixDQUFDTSxhQUFhLENBQXVCO2dCQUN4RjtjQUNELENBQUMsQ0FBQztjQUNGakIsTUFBTSxDQUFDRyxJQUFJLENBQUNMLGVBQWUsQ0FBQyxDQUFDa0IsT0FBTyxDQUFDLFVBQVVHLFlBQW9CLEVBQUU7Z0JBQ3BFLElBQUlSLHVCQUF1QixDQUFDUyxjQUFjLENBQUNELFlBQVksQ0FBQyxFQUFFO2tCQUN6RHpDLFNBQVMsQ0FBQ3lDLFlBQVksQ0FBQyxHQUFHUix1QkFBdUIsQ0FBQ1EsWUFBWSxDQUF1QjtnQkFDdEY7Y0FDRCxDQUFDLENBQUM7WUFDSCxDQUFDLE1BQU0sSUFBSW5ELHVCQUF1QixDQUFDMEIsVUFBVSxLQUFLLENBQUMsRUFBRTtjQUNwRE0sTUFBTSxDQUFDRyxJQUFJLENBQUNQLGNBQWMsQ0FBQyxDQUFDb0IsT0FBTyxDQUFDLFVBQUNLLFFBQVEsRUFBSztnQkFBQTtnQkFDakQsSUFBSUMsS0FBSyxHQUFHMUIsY0FBYyxDQUFDeUIsUUFBUSxDQUF1QjtnQkFDMUQ7Z0JBQ0EsSUFBTUUsa0JBQWtCLEdBQUd2RCx1QkFBdUIsYUFBdkJBLHVCQUF1QixnREFBdkJBLHVCQUF1QixDQUFFd0IsUUFBUSwwREFBakMsc0JBQW1DZ0MsVUFBVSxDQUFDSCxRQUFRLENBQUM7Z0JBQ2xGLElBQUlFLGtCQUFrQixhQUFsQkEsa0JBQWtCLGVBQWxCQSxrQkFBa0IsQ0FBRUUsUUFBUSxFQUFFO2tCQUNqQ0gsS0FBSyxHQUFHQyxrQkFBa0IsQ0FBQ0UsUUFBUSxDQUFDSCxLQUFLLENBQUMsSUFBSUEsS0FBSztnQkFDcEQ7Z0JBQ0EsSUFDQ0EsS0FBSyxJQUNMQSxLQUFLLENBQUNJLEdBQUcsSUFDVEosS0FBSyxDQUFDSSxHQUFHLENBQUNDLG9CQUFvQixDQUFDLElBQy9CLENBQUNMLEtBQUssQ0FBQ00sUUFBUSxFQUFFLENBQUNGLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxFQUM1RDtrQkFDRDlCLGNBQWMsQ0FBQ3lCLFFBQVEsQ0FBQyxHQUFHQyxLQUFLLENBQUNPLFNBQVMsRUFBRTtnQkFDN0M7Y0FDRCxDQUFDLENBQUM7Y0FDRixJQUFNQyxrQkFBa0IsR0FBRzlELHVCQUFtRDtjQUM5RTRCLGNBQWMsQ0FBQ3pCLFFBQVEsR0FBR0EsUUFBUTtjQUVsQ29DLFNBQVMsR0FBRyxJQUFJdUIsa0JBQWtCLGlDQUM1QmxDLGNBQWMsR0FBS1MsYUFBYSxHQUNyQ0csY0FBYyxFQUNkNUI7Y0FDQSx5REFDQTs7Y0FDRCtCLHVCQUF1QixHQUFHSixTQUFTLENBQUN3QixhQUFhLEVBQUU7Y0FDbkQvQixNQUFNLENBQUNHLElBQUksQ0FBQ2IsU0FBUyxDQUFDeUIsZ0JBQWdCLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFVBQVVHLFlBQW9CLEVBQUU7Z0JBQy9FLElBQUlSLHVCQUF1QixDQUFDUyxjQUFjLENBQUNELFlBQVksQ0FBQyxFQUFFO2tCQUN6RCxJQUFNYSxZQUFZLEdBQUdyQix1QkFBdUIsQ0FBQ1EsWUFBWSxDQUFDO2tCQUMxRCxJQUFJLE9BQU9hLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQ0MsU0FBUyxDQUFDRCxZQUFZLENBQUMsRUFBRTtvQkFDakUsSUFBTUUsZUFBZSxHQUFHQyxVQUFVLENBQUNILFlBQVksQ0FBQztvQkFDaEQsSUFBTUksWUFBWSxhQUFNRixlQUFlLENBQUU7b0JBQ3pDdEQsU0FBUyxDQUFDRSxNQUFNLENBQUN1RCxnQkFBZ0IsQ0FBQ0MsV0FBVyxDQUFDRixZQUFZLEVBQUVKLFlBQVksQ0FBQztvQkFDekUsSUFBTU8sVUFBVSxHQUFHM0QsU0FBUyxDQUFDRSxNQUFNLENBQUN1RCxnQkFBZ0IsQ0FBQ0csb0JBQW9CLENBQUNKLFlBQVksQ0FBRTtvQkFDeEYsT0FBT0ssT0FBTyxDQUFDUCxlQUFlLENBQUM7b0JBQy9CeEQsU0FBUyxDQUFDeUMsWUFBWSxDQUFDLEdBQUdvQixVQUFVO2tCQUNyQyxDQUFDLE1BQU0sSUFBSSxDQUFDN0QsU0FBUyxDQUFDMEMsY0FBYyxDQUFDRCxZQUFZLENBQUMsSUFBSWEsWUFBWSxLQUFLVSxTQUFTLEVBQUU7b0JBQ2pGaEUsU0FBUyxDQUFDeUMsWUFBWSxDQUFDLEdBQUdhLFlBQXVCO2tCQUNsRDtnQkFDRDtjQUNELENBQUMsQ0FBQztZQUNIO1lBQ0EsSUFBTVcsZ0JBQTJCLEdBQUcsSUFBSUMsY0FBYyxDQUFDM0UsS0FBSyxFQUFFMEMsdUJBQXVCLEVBQUUzQyx1QkFBdUIsQ0FBQztZQUMvR1UsU0FBUyxDQUFDRCxLQUFLLENBQUMsR0FBR2tFLGdCQUFnQixDQUFDSCxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7WUFDN0QsSUFBSWxDLGtCQUF5Qzs7WUFFN0M7WUFDQSxJQUFJdUMsU0FBUyxDQUFDQyxpQkFBaUIsRUFBRSxFQUFFO2NBQ2xDLElBQU1DLFVBQVUsR0FBR0YsU0FBUyxDQUFDRyxlQUFlLENBQUM1RSxhQUFhLEVBQUVrQixTQUFTLEVBQUVaLFNBQVMsRUFBRVQsS0FBSyxFQUFFQyxRQUFRLENBQUM7Y0FDbEcsSUFBSTZFLFVBQVUsSUFBS0EsVUFBVSxDQUEwQkUsU0FBUyxFQUFFO2dCQUNqRTNDLGtCQUFrQixHQUFHMUIsU0FBUyxDQUFDLFlBQVksQ0FBQztnQkFDNUNBLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBSW1FLFVBQVUsQ0FBMEJFLFNBQVM7Y0FDekU7WUFDRDtZQUNBQyxzQkFBc0IsQ0FBQzlFLGFBQWEsRUFBRWtCLFNBQVMsRUFBRVosU0FBUyxFQUFFVCxLQUFLLENBQUM7WUFFbEUsSUFBTWtGLGVBQWUsR0FBR2pGLFFBQVEsQ0FBQ2tGLElBQUksQ0FDcEMxRSxTQUFTLEVBQ1RWLHVCQUF1QixDQUFDeUIsTUFBTSxLQUFLaUQsU0FBUyxHQUFHLENBQUMxRSx1QkFBdUIsQ0FBQ3lCLE1BQU0sR0FBRyxJQUFJLENBQ3JGO1lBQ0QsSUFBTTRELE9BQU8sR0FBR3BGLEtBQUssQ0FBQ3FGLFVBQVU7WUFFaEMsSUFBSUMsV0FBbUI7WUFDdkIsSUFBSUMsUUFBUTtZQUNaLElBQUlDLGlCQUFpQixHQUFHLElBQUk7WUFBQztjQUFBLElBQ3pCSixPQUFPO2dCQUNWRSxXQUFXLEdBQUdHLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTixPQUFPLENBQUNPLFFBQVEsQ0FBQyxDQUFDQyxPQUFPLENBQUM1RixLQUFLLENBQUM7Z0JBQ3pELElBQ0UyQyxZQUFZLENBQUM1Qyx1QkFBdUIsQ0FBQyxJQUFJQSx1QkFBdUIsQ0FBQzhGLFdBQVcsSUFDNUU5Rix1QkFBdUIsQ0FBQzBCLFVBQVUsS0FBSyxDQUFDLElBQUksQ0FBQzFCLHVCQUF1QixDQUFDSyxRQUFTLEVBQzlFO2tCQUNELElBQUkwRixjQUFrQztrQkFDdEMsSUFBSUMsbUJBQW1CLEdBQUcsS0FBSztrQkFDL0IsSUFBSWhHLHVCQUF1QixDQUFDMEIsVUFBVSxLQUFLLENBQUMsSUFBSWEsU0FBUyxLQUFLbUMsU0FBUyxFQUFFO29CQUN4RXFCLGNBQWMsR0FBR3hELFNBQVMsQ0FBQ3VELFdBQVcsQ0FBRTdGLEtBQUssQ0FBQztvQkFDOUMsSUFBSUQsdUJBQXVCLENBQUNpRyxTQUFTLEtBQUssSUFBSSxFQUFFO3NCQUMvQyxLQUFLLElBQU1DLFVBQVUsSUFBSXpCLE9BQU8sRUFBRTt3QkFDakMsSUFBTW5CLEtBQUssR0FBR21CLE9BQU8sQ0FBQ3lCLFVBQVUsQ0FBQzt3QkFDakMsSUFBTTlCLFlBQVksYUFBTThCLFVBQVUsQ0FBRTt3QkFDcEN0RixTQUFTLENBQUNFLE1BQU0sQ0FBQ3VELGdCQUFnQixDQUFDQyxXQUFXLENBQUNGLFlBQVksRUFBRWQsS0FBSyxDQUFDO3dCQUNsRSxPQUFPbUIsT0FBTyxDQUFDeUIsVUFBVSxDQUFDO3NCQUMzQjtvQkFDRDtvQkFDQUYsbUJBQW1CLEdBQUcsSUFBSTtrQkFDM0IsQ0FBQyxNQUFNLElBQUloRyx1QkFBdUIsQ0FBQzhGLFdBQVcsRUFBRTtvQkFDL0NDLGNBQWMsR0FBRy9GLHVCQUF1QixDQUFDOEYsV0FBVyxDQUFDbkQsdUJBQXVCLENBQUM7a0JBQzlFO2tCQUVBLElBQUl3RCxRQUFRLEdBQUcsRUFBRTtrQkFDakIsSUFBSUosY0FBYyxFQUFFO29CQUFBO29CQUNuQixJQUFJSyxhQUFhLEdBQUcsS0FBSztvQkFDekIsSUFBSUMsY0FBYyxHQUFHQyxjQUFjLENBQUNQLGNBQWMsRUFBRUMsbUJBQW1CLENBQUM7b0JBQ3hFO29CQUFBLDRDQUNzQkssY0FBYztzQkFBQTtvQkFBQTtzQkFBcEMsdURBQXNDO3dCQUFBLElBQTNCRSxRQUFPO3dCQUNqQixJQUFNQyxJQUFJLEdBQUdDLFFBQVEsQ0FBQ0Msa0JBQWtCLENBQUNILFFBQU8sRUFBRUksVUFBVSxDQUFDQyxTQUFTLENBQUM7d0JBQ3ZFLElBQUlDLFFBQVEsR0FBR0wsSUFBSSxDQUFDTSxRQUFRLEVBQUU7d0JBQzlCLElBQUlQLFFBQU8sQ0FBQ1EsU0FBUyxLQUFLLGFBQWEsRUFBRTswQkFDeENYLGFBQWEsR0FBRyxJQUFJO3dCQUNyQjt3QkFDQSxPQUFPUyxRQUFRLEVBQUU7MEJBQ2hCLElBQUlBLFFBQVEsQ0FBQ0csV0FBVyxJQUFJSCxRQUFRLENBQUNHLFdBQVcsQ0FBQ0MsSUFBSSxFQUFFLENBQUN6SSxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNuRTJILFFBQVEsR0FBR1UsUUFBUSxDQUFDRyxXQUFXOzBCQUNoQzswQkFDQUgsUUFBUSxHQUFHTCxJQUFJLENBQUNNLFFBQVEsRUFBRTt3QkFDM0I7c0JBQ0Q7b0JBQUM7c0JBQUE7b0JBQUE7c0JBQUE7b0JBQUE7b0JBRUQsSUFBSVYsYUFBYSxFQUFFO3NCQUNsQjtzQkFDQTtzQkFDQTtzQkFDQS9FLEdBQUcsQ0FBQ0QsS0FBSyxpREFDaUNwQix1QkFBdUIsQ0FBQ08sTUFBTSxJQUFJUCx1QkFBdUIsQ0FBQ1EsSUFBSSxFQUN2RztzQkFDRCxJQUFJO3dCQUFBO3dCQUNIMEcsV0FBVyxHQUFHLElBQUk7d0JBQ2xCLElBQU1DLGVBQWUsR0FBRyxjQUFBNUUsU0FBUyx1Q0FBVCxXQUFXdUQsV0FBVyxHQUMzQ3ZELFNBQVMsQ0FBQ3VELFdBQVcsQ0FBQzdGLEtBQUssQ0FBQyxHQUM1QkQsdUJBQXVCLENBQUM4RixXQUFXLENBQUVuRCx1QkFBdUIsQ0FBQzt3QkFDaEUwRCxjQUFjLEdBQUdDLGNBQWMsQ0FBQ2EsZUFBZSxFQUFFLElBQUksQ0FBQztzQkFDdkQsQ0FBQyxTQUFTO3dCQUNURCxXQUFXLEdBQUcsS0FBSztzQkFDcEI7b0JBQ0QsQ0FBQyxNQUFNLElBQUlmLFFBQVEsQ0FBQzNILE1BQU0sR0FBRyxDQUFDLEVBQUU7c0JBQy9CO3NCQUNBNkMsR0FBRyxDQUFDRCxLQUFLLGlEQUNpQ3BCLHVCQUF1QixDQUFDTyxNQUFNLElBQUlQLHVCQUF1QixDQUFDUSxJQUFJLEVBQ3ZHO3NCQUNELElBQU00RyxVQUFVLEdBQUdDLGNBQWMsQ0FDaEMsaURBQzBDckgsdUJBQXVCLENBQUNPLE1BQU0sSUFBSVAsdUJBQXVCLENBQUNRLElBQUksaURBQ2hFMkYsUUFBUSxFQUMvQyxFQUNERSxjQUFjLENBQUNpQixHQUFHLENBQUMsVUFBQ0MsUUFBUTt3QkFBQSxPQUFLQSxRQUFRLENBQUNDLFNBQVM7c0JBQUEsRUFBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQy9EO3NCQUNEcEIsY0FBYyxHQUFHQyxjQUFjLENBQUNjLFVBQVUsRUFBRSxJQUFJLENBQUM7b0JBQ2xEO29CQUNBLFVBQUFuSCxLQUFLLEVBQUN5SCxXQUFXLGtDQUFJckIsY0FBYyxFQUFDO29CQUNwQ3BHLEtBQUssR0FBR29GLE9BQU8sQ0FBQ08sUUFBUSxDQUFDTCxXQUFXLENBQUM7b0JBQ3JDb0MsWUFBWSxDQUFDdEYsYUFBYSxFQUFFZixTQUFTLENBQUNzRyxZQUFZLEVBQUUzSCxLQUFLLEVBQUV3RixpQkFBaUIsQ0FBQztvQkFDN0VBLGlCQUFpQixHQUFHLEtBQUs7b0JBQ3pCRCxRQUFRLEdBQUdMLGVBQWUsQ0FBQzBDLFNBQVMsQ0FBQzVILEtBQUssQ0FBQztrQkFDNUMsQ0FBQyxNQUFNO29CQUNOQSxLQUFLLENBQUM2SCxNQUFNLEVBQUU7b0JBQ2R0QyxRQUFRLEdBQUd1QyxPQUFPLENBQUNDLE9BQU8sRUFBRTtrQkFDN0I7Z0JBQ0QsQ0FBQyxNQUFNO2tCQUNOeEMsUUFBUSxHQUFHTCxlQUFlLENBQUM4QyxjQUFjLENBQUM3SCxhQUFhLEVBQUVILEtBQUssQ0FBQztnQkFDaEU7Z0JBQUMsdUJBRUt1RixRQUFRO2tCQUNkLElBQU0wQyxhQUFhLEdBQUc3QyxPQUFPLENBQUNPLFFBQVEsQ0FBQ0wsV0FBVyxDQUFDO2tCQUNuRG9DLFlBQVksQ0FBQ3RGLGFBQWEsRUFBRWYsU0FBUyxDQUFDc0csWUFBWSxFQUFFTSxhQUFhLEVBQUV6QyxpQkFBaUIsQ0FBQztrQkFBQyxJQUNsRnlDLGFBQWEsS0FBS3hELFNBQVM7b0JBQzlCLElBQU15RCxlQUFlLEdBQUdELGFBQWEsQ0FBQ0UsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO29CQUM5REQsZUFBZSxDQUFDbkYsT0FBTyxDQUFDLFVBQVVxRixZQUFZLEVBQUU7c0JBQy9DQSxZQUFZLENBQUNQLE1BQU0sRUFBRTtvQkFDdEIsQ0FBQyxDQUFDO2tCQUFDO2dCQUFBO2NBQUE7WUFBQTtZQUFBO1VBQUE7UUFTTixDQUFDLFlBQVE1SixDQUFVLEVBQUU7VUFBQTtVQUNwQjtVQUNBLElBQU1vSyxZQUFZLEdBQUc7WUFDcEJDLGlCQUFpQixFQUFFLENBQUMsQ0FBNEI7WUFDaERDLGtCQUFrQixFQUFFLENBQUMsQ0FBNEI7WUFDakRDLGVBQWUsRUFBRTNHO1VBQ2xCLENBQUM7VUFBQyw0Q0FDeUJJLFdBQVc7WUFBQTtVQUFBO1lBQXRDLHVEQUF3QztjQUFBLElBQTdCd0csYUFBWTtjQUN0QixJQUFNQyxjQUFhLEdBQUcvRyxjQUFjLENBQUM4RyxhQUFZLENBQUM7Y0FDbEQsSUFBSXpFLFNBQVMsQ0FBQzBFLGNBQWEsQ0FBQyxFQUFFO2dCQUM3QkwsWUFBWSxDQUFDQyxpQkFBaUIsQ0FBQ0csYUFBWSxDQUFDLEdBQUc7a0JBQzlDRSxJQUFJLEVBQUVELGNBQWEsQ0FBQ0UsT0FBTyxFQUFFO2tCQUM3Qi9LLEtBQUssRUFBRTZLLGNBQWEsQ0FBQzlFLFNBQVM7Z0JBQy9CLENBQUM7Y0FDRixDQUFDLE1BQU07Z0JBQ055RSxZQUFZLENBQUNDLGlCQUFpQixDQUFDRyxhQUFZLENBQUMsR0FBR0MsY0FBYTtjQUM3RDtZQUNEO1VBQUM7WUFBQTtVQUFBO1lBQUE7VUFBQTtVQUNELEtBQUssSUFBTUQsWUFBWSxJQUFJOUcsY0FBYyxFQUFFO1lBQzFDLElBQU0rRyxhQUFhLEdBQUcvRyxjQUFjLENBQUM4RyxZQUFZLENBQUM7WUFDbEQsSUFBSSxDQUFDeEcsV0FBVyxDQUFDNEcsUUFBUSxDQUFDSixZQUFZLENBQUMsRUFBRTtjQUN4QyxJQUFJekUsU0FBUyxDQUFDMEUsYUFBYSxDQUFDLEVBQUU7Z0JBQzdCTCxZQUFZLENBQUNFLGtCQUFrQixDQUFDRSxZQUFZLENBQUMsR0FBRztrQkFDL0NFLElBQUksRUFBRUQsYUFBYSxDQUFDRSxPQUFPLEVBQUU7a0JBQzdCL0ssS0FBSyxFQUFFNkssYUFBYSxDQUFDOUUsU0FBUztnQkFDL0IsQ0FBQztjQUNGLENBQUMsTUFBTTtnQkFDTnlFLFlBQVksQ0FBQ0Usa0JBQWtCLENBQUNFLFlBQVksQ0FBQyxHQUFHQyxhQUFhO2NBQzlEO1lBQ0Q7VUFDRDtVQUNBdEgsR0FBRyxDQUFDRCxLQUFLLENBQUNsRCxDQUFDLEVBQVlBLENBQUMsQ0FBVztVQUNuQyxJQUFNNkssTUFBTSxHQUFHMUIsY0FBYyxDQUM1QixpREFBMENySCx1QkFBdUIsQ0FBQ1EsSUFBSSxFQUFHLEVBQ3pFUCxLQUFLLENBQUN1SCxTQUFTLEVBQ2ZjLFlBQVksRUFDWHBLLENBQUMsQ0FBVzhLLEtBQUssQ0FDbEI7VUFDRCxJQUFNQyxTQUFTLEdBQUczQyxjQUFjLENBQUN5QyxNQUFNLEVBQUUsSUFBSSxDQUFDO1VBQzlDLFdBQUE5SSxLQUFLLEVBQUN5SCxXQUFXLG1DQUFJdUIsU0FBUyxFQUFDO1FBQ2hDLENBQUM7UUFBQTtNQUFBO0lBQ0YsQ0FBQztNQUFBO0lBQUE7RUFBQTtFQUFBLElBNWNjN0csZUFBZSxhQUM3Qm5DLEtBQWMsRUFDZEMsUUFBMEIsRUFDMUJvQixTQUF3QyxFQUN4Q25CLFFBQWlCLEVBQ2pCeUIsY0FBMkMsRUFDM0NGLFVBQW1CO0lBQUEsSUFDbEI7TUFDRCxJQUFNVyxhQUFzQyxHQUFHLENBQUMsQ0FBQztNQUFDO1FBQUEsSUFDOUNwQyxLQUFLLENBQUNpSixpQkFBaUIsS0FBSyxJQUFJO1VBQUE7WUEwQm5DQyxtQkFBa0IsR0FBR2xKLEtBQUssQ0FBQ2lKLGlCQUFpQjtZQUFDO2NBQUEsT0FDdENDLG1CQUFrQixLQUFLLElBQUk7WUFBQSx1QkFBRTtjQUFBO2dCQXVGbkNBLG1CQUFrQixHQUFHQyxVQUFVO2NBQUM7Y0F0RmhDLElBQU1BLFVBQTBCLEdBQUdELG1CQUFrQixDQUFDRSxrQkFBa0I7Y0FDeEUsSUFBTUMsVUFBVSxHQUFHSCxtQkFBa0IsQ0FBQ3BDLFNBQVM7Y0FDL0MsSUFBSXdDLGdCQUFnQixHQUFHRCxVQUFVO2NBQ2pDLElBQUlDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDQyxXQUFXLEVBQUUsS0FBS0QsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzlEO2dCQUNBQSxnQkFBZ0IsR0FBR2pJLFNBQVMsQ0FBQ21JLGtCQUFrQixJQUFJLEVBQUU7Y0FDdEQ7Y0FBQztnQkFBQSxJQUVBekgsTUFBTSxDQUFDRyxJQUFJLENBQUNiLFNBQVMsQ0FBQ3NHLFlBQVksQ0FBQyxDQUFDL0IsT0FBTyxDQUFDMEQsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FDbkUsQ0FBQ3BKLFFBQVEsSUFBSW1CLFNBQVMsQ0FBQ3NHLFlBQVksQ0FBQzJCLGdCQUFnQixDQUFDLENBQUNwSixRQUFRLEtBQUssSUFBSSxDQUFDO2tCQUFBO29CQUFBLElBRXJFdUIsVUFBVSxLQUFLLENBQUM7c0JBQ25CLElBQU1nSSxxQkFBcUIsR0FBR3BJLFNBQVMsQ0FBQ3NHLFlBQVksQ0FBQzJCLGdCQUFnQixDQUFDO3NCQUFDO3dCQUFBLElBQ25FLENBQUNHLHFCQUFxQixDQUFDQyxJQUFJLElBQUlSLG1CQUFrQixLQUFLLElBQUksSUFBSUEsbUJBQWtCLENBQUN2RCxRQUFRLENBQUNwSCxNQUFNLEdBQUcsQ0FBQzswQkFBQSx1QkFDakcwQixRQUFRLENBQUMySCxTQUFTLENBQUNzQixtQkFBa0IsQ0FBQzs0QkFDNUMsSUFBSVMsZUFBZSxHQUFHVCxtQkFBa0IsQ0FBQ0QsaUJBQWlCOzRCQUMxRCxPQUFPVSxlQUFlLEVBQUU7OEJBQ3ZCLElBQU1DLFNBQVMsR0FBR0QsZUFBZSxDQUFDUCxrQkFBa0I7OEJBQ3BELElBQUksQ0FBQ0sscUJBQXFCLENBQUNJLGNBQWMsRUFBRTtnQ0FDMUMsSUFBTUMsWUFBWSxHQUFHdEQsUUFBUSxDQUFDdUQsZUFBZSxDQUFDL0osS0FBSyxDQUFDZ0ssWUFBWSxFQUFFTCxlQUFlLENBQUNNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBRTtnQ0FDdkdILFlBQVksQ0FBQ0ksV0FBVyxDQUFDUCxlQUFlLENBQUM7Z0NBQ3pDdkgsYUFBYSxDQUFDdUgsZUFBZSxDQUFDTSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUUsR0FBR0gsWUFBWTs4QkFDbkUsQ0FBQyxNQUFNO2dDQUNOMUgsYUFBYSxDQUFDdUgsZUFBZSxDQUFDTSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUUsR0FBR04sZUFBZTs4QkFDdEU7OEJBRUFBLGVBQWUsQ0FBQ1EsZUFBZSxDQUFDLEtBQUssQ0FBQzs4QkFDdENSLGVBQWUsR0FBR0MsU0FBUzs0QkFDNUI7MEJBQUM7d0JBQUEsT0FDSyxJQUFJSCxxQkFBcUIsQ0FBQ0MsSUFBSSxFQUFFOzBCQUN0QyxJQUFJSixnQkFBZ0IsS0FBS0QsVUFBVSxFQUFFOzRCQUNwQyxJQUFJLENBQUNqSCxhQUFhLENBQUNrSCxnQkFBZ0IsQ0FBQyxFQUFFOzhCQUNyQyxJQUFNYyxTQUFTLEdBQUc1RCxRQUFRLENBQUN1RCxlQUFlLENBQUMvSixLQUFLLENBQUNnSyxZQUFZLEVBQUVWLGdCQUFnQixDQUFDOzhCQUNoRmxILGFBQWEsQ0FBQ2tILGdCQUFnQixDQUFDLEdBQUdjLFNBQVM7NEJBQzVDOzRCQUNBaEksYUFBYSxDQUFDa0gsZ0JBQWdCLENBQUMsQ0FBQ1ksV0FBVyxDQUFDaEIsbUJBQWtCLENBQUM7MEJBQ2hFLENBQUMsTUFBTTs0QkFDTjlHLGFBQWEsQ0FBQ2tILGdCQUFnQixDQUFDLEdBQUdKLG1CQUFrQjswQkFDckQ7d0JBQ0Q7c0JBQUM7c0JBQUE7b0JBQUE7c0JBQUEsdUJBRUtqSixRQUFRLENBQUMySCxTQUFTLENBQUNzQixtQkFBa0IsQ0FBQzt3QkFDNUM5RyxhQUFhLENBQUM4RyxtQkFBa0IsQ0FBQ3BDLFNBQVMsQ0FBQyxHQUFHb0MsbUJBQWtCO3NCQUFDO29CQUFBO2tCQUFBO2tCQUFBO2dCQUFBO2tCQUFBO29CQUFBLElBRXhEbkgsTUFBTSxDQUFDRyxJQUFJLENBQUNiLFNBQVMsQ0FBQ2tDLFVBQVUsQ0FBQyxDQUFDcUMsT0FBTyxDQUFDMEQsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7c0JBQUEsdUJBQ3RFckosUUFBUSxDQUFDMkgsU0FBUyxDQUFDc0IsbUJBQWtCLENBQUM7d0JBQUEsSUFDeEM3SCxTQUFTLENBQUNrQyxVQUFVLENBQUMrRixnQkFBZ0IsQ0FBQyxDQUFDZSxJQUFJLEtBQUssUUFBUTswQkFDM0Q7MEJBQ0EsSUFBTUMseUJBQXNGLEdBQUcsQ0FBQyxDQUFDOzBCQUNqRyxJQUFNQyxjQUFjLEdBQUdyQixtQkFBa0IsQ0FBQ3NCLGlCQUFpQixFQUFFOzBCQUFDLDRDQUNsQ0QsY0FBYzs0QkFBQTswQkFBQTs0QkFBMUMsdURBQTRDOzhCQUFBLElBQWpDRSxhQUFhOzhCQUN2QkgseUJBQXlCLENBQUNHLGFBQWEsQ0FBQyxHQUFHdkIsbUJBQWtCLENBQUNlLFlBQVksQ0FBQ1EsYUFBYSxDQUFDOzRCQUMxRjswQkFBQzs0QkFBQTswQkFBQTs0QkFBQTswQkFBQTswQkFDRCxJQUFJdkIsbUJBQWtCLENBQUN2RCxRQUFRLENBQUNwSCxNQUFNLEVBQUU7NEJBQ3ZDOzRCQUNBLEtBQUssSUFBSW1NLFVBQVUsR0FBRyxDQUFDLEVBQUVBLFVBQVUsR0FBR3hCLG1CQUFrQixDQUFDdkQsUUFBUSxDQUFDcEgsTUFBTSxFQUFFbU0sVUFBVSxFQUFFLEVBQUU7OEJBQ3ZGLElBQU1DLFFBQVEsR0FBR3pCLG1CQUFrQixDQUFDdkQsUUFBUSxDQUFDK0UsVUFBVSxDQUFDOzhCQUN4RCxJQUFNRSxZQUFZLEdBQUdELFFBQVEsQ0FBQzdELFNBQVM7OEJBQ3ZDLElBQU0rRCxTQUF1QyxHQUFHLENBQUMsQ0FBQzs4QkFDbEQsSUFBTUMsc0JBQXNCLEdBQUdILFFBQVEsQ0FBQ0gsaUJBQWlCLEVBQUU7OEJBQUMsNENBQ3hCTSxzQkFBc0I7Z0NBQUE7OEJBQUE7Z0NBQTFELHVEQUE0RDtrQ0FBQSxJQUFqREMscUJBQXFCO2tDQUMvQkYsU0FBUyxDQUFDRSxxQkFBcUIsQ0FBQyxHQUFHSixRQUFRLENBQUNWLFlBQVksQ0FBQ2MscUJBQXFCLENBQUM7Z0NBQ2hGOzhCQUFDO2dDQUFBOzhCQUFBO2dDQUFBOzhCQUFBOzhCQUNEVCx5QkFBeUIsQ0FBQ00sWUFBWSxDQUFDLEdBQUdDLFNBQVM7NEJBQ3BEOzBCQUNEOzBCQUNBbEosY0FBYyxDQUFDMkgsZ0JBQWdCLENBQUMsR0FBR2dCLHlCQUF5Qjt3QkFBQyxPQUN2RCxJQUFJakosU0FBUyxDQUFDa0MsVUFBVSxDQUFDK0YsZ0JBQWdCLENBQUMsQ0FBQ2UsSUFBSSxLQUFLLE9BQU8sRUFBRTswQkFDbkUsSUFBSW5CLG1CQUFrQixLQUFLLElBQUksSUFBSUEsbUJBQWtCLENBQUN2RCxRQUFRLENBQUNwSCxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMxRSxJQUFNb0gsUUFBUSxHQUFHdUQsbUJBQWtCLENBQUN2RCxRQUFROzRCQUM1QyxJQUFNcUYsV0FBMkMsR0FBRyxFQUFFOzRCQUN0RCxLQUFLLElBQUlDLFFBQVEsR0FBRyxDQUFDLEVBQUVBLFFBQVEsR0FBR3RGLFFBQVEsQ0FBQ3BILE1BQU0sRUFBRTBNLFFBQVEsRUFBRSxFQUFFOzhCQUM5RCxJQUFNdEIsZUFBZSxHQUFHaEUsUUFBUSxDQUFDc0YsUUFBUSxDQUFDOzhCQUMxQzs4QkFDQSxJQUFNQyxPQUFxQyxHQUFHLENBQUMsQ0FBQzs4QkFDaEQsSUFBTVgsZUFBYyxHQUFHWixlQUFlLENBQUNhLGlCQUFpQixFQUFFOzhCQUFDLDRDQUMvQkQsZUFBYztnQ0FBQTs4QkFBQTtnQ0FBMUMsdURBQTRDO2tDQUFBLElBQWpDRSxjQUFhO2tDQUN2QlMsT0FBTyxDQUFDVCxjQUFhLENBQUMsR0FBR2QsZUFBZSxDQUFDTSxZQUFZLENBQUNRLGNBQWEsQ0FBQztnQ0FDckU7OEJBQUM7Z0NBQUE7OEJBQUE7Z0NBQUE7OEJBQUE7OEJBQ0RPLFdBQVcsQ0FBQ3hNLElBQUksQ0FBQzBNLE9BQU8sQ0FBQzs0QkFDMUI7NEJBQ0F2SixjQUFjLENBQUMySCxnQkFBZ0IsQ0FBQyxHQUFHMEIsV0FBVzswQkFDL0M7d0JBQ0Q7c0JBQUM7b0JBQUE7a0JBQUE7a0JBQUE7Z0JBQUE7Y0FBQTtjQUFBO1lBSUgsQ0FBQztZQUFBO1VBQUE7VUFsSEQsSUFBSTlCLG1CQUFrQyxHQUFHbEosS0FBSyxDQUFDaUosaUJBQW1DO1VBQ2xGLElBQUl4SCxVQUFVLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE9BQU95SCxtQkFBa0IsS0FBSyxJQUFJLEVBQUU7Y0FDbkMsSUFBTUcsVUFBVSxHQUFHSCxtQkFBa0IsQ0FBQ3BDLFNBQVM7Y0FDL0MsSUFBSXdDLGdCQUFnQixHQUFHRCxVQUFVO2NBQ2pDLElBQUlDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDQyxXQUFXLEVBQUUsS0FBS0QsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzlEO2dCQUNBQSxnQkFBZ0IsR0FBR2pJLFNBQVMsQ0FBQ21JLGtCQUFrQixJQUFJLEVBQUU7Y0FDdEQ7Y0FDQSxJQUFNQyxxQkFBcUIsR0FBR3BJLFNBQVMsQ0FBQ3NHLFlBQVksQ0FBQzJCLGdCQUFnQixDQUFDO2NBQ3RFLElBQUlHLHFCQUFxQixLQUFLaEYsU0FBUyxJQUFJLENBQUNnRixxQkFBcUIsQ0FBQ0MsSUFBSSxFQUFFO2dCQUN2RSxJQUFNeUIsaUJBQWlCLEdBQUdDLGdCQUFnQixDQUFDbEMsbUJBQWtCLEVBQUVPLHFCQUFxQixDQUFDNEIsbUJBQW1CLENBQUM7Z0JBQ3pHMUosY0FBYyxDQUFDMkgsZ0JBQWdCLENBQUMsR0FBRzZCLGlCQUFpQjtnQkFDcEQsS0FBSyxJQUFNRyxvQkFBb0IsSUFBSUgsaUJBQWlCLEVBQUU7a0JBQ3JEOUosU0FBUyxDQUFDc0csWUFBWSxDQUFDMkQsb0JBQW9CLENBQUMsR0FBR0gsaUJBQWlCLENBQUNHLG9CQUFvQixDQUFDO2dCQUN2RjtjQUNEO2NBQ0FwQyxtQkFBa0IsR0FBR0EsbUJBQWtCLENBQUNFLGtCQUFrQjtZQUMzRDtVQUNEO1VBQUM7WUFBQSxJQUVHM0gsVUFBVSxLQUFLLENBQUM7Y0FDbkI7Y0FBQSx1QkFDTXhCLFFBQVEsQ0FBQ3NMLGVBQWUsQ0FBQ3ZMLEtBQUssQ0FBQztZQUFBO1VBQUE7VUFBQTtRQUFBO01BQUE7TUFBQTtRQTZGdkMsT0FBT29DLGFBQWE7TUFBQyxLQUFkQSxhQUFhO0lBQ3JCLENBQUM7TUFBQTtJQUFBO0VBQUE7RUE5UUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkEsSUFTZVYsaUJBQWlCLGFBQy9CTCxTQUF3QyxFQUN4Q3JCLEtBQWMsRUFDZEUsUUFBaUIsRUFDakJELFFBQTBCLEVBQzFCd0IsVUFBbUI7SUFBQSxJQUNsQjtNQUNELElBQU0rSixxQkFBcUIsR0FBR25LLFNBQVMsQ0FBQ2tDLFVBQVU7O01BRWxEO01BQ0EsSUFBTWtJLHlCQUF5QixHQUFHMUosTUFBTSxDQUFDRyxJQUFJLENBQUNzSixxQkFBcUIsQ0FBQztNQUVwRSxJQUFNN0osY0FBMkMsR0FBRyxDQUFDLENBQUM7TUFBQyxxQkFDL0I4Six5QkFBeUIsWUFBdENDLFNBQVMsRUFBK0I7UUFDbEQsSUFBSUYscUJBQXFCLENBQUNFLFNBQVMsQ0FBQyxDQUFDckIsSUFBSSxLQUFLLFFBQVEsRUFBRTtVQUN2RDFJLGNBQWMsQ0FBQytKLFNBQVMsQ0FBQyxHQUFHQyxTQUFTLENBQUNILHFCQUFxQixDQUFDRSxTQUFTLENBQUMsQ0FBQ0UsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RixDQUFDLE1BQU07VUFDTmpLLGNBQWMsQ0FBQytKLFNBQVMsQ0FBQyxHQUFHRixxQkFBcUIsQ0FBQ0UsU0FBUyxDQUFDLENBQUNFLFlBQXlDO1FBQ3ZHO1FBQUM7VUFBQSxJQUVHNUwsS0FBSyxDQUFDNkwsWUFBWSxDQUFDSCxTQUFTLENBQUMsSUFBSXhMLFFBQVEsSUFBSXNMLHFCQUFxQixDQUFDRSxTQUFTLENBQUMsQ0FBQ3hMLFFBQVEsS0FBSyxLQUFLO1lBQ25Ha0IsR0FBRyxDQUFDRCxLQUFLLG9CQUFhdUssU0FBUyx5REFBc0Q7VUFBQztZQUFBO2NBQUEsSUFDNUUxTCxLQUFLLENBQUM2TCxZQUFZLENBQUNILFNBQVMsQ0FBQztnQkFBQSx1QkFDakN6TCxRQUFRLENBQUM2TCxjQUFjLENBQUM5TCxLQUFLLEVBQUVBLEtBQUssQ0FBQytMLFVBQVUsQ0FBQ0MsWUFBWSxDQUFDTixTQUFTLENBQUMsQ0FBUztrQkFDdEYsSUFBSU8sTUFBaUMsR0FBR2pNLEtBQUssQ0FBQ2lLLFlBQVksQ0FBQ3lCLFNBQVMsQ0FBQztrQkFBQyxJQUNsRU8sTUFBTSxLQUFLeEgsU0FBUyxJQUFJd0gsTUFBTSxLQUFLLElBQUk7b0JBQzFDLElBQUlDLGFBQXdDLEdBQUdELE1BQU07b0JBQ3JELElBQUl4SyxVQUFVLEtBQUssQ0FBQyxJQUFJLE9BQU93SyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0UsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3NCQUM5RSxRQUFRWCxxQkFBcUIsQ0FBQ0UsU0FBUyxDQUFDLENBQUNyQixJQUFJO3dCQUM1QyxLQUFLLFNBQVM7MEJBQ2I2QixhQUFhLEdBQUdELE1BQU0sS0FBSyxNQUFNOzBCQUNqQzt3QkFDRCxLQUFLLFFBQVE7MEJBQ1pDLGFBQWEsR0FBR0UsTUFBTSxDQUFDSCxNQUFNLENBQUM7MEJBQzlCO3NCQUFNO29CQUVUO29CQUNBQSxNQUFNLEdBQUdBLE1BQU0sS0FBSyxJQUFJLEdBQUd4SCxTQUFTLEdBQUd3SCxNQUFNO29CQUM3Q3RLLGNBQWMsQ0FBQytKLFNBQVMsQ0FBQyxHQUFHUSxhQUFhO2tCQUFDO2dCQUFBO2NBQUE7WUFBQTtZQUFBO1VBQUE7UUFBQTtRQUFBO01BRzdDLENBQUM7TUFBQTtRQUNELE9BQU92SyxjQUFjO01BQUMsS0FBZkEsY0FBYztJQUN0QixDQUFDO01BQUE7SUFBQTtFQUFBO0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBaGNBLElBQU0wSyxZQUFZLEdBQUcsaURBQWlEO0VBQ3RFLElBQU1DLGlCQUFpQixHQUFHLElBQUlDLFNBQVMsRUFBRTtFQUN6QyxJQUFJdEYsV0FBVyxHQUFHLEtBQUs7RUFnSHZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN0RSxZQUFZLENBQUM1Qyx1QkFBZ0QsRUFBd0Q7SUFDN0gsT0FBT0EsdUJBQXVCLENBQUMwQixVQUFVLEtBQUtnRCxTQUFTLElBQUkxRSx1QkFBdUIsQ0FBQzBCLFVBQVUsS0FBSyxDQUFDO0VBQ3BHO0VBQ0EsU0FBUytLLDRCQUE0QixDQUNwQ2hNLEtBQWEsRUFDYkMsU0FBa0MsRUFDbENnTSxnQkFBd0QsRUFDeERDLElBQVksRUFDWDtJQUNELElBQU1DLFFBQVEsR0FBR2xNLFNBQVMsQ0FBQ2lNLElBQUksQ0FBQztJQUNoQyxJQUFNRSxjQUFjLEdBQUdELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFL0ksU0FBUyxFQUd6QztJQUVELElBQUk2SSxnQkFBZ0IsQ0FBQ0ksUUFBUSxLQUFLLElBQUksS0FBSyxDQUFDRixRQUFRLElBQUlDLGNBQWMsS0FBSyxJQUFJLENBQUMsRUFBRTtNQUNqRixNQUFNLElBQUlFLEtBQUssV0FBSXRNLEtBQUsseUNBQStCa00sSUFBSSxrQkFBZTtJQUMzRSxDQUFDLE1BQU0sSUFBSUUsY0FBYyxFQUFFO01BQzFCO01BQ0E7TUFDQSxJQUFJQSxjQUFjLENBQUN6SixjQUFjLENBQUMsT0FBTyxDQUFDLElBQUl5SixjQUFjLENBQUNHLEtBQUssS0FBS3RJLFNBQVMsSUFBSWdJLGdCQUFnQixDQUFDTSxLQUFLLEtBQUt0SSxTQUFTLEVBQUU7UUFDekg7UUFDQSxJQUFJZ0ksZ0JBQWdCLENBQUNNLEtBQUssQ0FBQ25ILE9BQU8sQ0FBQ2dILGNBQWMsQ0FBQ0csS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7VUFDaEUsTUFBTSxJQUFJRCxLQUFLLFdBQ1h0TSxLQUFLLGdCQUFNa00sSUFBSSxnQ0FBc0JELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx1QkFDaEVHLGNBQWMsQ0FBQ0csS0FBSyxnQkFDZkosUUFBUSxDQUFDL0QsT0FBTyxFQUFFLEVBQ3hCO1FBQ0Y7TUFDRCxDQUFDLE1BQU0sSUFBSWdFLGNBQWMsQ0FBQ3pKLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSXlKLGNBQWMsQ0FBQ0ksS0FBSyxLQUFLdkksU0FBUyxJQUFJZ0ksZ0JBQWdCLENBQUNPLEtBQUssRUFBRTtRQUNsSDtRQUNBLElBQUlQLGdCQUFnQixDQUFDTyxLQUFLLENBQUNwSCxPQUFPLENBQUNnSCxjQUFjLENBQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQ2hFLE1BQU0sSUFBSUYsS0FBSyxXQUNYdE0sS0FBSyxnQkFBTWtNLElBQUksZ0NBQXNCRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsdUJBQ2hFRyxjQUFjLENBQUNJLEtBQUssZ0JBQ2ZMLFFBQVEsQ0FBQy9ELE9BQU8sRUFBRSxFQUN4QjtRQUNGO01BQ0Q7SUFDRDtFQUNEO0VBQ08sU0FBUzNELHNCQUFzQixDQUNyQ3pFLEtBQWEsRUFDYmEsU0FBd0MsRUFDeENaLFNBQWtDLEVBQ2xDVCxLQUFjLEVBQ2I7SUFDRCxJQUFNaU4sb0JBQW9CLEdBQUk1TCxTQUFTLENBQUN5QixnQkFBZ0IsSUFBSWYsTUFBTSxDQUFDRyxJQUFJLENBQUNiLFNBQVMsQ0FBQ3lCLGdCQUFnQixDQUFDLElBQUssRUFBRTtNQUN6R29LLFdBQVcsR0FBSTdMLFNBQVMsQ0FBQ2tDLFVBQVUsSUFBSXhCLE1BQU0sQ0FBQ0csSUFBSSxDQUFDYixTQUFTLENBQUNrQyxVQUFVLENBQUMsSUFBSyxFQUFFO01BQy9FNEosZUFBd0MsR0FBRyxDQUFDLENBQUM7O0lBRTlDO0lBQ0EsSUFBTTVDLGNBQWMsR0FBR3ZLLEtBQUssQ0FBQ3dLLGlCQUFpQixFQUFFO0lBQUMsMkNBQ3JCRCxjQUFjO01BQUE7SUFBQTtNQUExQyxvREFBNEM7UUFBQSxJQUFqQ0UsYUFBYTtRQUN2QjBDLGVBQWUsQ0FBQzFDLGFBQWEsQ0FBQyxHQUFHLElBQUk7TUFDdEM7O01BRUE7SUFBQTtNQUFBO0lBQUE7TUFBQTtJQUFBO0lBQ0F3QyxvQkFBb0IsQ0FBQ2xLLE9BQU8sQ0FBQyxVQUFVMkosSUFBSSxFQUFFO01BQzVDLElBQU1ELGdCQUFnQixHQUFHcEwsU0FBUyxDQUFDeUIsZ0JBQWdCLENBQUM0SixJQUFJLENBQUM7TUFFekRGLDRCQUE0QixDQUFDaE0sS0FBSyxFQUFFQyxTQUFTLEVBQUVnTSxnQkFBZ0IsRUFBRUMsSUFBSSxDQUFDO01BQ3RFLE9BQU9TLGVBQWUsQ0FBQ1QsSUFBSSxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUNGO0lBQ0FRLFdBQVcsQ0FBQ25LLE9BQU8sQ0FBQyxVQUFVMkosSUFBSSxFQUFFO01BQ25DLElBQU1VLGlCQUFpQixHQUFHL0wsU0FBUyxDQUFDa0MsVUFBVSxDQUFDbUosSUFBSSxDQUFDO01BQ3BELElBQUksQ0FBQzFNLEtBQUssQ0FBQzZMLFlBQVksQ0FBQ2EsSUFBSSxDQUFDLEVBQUU7UUFDOUIsSUFBSVUsaUJBQWlCLENBQUNQLFFBQVEsSUFBSSxDQUFDTyxpQkFBaUIsQ0FBQ2pLLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtVQUNwRixNQUFNLElBQUkySixLQUFLLENBQUMsVUFBR3RNLEtBQUssdUNBQTZCa00sSUFBSSxpQkFBYyxDQUFDO1FBQ3pFO01BQ0QsQ0FBQyxNQUFNO1FBQ04sT0FBT1MsZUFBZSxDQUFDVCxJQUFJLENBQUM7TUFDN0I7SUFDRCxDQUFDLENBQUM7O0lBRUY7SUFDQTNLLE1BQU0sQ0FBQ0csSUFBSSxDQUFDaUwsZUFBZSxDQUFDLENBQUNwSyxPQUFPLENBQUMsVUFBVTJKLElBQVksRUFBRTtNQUM1RDtNQUNBLElBQUlBLElBQUksQ0FBQzlHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzhHLElBQUksQ0FBQ1AsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZEL0ssR0FBRyxDQUFDaU0sT0FBTyxnQ0FBeUI3TSxLQUFLLGVBQUtrTSxJQUFJLEdBQUlqSSxTQUFTLEVBQUU0SCxZQUFZLENBQUM7TUFDL0U7SUFDRCxDQUFDLENBQUM7RUFDSDtFQUFDO0VBRUQsSUFBTWlCLG1CQUFtQixHQUFHLHFCQUFxQjtFQUVqRCxJQUFNNUosb0JBQW9CLEdBQUcsc0JBQXNCOztFQUVuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU3BDLGVBQWUsQ0FDdkJpTSxxQkFBNkMsRUFHYjtJQUFBLElBRmhDL0wsTUFBTSx1RUFBRyxLQUFLO0lBQUEsSUFDZEMsVUFBbUI7SUFFbkIsSUFBSThMLHFCQUFxQixFQUFFO01BQzFCLElBQU1DLFdBQTRELEdBQUcsQ0FBQyxDQUFDO01BQ3ZFLElBQU1wTCxhQUFpRSxHQUFHO1FBQ3pFcUwsVUFBVSxFQUFFO1VBQ1hwRCxJQUFJLEVBQUVpRDtRQUNQLENBQUM7UUFDREksVUFBVSxFQUFFO1VBQ1hyRCxJQUFJLEVBQUVpRDtRQUNQO01BQ0QsQ0FBQztNQUVELElBQUk3TCxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ3JCVyxhQUFhLENBQUNxTCxVQUFVLENBQUMvRCxJQUFJLEdBQUcsWUFBWTtNQUM3QztNQUVBLElBQU1oSixpQkFBa0UsR0FBRyxDQUFDLENBQUM7TUFDN0UsSUFBSWlOLHVCQUF1QjtNQUMzQjVMLE1BQU0sQ0FBQ0csSUFBSSxDQUFDcUwscUJBQXFCLENBQUNoSyxVQUFVLENBQUMsQ0FBQ1IsT0FBTyxDQUFDLFVBQVU2SyxhQUFxQixFQUFFO1FBQ3RGLElBQUlMLHFCQUFxQixDQUFDaEssVUFBVSxDQUFDcUssYUFBYSxDQUFDLENBQUN2RCxJQUFJLEtBQUszRyxvQkFBb0IsRUFBRTtVQUNsRjhKLFdBQVcsQ0FBQ0ksYUFBYSxDQUFDLEdBQUdMLHFCQUFxQixDQUFDaEssVUFBVSxDQUFDcUssYUFBYSxDQUFDO1FBQzdFLENBQUMsTUFBTTtVQUNObE4saUJBQWlCLENBQUNrTixhQUFhLENBQUMsR0FBR0wscUJBQXFCLENBQUNoSyxVQUFVLENBQUNxSyxhQUFhLENBQUM7UUFDbkY7TUFDRCxDQUFDLENBQUM7TUFDRjtNQUNBLElBQUlMLHFCQUFxQixDQUFDTSxNQUFNLEtBQUtwSixTQUFTLEVBQUU7UUFDL0MxQyxNQUFNLENBQUNHLElBQUksQ0FBQ3FMLHFCQUFxQixDQUFDTSxNQUFNLENBQUMsQ0FBQzlLLE9BQU8sQ0FBQyxVQUFVK0ssVUFBa0IsRUFBRTtVQUMvRU4sV0FBVyxDQUFDTSxVQUFVLENBQUM7WUFBS3pELElBQUksRUFBRTtVQUFVLEdBQUtrRCxxQkFBcUIsQ0FBQ00sTUFBTSxDQUFDQyxVQUFVLENBQUMsQ0FBRTtRQUM1RixDQUFDLENBQUM7TUFDSDtNQUNBLElBQUlQLHFCQUFxQixDQUFDNUYsWUFBWSxLQUFLbEQsU0FBUyxFQUFFO1FBQ3JEMUMsTUFBTSxDQUFDRyxJQUFJLENBQUNxTCxxQkFBcUIsQ0FBQzVGLFlBQVksQ0FBQyxDQUFDNUUsT0FBTyxDQUFDLFVBQVU2SyxhQUFxQixFQUFFO1VBQ3hGeEwsYUFBYSxDQUFDd0wsYUFBYSxDQUFDLEdBQUdMLHFCQUFxQixDQUFDNUYsWUFBWSxDQUFDaUcsYUFBYSxDQUFDO1VBQ2hGLElBQUl4TCxhQUFhLENBQUN3TCxhQUFhLENBQUMsQ0FBQ0csU0FBUyxFQUFFO1lBQzNDSix1QkFBdUIsR0FBR0MsYUFBYTtVQUN4QztRQUNELENBQUMsQ0FBQztNQUNIO01BQ0EsT0FBTztRQUNOckssVUFBVSxFQUFFaUssV0FBVztRQUN2QjdGLFlBQVksRUFBRXZGLGFBQWE7UUFDM0JvSCxrQkFBa0IsRUFBRW1FLHVCQUF1QjtRQUMzQzdLLGdCQUFnQixFQUFFcEMsaUJBQWlCO1FBQ25DYyxNQUFNLEVBQUVBO01BQ1QsQ0FBQztJQUNGLENBQUMsTUFBTTtNQUNOLE9BQU87UUFDTnNCLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNwQjZFLFlBQVksRUFBRTtVQUNiOEYsVUFBVSxFQUFFO1lBQ1hwRCxJQUFJLEVBQUVpRDtVQUNQLENBQUM7VUFDREksVUFBVSxFQUFFO1lBQ1hyRCxJQUFJLEVBQUVpRDtVQUNQO1FBQ0QsQ0FBQztRQUNEL0osVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNkL0IsTUFBTSxFQUFFQTtNQUNULENBQUM7SUFDRjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU3dNLDZCQUE2QixDQUFDck4sU0FBb0MsRUFBRXNELGVBQXVCLEVBQW1CO0lBQ3RILElBQUlnSyxTQUFpQjtJQUNyQixJQUFJaEssZUFBZSxJQUFJQSxlQUFlLENBQUNrSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDdkQ7TUFDQThCLFNBQVMsR0FBR2hLLGVBQWU7SUFDNUIsQ0FBQyxNQUFNO01BQ04sSUFBSUUsWUFBWSxHQUFHeEQsU0FBUyxDQUFDdU4sa0JBQWtCLENBQUN0RixPQUFPLEVBQUU7TUFDekQsSUFBSSxDQUFDekUsWUFBWSxDQUFDZ0ssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2hDaEssWUFBWSxJQUFJLEdBQUc7TUFDcEI7TUFDQThKLFNBQVMsR0FBRzlKLFlBQVksR0FBR0YsZUFBZTtJQUMzQztJQUNBLE9BQU87TUFDTm1LLEtBQUssRUFBRSxXQUFXO01BQ2xCekYsSUFBSSxFQUFFc0Y7SUFDUCxDQUFDO0VBQ0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNJLDZCQUE2QixDQUNyQzFOLFNBQW9DLEVBQ3BDMk4sY0FBc0IsRUFDdEJySyxlQUF1QixFQUNMO0lBQ2xCLElBQUlzSyxhQUE4QjtJQUNsQyxJQUFJdEssZUFBZSxDQUFDa0ksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO01BQ3pDLElBQU05SSxLQUFLLEdBQUdtQixPQUFPLENBQUNQLGVBQWUsQ0FBQztNQUN0Q3RELFNBQVMsQ0FBQ0UsTUFBTSxDQUFDdUQsZ0JBQWdCLENBQUNDLFdBQVcsQ0FBQ0osZUFBZSxFQUFFWixLQUFLLENBQUM7TUFDckVrTCxhQUFhLEdBQUc7UUFDZkgsS0FBSyxFQUFFLGtCQUFrQjtRQUN6QnpGLElBQUksRUFBRTFFO01BQ1AsQ0FBQztNQUNELE9BQU9PLE9BQU8sQ0FBQ1AsZUFBZSxDQUFDO0lBQ2hDLENBQUMsTUFBTSxJQUFLcUssY0FBYyxLQUFLLFVBQVUsSUFBSTNOLFNBQVMsQ0FBQ3VOLGtCQUFrQixJQUFLSSxjQUFjLEtBQUssYUFBYSxFQUFFO01BQy9HQyxhQUFhLEdBQUdQLDZCQUE2QixDQUFDck4sU0FBUyxFQUFFc0QsZUFBZSxDQUFDO0lBQzFFLENBQUMsTUFBTSxJQUFJQSxlQUFlLElBQUlBLGVBQWUsQ0FBQ2tJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUM5RDtNQUNBb0MsYUFBYSxHQUFHO1FBQ2ZILEtBQUssRUFBRSxXQUFXO1FBQ2xCekYsSUFBSSxFQUFFMUU7TUFDUCxDQUFDO0lBQ0YsQ0FBQyxNQUFNO01BQ05zSyxhQUFhLEdBQUc7UUFDZkgsS0FBSyxFQUFFLFdBQVc7UUFDbEJ6RixJQUFJLEVBQUVoSSxTQUFTLENBQUM2TixlQUFlLENBQUNDLFNBQVMsR0FBRzlOLFNBQVMsQ0FBQzZOLGVBQWUsQ0FBQ0MsU0FBUyxDQUFDN0YsT0FBTyxDQUFDM0UsZUFBZSxDQUFDLEdBQUdBO01BQzVHLENBQUM7SUFDRjtJQUNBLE9BQU9zSyxhQUFhO0VBQ3JCO0VBRUEsU0FBU0csbUJBQW1CLENBQzNCL04sU0FBb0MsRUFDcENYLEtBQWMsRUFDZHNPLGNBQXNCLEVBQ3RCck8sUUFBMEIsRUFDMUIwTyxhQUFzQixFQUN0Qm5OLE1BQWUsRUFDZDtJQUNELElBQUlvTixnQkFBNkM7SUFDakQsSUFBSSxDQUFDRCxhQUFhLElBQUkzTyxLQUFLLENBQUM2TCxZQUFZLENBQUN5QyxjQUFjLENBQUMsRUFBRTtNQUN6RCxJQUFNckssZUFBZSxHQUFHakUsS0FBSyxDQUFDaUssWUFBWSxDQUFDcUUsY0FBYyxDQUFXO01BQ3BFTSxnQkFBZ0IsR0FBR0MsYUFBYSxDQUFDQyxhQUFhLENBQUM3SyxlQUFlLENBQUM7TUFDL0QsSUFBSSxDQUFDMkssZ0JBQWdCLEVBQUU7UUFDdEJBLGdCQUFnQixHQUFHUCw2QkFBNkIsQ0FBQzFOLFNBQVMsRUFBRTJOLGNBQWMsRUFBRXJLLGVBQWUsQ0FBQztNQUM3RjtJQUNELENBQUMsTUFBTSxJQUFJdEQsU0FBUyxDQUFDNk4sZUFBZSxDQUFDckwsY0FBYyxDQUFDbUwsY0FBYyxDQUFDLEVBQUU7TUFDcEVNLGdCQUFnQixHQUFHO1FBQ2xCUixLQUFLLEVBQUVFLGNBQWM7UUFDckIzRixJQUFJLEVBQUU7TUFDUCxDQUFDO0lBQ0YsQ0FBQyxNQUFNLElBQUluSCxNQUFNLEVBQUU7TUFDbEIsSUFBSTtRQUNILElBQUl2QixRQUFRLENBQUM4TyxVQUFVLFdBQUlULGNBQWMsT0FBSSxFQUFFO1VBQzlDTSxnQkFBZ0IsR0FBRztZQUNsQlIsS0FBSyxFQUFFRSxjQUFjO1lBQ3JCM0YsSUFBSSxFQUFFO1VBQ1AsQ0FBQztRQUNGO01BQ0QsQ0FBQyxDQUFDLE9BQU8xSyxDQUFDLEVBQUU7UUFDWCxPQUFPd0csU0FBUztNQUNqQjtJQUNEO0lBQ0EsT0FBT21LLGdCQUFnQjtFQUN4QjtFQW9FQSxTQUFTaE4sZUFBZSxDQUN2QlAsU0FBd0MsRUFDeENWLFNBQW9DLEVBQ3BDWCxLQUFjLEVBQ2RFLFFBQWlCLEVBQ2pCRCxRQUEwQixFQUMxQlEsU0FBa0MsRUFDbENDLGlCQUEwQyxFQUN6QztJQUNEQyxTQUFTLENBQUN1TixrQkFBa0IsR0FBR3ZOLFNBQVMsQ0FBQzZOLGVBQWUsQ0FBQ1EsV0FBVztJQUNwRSxJQUFNbk4sZUFBd0MsR0FBRyxDQUFDLENBQUM7SUFDbkQsSUFBTUYsY0FBdUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBTXNOLG1CQUFtQixHQUFHNU4sU0FBUyxDQUFDeUIsZ0JBQWdCO0lBQ3RELElBQU1vTSx1QkFBdUIsR0FBR25OLE1BQU0sQ0FBQ0csSUFBSSxDQUFDK00sbUJBQW1CLENBQUM7SUFDaEU7SUFDQSxJQUFNRSxnQkFBZ0IsR0FBR0QsdUJBQXVCLENBQUN0SixPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3ZFLElBQUl1SixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsRUFBRTtNQUM1QjtNQUNBLElBQU1DLHFCQUFxQixHQUFHRix1QkFBdUIsQ0FBQ0csTUFBTSxDQUFDRixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7TUFDakZELHVCQUF1QixDQUFDRyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRUQscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0Q7SUFDQSx5Q0FBNkJGLHVCQUF1QiwyQ0FBRTtNQUFqRCxJQUFNWixjQUFjO01BQ3hCLElBQU1LLGFBQWEsR0FBR3pPLFFBQVEsSUFBSStPLG1CQUFtQixDQUFDWCxjQUFjLENBQUMsQ0FBQ3BPLFFBQVEsS0FBSyxLQUFLLElBQUlGLEtBQUssQ0FBQzZMLFlBQVksQ0FBQ3lDLGNBQWMsQ0FBQztNQUM5SCxJQUFNTSxnQkFBZ0IsR0FBR0YsbUJBQW1CLENBQUMvTixTQUFTLEVBQUVYLEtBQUssRUFBRXNPLGNBQWMsRUFBRXJPLFFBQVEsRUFBRTBPLGFBQWEsRUFBRXROLFNBQVMsQ0FBQ0csTUFBTSxDQUFDO01BQ3pILElBQUlvTixnQkFBZ0IsRUFBRTtRQUNyQkEsZ0JBQWdCLENBQUNyTyxJQUFJLEdBQUcrTixjQUFjO1FBQ3RDZ0IsZ0JBQWdCLENBQUM3TyxTQUFTLEVBQUVSLFFBQVEsRUFBRTJPLGdCQUFnQixFQUFFbE8saUJBQWlCLENBQUM7UUFDMUUsSUFDQyxDQUFDNE4sY0FBYyxLQUFLLFdBQVcsSUFBSUEsY0FBYyxLQUFLLGFBQWEsS0FDbkUsQ0FBQzNOLFNBQVMsQ0FBQzZOLGVBQWUsQ0FBQ3JMLGNBQWMsQ0FBQ21MLGNBQWMsQ0FBQyxFQUN4RDtVQUNEM04sU0FBUyxDQUFDNk4sZUFBZSxDQUFDRixjQUFjLENBQUMsR0FBRzdOLFNBQVMsQ0FBQzZOLGNBQWMsQ0FBQztRQUN0RTtRQUNBLElBQUlBLGNBQWMsS0FBSyxhQUFhLEVBQUU7VUFDckMzTixTQUFTLENBQUN1TixrQkFBa0IsR0FBR3pOLFNBQVMsQ0FBQzZOLGNBQWMsQ0FBQztRQUN6RDtRQUNBM00sY0FBYyxDQUFDMk0sY0FBYyxDQUFDLEdBQUc3TixTQUFTLENBQUM2TixjQUFjLENBQUM7TUFDM0QsQ0FBQyxNQUFNO1FBQ056TSxlQUFlLENBQUN5TSxjQUFjLENBQUMsR0FBRyxJQUFJO01BQ3ZDO0lBQ0Q7SUFDQSxPQUFPO01BQUV6TSxlQUFlLEVBQWZBLGVBQWU7TUFBRUYsY0FBYyxFQUFFQTtJQUFlLENBQUM7RUFDM0Q7RUFPQSxTQUFTeUosZ0JBQWdCLENBQUNtRSxZQUFzQixFQUFFbEUsbUJBQThCLEVBQUU7SUFDakYsSUFBTUwsV0FBcUQsR0FBRyxDQUFDLENBQUM7SUFDaEUsSUFBSXVFLFlBQVksSUFBSUEsWUFBWSxDQUFDNUosUUFBUSxDQUFDcEgsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNyRCxJQUFNb0gsUUFBUSxHQUFHNEosWUFBWSxDQUFDNUosUUFBUTtNQUN0QyxLQUFLLElBQUlzRixRQUFRLEdBQUcsQ0FBQyxFQUFFQSxRQUFRLEdBQUd0RixRQUFRLENBQUNwSCxNQUFNLEVBQUUwTSxRQUFRLEVBQUUsRUFBRTtRQUM5RCxJQUFNdEIsZUFBZSxHQUFHaEUsUUFBUSxDQUFDc0YsUUFBUSxDQUFDO1FBQzFDLElBQUl1RSxRQUFRLEdBQUc3RixlQUFlLENBQUNNLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSU4sZUFBZSxDQUFDTSxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ3hGLElBQUl1RixRQUFRLEVBQUU7VUFDYkEsUUFBUSx1QkFBZ0JBLFFBQVEsQ0FBRTtVQUNsQzdGLGVBQWUsQ0FBQzhGLFlBQVksQ0FBQyxLQUFLLEVBQUVELFFBQVEsQ0FBQztVQUM3QyxJQUFJRSxpQkFBMkMsR0FBRztZQUNqREMsR0FBRyxFQUFFSCxRQUFRO1lBQ2JJLFFBQVEsRUFBRTtjQUNUQyxTQUFTLEVBQUdsRyxlQUFlLENBQUNNLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBa0I2RixTQUFTLENBQUNDLEtBQUs7Y0FDdEZDLE1BQU0sRUFBRXJHLGVBQWUsQ0FBQ00sWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJeEY7WUFDbkQsQ0FBQztZQUNENEYsSUFBSSxFQUFFO1VBQ1AsQ0FBQztVQUNELElBQUlnQixtQkFBbUIsRUFBRTtZQUN4QnFFLGlCQUFpQixHQUFHckUsbUJBQW1CLENBQUMxQixlQUFlLEVBQUUrRixpQkFBaUIsQ0FBQztVQUM1RTtVQUNBMUUsV0FBVyxDQUFDMEUsaUJBQWlCLENBQUNDLEdBQUcsQ0FBQyxHQUFHRCxpQkFBaUI7UUFDdkQ7TUFDRDtJQUNEO0lBQ0EsT0FBTzFFLFdBQVc7RUFDbkI7RUFtSUEsU0FBU3RELFlBQVksQ0FDcEJ0RixhQUFzQyxFQUN0QzZOLHFCQUF5RSxFQUN6RWpRLEtBQWMsRUFFYjtJQUFBLElBRER3RixpQkFBaUIsdUVBQUcsS0FBSztJQUV6QixJQUFJekQsTUFBTSxDQUFDRyxJQUFJLENBQUNFLGFBQWEsQ0FBQyxDQUFDN0QsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMxQ3dELE1BQU0sQ0FBQ0csSUFBSSxDQUFDRSxhQUFhLENBQUMsQ0FBQ1csT0FBTyxDQUFDLFVBQVV1RyxnQkFBd0IsRUFBRTtRQUN0RSxJQUFNNEcsbUJBQW1CLEdBQUc5TixhQUFhLENBQUNrSCxnQkFBZ0IsQ0FBQztRQUMzRCxJQUFJdEosS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLeUUsU0FBUyxJQUFJeUwsbUJBQW1CLEVBQUU7VUFDakU7VUFDQSxJQUFNQyxhQUFhLEdBQUdELG1CQUFtQixDQUFDakgsaUJBQWlCO1VBQzNELElBQUlLLGdCQUFnQixLQUFLLFlBQVksSUFBSUEsZ0JBQWdCLEtBQUssWUFBWSxFQUFFO1lBQzNFLElBQU04RyxTQUFTLEdBQ2JILHFCQUFxQixDQUFDM0csZ0JBQWdCLENBQUMsS0FBSzdFLFNBQVMsSUFBSXdMLHFCQUFxQixDQUFDM0csZ0JBQWdCLENBQUMsQ0FBQ0ksSUFBSSxJQUN0R0osZ0JBQWdCO1lBQ2pCLElBQU0rRyxjQUFjLEdBQUdyUSxLQUFLLENBQUNzUSxhQUFhLHNCQUFlRixTQUFTLFFBQUs7WUFDdkUsSUFBSUMsY0FBYyxLQUFLLElBQUksRUFBRTtjQUM1QixJQUFNakcsU0FBUyxHQUFHbUcsMEJBQTBCLENBQUN2USxLQUFLLEVBQUVzSixnQkFBZ0IsRUFBRTZHLGFBQWEsQ0FBQztjQUNwRkUsY0FBYyxDQUFDNUksV0FBVyxPQUExQjRJLGNBQWMscUJBQWlCakcsU0FBUyxDQUFDekUsUUFBUSxFQUF1QixDQUFDLENBQUM7WUFDM0U7VUFDRCxDQUFDLE1BQU0sSUFBSUgsaUJBQWlCLElBQUkySyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQ3ZELElBQU0vRixVQUFTLEdBQUdtRywwQkFBMEIsQ0FBQ3ZRLEtBQUssRUFBRXNKLGdCQUFnQixFQUFFNkcsYUFBYSxDQUFDO1lBQ3BGblEsS0FBSyxDQUFDa0ssV0FBVyxDQUFDRSxVQUFTLENBQUM7VUFDN0I7UUFDRDtNQUNELENBQUMsQ0FBQztJQUNIO0VBQ0Q7RUFFQSxTQUFTbUcsMEJBQTBCLENBQUN2USxLQUFjLEVBQUVzSixnQkFBd0IsRUFBRTZHLGFBQTZCLEVBQUU7SUFDNUcsSUFBTS9GLFNBQVMsR0FBRzVELFFBQVEsQ0FBQ3VELGVBQWUsQ0FBQy9KLEtBQUssQ0FBQ2dLLFlBQVksRUFBRVYsZ0JBQWdCLENBQUNrSCxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BHLE9BQU9MLGFBQWEsRUFBRTtNQUNyQixJQUFNaEgsVUFBVSxHQUFHZ0gsYUFBYSxDQUFDL0csa0JBQWtCO01BQ25EZ0IsU0FBUyxDQUFDRixXQUFXLENBQUNpRyxhQUFhLENBQUM7TUFDcENBLGFBQWEsR0FBR2hILFVBQVU7SUFDM0I7SUFDQSxPQUFPaUIsU0FBUztFQUNqQjtFQXNTQSxTQUFTa0YsZ0JBQWdCLENBQ3hCN08sU0FBOEMsRUFDOUNSLFFBQTBCLEVBQzFCd1EsSUFJQyxFQUNEL1AsaUJBQXNELEVBQ3JEO0lBQ0QsSUFBTWdNLElBQUksR0FBSStELElBQUksQ0FBQ2xRLElBQUksSUFBSWtRLElBQUksQ0FBQ3JDLEtBQUssSUFBSTNKLFNBQW9CO0lBQzdELElBQUkvRCxpQkFBaUIsQ0FBQ2dNLElBQUksQ0FBQyxFQUFFO01BQzVCLE9BQU8sQ0FBQztJQUNUOztJQUNBLElBQUk7TUFDSCxJQUFJdkksWUFBWSxHQUFHc00sSUFBSSxDQUFDOUgsSUFBSTtNQUM1QixJQUFJOEgsSUFBSSxDQUFDckMsS0FBSyxJQUFJLElBQUksRUFBRTtRQUN2QmpLLFlBQVksYUFBTXNNLElBQUksQ0FBQ3JDLEtBQUssY0FBSWpLLFlBQVksQ0FBRTtNQUMvQztNQUNBLElBQU11TSxRQUFRLEdBQUd6USxRQUFRLENBQUNXLFdBQVcsRUFBRTtNQUN2QyxJQUFJNlAsSUFBSSxDQUFDckMsS0FBSyxLQUFLLGtCQUFrQixJQUFJcUMsSUFBSSxDQUFDOUgsSUFBSSxDQUFDcEssTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5RGtDLFNBQVMsQ0FBQ2lNLElBQUksQ0FBQyxHQUFHZ0UsUUFBUSxDQUFDN1AsTUFBTSxDQUFDNFAsSUFBSSxDQUFDckMsS0FBSyxDQUFDLENBQUNXLFVBQVUsQ0FBQzBCLElBQUksQ0FBQzlILElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO01BQ2pILENBQUMsTUFBTSxJQUFJLENBQUMrSCxRQUFRLENBQUNsQyxlQUFlLENBQUNpQyxJQUFJLENBQUNyQyxLQUFLLENBQUUsSUFBSXNDLFFBQVEsQ0FBQzdQLE1BQU0sQ0FBQzRQLElBQUksQ0FBQ3JDLEtBQUssQ0FBRSxFQUFFO1FBQ2xGM04sU0FBUyxDQUFDaU0sSUFBSSxDQUFDLEdBQUdnRSxRQUFRLENBQUM3UCxNQUFNLENBQUM0UCxJQUFJLENBQUNyQyxLQUFLLENBQUUsQ0FBQ1csVUFBVSxDQUFDMEIsSUFBSSxDQUFDOUgsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUN2RSxDQUFDLE1BQU07UUFDTmxJLFNBQVMsQ0FBQ2lNLElBQUksQ0FBQyxHQUFHek0sUUFBUSxDQUFDOE8sVUFBVSxDQUFDNUssWUFBWSxDQUFDLENBQUMsQ0FBQztNQUN0RDs7TUFFQXpELGlCQUFpQixDQUFDZ00sSUFBSSxDQUFDLEdBQUdqTSxTQUFTLENBQUNpTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxPQUFPaUUsRUFBRSxFQUFFO01BQ1o7TUFDQTtNQUNBO01BQ0E7TUFDQTtJQUFBO0VBRUY7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNDLHFCQUFxQixDQUFDN1EsdUJBQWdELEVBQVE7SUFDN0Y4USxlQUFlLENBQUNDLE1BQU0sV0FDZDlRLEtBQWMsRUFBRUMsUUFBMEI7TUFBQSxPQUFLSCxvQkFBb0IsQ0FBQ0MsdUJBQXVCLEVBQUVDLEtBQUssRUFBRUMsUUFBUSxDQUFDO0lBQUEsR0FDcEhGLHVCQUF1QixDQUFDTSxTQUFTLEVBQ2pDTix1QkFBdUIsQ0FBQ08sTUFBTSxJQUFJUCx1QkFBdUIsQ0FBQ1EsSUFBSSxDQUM5RDtJQUNELElBQUlSLHVCQUF1QixDQUFDZ1IsZUFBZSxFQUFFO01BQzVDRixlQUFlLENBQUNDLE1BQU0sV0FDZDlRLEtBQWMsRUFBRUMsUUFBMEI7UUFBQSxPQUFLSCxvQkFBb0IsQ0FBQ0MsdUJBQXVCLEVBQUVDLEtBQUssRUFBRUMsUUFBUSxFQUFFLElBQUksQ0FBQztNQUFBLEdBQzFIRix1QkFBdUIsQ0FBQ2dSLGVBQWUsRUFDdkNoUix1QkFBdUIsQ0FBQ08sTUFBTSxJQUFJUCx1QkFBdUIsQ0FBQ1EsSUFBSSxDQUM5RDtJQUNGO0VBQ0Q7RUFBQztFQUVELFNBQVM2RyxjQUFjLENBQUM0SixhQUF1QixFQUFFQyxXQUFtQixFQUFFQyxjQUF1QixFQUFFbkksS0FBYyxFQUFVO0lBQ3RILElBQU1vSSxXQUFXLEdBQUdILGFBQWEsQ0FBQzNKLEdBQUcsQ0FBQyxVQUFDK0osWUFBWTtNQUFBLE9BQUtDLEdBQUcsOEZBQWtCQyx1QkFBdUIsQ0FBQ0YsWUFBWSxDQUFDO0lBQUEsQ0FBSyxDQUFDO0lBQ3hILElBQUlHLFVBQVUsR0FBRyxFQUFFO0lBQ25CLElBQUl4SSxLQUFLLEVBQUU7TUFDVixJQUFNeUksY0FBYyxHQUFHQyxJQUFJLGdCQUFTMUksS0FBSyxZQUFTO01BQ2xEd0ksVUFBVSxHQUFHRixHQUFHLDRJQUFzREcsY0FBYyxVQUFZO0lBQ2pHO0lBQ0EsSUFBSUUsY0FBYyxHQUFHLEVBQUU7SUFDdkIsSUFBSVIsY0FBYyxFQUFFO01BQ25CUSxjQUFjLEdBQUdMLEdBQUcsZ1FBRStDSSxJQUFJLENBQUNFLElBQUksQ0FBQ0MsU0FBUyxDQUFDVixjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQ25HO0lBQ2Q7SUFDQSxPQUFPRyxHQUFHLDJtQkFDTEYsV0FBVyxFQUNYSSxVQUFVLGlDQUltREUsSUFBSSxDQUFDUixXQUFXLENBQUNZLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FFckdILGNBQWM7RUFHckI7RUFFQSxJQUFNbE4sT0FBZ0MsR0FBRyxDQUFDLENBQUM7RUFDM0MsU0FBU04sVUFBVSxDQUFDN0YsTUFBZSxFQUFFO0lBQ3BDLElBQU15VCxXQUFXLG1CQUFZQyxHQUFHLEVBQUUsQ0FBRTtJQUNwQ3ZOLE9BQU8sQ0FBQ3NOLFdBQVcsQ0FBQyxHQUFHelQsTUFBTTtJQUM3QixPQUFPeVQsV0FBVztFQUNuQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVN6TCxjQUFjLENBQUMyTCxTQUFpQixFQUEyQztJQUFBO0lBQUEsSUFBekNDLG9CQUFvQix1RUFBRyxLQUFLO0lBQzdFLElBQUlBLG9CQUFvQixFQUFFO01BQ3pCRCxTQUFTLGtYQU1pRkEsU0FBUyxnQkFBYTtJQUNqSDtJQUNBLElBQU1FLFdBQVcsR0FBRzVGLGlCQUFpQixDQUFDNkYsZUFBZSxDQUFDSCxTQUFTLEVBQUUsVUFBVSxDQUFDO0lBQzVFLElBQUlJLE1BQU0sR0FBR0YsV0FBVyxDQUFDakosaUJBQWlCO0lBQzFDLE9BQU8sWUFBQW1KLE1BQU0sNENBQU4sUUFBUXRMLFNBQVMsTUFBSyxVQUFVLEVBQUU7TUFBQTtNQUN4Q3NMLE1BQU0sR0FBR0EsTUFBTSxDQUFDbkosaUJBQWlCO0lBQ2xDO0lBQ0EsSUFBTXRELFFBQVEsR0FBRyxZQUFBeU0sTUFBTSxxQ0FBTixTQUFRQyxhQUFhLGVBQUdELE1BQU0sNkNBQU4sU0FBUUMsYUFBYSxDQUFDMU0sUUFBUSxHQUFHLENBQUN5TSxNQUFNLENBQVk7SUFDN0YsT0FBTzNNLEtBQUssQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLENBQUM7RUFDNUI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNTyxTQUFTMkwsdUJBQXVCLENBQUN6VCxLQUFjLEVBQXNCO0lBQzNFLE9BQU9BLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFMlMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7RUFDM0c7RUFBQztFQUVELFNBQVM4QixpQkFBaUIsQ0FBQ0MsTUFBYyxFQUFFO0lBQUE7SUFDMUMsSUFBTUMsU0FBUyxHQUFHbk0sY0FBYyxDQUFDa00sTUFBTSxFQUFFLElBQUksQ0FBQztJQUM5QyxJQUFJQyxTQUFTLENBQUNqVSxNQUFNLEdBQUcsQ0FBQyxLQUFLa0csU0FBUyxJQUFJLGdCQUFBK04sU0FBUyxDQUFDLENBQUMsQ0FBQyxnREFBWixZQUFjMUwsU0FBUyxNQUFLLGFBQWEsRUFBRTtNQUNwRixJQUFNc0ssWUFBWSxHQUFJb0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFpQkMsU0FBUyxJQUFLRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQWlCRSxTQUFTO01BQ3ZHLE9BQU90TCxjQUFjLENBQUMsQ0FBQ2dLLFlBQVksQ0FBQ3VCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFSixNQUFNLENBQUM7SUFDN0QsQ0FBQyxNQUFNO01BQ04sT0FBT0EsTUFBTTtJQUNkO0VBQ0Q7RUFFQSxTQUFTSyxtQkFBbUIsQ0FBQ0MsRUFBK0IsRUFBMkI7SUFDdEYsT0FBTyxDQUFDQSxFQUFFLGFBQUZBLEVBQUUsdUJBQUZBLEVBQUUsQ0FBd0JoTixXQUFXLE1BQUtwQixTQUFTO0VBQzVEO0VBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxJQUFNNE0sR0FBRyxHQUFHLFVBQUN5QixPQUE2QixFQUF5QztJQUN6RixJQUFJUCxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUlqVSxDQUFDO0lBQUMsa0NBRitDRCxNQUFNO01BQU5BLE1BQU07SUFBQTtJQUczRCxLQUFLQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdELE1BQU0sQ0FBQ0UsTUFBTSxFQUFFRCxDQUFDLEVBQUUsRUFBRTtNQUNuQ2lVLE1BQU0sSUFBSU8sT0FBTyxDQUFDeFUsQ0FBQyxDQUFDOztNQUVwQjtNQUNBLElBQU1ULEtBQUssR0FBR1EsTUFBTSxDQUFDQyxDQUFDLENBQUM7TUFFdkIsSUFBSW1ILEtBQUssQ0FBQ3NOLE9BQU8sQ0FBQ2xWLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUNVLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBT1YsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUM3RTBVLE1BQU0sSUFBSTFVLEtBQUssQ0FBQ21WLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ3hMLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ1IsSUFBSSxFQUFFO01BQzFDLENBQUMsTUFBTSxJQUFJaU0sZUFBZSxDQUFDcFYsS0FBSyxDQUFDLEVBQUU7UUFDbEMwVSxNQUFNLElBQUkxVSxLQUFLLENBQUN3SixHQUFHLENBQUMsVUFBQzZMLE9BQU87VUFBQSxPQUFLQSxPQUFPLEVBQUU7UUFBQSxFQUFDLENBQUMxTCxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3ZELENBQUMsTUFBTSxJQUFJMkwsMEJBQTBCLENBQUN0VixLQUFLLENBQUMsRUFBRTtRQUM3QyxJQUFNdVYsa0JBQWtCLEdBQUdDLGlCQUFpQixDQUFDeFYsS0FBSyxDQUFDO1FBQ25EMFUsTUFBTSxJQUFJakIsdUJBQXVCLENBQUM4QixrQkFBa0IsQ0FBQztNQUN0RCxDQUFDLE1BQU0sSUFBSVIsbUJBQW1CLENBQUMvVSxLQUFLLENBQUMsRUFBRTtRQUN0QzBVLE1BQU0sSUFBSTFVLEtBQUssQ0FBQ2dJLFdBQVcsRUFBRztNQUMvQixDQUFDLE1BQU0sSUFBSSxPQUFPaEksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN4QzBVLE1BQU0sSUFBSSx1QkFBdUI7TUFDbEMsQ0FBQyxNQUFNLElBQUksT0FBTzFVLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDdkMwVSxNQUFNLElBQUkxVSxLQUFLLEVBQUU7TUFDbEIsQ0FBQyxNQUFNLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxLQUFLLElBQUksRUFBRTtRQUN2RCxJQUFJbUcsU0FBUyxDQUFDbkcsS0FBSyxDQUFDLEVBQUU7VUFDckIwVSxNQUFNLElBQUkxVSxLQUFLLENBQUMrSyxPQUFPLEVBQUU7UUFDMUIsQ0FBQyxNQUFNO1VBQ04sSUFBTTBLLFdBQVcsR0FBR3BQLFVBQVUsQ0FBQ3JHLEtBQUssQ0FBQztVQUNyQzBVLE1BQU0sY0FBT2UsV0FBVyxDQUFFO1FBQzNCO01BQ0QsQ0FBQyxNQUFNLElBQUl6VixLQUFLLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDQSxLQUFLLENBQUNzTyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQ3RPLEtBQUssQ0FBQ3NPLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNyR29HLE1BQU0sSUFBSWpCLHVCQUF1QixDQUFDelQsS0FBSyxDQUFDO01BQ3pDLENBQUMsTUFBTTtRQUNOMFUsTUFBTSxJQUFJMVUsS0FBSztNQUNoQjtJQUNEO0lBQ0EwVSxNQUFNLElBQUlPLE9BQU8sQ0FBQ3hVLENBQUMsQ0FBQztJQUNwQmlVLE1BQU0sR0FBR0EsTUFBTSxDQUFDdkwsSUFBSSxFQUFFO0lBQ3RCLElBQUlDLFdBQVcsRUFBRTtNQUNoQixPQUFPcUwsaUJBQWlCLENBQUNDLE1BQU0sQ0FBQztJQUNqQztJQUNBLE9BQU9BLE1BQU07RUFDZCxDQUFDO0VBQUM7RUFBQTtBQUFBIn0=