@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -8,6 +8,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
8
8
  var _exports = {};
9
9
  var isPathExpression = PropertyHelper.isPathExpression;
10
10
  var isAnnotationPathExpression = PropertyHelper.isAnnotationPathExpression;
11
+ var unresolveableExpression = BindingExpression.unresolveableExpression;
11
12
  var equal = BindingExpression.equal;
12
13
  var constant = BindingExpression.constant;
13
14
  var annotationExpression = BindingExpression.annotationExpression;
@@ -17,59 +18,57 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
17
18
 
18
19
  if (!contextPath) {
19
20
  return visitedNavProps;
20
- } else {
21
- if (visitedNavProps.length >= contextPath.navigationProperties.length) {
22
- var remainingNavProps = [];
23
- contextPath.navigationProperties.forEach(function (navProp, navIndex) {
24
- if (visitedNavProps[navIndex] !== navProp) {
25
- remainingNavProps.push(visitedNavProps[navIndex]);
26
- }
27
- });
28
- remainingNavProps = remainingNavProps.concat(visitedNavProps.slice(contextPath.navigationProperties.length)); // Clean up NavProp -> Owner
21
+ } else if (visitedNavProps.length >= contextPath.navigationProperties.length) {
22
+ var remainingNavProps = [];
23
+ contextPath.navigationProperties.forEach(function (navProp, navIndex) {
24
+ if (visitedNavProps[navIndex] !== navProp) {
25
+ remainingNavProps.push(visitedNavProps[navIndex]);
26
+ }
27
+ });
28
+ remainingNavProps = remainingNavProps.concat(visitedNavProps.slice(contextPath.navigationProperties.length)); // Clean up NavProp -> Owner
29
29
 
30
- var currentIdx = 0;
30
+ var currentIdx = 0;
31
31
 
32
- while (remainingNavProps.length > 1 && currentIdx != remainingNavProps.length - 1) {
33
- var currentNav = remainingNavProps[currentIdx];
34
- var nextNavProp = remainingNavProps[currentIdx + 1];
32
+ while (remainingNavProps.length > 1 && currentIdx != remainingNavProps.length - 1) {
33
+ var currentNav = remainingNavProps[currentIdx];
34
+ var nextNavProp = remainingNavProps[currentIdx + 1];
35
35
 
36
- if (currentNav.partner === nextNavProp.name) {
37
- remainingNavProps.splice(0, 2);
38
- } else {
39
- currentIdx++;
40
- }
36
+ if (currentNav.partner === nextNavProp.name) {
37
+ remainingNavProps.splice(0, 2);
38
+ } else {
39
+ currentIdx++;
41
40
  }
41
+ }
42
42
 
43
- return remainingNavProps;
44
- } else {
45
- var extraNavProp = [];
46
- visitedNavProps.forEach(function (navProp, navIndex) {
47
- if (contextPath.navigationProperties[navIndex] !== navProp) {
48
- extraNavProp.push(visitedNavProps[navIndex]);
49
- }
50
- });
51
- extraNavProp = extraNavProp.concat(contextPath.navigationProperties.slice(visitedNavProps.length)); // Clean up NavProp -> Owner
43
+ return remainingNavProps;
44
+ } else {
45
+ var extraNavProp = [];
46
+ visitedNavProps.forEach(function (navProp, navIndex) {
47
+ if (contextPath.navigationProperties[navIndex] !== navProp) {
48
+ extraNavProp.push(visitedNavProps[navIndex]);
49
+ }
50
+ });
51
+ extraNavProp = extraNavProp.concat(contextPath.navigationProperties.slice(visitedNavProps.length)); // Clean up NavProp -> Owner
52
52
 
53
- var _currentIdx = 0;
53
+ var _currentIdx = 0;
54
54
 
55
- while (extraNavProp.length > 1 && _currentIdx != extraNavProp.length - 1) {
56
- var _currentNav = extraNavProp[_currentIdx];
57
- var _nextNavProp = extraNavProp[_currentIdx + 1];
55
+ while (extraNavProp.length > 1 && _currentIdx != extraNavProp.length - 1) {
56
+ var _currentNav = extraNavProp[_currentIdx];
57
+ var _nextNavProp = extraNavProp[_currentIdx + 1];
58
58
 
59
- if (_currentNav.partner === _nextNavProp.name) {
60
- extraNavProp.splice(0, 2);
61
- } else {
62
- _currentIdx++;
63
- }
59
+ if (_currentNav.partner === _nextNavProp.name) {
60
+ extraNavProp.splice(0, 2);
61
+ } else {
62
+ _currentIdx++;
64
63
  }
64
+ }
65
65
 
66
- extraNavProp = extraNavProp.map(function (navProp) {
67
- return navProp.targetType.navigationProperties.find(function (np) {
68
- return np.name === navProp.partner;
69
- });
66
+ extraNavProp = extraNavProp.map(function (navProp) {
67
+ return navProp.targetType.navigationProperties.find(function (np) {
68
+ return np.name === navProp.partner;
70
69
  });
71
- return extraNavProp;
72
- }
70
+ });
71
+ return extraNavProp;
73
72
  }
74
73
  };
75
74
 
@@ -127,67 +126,30 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
127
126
  contextLocation: dataModelObjectPath.contextLocation,
128
127
  targetEntitySet: currentEntitySet,
129
128
  targetEntityType: currentEntityType,
130
- targetObject: oTarget
129
+ targetObject: oTarget,
130
+ convertedTypes: dataModelObjectPath.convertedTypes
131
131
  };
132
132
  };
133
133
 
134
134
  _exports.enhanceDataModelPath = enhanceDataModelPath;
135
135
 
136
136
  var getTargetEntitySetPath = function (dataModelObjectPath) {
137
- var _dataModelObjectPath$;
138
-
139
- var bRelative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
140
- var targetEntitySetPath = "";
141
-
142
- if (!bRelative) {
143
- targetEntitySetPath += "/".concat(dataModelObjectPath.startingEntitySet.name);
144
- }
145
-
146
- var currentEntitySet = bRelative && (_dataModelObjectPath$ = dataModelObjectPath.contextLocation) !== null && _dataModelObjectPath$ !== void 0 && _dataModelObjectPath$.targetEntitySet ? dataModelObjectPath.contextLocation.targetEntitySet : dataModelObjectPath.startingEntitySet;
147
- var navigatedPaths = [];
148
- dataModelObjectPath.navigationProperties.forEach(function (navProp) {
149
- var _dataModelObjectPath$2;
150
-
151
- if (!bRelative || !dataModelObjectPath.contextLocation || !((_dataModelObjectPath$2 = dataModelObjectPath.contextLocation) !== null && _dataModelObjectPath$2 !== void 0 && _dataModelObjectPath$2.navigationProperties.some(function (contextNavProp) {
152
- return contextNavProp.fullyQualifiedName === navProp.fullyQualifiedName;
153
- }))) {
154
- // in case of relative entitySetPath we don't consider navigationPath that are already in the context
155
- navigatedPaths.push(navProp.name);
156
- }
157
-
158
- if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
159
- if (bRelative) {
160
- targetEntitySetPath += "".concat(navigatedPaths.join("/"));
161
- } else {
162
- targetEntitySetPath += "/$NavigationPropertyBinding/".concat(navigatedPaths.join("/"), "/$");
163
- }
164
-
165
- currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
166
- navigatedPaths = [];
167
- }
168
- });
169
- return targetEntitySetPath;
170
- };
171
-
172
- _exports.getTargetEntitySetPath = getTargetEntitySetPath;
173
-
174
- var getTargetEntitySetNavigation = function (dataModelObjectPath) {
175
- var visitedNavigationProperties = [];
137
+ var targetEntitySetPath = "/".concat(dataModelObjectPath.startingEntitySet.name);
176
138
  var currentEntitySet = dataModelObjectPath.startingEntitySet;
177
139
  var navigatedPaths = [];
178
140
  dataModelObjectPath.navigationProperties.forEach(function (navProp) {
179
141
  navigatedPaths.push(navProp.name);
180
142
 
181
143
  if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
182
- visitedNavigationProperties.push(navProp);
144
+ targetEntitySetPath += "/$NavigationPropertyBinding/".concat(navigatedPaths.join("/"), "/$");
183
145
  currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
184
146
  navigatedPaths = [];
185
147
  }
186
148
  });
187
- return visitedNavigationProperties;
149
+ return targetEntitySetPath;
188
150
  };
189
151
 
190
- _exports.getTargetEntitySetNavigation = getTargetEntitySetNavigation;
152
+ _exports.getTargetEntitySetPath = getTargetEntitySetPath;
191
153
 
192
154
  var getTargetObjectPath = function (dataModelObjectPath) {
193
155
  var bRelative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@@ -271,42 +233,42 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
271
233
 
272
234
  _exports.getContextRelativeTargetObjectPath = getContextRelativeTargetObjectPath;
273
235
 
274
- var isPathUpdatable = function (dataModelObjectPath, propertyPath, bTableCase) {
236
+ var isPathUpdatable = function (dataModelObjectPath, extractionParametersOnPath) {
275
237
  return checkOnPath(dataModelObjectPath, function (annotationObject) {
276
238
  var _annotationObject$Upd;
277
239
 
278
240
  return annotationObject === null || annotationObject === void 0 ? void 0 : (_annotationObject$Upd = annotationObject.UpdateRestrictions) === null || _annotationObject$Upd === void 0 ? void 0 : _annotationObject$Upd.Updatable;
279
- }, propertyPath, bTableCase);
241
+ }, extractionParametersOnPath);
280
242
  };
281
243
 
282
244
  _exports.isPathUpdatable = isPathUpdatable;
283
245
 
284
- var isPathSearchable = function (dataModelObjectPath, propertyPath, bTableCase) {
246
+ var isPathSearchable = function (dataModelObjectPath, extractionParametersOnPath) {
285
247
  return checkOnPath(dataModelObjectPath, function (annotationObject) {
286
248
  var _annotationObject$Sea;
287
249
 
288
250
  return annotationObject === null || annotationObject === void 0 ? void 0 : (_annotationObject$Sea = annotationObject.SearchRestrictions) === null || _annotationObject$Sea === void 0 ? void 0 : _annotationObject$Sea.Searchable;
289
- }, propertyPath, bTableCase);
251
+ }, extractionParametersOnPath);
290
252
  };
291
253
 
292
254
  _exports.isPathSearchable = isPathSearchable;
293
255
 
294
- var isPathDeletable = function (dataModelObjectPath, propertyPath, bTableCase) {
256
+ var isPathDeletable = function (dataModelObjectPath, extractionParametersOnPath) {
295
257
  return checkOnPath(dataModelObjectPath, function (annotationObject) {
296
258
  var _annotationObject$Del;
297
259
 
298
260
  return annotationObject === null || annotationObject === void 0 ? void 0 : (_annotationObject$Del = annotationObject.DeleteRestrictions) === null || _annotationObject$Del === void 0 ? void 0 : _annotationObject$Del.Deletable;
299
- }, propertyPath, bTableCase);
261
+ }, extractionParametersOnPath);
300
262
  };
301
263
 
302
264
  _exports.isPathDeletable = isPathDeletable;
303
265
 
304
- var isPathInsertable = function (dataModelObjectPath, propertyPath) {
266
+ var isPathInsertable = function (dataModelObjectPath, extractionParametersOnPath) {
305
267
  return checkOnPath(dataModelObjectPath, function (annotationObject) {
306
268
  var _annotationObject$Ins;
307
269
 
308
270
  return annotationObject === null || annotationObject === void 0 ? void 0 : (_annotationObject$Ins = annotationObject.InsertRestrictions) === null || _annotationObject$Ins === void 0 ? void 0 : _annotationObject$Ins.Insertable;
309
- }, propertyPath);
271
+ }, extractionParametersOnPath);
310
272
  };
311
273
 
312
274
  _exports.isPathInsertable = isPathInsertable;
@@ -336,14 +298,12 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
336
298
 
337
299
  _exports.checkFilterExpressionRestrictions = checkFilterExpressionRestrictions;
338
300
 
339
- var checkOnPath = function (dataModelObjectPath, checkFunction, propertyPath, bTableCase) {
340
- var _targetEntitySet, _targetEntitySet$anno, _restrictionDefinitio;
341
-
301
+ var checkOnPath = function (dataModelObjectPath, checkFunction, extractionParametersOnPath) {
342
302
  if (!dataModelObjectPath || !dataModelObjectPath.startingEntitySet) {
343
303
  return constant(true);
344
304
  }
345
305
 
346
- dataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, propertyPath);
306
+ dataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, extractionParametersOnPath === null || extractionParametersOnPath === void 0 ? void 0 : extractionParametersOnPath.propertyPath);
347
307
  var currentEntitySet = dataModelObjectPath.startingEntitySet;
348
308
  var parentEntitySet = null;
349
309
  var visitedNavigationPropsName = [];
@@ -380,10 +340,10 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
380
340
  targetEntitySet = null;
381
341
  }
382
342
  }); // At this point we have navigated down all the nav prop and we should have
383
- // The target entityset pointing to either null (in case of containment navprop a last part), or the actual target (non containment as target)
384
- // The parent entitySet pointing to the previous entityset used in the path
343
+ // The target entitySet pointing to either null (in case of containment navprop a last part), or the actual target (non containment as target)
344
+ // The parent entitySet pointing to the previous entitySet used in the path
385
345
  // VisitedNavigationPath should contain the path up to this property
386
- // Restrictions should then be evaluated as ParentEntitySet.NavRestrictions[NavpropertyPath] || TargetEntitySet.Restrictions
346
+ // Restrictions should then be evaluated as ParentEntitySet.NavRestrictions[NavPropertyPath] || TargetEntitySet.Restrictions
387
347
 
388
348
  var fullNavigationPath = visitedNavigationPropsName.join("/");
389
349
  var restrictions, visitedNavProps;
@@ -396,58 +356,68 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
396
356
  var _restrictedNavProp$Na;
397
357
 
398
358
  if (((_restrictedNavProp$Na = restrictedNavProp.NavigationProperty) === null || _restrictedNavProp$Na === void 0 ? void 0 : _restrictedNavProp$Na.type) === "NavigationPropertyPath") {
399
- var _restrictionDefinition = checkFunction(restrictedNavProp);
359
+ var restrictionDefinition = checkFunction(restrictedNavProp);
400
360
 
401
- if (fullNavigationPath === restrictedNavProp.NavigationProperty.value && _restrictionDefinition !== undefined) {
361
+ if (fullNavigationPath === restrictedNavProp.NavigationProperty.value && restrictionDefinition !== undefined) {
402
362
  var _dataModelObjectPath;
403
363
 
404
364
  var _allVisitedNavigationProps = allVisitedNavigationProps.slice(0, -1);
405
365
 
406
366
  if (targetEntitySet !== null) {
407
367
  visitedNavProps = _allVisitedNavigationProps;
368
+ } else if (_allVisitedNavigationProps.length === 0) {
369
+ visitedNavProps = allVisitedNavigationProps.slice(0);
408
370
  } else {
409
- if (_allVisitedNavigationProps.length === 0) {
410
- visitedNavProps = allVisitedNavigationProps.slice(0);
411
- } else {
412
- visitedNavProps = _allVisitedNavigationProps;
413
- }
371
+ visitedNavProps = _allVisitedNavigationProps;
414
372
  }
415
373
 
416
- restrictions = equal(annotationExpression(_restrictionDefinition, getPathRelativeLocation((_dataModelObjectPath = dataModelObjectPath) === null || _dataModelObjectPath === void 0 ? void 0 : _dataModelObjectPath.contextLocation, visitedNavProps).map(function (np) {
374
+ var pathRelativeLocation = getPathRelativeLocation((_dataModelObjectPath = dataModelObjectPath) === null || _dataModelObjectPath === void 0 ? void 0 : _dataModelObjectPath.contextLocation, visitedNavProps).map(function (np) {
417
375
  return np.name;
418
- })), true);
376
+ });
377
+ var pathVisitorFunction = extractionParametersOnPath !== null && extractionParametersOnPath !== void 0 && extractionParametersOnPath.pathVisitor ? getPathVisitorForSingleton(extractionParametersOnPath.pathVisitor, pathRelativeLocation) : undefined; // send pathVisitor function only when it is defined and only send function or defined as a parameter
378
+
379
+ restrictions = equal(annotationExpression(restrictionDefinition, pathRelativeLocation, undefined, pathVisitorFunction), true);
419
380
  }
420
381
  }
421
382
  });
422
383
  }
423
384
 
424
385
  var targetRestrictions;
425
- var restrictionDefinition = checkFunction((_targetEntitySet = targetEntitySet) === null || _targetEntitySet === void 0 ? void 0 : (_targetEntitySet$anno = _targetEntitySet.annotations) === null || _targetEntitySet$anno === void 0 ? void 0 : _targetEntitySet$anno.Capabilities);
426
386
 
427
- if (targetEntitySet === null && restrictionDefinition === undefined) {
428
- var _targetEntityType$ann;
387
+ if (!(extractionParametersOnPath !== null && extractionParametersOnPath !== void 0 && extractionParametersOnPath.ignoreTargetCollection)) {
388
+ var _targetEntitySet, _targetEntitySet$anno;
429
389
 
430
- restrictionDefinition = checkFunction(targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : _targetEntityType$ann.Capabilities);
431
- }
390
+ var restrictionDefinition = checkFunction((_targetEntitySet = targetEntitySet) === null || _targetEntitySet === void 0 ? void 0 : (_targetEntitySet$anno = _targetEntitySet.annotations) === null || _targetEntitySet$anno === void 0 ? void 0 : _targetEntitySet$anno.Capabilities);
432
391
 
433
- if (restrictionDefinition !== undefined) {
434
- targetRestrictions = equal(annotationExpression(restrictionDefinition, getPathRelativeLocation(dataModelObjectPath.contextLocation, allVisitedNavigationProps).map(function (np) {
435
- return np.name;
436
- })), true);
437
- } //object page table case in path based scenario's fallback to exisiting approach
392
+ if (targetEntitySet === null && restrictionDefinition === undefined) {
393
+ var _targetEntityType$ann;
438
394
 
395
+ restrictionDefinition = checkFunction(targetEntityType === null || targetEntityType === void 0 ? void 0 : (_targetEntityType$ann = targetEntityType.annotations) === null || _targetEntityType$ann === void 0 ? void 0 : _targetEntityType$ann.Capabilities);
396
+ }
439
397
 
440
- if (bTableCase && !restrictions && (_restrictionDefinitio = restrictionDefinition) !== null && _restrictionDefinitio !== void 0 && _restrictionDefinitio.path) {
441
- var oResult = {
442
- "currentEntityRestriction": targetRestrictions
443
- };
444
- return oResult;
398
+ if (restrictionDefinition !== undefined) {
399
+ var pathRelativeLocation = getPathRelativeLocation(dataModelObjectPath.contextLocation, allVisitedNavigationProps).map(function (np) {
400
+ return np.name;
401
+ });
402
+ var pathVisitorFunction = extractionParametersOnPath !== null && extractionParametersOnPath !== void 0 && extractionParametersOnPath.pathVisitor ? getPathVisitorForSingleton(extractionParametersOnPath.pathVisitor, pathRelativeLocation) : undefined;
403
+ targetRestrictions = equal(annotationExpression(restrictionDefinition, pathRelativeLocation, undefined, pathVisitorFunction), true);
404
+ }
445
405
  }
446
406
 
447
- return restrictions || targetRestrictions || constant(true);
448
- };
407
+ return restrictions || targetRestrictions || (extractionParametersOnPath !== null && extractionParametersOnPath !== void 0 && extractionParametersOnPath.authorizeUnresolvable ? unresolveableExpression : constant(true));
408
+ }; // This helper method is used to add relative path location argument to singletonPathVisitorFunction i.e. pathVisitor
409
+ // pathVisitor method is used later to get the correct bindings for singleton entity
410
+ // method is invoked later in bindingExpression() method to get the correct binding.
411
+
449
412
 
450
413
  _exports.checkOnPath = checkOnPath;
414
+
415
+ var getPathVisitorForSingleton = function (pathVisitor, pathRelativeLocation) {
416
+ return function (path) {
417
+ return pathVisitor(path, pathRelativeLocation);
418
+ };
419
+ };
420
+
451
421
  return _exports;
452
422
  }, false);
453
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFNb2RlbFBhdGhIZWxwZXIudHMiXSwibmFtZXMiOlsiZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24iLCJjb250ZXh0UGF0aCIsInZpc2l0ZWROYXZQcm9wcyIsImxlbmd0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVtYWluaW5nTmF2UHJvcHMiLCJmb3JFYWNoIiwibmF2UHJvcCIsIm5hdkluZGV4IiwicHVzaCIsImNvbmNhdCIsInNsaWNlIiwiY3VycmVudElkeCIsImN1cnJlbnROYXYiLCJuZXh0TmF2UHJvcCIsInBhcnRuZXIiLCJuYW1lIiwic3BsaWNlIiwiZXh0cmFOYXZQcm9wIiwibWFwIiwidGFyZ2V0VHlwZSIsImZpbmQiLCJucCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJpc1BhdGhFeHByZXNzaW9uIiwiaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24iLCJwYXRoIiwib1RhcmdldCIsIiR0YXJnZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXRPYmplY3QiLCJhUGF0aFNwbGl0Iiwic3BsaXQiLCJjdXJyZW50RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJyZWR1Y2UiLCJyZWR1Y2VkRW50aXR5VHlwZSIsInBhdGhQYXJ0IiwidW5kZWZpbmVkIiwicG90ZW50aWFsTmF2UHJvcCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJoYXNPd25Qcm9wZXJ0eSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwiZ2V0VGFyZ2V0RW50aXR5U2V0UGF0aCIsImJSZWxhdGl2ZSIsInRhcmdldEVudGl0eVNldFBhdGgiLCJuYXZpZ2F0ZWRQYXRocyIsInNvbWUiLCJjb250ZXh0TmF2UHJvcCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImpvaW4iLCJnZXRUYXJnZXRFbnRpdHlTZXROYXZpZ2F0aW9uIiwidmlzaXRlZE5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsIl90eXBlIiwiZW5kc1dpdGgiLCJ0ZXJtIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsImZvckJpbmRpbmdFeHByZXNzaW9uIiwibmF2UHJvcGVydGllcyIsImlzQ29sbGVjdGlvbiIsInR5cGUiLCJ2YWx1ZSIsInF1YWxpZmllciIsImlzUGF0aFVwZGF0YWJsZSIsImJUYWJsZUNhc2UiLCJjaGVja09uUGF0aCIsImFubm90YXRpb25PYmplY3QiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJpc1BhdGhTZWFyY2hhYmxlIiwiU2VhcmNoUmVzdHJpY3Rpb25zIiwiU2VhcmNoYWJsZSIsImlzUGF0aERlbGV0YWJsZSIsIkRlbGV0ZVJlc3RyaWN0aW9ucyIsIkRlbGV0YWJsZSIsImlzUGF0aEluc2VydGFibGUiLCJJbnNlcnRSZXN0cmljdGlvbnMiLCJJbnNlcnRhYmxlIiwiY2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiYWxsb3dlZEV4cHJlc3Npb24iLCJmaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsImN1cnJlbnRPYmplY3RSZXN0cmljdGlvbiIsInJlc3RyaWN0aW9uIiwiUHJvcGVydHkiLCJpbmRleE9mIiwiQWxsb3dlZEV4cHJlc3Npb25zIiwidG9TdHJpbmciLCJjaGVja0Z1bmN0aW9uIiwiY29uc3RhbnQiLCJwYXJlbnRFbnRpdHlTZXQiLCJ2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZSIsImFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMiLCJyZXNldFZpc2l0ZWROYXZQcm9wcyIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImNvbnRhaW5zVGFyZ2V0IiwiZnVsbE5hdmlnYXRpb25QYXRoIiwicmVzdHJpY3Rpb25zIiwiX3BhcmVudEVudGl0eVNldCIsImFubm90YXRpb25zIiwiQ2FwYWJpbGl0aWVzIiwiTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwicmVzdHJpY3RlZE5hdlByb3AiLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCJyZXN0cmljdGlvbkRlZmluaXRpb24iLCJfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcyIsImVxdWFsIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJ0YXJnZXRSZXN0cmljdGlvbnMiLCJvUmVzdWx0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQXNCTyxNQUFNQSx1QkFBdUIsR0FBRyxVQUN0Q0MsV0FEc0MsRUFHZjtBQUFBLFFBRHZCQyxlQUN1Qix1RUFEaUIsRUFDakI7O0FBQ3ZCLFFBQUksQ0FBQ0QsV0FBTCxFQUFrQjtBQUNqQixhQUFPQyxlQUFQO0FBQ0EsS0FGRCxNQUVPO0FBQ04sVUFBSUEsZUFBZSxDQUFDQyxNQUFoQixJQUEwQkYsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0QsTUFBL0QsRUFBdUU7QUFDdEUsWUFBSUUsaUJBQXVDLEdBQUcsRUFBOUM7QUFDQUosUUFBQUEsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0UsT0FBakMsQ0FBeUMsVUFBQ0MsT0FBRCxFQUFVQyxRQUFWLEVBQXVCO0FBQy9ELGNBQUlOLGVBQWUsQ0FBQ00sUUFBRCxDQUFmLEtBQThCRCxPQUFsQyxFQUEyQztBQUMxQ0YsWUFBQUEsaUJBQWlCLENBQUNJLElBQWxCLENBQXVCUCxlQUFlLENBQUNNLFFBQUQsQ0FBdEM7QUFDQTtBQUNELFNBSkQ7QUFLQUgsUUFBQUEsaUJBQWlCLEdBQUdBLGlCQUFpQixDQUFDSyxNQUFsQixDQUF5QlIsZUFBZSxDQUFDUyxLQUFoQixDQUFzQlYsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0QsTUFBdkQsQ0FBekIsQ0FBcEIsQ0FQc0UsQ0FRdEU7O0FBQ0EsWUFBSVMsVUFBVSxHQUFHLENBQWpCOztBQUNB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OztBQUNELFdBQU9iLFlBQVksSUFBSVksa0JBQWhCLElBQXNDcEIsUUFBUSxDQUFDLElBQUQsQ0FBckQ7QUFDQSxHQXpHTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGFubm90YXRpb25FeHByZXNzaW9uLCBjb25zdGFudCwgZXF1YWwsIEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7IFByb3BlcnR5T3JQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgeyBpc0Fubm90YXRpb25QYXRoRXhwcmVzc2lvbiwgaXNQYXRoRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQge1xuXHRGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlVHlwZXMsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQge1xuXHRFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMsXG5cdEVudGl0eVR5cGVBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRzdGFydGluZ0VudGl0eVNldDogRW50aXR5U2V0O1xuXHRjb250ZXh0TG9jYXRpb24/OiBEYXRhTW9kZWxPYmplY3RQYXRoO1xuXHRuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W107XG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldDtcblx0dGFyZ2V0RW50aXR5VHlwZTogRW50aXR5VHlwZTtcblx0dGFyZ2V0T2JqZWN0OiBhbnk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24gPSBmdW5jdGlvbihcblx0Y29udGV4dFBhdGg/OiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHR2aXNpdGVkTmF2UHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW11cbik6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdIHtcblx0aWYgKCFjb250ZXh0UGF0aCkge1xuXHRcdHJldHVybiB2aXNpdGVkTmF2UHJvcHM7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHZpc2l0ZWROYXZQcm9wcy5sZW5ndGggPj0gY29udGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRsZXQgcmVtYWluaW5nTmF2UHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdFx0XHRjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKChuYXZQcm9wLCBuYXZJbmRleCkgPT4ge1xuXHRcdFx0XHRpZiAodmlzaXRlZE5hdlByb3BzW25hdkluZGV4XSAhPT0gbmF2UHJvcCkge1xuXHRcdFx0XHRcdHJlbWFpbmluZ05hdlByb3BzLnB1c2godmlzaXRlZE5hdlByb3BzW25hdkluZGV4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmVtYWluaW5nTmF2UHJvcHMgPSByZW1haW5pbmdOYXZQcm9wcy5jb25jYXQodmlzaXRlZE5hdlByb3BzLnNsaWNlKGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCkpO1xuXHRcdFx0Ly8gQ2xlYW4gdXAgTmF2UHJvcCAtPiBPd25lclxuXHRcdFx0bGV0IGN1cnJlbnRJZHggPSAwO1xuXHRcdFx0d2hpbGUgKHJlbWFpbmluZ05hdlByb3BzLmxlbmd0aCA+IDEgJiYgY3VycmVudElkeCAhPSByZW1haW5pbmdOYXZQcm9wcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnROYXYgPSByZW1haW5pbmdOYXZQcm9wc1tjdXJyZW50SWR4XTtcblx0XHRcdFx0Y29uc3QgbmV4dE5hdlByb3AgPSByZW1haW5pbmdOYXZQcm9wc1tjdXJyZW50SWR4ICsgMV07XG5cdFx0XHRcdGlmIChjdXJyZW50TmF2LnBhcnRuZXIgPT09IG5leHROYXZQcm9wLm5hbWUpIHtcblx0XHRcdFx0XHRyZW1haW5pbmdOYXZQcm9wcy5zcGxpY2UoMCwgMik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudElkeCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVtYWluaW5nTmF2UHJvcHM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxldCBleHRyYU5hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdFx0XHR2aXNpdGVkTmF2UHJvcHMuZm9yRWFjaCgobmF2UHJvcCwgbmF2SW5kZXgpID0+IHtcblx0XHRcdFx0aWYgKGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdkluZGV4XSAhPT0gbmF2UHJvcCkge1xuXHRcdFx0XHRcdGV4dHJhTmF2UHJvcC5wdXNoKHZpc2l0ZWROYXZQcm9wc1tuYXZJbmRleF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGV4dHJhTmF2UHJvcCA9IGV4dHJhTmF2UHJvcC5jb25jYXQoY29udGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuc2xpY2UodmlzaXRlZE5hdlByb3BzLmxlbmd0aCkpO1xuXHRcdFx0Ly8gQ2xlYW4gdXAgTmF2UHJvcCAtPiBPd25lclxuXHRcdFx0bGV0IGN1cnJlbnRJZHggPSAwO1xuXHRcdFx0d2hpbGUgKGV4dHJhTmF2UHJvcC5sZW5ndGggPiAxICYmIGN1cnJlbnRJZHggIT0gZXh0cmFOYXZQcm9wLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudE5hdiA9IGV4dHJhTmF2UHJvcFtjdXJyZW50SWR4XTtcblx0XHRcdFx0Y29uc3QgbmV4dE5hdlByb3AgPSBleHRyYU5hdlByb3BbY3VycmVudElkeCArIDFdO1xuXHRcdFx0XHRpZiAoY3VycmVudE5hdi5wYXJ0bmVyID09PSBuZXh0TmF2UHJvcC5uYW1lKSB7XG5cdFx0XHRcdFx0ZXh0cmFOYXZQcm9wLnNwbGljZSgwLCAyKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjdXJyZW50SWR4Kys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGV4dHJhTmF2UHJvcCA9IGV4dHJhTmF2UHJvcC5tYXAobmF2UHJvcCA9PiB7XG5cdFx0XHRcdHJldHVybiBuYXZQcm9wLnRhcmdldFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZChucCA9PiBucC5uYW1lID09PSBuYXZQcm9wLnBhcnRuZXIpIGFzIE5hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGV4dHJhTmF2UHJvcDtcblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBlbmhhbmNlRGF0YU1vZGVsUGF0aCA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT5cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRsZXQgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gXCJcIjtcblx0aWYgKChpc1BhdGhFeHByZXNzaW9uKHByb3BlcnR5UGF0aCkgfHwgaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24ocHJvcGVydHlQYXRoKSkgJiYgcHJvcGVydHlQYXRoLnBhdGgpIHtcblx0XHRzUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoLnBhdGg7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHNQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGggYXMgc3RyaW5nO1xuXHR9XG5cdGxldCBvVGFyZ2V0O1xuXHRpZiAoaXNQYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpIHx8IGlzQW5ub3RhdGlvblBhdGhFeHByZXNzaW9uKHByb3BlcnR5UGF0aCkpIHtcblx0XHRvVGFyZ2V0ID0gcHJvcGVydHlQYXRoLiR0YXJnZXQ7XG5cdH0gZWxzZSBpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0b1RhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5yZXNvbHZlUGF0aChzUHJvcGVydHlQYXRoKTtcblx0fSBlbHNlIHtcblx0XHRvVGFyZ2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdH1cblx0Y29uc3QgYVBhdGhTcGxpdCA9IHNQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRsZXQgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGUgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5jb25jYXQoKTtcblx0Ly8gUHJvY2VzcyBvbmx5IGlmIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblxuXHRhUGF0aFNwbGl0LnJlZHVjZSgocmVkdWNlZEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQsIHBhdGhQYXJ0OiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXJlZHVjZWRFbnRpdHlUeXBlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBwb3RlbnRpYWxOYXZQcm9wID0gcmVkdWNlZEVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZChuYXZQcm9wID0+IG5hdlByb3AubmFtZSA9PT0gcGF0aFBhcnQpO1xuXHRcdGlmIChwb3RlbnRpYWxOYXZQcm9wKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcy5wdXNoKHBvdGVudGlhbE5hdlByb3ApO1xuXHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBwb3RlbnRpYWxOYXZQcm9wLnRhcmdldFR5cGU7XG5cdFx0XHRpZiAoY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkocGF0aFBhcnQpKSB7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbcGF0aFBhcnRdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGN1cnJlbnRFbnRpdHlUeXBlO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LCBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUpO1xuXG5cdHJldHVybiB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdGNvbnRleHRMb2NhdGlvbjogZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBjdXJyZW50RW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGN1cnJlbnRFbnRpdHlUeXBlLFxuXHRcdHRhcmdldE9iamVjdDogb1RhcmdldFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRhcmdldEVudGl0eVNldFBhdGggPSBmdW5jdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLCBiUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuXHRpZiAoIWJSZWxhdGl2ZSkge1xuXHRcdHRhcmdldEVudGl0eVNldFBhdGggKz0gYC8ke2RhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZX1gO1xuXHR9XG5cdGxldCBjdXJyZW50RW50aXR5U2V0ID1cblx0XHRiUmVsYXRpdmUgJiYgZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVNldFxuXHRcdFx0PyBkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbi50YXJnZXRFbnRpdHlTZXRcblx0XHRcdDogZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gobmF2UHJvcCA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0IWJSZWxhdGl2ZSB8fFxuXHRcdFx0IWRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uIHx8XG5cdFx0XHRcdCFkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuc29tZShcblx0XHRcdFx0XHRjb250ZXh0TmF2UHJvcCA9PiBjb250ZXh0TmF2UHJvcC5mdWxseVF1YWxpZmllZE5hbWUgPT09IG5hdlByb3AuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdClcblx0XHQpIHtcblx0XHRcdC8vIGluIGNhc2Ugb2YgcmVsYXRpdmUgZW50aXR5U2V0UGF0aCB3ZSBkb24ndCBjb25zaWRlciBuYXZpZ2F0aW9uUGF0aCB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBjb250ZXh0XG5cdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG5hdlByb3AubmFtZSk7XG5cdFx0fVxuXHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdGlmIChiUmVsYXRpdmUpIHtcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0UGF0aCArPSBgJHtuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0UGF0aCArPSBgLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLyR7bmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIil9LyRgO1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiB0YXJnZXRFbnRpdHlTZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRhcmdldEVudGl0eVNldE5hdmlnYXRpb24gPSBmdW5jdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogTmF2aWdhdGlvblByb3BlcnR5W10ge1xuXHRjb25zdCB2aXNpdGVkTmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdGxldCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gobmF2UHJvcCA9PiB7XG5cdFx0bmF2aWdhdGVkUGF0aHMucHVzaChuYXZQcm9wLm5hbWUpO1xuXHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUHJvcGVydGllcy5wdXNoKG5hdlByb3ApO1xuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiB2aXNpdGVkTmF2aWdhdGlvblByb3BlcnRpZXM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0T2JqZWN0UGF0aCA9IGZ1bmN0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIGJSZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcblx0bGV0IHBhdGggPSBcIlwiO1xuXHRpZiAoIWRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQpIHtcblx0XHRyZXR1cm4gXCIvXCI7XG5cdH1cblx0aWYgKCFiUmVsYXRpdmUpIHtcblx0XHRwYXRoICs9IGAvJHtkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWV9YDtcblx0fVxuXHRpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG5cdFx0aWYgKHBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPSBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IG5hdlByb3AubmFtZSkuam9pbihcIi9cIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuX3R5cGUgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5fdHlwZSAhPT0gXCJFbnRpdHlUeXBlXCIgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAhPT0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldFxuXHQpIHtcblx0XHRpZiAoIXBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lm5hbWV9YDtcblx0fSBlbHNlIGlmIChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJiBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcInRlcm1cIikpIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwICYmICFwYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPSBgQCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudGVybX1gO1xuXHR9XG5cdHJldHVybiBwYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGggPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Zm9yQmluZGluZ0V4cHJlc3Npb246IGJvb2xlYW4gPSBmYWxzZVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2UHJvcGVydGllcyA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLCBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzKTtcblx0aWYgKGZvckJpbmRpbmdFeHByZXNzaW9uKSB7XG5cdFx0aWYgKG5hdlByb3BlcnRpZXMuZmluZChucCA9PiBucC5pc0NvbGxlY3Rpb24pKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRsZXQgcGF0aCA9IG5hdlByb3BlcnRpZXMubWFwKG5wID0+IG5wLm5hbWUpLmpvaW4oXCIvXCIpO1xuXHRpZiAoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgJiZcblx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QubmFtZSB8fFxuXHRcdFx0KGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIgJiYgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudmFsdWUpKSAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Ll90eXBlICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgIT09IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXRcblx0KSB7XG5cdFx0aWYgKHBhdGgubGVuZ3RoID4gMCAmJiAhcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz1cblx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCJcblx0XHRcdFx0PyBgJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC52YWx1ZX1gXG5cdFx0XHRcdDogYCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QubmFtZX1gO1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICYmIGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lmhhc093blByb3BlcnR5KFwidGVybVwiKSkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDAgJiYgIXBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGBAJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC50ZXJtfWA7XG5cdFx0aWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lmhhc093blByb3BlcnR5KFwicXVhbGlmaWVyXCIpICYmICEhZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucXVhbGlmaWVyKSB7XG5cdFx0XHRwYXRoICs9IGAjJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5xdWFsaWZpZXJ9YDtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIWRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gcGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1BhdGhVcGRhdGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRiVGFibGVDYXNlPzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyB8IEVudGl0eVR5cGVBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0Py5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aCxcblx0XHRiVGFibGVDYXNlXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoU2VhcmNoYWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdGJUYWJsZUNhc2U/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uU2VhcmNoUmVzdHJpY3Rpb25zPy5TZWFyY2hhYmxlO1xuXHRcdH0sXG5cdFx0cHJvcGVydHlQYXRoLFxuXHRcdGJUYWJsZUNhc2Vcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1BhdGhEZWxldGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRiVGFibGVDYXNlPzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyB8IEVudGl0eVR5cGVBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0Py5EZWxldGVSZXN0cmljdGlvbnM/LkRlbGV0YWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aCxcblx0XHRiVGFibGVDYXNlXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoSW5zZXJ0YWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uSW5zZXJ0UmVzdHJpY3Rpb25zPy5JbnNlcnRhYmxlO1xuXHRcdH0sXG5cdFx0cHJvcGVydHlQYXRoXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGFsbG93ZWRFeHByZXNzaW9uOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIHwgRW50aXR5VHlwZUFubm90YXRpb25zX0NhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0aWYgKGFubm90YXRpb25PYmplY3QgJiYgXCJGaWx0ZXJSZXN0cmljdGlvbnNcIiBpbiBhbm5vdGF0aW9uT2JqZWN0KSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnM6IEZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvblR5cGVUeXBlc1tdID1cblx0XHRcdFx0XHQoYW5ub3RhdGlvbk9iamVjdD8uRmlsdGVyUmVzdHJpY3Rpb25zPy5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIGFzIEZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvblR5cGVUeXBlc1tdKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgY3VycmVudE9iamVjdFJlc3RyaWN0aW9uID0gZmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5maW5kKHJlc3RyaWN0aW9uID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gKHJlc3RyaWN0aW9uLlByb3BlcnR5IGFzIFByb3BlcnR5UGF0aCkuJHRhcmdldCA9PT0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY3VycmVudE9iamVjdFJlc3RyaWN0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFsbG93ZWRFeHByZXNzaW9uLmluZGV4T2YoY3VycmVudE9iamVjdFJlc3RyaWN0aW9uPy5BbGxvd2VkRXhwcmVzc2lvbnM/LnRvU3RyaW5nKCkpICE9PSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tPblBhdGggPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0Y2hlY2tGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb3BlcnR5UGF0aD86IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0YlRhYmxlQ2FzZT86IGJvb2xlYW5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIWRhdGFNb2RlbE9iamVjdFBhdGggfHwgIWRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblx0ZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGgsIHByb3BlcnR5UGF0aCk7XG5cblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IG51bGwgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0O1xuXHRsZXQgcGFyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCBudWxsID0gbnVsbDtcblx0bGV0IHZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRsZXQgdGFyZ2V0RW50aXR5U2V0OiBFbnRpdHlTZXQgfCBudWxsID0gY3VycmVudEVudGl0eVNldDtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZTogRW50aXR5VHlwZSB8IG51bGwgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdGxldCByZXNldFZpc2l0ZWROYXZQcm9wcyA9IGZhbHNlO1xuXG5cdGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRpZiAocmVzZXRWaXNpdGVkTmF2UHJvcHMpIHtcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lID0gW107XG5cdFx0fVxuXHRcdHZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lLnB1c2gobmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpO1xuXHRcdGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMucHVzaChuYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdGlmICghbmF2aWdhdGlvblByb3BlcnR5LmNvbnRhaW5zVGFyZ2V0KSB7XG5cdFx0XHQvLyBXZSBzaG91bGQgaGF2ZSBhIG5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXRoIHNvIGZhciB3aGljaCBjYW4gY29uc2lzdCBvZiAoW0NvbnRhaW5tZW50TmF2UHJvcF0vKSpbTmF2UHJvcF1cblx0XHRcdGNvbnN0IGZ1bGxOYXZpZ2F0aW9uUGF0aCA9IHZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lLmpvaW4oXCIvXCIpO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KGZ1bGxOYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHRcdFx0cGFyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tmdWxsTmF2aWdhdGlvblBhdGhdO1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRcdFx0XHQvLyBJZiB3ZSByZWFjaGVkIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoIGEgbmF2aWdhdGlvbnByb3BlcnR5YmluZGluZywgd2UgbmVlZCB0byByZXNldCB0aGUgdmlzaXRlZCBwYXRoIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiAoaWYgdGhlcmUgaXMgb25lKVxuXHRcdFx0XHRyZXNldFZpc2l0ZWROYXZQcm9wcyA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSByZWFsbHkgc2hvdWxkIG5vdCBlbmQgdXAgaGVyZSBidXQgYXQgbGVhc3QgbGV0J3MgdHJ5IHRvIGF2b2lkIGluY29ycmVjdCBiZWhhdmlvclxuXHRcdFx0XHRwYXJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gbnVsbDtcblx0XHRcdFx0cmVzZXRWaXNpdGVkTmF2UHJvcHMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRcdFx0dGFyZ2V0RW50aXR5U2V0ID0gbnVsbDtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBuYXZpZ2F0ZWQgZG93biBhbGwgdGhlIG5hdiBwcm9wIGFuZCB3ZSBzaG91bGQgaGF2ZVxuXHQvLyBUaGUgdGFyZ2V0IGVudGl0eXNldCBwb2ludGluZyB0byBlaXRoZXIgbnVsbCAoaW4gY2FzZSBvZiBjb250YWlubWVudCBuYXZwcm9wIGEgbGFzdCBwYXJ0KSwgb3IgdGhlIGFjdHVhbCB0YXJnZXQgKG5vbiBjb250YWlubWVudCBhcyB0YXJnZXQpXG5cdC8vIFRoZSBwYXJlbnQgZW50aXR5U2V0IHBvaW50aW5nIHRvIHRoZSBwcmV2aW91cyBlbnRpdHlzZXQgdXNlZCBpbiB0aGUgcGF0aFxuXHQvLyBWaXNpdGVkTmF2aWdhdGlvblBhdGggc2hvdWxkIGNvbnRhaW4gdGhlIHBhdGggdXAgdG8gdGhpcyBwcm9wZXJ0eVxuXG5cdC8vIFJlc3RyaWN0aW9ucyBzaG91bGQgdGhlbiBiZSBldmFsdWF0ZWQgYXMgUGFyZW50RW50aXR5U2V0Lk5hdlJlc3RyaWN0aW9uc1tOYXZwcm9wZXJ0eVBhdGhdIHx8IFRhcmdldEVudGl0eVNldC5SZXN0cmljdGlvbnNcblx0Y29uc3QgZnVsbE5hdmlnYXRpb25QYXRoID0gdmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUuam9pbihcIi9cIik7XG5cdGxldCByZXN0cmljdGlvbnMsIHZpc2l0ZWROYXZQcm9wcztcblx0aWYgKHBhcmVudEVudGl0eVNldCAhPT0gbnVsbCkge1xuXHRcdGNvbnN0IF9wYXJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCA9IHBhcmVudEVudGl0eVNldDtcblx0XHRfcGFyZW50RW50aXR5U2V0LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM/LlJlc3RyaWN0ZWRQcm9wZXJ0aWVzLmZvckVhY2goXG5cdFx0XHQocmVzdHJpY3RlZE5hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXMpID0+IHtcblx0XHRcdFx0aWYgKHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eT8udHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRjb25zdCByZXN0cmljdGlvbkRlZmluaXRpb24gPSBjaGVja0Z1bmN0aW9uKHJlc3RyaWN0ZWROYXZQcm9wKTtcblx0XHRcdFx0XHRpZiAoZnVsbE5hdmlnYXRpb25QYXRoID09PSByZXN0cmljdGVkTmF2UHJvcC5OYXZpZ2F0aW9uUHJvcGVydHkudmFsdWUgJiYgcmVzdHJpY3Rpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IF9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzID0gYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcy5zbGljZSgwLCAtMSk7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0RW50aXR5U2V0ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdHZpc2l0ZWROYXZQcm9wcyA9IF9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYgKF9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHZpc2l0ZWROYXZQcm9wcyA9IGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMuc2xpY2UoMCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dmlzaXRlZE5hdlByb3BzID0gX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRyZXN0cmljdGlvbkRlZmluaXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0Z2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oZGF0YU1vZGVsT2JqZWN0UGF0aD8uY29udGV4dExvY2F0aW9uLCB2aXNpdGVkTmF2UHJvcHMpLm1hcChucCA9PiBucC5uYW1lKVxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblx0bGV0IHRhcmdldFJlc3RyaWN0aW9ucztcblx0bGV0IHJlc3RyaWN0aW9uRGVmaW5pdGlvbiA9IGNoZWNrRnVuY3Rpb24odGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzKTtcblx0aWYgKHRhcmdldEVudGl0eVNldCA9PT0gbnVsbCAmJiByZXN0cmljdGlvbkRlZmluaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdHJlc3RyaWN0aW9uRGVmaW5pdGlvbiA9IGNoZWNrRnVuY3Rpb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcyk7XG5cdH1cblx0aWYgKHJlc3RyaWN0aW9uRGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFyZ2V0UmVzdHJpY3Rpb25zID0gZXF1YWwoXG5cdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0cmVzdHJpY3Rpb25EZWZpbml0aW9uLFxuXHRcdFx0XHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbiwgYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcykubWFwKG5wID0+IG5wLm5hbWUpXG5cdFx0XHQpLFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdH1cblx0Ly9vYmplY3QgcGFnZSB0YWJsZSBjYXNlIGluIHBhdGggYmFzZWQgc2NlbmFyaW8ncyBmYWxsYmFjayB0byBleGlzaXRpbmcgYXBwcm9hY2hcblx0aWYgKGJUYWJsZUNhc2UgJiYgIXJlc3RyaWN0aW9ucyAmJiByZXN0cmljdGlvbkRlZmluaXRpb24/LnBhdGgpIHtcblx0XHRjb25zdCBvUmVzdWx0OiBhbnkgPSB7XG5cdFx0XHRcImN1cnJlbnRFbnRpdHlSZXN0cmljdGlvblwiOiB0YXJnZXRSZXN0cmljdGlvbnNcblx0XHR9O1xuXHRcdHJldHVybiBvUmVzdWx0O1xuXHR9XG5cdHJldHVybiByZXN0cmljdGlvbnMgfHwgdGFyZ2V0UmVzdHJpY3Rpb25zIHx8IGNvbnN0YW50KHRydWUpO1xufTtcbiJdfQ==
423
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFNb2RlbFBhdGhIZWxwZXIudHMiXSwibmFtZXMiOlsiZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24iLCJjb250ZXh0UGF0aCIsInZpc2l0ZWROYXZQcm9wcyIsImxlbmd0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVtYWluaW5nTmF2UHJvcHMiLCJmb3JFYWNoIiwibmF2UHJvcCIsIm5hdkluZGV4IiwicHVzaCIsImNvbmNhdCIsInNsaWNlIiwiY3VycmVudElkeCIsImN1cnJlbnROYXYiLCJuZXh0TmF2UHJvcCIsInBhcnRuZXIiLCJuYW1lIiwic3BsaWNlIiwiZXh0cmFOYXZQcm9wIiwibWFwIiwidGFyZ2V0VHlwZSIsImZpbmQiLCJucCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJpc1BhdGhFeHByZXNzaW9uIiwiaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24iLCJwYXRoIiwib1RhcmdldCIsIiR0YXJnZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXRPYmplY3QiLCJhUGF0aFNwbGl0Iiwic3BsaXQiLCJjdXJyZW50RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJyZWR1Y2UiLCJyZWR1Y2VkRW50aXR5VHlwZSIsInBhdGhQYXJ0IiwidW5kZWZpbmVkIiwicG90ZW50aWFsTmF2UHJvcCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJoYXNPd25Qcm9wZXJ0eSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwiY29udmVydGVkVHlwZXMiLCJnZXRUYXJnZXRFbnRpdHlTZXRQYXRoIiwidGFyZ2V0RW50aXR5U2V0UGF0aCIsIm5hdmlnYXRlZFBhdGhzIiwiam9pbiIsImdldFRhcmdldE9iamVjdFBhdGgiLCJiUmVsYXRpdmUiLCJfdHlwZSIsImVuZHNXaXRoIiwidGVybSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJmb3JCaW5kaW5nRXhwcmVzc2lvbiIsIm5hdlByb3BlcnRpZXMiLCJpc0NvbGxlY3Rpb24iLCJ0eXBlIiwidmFsdWUiLCJxdWFsaWZpZXIiLCJpc1BhdGhVcGRhdGFibGUiLCJleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aCIsImNoZWNrT25QYXRoIiwiYW5ub3RhdGlvbk9iamVjdCIsIlVwZGF0ZVJlc3RyaWN0aW9ucyIsIlVwZGF0YWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJTZWFyY2hSZXN0cmljdGlvbnMiLCJTZWFyY2hhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiRGVsZXRlUmVzdHJpY3Rpb25zIiwiRGVsZXRhYmxlIiwiaXNQYXRoSW5zZXJ0YWJsZSIsIkluc2VydFJlc3RyaWN0aW9ucyIsIkluc2VydGFibGUiLCJjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJhbGxvd2VkRXhwcmVzc2lvbiIsImZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiY3VycmVudE9iamVjdFJlc3RyaWN0aW9uIiwicmVzdHJpY3Rpb24iLCJQcm9wZXJ0eSIsImluZGV4T2YiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJ0b1N0cmluZyIsImNoZWNrRnVuY3Rpb24iLCJjb25zdGFudCIsInBhcmVudEVudGl0eVNldCIsInZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lIiwiYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcyIsInJlc2V0VmlzaXRlZE5hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiY29udGFpbnNUYXJnZXQiLCJmdWxsTmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnMiLCJfcGFyZW50RW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJyZXN0cmljdGVkTmF2UHJvcCIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlc3RyaWN0aW9uRGVmaW5pdGlvbiIsIl9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzIiwicGF0aFJlbGF0aXZlTG9jYXRpb24iLCJwYXRoVmlzaXRvckZ1bmN0aW9uIiwicGF0aFZpc2l0b3IiLCJnZXRQYXRoVmlzaXRvckZvclNpbmdsZXRvbiIsImVxdWFsIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJ0YXJnZXRSZXN0cmljdGlvbnMiLCJpZ25vcmVUYXJnZXRDb2xsZWN0aW9uIiwiYXV0aG9yaXplVW5yZXNvbHZhYmxlIiwidW5yZXNvbHZlYWJsZUV4cHJlc3Npb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQThCTyxNQUFNQSx1QkFBdUIsR0FBRyxVQUN0Q0MsV0FEc0MsRUFHZjtBQUFBLFFBRHZCQyxlQUN1Qix1RUFEaUIsRUFDakI7O0FBQ3ZCLFFBQUksQ0FBQ0QsV0FBTCxFQUFrQjtBQUNqQixhQUFPQyxlQUFQO0FBQ0EsS0FGRCxNQUVPLElBQUlBLGVBQWUsQ0FBQ0MsTUFBaEIsSUFBMEJGLFdBQVcsQ0FBQ0csb0JBQVosQ0FBaUNELE1BQS9ELEVBQXVFO0FBQzdFLFVBQUlFLGlCQUF1QyxHQUFHLEVBQTlDO0FBQ0FKLE1BQUFBLFdBQVcsQ0FBQ0csb0JBQVosQ0FBaUNFLE9BQWpDLENBQXlDLFVBQUNDLE9BQUQsRUFBVUMsUUFBVixFQUF1QjtBQUMvRCxZQUFJTixlQUFlLENBQUNNLFFBQUQsQ0FBZixLQUE4QkQsT0FBbEMsRUFBMkM7QUFDMUNGLFVBQUFBLGlCQUFpQixDQUFDSSxJQUFsQixDQUF1QlAsZUFBZSxDQUFDTSxRQUFELENBQXRDO0FBQ0E7QUFDRCxPQUpEO0FBS0FILE1BQUFBLGlCQUFpQixHQUFHQSxpQkFBaUIsQ0FBQ0ssTUFBbEIsQ0FBeUJSLGVBQWUsQ0FBQ1MsS0FBaEIsQ0FBc0JWLFdBQVcsQ0FBQ0csb0JBQVosQ0FBaUNELE1BQXZELENBQXpCLENBQXBCLENBUDZFLENBUTdFOztBQUNBLFVBQUlTLFVBQVUsR0FBRyxDQUFqQjs7QUFDQSxhQUFPUCxpQkFBaUIsQ0FBQ0YsTUFBbEIsR0FBMkIsQ0FBM0IsSUFBZ0NTLFVBQVUsSUFBSVAsaUJBQWlCLENBQUNGLE1BQWxCLEdBQTJCLENBQWhGLEVBQW1GO0FBQ2xGLFlBQU1VLFVBQVUsR0FBR1IsaUJBQWlCLENBQUNPLFVBQUQsQ0FBcEM7QUFDQSxZQUFNRSxXQUFXLEdBQUdULGlCQUFpQixDQUFDTyxVQUFVLEdBQUcsQ0FBZCxDQUFyQzs7QUFDQSxZQUFJQyxVQUFVLENBQUNFLE9BQVgsS0FBdUJELFdBQVcsQ0FBQ0UsSUFBdkMsRUFBNkM7QUFDNUNYLFVBQUFBLGlCQUFpQixDQUFDWSxNQUFsQixDQUF5QixDQUF6QixFQUE0QixDQUE1QjtBQUNBLFNBRkQsTUFFTztBQUNOTCxVQUFBQSxVQUFVO0FBQ1Y7QUFDRDs7QUFDRCxhQUFPUCxpQkFBUDtBQUNBLEtBcEJNLE1Bb0JBO0FBQ04sVUFBSWEsWUFBa0MsR0FBRyxFQUF6QztBQUNBaEIsTUFBQUEsZUFBZSxDQUFDSSxPQUFoQixDQUF3QixVQUFDQyxPQUFELEVBQVVDLFFBQVYsRUFBdUI7QUFDOUMsWUFBSVAsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0ksUUFBakMsTUFBK0NELE9BQW5ELEVBQTREO0FBQzNEVyxVQUFBQSxZQUFZLENBQUNULElBQWIsQ0FBa0JQLGVBQWUsQ0FBQ00sUUFBRCxDQUFqQztBQUNBO0FBQ0QsT0FKRDtBQUtBVSxNQUFBQSxZQUFZLEdBQUdBLFlBQVksQ0FBQ1IsTUFBYixDQUFvQlQsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ08sS0FBakMsQ0FBdUNULGVBQWUsQ0FBQ0MsTUFBdkQsQ0FBcEIsQ0FBZixDQVBNLENBUU47O0FBQ0EsVUFBSVMsV0FBVSxHQUFHLENBQWpCOztBQUNBLGFBQU9NLFlBQVksQ0FBQ2YsTUFBYixHQUFzQixDQUF0QixJQUEyQlMsV0FBVSxJQUFJTSxZQUFZLENBQUNmLE1BQWIsR0FBc0IsQ0FBdEUsRUFBeUU7QUFDeEUsWUFBTVUsV0FBVSxHQUFHSyxZQUFZLENBQUNOLFdBQUQsQ0FBL0I7QUFDQSxZQUFNRSxZQUFXLEdBQUdJLFlBQVksQ0FBQ04sV0FBVSxHQUFHLENBQWQsQ0FBaEM7O0FBQ0EsWUFBSUMsV0FBVSxDQUFDRSxPQUFYLEtBQXVCRCxZQUFXLENBQUNFLElBQXZDLEVBQTZDO0FBQzVDRSxVQUFBQSxZQUFZLENBQUNELE1BQWIsQ0FBb0IsQ0FBcEIsRUFBdUIsQ0FBdkI7QUFDQSxTQUZELE1BRU87QUFDTkwsVUFBQUEsV0FBVTtBQUNWO0FBQ0Q7O0FBQ0RNLE1BQUFBLFlBQVksR0FBR0EsWUFBWSxDQUFDQyxHQUFiLENBQWlCLFVBQUFaLE9BQU8sRUFBSTtBQUMxQyxlQUFPQSxPQUFPLENBQUNhLFVBQVIsQ0FBbUJoQixvQkFBbkIsQ0FBd0NpQixJQUF4QyxDQUE2QyxVQUFBQyxFQUFFO0FBQUEsaUJBQUlBLEVBQUUsQ0FBQ04sSUFBSCxLQUFZVCxPQUFPLENBQUNRLE9BQXhCO0FBQUEsU0FBL0MsQ0FBUDtBQUNBLE9BRmMsQ0FBZjtBQUdBLGFBQU9HLFlBQVA7QUFDQTtBQUNELEdBbERNOzs7O0FBb0RBLE1BQU1LLG9CQUFvQixHQUFHLFVBQ25DQyxtQkFEbUMsRUFFbkNDLFlBRm1DLEVBR2I7QUFDdEIsUUFBSUMsYUFBcUIsR0FBRyxFQUE1Qjs7QUFDQSxRQUFJLENBQUNDLGdCQUFnQixDQUFDRixZQUFELENBQWhCLElBQWtDRywwQkFBMEIsQ0FBQ0gsWUFBRCxDQUE3RCxLQUFnRkEsWUFBWSxDQUFDSSxJQUFqRyxFQUF1RztBQUN0R0gsTUFBQUEsYUFBYSxHQUFHRCxZQUFZLENBQUNJLElBQTdCO0FBQ0EsS0FGRCxNQUVPLElBQUksT0FBT0osWUFBUCxLQUF3QixRQUE1QixFQUFzQztBQUM1Q0MsTUFBQUEsYUFBYSxHQUFHRCxZQUFoQjtBQUNBOztBQUNELFFBQUlLLE9BQUo7O0FBQ0EsUUFBSUgsZ0JBQWdCLENBQUNGLFlBQUQsQ0FBaEIsSUFBa0NHLDBCQUEwQixDQUFDSCxZQUFELENBQWhFLEVBQWdGO0FBQy9FSyxNQUFBQSxPQUFPLEdBQUdMLFlBQVksQ0FBQ00sT0FBdkI7QUFDQSxLQUZELE1BRU8sSUFBSVAsbUJBQW1CLENBQUNRLGdCQUF4QixFQUEwQztBQUNoREYsTUFBQUEsT0FBTyxHQUFHTixtQkFBbUIsQ0FBQ1EsZ0JBQXBCLENBQXFDQyxXQUFyQyxDQUFpRFAsYUFBakQsQ0FBVjtBQUNBLEtBRk0sTUFFQTtBQUNOSSxNQUFBQSxPQUFPLEdBQUdOLG1CQUFtQixDQUFDVSxZQUE5QjtBQUNBOztBQUNELFFBQU1DLFVBQVUsR0FBR1QsYUFBYSxDQUFDVSxLQUFkLENBQW9CLEdBQXBCLENBQW5CO0FBQ0EsUUFBSUMsZ0JBQWdCLEdBQUdiLG1CQUFtQixDQUFDYyxlQUEzQztBQUNBLFFBQUlDLGlCQUFpQixHQUFHZixtQkFBbUIsQ0FBQ1EsZ0JBQTVDO0FBQ0EsUUFBTTVCLG9CQUFvQixHQUFHb0IsbUJBQW1CLENBQUNwQixvQkFBcEIsQ0FBeUNNLE1BQXpDLEVBQTdCLENBbEJzQixDQW1CdEI7O0FBRUF5QixJQUFBQSxVQUFVLENBQUNLLE1BQVgsQ0FBa0IsVUFBQ0MsaUJBQUQsRUFBNENDLFFBQTVDLEVBQWlFO0FBQ2xGLFVBQUksQ0FBQ0QsaUJBQUwsRUFBd0I7QUFDdkIsZUFBT0UsU0FBUDtBQUNBOztBQUNELFVBQU1DLGdCQUFnQixHQUFHSCxpQkFBaUIsQ0FBQ3JDLG9CQUFsQixDQUF1Q2lCLElBQXZDLENBQTRDLFVBQUFkLE9BQU87QUFBQSxlQUFJQSxPQUFPLENBQUNTLElBQVIsS0FBaUIwQixRQUFyQjtBQUFBLE9BQW5ELENBQXpCOztBQUNBLFVBQUlFLGdCQUFKLEVBQXNCO0FBQ3JCeEMsUUFBQUEsb0JBQW9CLENBQUNLLElBQXJCLENBQTBCbUMsZ0JBQTFCO0FBQ0FMLFFBQUFBLGlCQUFpQixHQUFHSyxnQkFBZ0IsQ0FBQ3hCLFVBQXJDOztBQUNBLFlBQUlpQixnQkFBZ0IsSUFBSUEsZ0JBQWdCLENBQUNRLHlCQUFqQixDQUEyQ0MsY0FBM0MsQ0FBMERKLFFBQTFELENBQXhCLEVBQTZGO0FBQzVGTCxVQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLENBQUNRLHlCQUFqQixDQUEyQ0gsUUFBM0MsQ0FBbkI7QUFDQTs7QUFDRCxlQUFPSCxpQkFBUDtBQUNBOztBQUNELGFBQU9JLFNBQVA7QUFDQSxLQWRELEVBY0duQixtQkFBbUIsQ0FBQ1EsZ0JBZHZCO0FBZ0JBLFdBQU87QUFDTmUsTUFBQUEsaUJBQWlCLEVBQUV2QixtQkFBbUIsQ0FBQ3VCLGlCQURqQztBQUVOM0MsTUFBQUEsb0JBQW9CLEVBQUVBLG9CQUZoQjtBQUdONEMsTUFBQUEsZUFBZSxFQUFFeEIsbUJBQW1CLENBQUN3QixlQUgvQjtBQUlOVixNQUFBQSxlQUFlLEVBQUVELGdCQUpYO0FBS05MLE1BQUFBLGdCQUFnQixFQUFFTyxpQkFMWjtBQU1OTCxNQUFBQSxZQUFZLEVBQUVKLE9BTlI7QUFPTm1CLE1BQUFBLGNBQWMsRUFBRXpCLG1CQUFtQixDQUFDeUI7QUFQOUIsS0FBUDtBQVNBLEdBakRNOzs7O0FBbURBLE1BQU1DLHNCQUFzQixHQUFHLFVBQVMxQixtQkFBVCxFQUEyRDtBQUNoRyxRQUFJMkIsbUJBQTJCLGNBQU8zQixtQkFBbUIsQ0FBQ3VCLGlCQUFwQixDQUFzQy9CLElBQTdDLENBQS9CO0FBQ0EsUUFBSXFCLGdCQUFnQixHQUFHYixtQkFBbUIsQ0FBQ3VCLGlCQUEzQztBQUNBLFFBQUlLLGNBQXdCLEdBQUcsRUFBL0I7QUFDQTVCLElBQUFBLG1CQUFtQixDQUFDcEIsb0JBQXBCLENBQXlDRSxPQUF6QyxDQUFpRCxVQUFBQyxPQUFPLEVBQUk7QUFDM0Q2QyxNQUFBQSxjQUFjLENBQUMzQyxJQUFmLENBQW9CRixPQUFPLENBQUNTLElBQTVCOztBQUNBLFVBQUlxQixnQkFBZ0IsSUFBSUEsZ0JBQWdCLENBQUNRLHlCQUFqQixDQUEyQ0MsY0FBM0MsQ0FBMERNLGNBQWMsQ0FBQ0MsSUFBZixDQUFvQixHQUFwQixDQUExRCxDQUF4QixFQUE2RztBQUM1R0YsUUFBQUEsbUJBQW1CLDBDQUFtQ0MsY0FBYyxDQUFDQyxJQUFmLENBQW9CLEdBQXBCLENBQW5DLE9BQW5CO0FBQ0FoQixRQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLENBQUNRLHlCQUFqQixDQUEyQ08sY0FBYyxDQUFDQyxJQUFmLENBQW9CLEdBQXBCLENBQTNDLENBQW5CO0FBQ0FELFFBQUFBLGNBQWMsR0FBRyxFQUFqQjtBQUNBO0FBQ0QsS0FQRDtBQVFBLFdBQU9ELG1CQUFQO0FBQ0EsR0FiTTs7OztBQWVBLE1BQU1HLG1CQUFtQixHQUFHLFVBQVM5QixtQkFBVCxFQUF1RjtBQUFBLFFBQXBDK0IsU0FBb0MsdUVBQWYsS0FBZTtBQUN6SCxRQUFJMUIsSUFBSSxHQUFHLEVBQVg7O0FBQ0EsUUFBSSxDQUFDTCxtQkFBbUIsQ0FBQ3VCLGlCQUF6QixFQUE0QztBQUMzQyxhQUFPLEdBQVA7QUFDQTs7QUFDRCxRQUFJLENBQUNRLFNBQUwsRUFBZ0I7QUFDZjFCLE1BQUFBLElBQUksZUFBUUwsbUJBQW1CLENBQUN1QixpQkFBcEIsQ0FBc0MvQixJQUE5QyxDQUFKO0FBQ0E7O0FBQ0QsUUFBSVEsbUJBQW1CLENBQUNwQixvQkFBcEIsQ0FBeUNELE1BQXpDLEdBQWtELENBQXRELEVBQXlEO0FBQ3hELFVBQUkwQixJQUFJLENBQUMxQixNQUFMLEdBQWMsQ0FBbEIsRUFBcUI7QUFDcEIwQixRQUFBQSxJQUFJLElBQUksR0FBUjtBQUNBOztBQUNEQSxNQUFBQSxJQUFJLElBQUlMLG1CQUFtQixDQUFDcEIsb0JBQXBCLENBQXlDZSxHQUF6QyxDQUE2QyxVQUFBWixPQUFPO0FBQUEsZUFBSUEsT0FBTyxDQUFDUyxJQUFaO0FBQUEsT0FBcEQsRUFBc0VxQyxJQUF0RSxDQUEyRSxHQUEzRSxDQUFSO0FBQ0E7O0FBRUQsUUFDQzdCLG1CQUFtQixDQUFDVSxZQUFwQixJQUNBVixtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUNsQixJQURqQyxJQUVBUSxtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUNzQixLQUFqQyxLQUEyQyxvQkFGM0MsSUFHQWhDLG1CQUFtQixDQUFDVSxZQUFwQixDQUFpQ3NCLEtBQWpDLEtBQTJDLFlBSDNDLElBSUFoQyxtQkFBbUIsQ0FBQ1UsWUFBcEIsS0FBcUNWLG1CQUFtQixDQUFDdUIsaUJBTDFELEVBTUU7QUFDRCxVQUFJLENBQUNsQixJQUFJLENBQUM0QixRQUFMLENBQWMsR0FBZCxDQUFMLEVBQXlCO0FBQ3hCNUIsUUFBQUEsSUFBSSxJQUFJLEdBQVI7QUFDQTs7QUFDREEsTUFBQUEsSUFBSSxjQUFPTCxtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUNsQixJQUF4QyxDQUFKO0FBQ0EsS0FYRCxNQVdPLElBQUlRLG1CQUFtQixDQUFDVSxZQUFwQixJQUFvQ1YsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDWSxjQUFqQyxDQUFnRCxNQUFoRCxDQUF4QyxFQUFpRztBQUN2RyxVQUFJakIsSUFBSSxDQUFDMUIsTUFBTCxHQUFjLENBQWQsSUFBbUIsQ0FBQzBCLElBQUksQ0FBQzRCLFFBQUwsQ0FBYyxHQUFkLENBQXhCLEVBQTRDO0FBQzNDNUIsUUFBQUEsSUFBSSxJQUFJLEdBQVI7QUFDQTs7QUFDREEsTUFBQUEsSUFBSSxlQUFRTCxtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUN3QixJQUF6QyxDQUFKO0FBQ0E7O0FBQ0QsV0FBTzdCLElBQVA7QUFDQSxHQWpDTTs7OztBQW1DQSxNQUFNOEIsa0NBQWtDLEdBQUcsVUFDakRuQyxtQkFEaUQsRUFHNUI7QUFBQSxRQURyQm9DLG9CQUNxQix1RUFEVyxLQUNYO0FBQ3JCLFFBQU1DLGFBQWEsR0FBRzdELHVCQUF1QixDQUFDd0IsbUJBQW1CLENBQUN3QixlQUFyQixFQUFzQ3hCLG1CQUFtQixDQUFDcEIsb0JBQTFELENBQTdDOztBQUNBLFFBQUl3RCxvQkFBSixFQUEwQjtBQUN6QixVQUFJQyxhQUFhLENBQUN4QyxJQUFkLENBQW1CLFVBQUFDLEVBQUU7QUFBQSxlQUFJQSxFQUFFLENBQUN3QyxZQUFQO0FBQUEsT0FBckIsQ0FBSixFQUErQztBQUM5QyxlQUFPbkIsU0FBUDtBQUNBO0FBQ0Q7O0FBQ0QsUUFBSWQsSUFBSSxHQUFHZ0MsYUFBYSxDQUFDMUMsR0FBZCxDQUFrQixVQUFBRyxFQUFFO0FBQUEsYUFBSUEsRUFBRSxDQUFDTixJQUFQO0FBQUEsS0FBcEIsRUFBaUNxQyxJQUFqQyxDQUFzQyxHQUF0QyxDQUFYOztBQUNBLFFBQ0M3QixtQkFBbUIsQ0FBQ1UsWUFBcEIsS0FDQ1YsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDbEIsSUFBakMsSUFDQ1EsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDNkIsSUFBakMsS0FBMEMsY0FBMUMsSUFBNER2QyxtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUM4QixLQUYvRixLQUdBeEMsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDc0IsS0FBakMsS0FBMkMsb0JBSDNDLElBSUFoQyxtQkFBbUIsQ0FBQ1UsWUFBcEIsS0FBcUNWLG1CQUFtQixDQUFDdUIsaUJBTDFELEVBTUU7QUFDRCxVQUFJbEIsSUFBSSxDQUFDMUIsTUFBTCxHQUFjLENBQWQsSUFBbUIsQ0FBQzBCLElBQUksQ0FBQzRCLFFBQUwsQ0FBYyxHQUFkLENBQXhCLEVBQTRDO0FBQzNDNUIsUUFBQUEsSUFBSSxJQUFJLEdBQVI7QUFDQTs7QUFDREEsTUFBQUEsSUFBSSxJQUNITCxtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUM2QixJQUFqQyxLQUEwQyxjQUExQyxhQUNNdkMsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDOEIsS0FEdkMsY0FFTXhDLG1CQUFtQixDQUFDVSxZQUFwQixDQUFpQ2xCLElBRnZDLENBREQ7QUFJQSxLQWRELE1BY08sSUFBSVEsbUJBQW1CLENBQUNVLFlBQXBCLElBQW9DVixtQkFBbUIsQ0FBQ1UsWUFBcEIsQ0FBaUNZLGNBQWpDLENBQWdELE1BQWhELENBQXhDLEVBQWlHO0FBQ3ZHLFVBQUlqQixJQUFJLENBQUMxQixNQUFMLEdBQWMsQ0FBZCxJQUFtQixDQUFDMEIsSUFBSSxDQUFDNEIsUUFBTCxDQUFjLEdBQWQsQ0FBeEIsRUFBNEM7QUFDM0M1QixRQUFBQSxJQUFJLElBQUksR0FBUjtBQUNBOztBQUNEQSxNQUFBQSxJQUFJLGVBQVFMLG1CQUFtQixDQUFDVSxZQUFwQixDQUFpQ3dCLElBQXpDLENBQUo7O0FBQ0EsVUFBSWxDLG1CQUFtQixDQUFDVSxZQUFwQixDQUFpQ1ksY0FBakMsQ0FBZ0QsV0FBaEQsS0FBZ0UsQ0FBQyxDQUFDdEIsbUJBQW1CLENBQUNVLFlBQXBCLENBQWlDK0IsU0FBdkcsRUFBa0g7QUFDakhwQyxRQUFBQSxJQUFJLGVBQVFMLG1CQUFtQixDQUFDVSxZQUFwQixDQUFpQytCLFNBQXpDLENBQUo7QUFDQTtBQUNELEtBUk0sTUFRQSxJQUFJLENBQUN6QyxtQkFBbUIsQ0FBQ1UsWUFBekIsRUFBdUM7QUFDN0MsYUFBT1MsU0FBUDtBQUNBOztBQUNELFdBQU9kLElBQVA7QUFDQSxHQXJDTTs7OztBQXVDQSxNQUFNcUMsZUFBZSxHQUFHLFVBQzlCMUMsbUJBRDhCLEVBRTlCMkMsMEJBRjhCLEVBR1I7QUFDdEIsV0FBT0MsV0FBVyxDQUNqQjVDLG1CQURpQixFQUVqQixVQUFDNkMsZ0JBQUQsRUFBeUY7QUFBQTs7QUFDeEYsYUFBT0EsZ0JBQVAsYUFBT0EsZ0JBQVAsZ0RBQU9BLGdCQUFnQixDQUFFQyxrQkFBekIsMERBQU8sc0JBQXNDQyxTQUE3QztBQUNBLEtBSmdCLEVBS2pCSiwwQkFMaUIsQ0FBbEI7QUFPQSxHQVhNOzs7O0FBYUEsTUFBTUssZ0JBQWdCLEdBQUcsVUFDL0JoRCxtQkFEK0IsRUFFL0IyQywwQkFGK0IsRUFHVDtBQUN0QixXQUFPQyxXQUFXLENBQ2pCNUMsbUJBRGlCLEVBRWpCLFVBQUM2QyxnQkFBRCxFQUF5RjtBQUFBOztBQUN4RixhQUFPQSxnQkFBUCxhQUFPQSxnQkFBUCxnREFBT0EsZ0JBQWdCLENBQUVJLGtCQUF6QiwwREFBTyxzQkFBc0NDLFVBQTdDO0FBQ0EsS0FKZ0IsRUFLakJQLDBCQUxpQixDQUFsQjtBQU9BLEdBWE07Ozs7QUFhQSxNQUFNUSxlQUFlLEdBQUcsVUFDOUJuRCxtQkFEOEIsRUFFOUIyQywwQkFGOEIsRUFHUjtBQUN0QixXQUFPQyxXQUFXLENBQ2pCNUMsbUJBRGlCLEVBRWpCLFVBQUM2QyxnQkFBRCxFQUF5RjtBQUFBOztBQUN4RixhQUFPQSxnQkFBUCxhQUFPQSxnQkFBUCxnREFBT0EsZ0JBQWdCLENBQUVPLGtCQUF6QiwwREFBTyxzQkFBc0NDLFNBQTdDO0FBQ0EsS0FKZ0IsRUFLakJWLDBCQUxpQixDQUFsQjtBQU9BLEdBWE07Ozs7QUFhQSxNQUFNVyxnQkFBZ0IsR0FBRyxVQUMvQnRELG1CQUQrQixFQUUvQjJDLDBCQUYrQixFQUdUO0FBQ3RCLFdBQU9DLFdBQVcsQ0FDakI1QyxtQkFEaUIsRUFFakIsVUFBQzZDLGdCQUFELEVBQXlGO0FBQUE7O0FBQ3hGLGFBQU9BLGdCQUFQLGFBQU9BLGdCQUFQLGdEQUFPQSxnQkFBZ0IsQ0FBRVUsa0JBQXpCLDBEQUFPLHNCQUFzQ0MsVUFBN0M7QUFDQSxLQUpnQixFQUtqQmIsMEJBTGlCLENBQWxCO0FBT0EsR0FYTTs7OztBQWFBLE1BQU1jLGlDQUFpQyxHQUFHLFVBQ2hEekQsbUJBRGdELEVBRWhEMEQsaUJBRmdELEVBRzFCO0FBQ3RCLFdBQU9kLFdBQVcsQ0FDakI1QyxtQkFEaUIsRUFFakIsVUFBQzZDLGdCQUFELEVBQThIO0FBQzdILFVBQUlBLGdCQUFnQixJQUFJLHdCQUF3QkEsZ0JBQWhELEVBQWtFO0FBQUE7O0FBQ2pFLFlBQU1jLDRCQUFvRSxHQUN6RSxDQUFDZCxnQkFBRCxhQUFDQSxnQkFBRCxnREFBQ0EsZ0JBQWdCLENBQUVlLGtCQUFuQiwwREFBQyxzQkFBc0NDLDRCQUF2QyxLQUFrSCxFQURuSDtBQUVBLFlBQU1DLHdCQUF3QixHQUFHSCw0QkFBNEIsQ0FBQzlELElBQTdCLENBQWtDLFVBQUFrRSxXQUFXLEVBQUk7QUFDakYsaUJBQVFBLFdBQVcsQ0FBQ0MsUUFBYixDQUF1Q3pELE9BQXZDLEtBQW1EUCxtQkFBbUIsQ0FBQ1UsWUFBOUU7QUFDQSxTQUZnQyxDQUFqQzs7QUFHQSxZQUFJb0Qsd0JBQUosRUFBOEI7QUFBQTs7QUFDN0IsaUJBQU9KLGlCQUFpQixDQUFDTyxPQUFsQixDQUEwQkgsd0JBQTFCLGFBQTBCQSx3QkFBMUIsZ0RBQTBCQSx3QkFBd0IsQ0FBRUksa0JBQXBELDBEQUEwQixzQkFBOENDLFFBQTlDLEVBQTFCLE1BQXdGLENBQUMsQ0FBaEc7QUFDQSxTQUZELE1BRU87QUFDTixpQkFBTyxLQUFQO0FBQ0E7QUFDRCxPQVhELE1BV087QUFDTixlQUFPLEtBQVA7QUFDQTtBQUNELEtBakJnQixDQUFsQjtBQW1CQSxHQXZCTTs7OztBQXlCQSxNQUFNdkIsV0FBVyxHQUFHLFVBQzFCNUMsbUJBRDBCLEVBRTFCb0UsYUFGMEIsRUFHMUJ6QiwwQkFIMEIsRUFJSjtBQUN0QixRQUFJLENBQUMzQyxtQkFBRCxJQUF3QixDQUFDQSxtQkFBbUIsQ0FBQ3VCLGlCQUFqRCxFQUFvRTtBQUNuRSxhQUFPOEMsUUFBUSxDQUFDLElBQUQsQ0FBZjtBQUNBOztBQUVEckUsSUFBQUEsbUJBQW1CLEdBQUdELG9CQUFvQixDQUFDQyxtQkFBRCxFQUFzQjJDLDBCQUF0QixhQUFzQkEsMEJBQXRCLHVCQUFzQkEsMEJBQTBCLENBQUUxQyxZQUFsRCxDQUExQztBQUVBLFFBQUlZLGdCQUFrQyxHQUFHYixtQkFBbUIsQ0FBQ3VCLGlCQUE3RDtBQUNBLFFBQUkrQyxlQUFpQyxHQUFHLElBQXhDO0FBQ0EsUUFBSUMsMEJBQW9DLEdBQUcsRUFBM0M7QUFDQSxRQUFNQyx5QkFBK0MsR0FBRyxFQUF4RDtBQUNBLFFBQUkxRCxlQUFpQyxHQUFHRCxnQkFBeEM7QUFDQSxRQUFNTCxnQkFBbUMsR0FBR1IsbUJBQW1CLENBQUNRLGdCQUFoRTtBQUNBLFFBQUlpRSxvQkFBb0IsR0FBRyxLQUEzQjtBQUVBekUsSUFBQUEsbUJBQW1CLENBQUNwQixvQkFBcEIsQ0FBeUNFLE9BQXpDLENBQWlELFVBQUM0RixrQkFBRCxFQUE0QztBQUM1RixVQUFJRCxvQkFBSixFQUEwQjtBQUN6QkYsUUFBQUEsMEJBQTBCLEdBQUcsRUFBN0I7QUFDQTs7QUFDREEsTUFBQUEsMEJBQTBCLENBQUN0RixJQUEzQixDQUFnQ3lGLGtCQUFrQixDQUFDbEYsSUFBbkQ7QUFDQWdGLE1BQUFBLHlCQUF5QixDQUFDdkYsSUFBMUIsQ0FBK0J5RixrQkFBL0I7O0FBQ0EsVUFBSSxDQUFDQSxrQkFBa0IsQ0FBQ0MsY0FBeEIsRUFBd0M7QUFDdkM7QUFDQSxZQUFNQyxtQkFBa0IsR0FBR0wsMEJBQTBCLENBQUMxQyxJQUEzQixDQUFnQyxHQUFoQyxDQUEzQjs7QUFDQSxZQUFJaEIsZ0JBQWdCLElBQUlBLGdCQUFnQixDQUFDUSx5QkFBakIsQ0FBMkNDLGNBQTNDLENBQTBEc0QsbUJBQTFELENBQXhCLEVBQXVHO0FBQ3RHTixVQUFBQSxlQUFlLEdBQUd6RCxnQkFBbEI7QUFDQUEsVUFBQUEsZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDUSx5QkFBakIsQ0FBMkN1RCxtQkFBM0MsQ0FBbkI7QUFDQTlELFVBQUFBLGVBQWUsR0FBR0QsZ0JBQWxCLENBSHNHLENBSXRHOztBQUNBNEQsVUFBQUEsb0JBQW9CLEdBQUcsSUFBdkI7QUFDQSxTQU5ELE1BTU87QUFDTjtBQUNBSCxVQUFBQSxlQUFlLEdBQUd6RCxnQkFBbEI7QUFDQUEsVUFBQUEsZ0JBQWdCLEdBQUcsSUFBbkI7QUFDQTRELFVBQUFBLG9CQUFvQixHQUFHLElBQXZCO0FBQ0E7QUFDRCxPQWZELE1BZU87QUFDTkgsUUFBQUEsZUFBZSxHQUFHekQsZ0JBQWxCO0FBQ0FDLFFBQUFBLGVBQWUsR0FBRyxJQUFsQjtBQUNBO0FBQ0QsS0F6QkQsRUFmc0IsQ0EwQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0EsUUFBTThELGtCQUFrQixHQUFHTCwwQkFBMEIsQ0FBQzFDLElBQTNCLENBQWdDLEdBQWhDLENBQTNCO0FBQ0EsUUFBSWdELFlBQUosRUFBa0JuRyxlQUFsQjs7QUFDQSxRQUFJNEYsZUFBZSxLQUFLLElBQXhCLEVBQThCO0FBQUE7O0FBQzdCLFVBQU1RLGdCQUEyQixHQUFHUixlQUFwQztBQUNBLCtCQUFBUSxnQkFBZ0IsQ0FBQ0MsV0FBakIsMEdBQThCQyxZQUE5Qiw0R0FBNENDLHNCQUE1QyxrRkFBb0VDLG9CQUFwRSxDQUF5RnBHLE9BQXpGLENBQ0MsVUFBQ3FHLGlCQUFELEVBQTJEO0FBQUE7O0FBQzFELFlBQUksMEJBQUFBLGlCQUFpQixDQUFDQyxrQkFBbEIsZ0ZBQXNDN0MsSUFBdEMsTUFBK0Msd0JBQW5ELEVBQTZFO0FBQzVFLGNBQU04QyxxQkFBcUIsR0FBR2pCLGFBQWEsQ0FBQ2UsaUJBQUQsQ0FBM0M7O0FBQ0EsY0FBSVAsa0JBQWtCLEtBQUtPLGlCQUFpQixDQUFDQyxrQkFBbEIsQ0FBcUM1QyxLQUE1RCxJQUFxRTZDLHFCQUFxQixLQUFLbEUsU0FBbkcsRUFBOEc7QUFBQTs7QUFDN0csZ0JBQU1tRSwwQkFBMEIsR0FBR2QseUJBQXlCLENBQUNyRixLQUExQixDQUFnQyxDQUFoQyxFQUFtQyxDQUFDLENBQXBDLENBQW5DOztBQUNBLGdCQUFJMkIsZUFBZSxLQUFLLElBQXhCLEVBQThCO0FBQzdCcEMsY0FBQUEsZUFBZSxHQUFHNEcsMEJBQWxCO0FBQ0EsYUFGRCxNQUVPLElBQUlBLDBCQUEwQixDQUFDM0csTUFBM0IsS0FBc0MsQ0FBMUMsRUFBNkM7QUFDbkRELGNBQUFBLGVBQWUsR0FBRzhGLHlCQUF5QixDQUFDckYsS0FBMUIsQ0FBZ0MsQ0FBaEMsQ0FBbEI7QUFDQSxhQUZNLE1BRUE7QUFDTlQsY0FBQUEsZUFBZSxHQUFHNEcsMEJBQWxCO0FBQ0E7O0FBQ0QsZ0JBQU1DLG9CQUFvQixHQUFHL0csdUJBQXVCLHlCQUFDd0IsbUJBQUQseURBQUMscUJBQXFCd0IsZUFBdEIsRUFBdUM5QyxlQUF2QyxDQUF2QixDQUErRWlCLEdBQS9FLENBQzVCLFVBQUFHLEVBQUU7QUFBQSxxQkFBSUEsRUFBRSxDQUFDTixJQUFQO0FBQUEsYUFEMEIsQ0FBN0I7QUFHQSxnQkFBTWdHLG1CQUFtQixHQUFHN0MsMEJBQTBCLFNBQTFCLElBQUFBLDBCQUEwQixXQUExQixJQUFBQSwwQkFBMEIsQ0FBRThDLFdBQTVCLEdBQ3pCQywwQkFBMEIsQ0FBQy9DLDBCQUEwQixDQUFDOEMsV0FBNUIsRUFBeUNGLG9CQUF6QyxDQURELEdBRXpCcEUsU0FGSCxDQVo2RyxDQWMvRjs7QUFDZDBELFlBQUFBLFlBQVksR0FBR2MsS0FBSyxDQUNuQkMsb0JBQW9CLENBQUNQLHFCQUFELEVBQXdCRSxvQkFBeEIsRUFBOENwRSxTQUE5QyxFQUF5RHFFLG1CQUF6RCxDQURELEVBRW5CLElBRm1CLENBQXBCO0FBSUE7QUFDRDtBQUNELE9BekJGO0FBMkJBOztBQUNELFFBQUlLLGtCQUFKOztBQUNBLFFBQUksRUFBQ2xELDBCQUFELGFBQUNBLDBCQUFELGVBQUNBLDBCQUEwQixDQUFFbUQsc0JBQTdCLENBQUosRUFBeUQ7QUFBQTs7QUFDeEQsVUFBSVQscUJBQXFCLEdBQUdqQixhQUFhLHFCQUFDdEQsZUFBRCw4RUFBQyxpQkFBaUJpRSxXQUFsQiwwREFBQyxzQkFBOEJDLFlBQS9CLENBQXpDOztBQUNBLFVBQUlsRSxlQUFlLEtBQUssSUFBcEIsSUFBNEJ1RSxxQkFBcUIsS0FBS2xFLFNBQTFELEVBQXFFO0FBQUE7O0FBQ3BFa0UsUUFBQUEscUJBQXFCLEdBQUdqQixhQUFhLENBQUM1RCxnQkFBRCxhQUFDQSxnQkFBRCxnREFBQ0EsZ0JBQWdCLENBQUV1RSxXQUFuQiwwREFBQyxzQkFBK0JDLFlBQWhDLENBQXJDO0FBQ0E7O0FBQ0QsVUFBSUsscUJBQXFCLEtBQUtsRSxTQUE5QixFQUF5QztBQUN4QyxZQUFNb0Usb0JBQW9CLEdBQUcvRyx1QkFBdUIsQ0FBQ3dCLG1CQUFtQixDQUFDd0IsZUFBckIsRUFBc0NnRCx5QkFBdEMsQ0FBdkIsQ0FBd0Y3RSxHQUF4RixDQUM1QixVQUFBRyxFQUFFO0FBQUEsaUJBQUlBLEVBQUUsQ0FBQ04sSUFBUDtBQUFBLFNBRDBCLENBQTdCO0FBR0EsWUFBTWdHLG1CQUFtQixHQUFHN0MsMEJBQTBCLFNBQTFCLElBQUFBLDBCQUEwQixXQUExQixJQUFBQSwwQkFBMEIsQ0FBRThDLFdBQTVCLEdBQ3pCQywwQkFBMEIsQ0FBQy9DLDBCQUEwQixDQUFDOEMsV0FBNUIsRUFBeUNGLG9CQUF6QyxDQURELEdBRXpCcEUsU0FGSDtBQUdBMEUsUUFBQUEsa0JBQWtCLEdBQUdGLEtBQUssQ0FDekJDLG9CQUFvQixDQUFDUCxxQkFBRCxFQUF3QkUsb0JBQXhCLEVBQThDcEUsU0FBOUMsRUFBeURxRSxtQkFBekQsQ0FESyxFQUV6QixJQUZ5QixDQUExQjtBQUlBO0FBQ0Q7O0FBRUQsV0FDQ1gsWUFBWSxJQUFJZ0Isa0JBQWhCLEtBQXVDbEQsMEJBQTBCLFNBQTFCLElBQUFBLDBCQUEwQixXQUExQixJQUFBQSwwQkFBMEIsQ0FBRW9ELHFCQUE1QixHQUFvREMsdUJBQXBELEdBQThFM0IsUUFBUSxDQUFDLElBQUQsQ0FBN0gsQ0FERDtBQUdBLEdBM0dNLEMsQ0E0R1A7QUFDQTtBQUNBOzs7OztBQUNBLE1BQU1xQiwwQkFBMEIsR0FBRyxVQUFTRCxXQUFULEVBQWdDRixvQkFBaEMsRUFBZ0U7QUFDbEcsV0FBTyxVQUFTbEYsSUFBVCxFQUF1QjtBQUM3QixhQUFPb0YsV0FBVyxDQUFDcEYsSUFBRCxFQUFPa0Ysb0JBQVAsQ0FBbEI7QUFDQSxLQUZEO0FBR0EsR0FKRCIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlTZXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbnN0YW50LCBlcXVhbCwgRXhwcmVzc2lvbiwgdW5yZXNvbHZlYWJsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7IFByb3BlcnR5T3JQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGlzQW5ub3RhdGlvblBhdGhFeHByZXNzaW9uLCBpc1BhdGhFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7XG5cdEZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvblR5cGVUeXBlcyxcblx0TmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25cbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7XG5cdEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyxcblx0RW50aXR5VHlwZUFubm90YXRpb25zX0NhcGFiaWxpdGllc1xufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ2FwYWJpbGl0aWVzX0VkbVwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdHN0YXJ0aW5nRW50aXR5U2V0OiBFbnRpdHlTZXQ7XG5cdGNvbnRleHRMb2NhdGlvbj86IERhdGFNb2RlbE9iamVjdFBhdGg7XG5cdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXTtcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0O1xuXHR0YXJnZXRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlO1xuXHR0YXJnZXRPYmplY3Q6IGFueTtcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dDtcbn07XG5cbnR5cGUgRXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGggPSB7XG5cdHByb3BlcnR5UGF0aD86IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pjtcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvbjtcblx0aWdub3JlVGFyZ2V0Q29sbGVjdGlvbj86IGJvb2xlYW47XG5cdGF1dGhvcml6ZVVucmVzb2x2YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24gPSBmdW5jdGlvbihcblx0Y29udGV4dFBhdGg/OiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHR2aXNpdGVkTmF2UHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW11cbik6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdIHtcblx0aWYgKCFjb250ZXh0UGF0aCkge1xuXHRcdHJldHVybiB2aXNpdGVkTmF2UHJvcHM7XG5cdH0gZWxzZSBpZiAodmlzaXRlZE5hdlByb3BzLmxlbmd0aCA+PSBjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRsZXQgcmVtYWluaW5nTmF2UHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdFx0Y29udGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcCwgbmF2SW5kZXgpID0+IHtcblx0XHRcdGlmICh2aXNpdGVkTmF2UHJvcHNbbmF2SW5kZXhdICE9PSBuYXZQcm9wKSB7XG5cdFx0XHRcdHJlbWFpbmluZ05hdlByb3BzLnB1c2godmlzaXRlZE5hdlByb3BzW25hdkluZGV4XSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmVtYWluaW5nTmF2UHJvcHMgPSByZW1haW5pbmdOYXZQcm9wcy5jb25jYXQodmlzaXRlZE5hdlByb3BzLnNsaWNlKGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCkpO1xuXHRcdC8vIENsZWFuIHVwIE5hdlByb3AgLT4gT3duZXJcblx0XHRsZXQgY3VycmVudElkeCA9IDA7XG5cdFx0d2hpbGUgKHJlbWFpbmluZ05hdlByb3BzLmxlbmd0aCA+IDEgJiYgY3VycmVudElkeCAhPSByZW1haW5pbmdOYXZQcm9wcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50TmF2ID0gcmVtYWluaW5nTmF2UHJvcHNbY3VycmVudElkeF07XG5cdFx0XHRjb25zdCBuZXh0TmF2UHJvcCA9IHJlbWFpbmluZ05hdlByb3BzW2N1cnJlbnRJZHggKyAxXTtcblx0XHRcdGlmIChjdXJyZW50TmF2LnBhcnRuZXIgPT09IG5leHROYXZQcm9wLm5hbWUpIHtcblx0XHRcdFx0cmVtYWluaW5nTmF2UHJvcHMuc3BsaWNlKDAsIDIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VycmVudElkeCsrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVtYWluaW5nTmF2UHJvcHM7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IGV4dHJhTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5W10gPSBbXTtcblx0XHR2aXNpdGVkTmF2UHJvcHMuZm9yRWFjaCgobmF2UHJvcCwgbmF2SW5kZXgpID0+IHtcblx0XHRcdGlmIChjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1tuYXZJbmRleF0gIT09IG5hdlByb3ApIHtcblx0XHRcdFx0ZXh0cmFOYXZQcm9wLnB1c2godmlzaXRlZE5hdlByb3BzW25hdkluZGV4XSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0ZXh0cmFOYXZQcm9wID0gZXh0cmFOYXZQcm9wLmNvbmNhdChjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5zbGljZSh2aXNpdGVkTmF2UHJvcHMubGVuZ3RoKSk7XG5cdFx0Ly8gQ2xlYW4gdXAgTmF2UHJvcCAtPiBPd25lclxuXHRcdGxldCBjdXJyZW50SWR4ID0gMDtcblx0XHR3aGlsZSAoZXh0cmFOYXZQcm9wLmxlbmd0aCA+IDEgJiYgY3VycmVudElkeCAhPSBleHRyYU5hdlByb3AubGVuZ3RoIC0gMSkge1xuXHRcdFx0Y29uc3QgY3VycmVudE5hdiA9IGV4dHJhTmF2UHJvcFtjdXJyZW50SWR4XTtcblx0XHRcdGNvbnN0IG5leHROYXZQcm9wID0gZXh0cmFOYXZQcm9wW2N1cnJlbnRJZHggKyAxXTtcblx0XHRcdGlmIChjdXJyZW50TmF2LnBhcnRuZXIgPT09IG5leHROYXZQcm9wLm5hbWUpIHtcblx0XHRcdFx0ZXh0cmFOYXZQcm9wLnNwbGljZSgwLCAyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1cnJlbnRJZHgrKztcblx0XHRcdH1cblx0XHR9XG5cdFx0ZXh0cmFOYXZQcm9wID0gZXh0cmFOYXZQcm9wLm1hcChuYXZQcm9wID0+IHtcblx0XHRcdHJldHVybiBuYXZQcm9wLnRhcmdldFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZChucCA9PiBucC5uYW1lID09PSBuYXZQcm9wLnBhcnRuZXIpIGFzIE5hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHR9KTtcblx0XHRyZXR1cm4gZXh0cmFOYXZQcm9wO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZW5oYW5jZURhdGFNb2RlbFBhdGggPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+XG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0bGV0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IFwiXCI7XG5cdGlmICgoaXNQYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpIHx8IGlzQW5ub3RhdGlvblBhdGhFeHByZXNzaW9uKHByb3BlcnR5UGF0aCkpICYmIHByb3BlcnR5UGF0aC5wYXRoKSB7XG5cdFx0c1Byb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aC5wYXRoO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRzUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoIGFzIHN0cmluZztcblx0fVxuXHRsZXQgb1RhcmdldDtcblx0aWYgKGlzUGF0aEV4cHJlc3Npb24ocHJvcGVydHlQYXRoKSB8fCBpc0Fubm90YXRpb25QYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0b1RhcmdldCA9IHByb3BlcnR5UGF0aC4kdGFyZ2V0O1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdG9UYXJnZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHR9XG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldDtcblx0bGV0IGN1cnJlbnRFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuY29uY2F0KCk7XG5cdC8vIFByb2Nlc3Mgb25seSBpZiB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cblx0YVBhdGhTcGxpdC5yZWR1Y2UoKHJlZHVjZWRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCBwYXRoUGFydDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKCFyZWR1Y2VkRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgcG90ZW50aWFsTmF2UHJvcCA9IHJlZHVjZWRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQobmF2UHJvcCA9PiBuYXZQcm9wLm5hbWUgPT09IHBhdGhQYXJ0KTtcblx0XHRpZiAocG90ZW50aWFsTmF2UHJvcCkge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChwb3RlbnRpYWxOYXZQcm9wKTtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gcG90ZW50aWFsTmF2UHJvcC50YXJnZXRUeXBlO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KHBhdGhQYXJ0KSkge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3BhdGhQYXJ0XTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50RW50aXR5VHlwZTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSwgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlKTtcblxuXHRyZXR1cm4ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdHRhcmdldEVudGl0eVNldDogY3VycmVudEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHR0YXJnZXRPYmplY3Q6IG9UYXJnZXQsXG5cdFx0Y29udmVydGVkVHlwZXM6IGRhdGFNb2RlbE9iamVjdFBhdGguY29udmVydGVkVHlwZXNcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRFbnRpdHlTZXRQYXRoID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXRQYXRoOiBzdHJpbmcgPSBgLyR7ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lfWA7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gobmF2UHJvcCA9PiB7XG5cdFx0bmF2aWdhdGVkUGF0aHMucHVzaChuYXZQcm9wLm5hbWUpO1xuXHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdHRhcmdldEVudGl0eVNldFBhdGggKz0gYC8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke25hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpfS8kYDtcblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIildO1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdGFyZ2V0RW50aXR5U2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPYmplY3RQYXRoID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCwgYlJlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgcGF0aCA9IFwiXCI7XG5cdGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCkge1xuXHRcdHJldHVybiBcIi9cIjtcblx0fVxuXHRpZiAoIWJSZWxhdGl2ZSkge1xuXHRcdHBhdGggKz0gYC8ke2RhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZX1gO1xuXHR9XG5cdGlmIChkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubWFwKG5hdlByb3AgPT4gbmF2UHJvcC5uYW1lKS5qb2luKFwiL1wiKTtcblx0fVxuXG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lm5hbWUgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5fdHlwZSAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Ll90eXBlICE9PSBcIkVudGl0eVR5cGVcIiAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICE9PSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0XG5cdCkge1xuXHRcdGlmICghcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gYCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QubmFtZX1gO1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICYmIGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lmhhc093blByb3BlcnR5KFwidGVybVwiKSkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDAgJiYgIXBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGBAJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC50ZXJtfWA7XG5cdH1cblx0cmV0dXJuIHBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JCaW5kaW5nRXhwcmVzc2lvbjogYm9vbGVhbiA9IGZhbHNlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZQcm9wZXJ0aWVzID0gZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sIGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRpZiAoZm9yQmluZGluZ0V4cHJlc3Npb24pIHtcblx0XHRpZiAobmF2UHJvcGVydGllcy5maW5kKG5wID0+IG5wLmlzQ29sbGVjdGlvbikpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGxldCBwYXRoID0gbmF2UHJvcGVydGllcy5tYXAobnAgPT4gbnAubmFtZSkuam9pbihcIi9cIik7XG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJlxuXHRcdChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lIHx8XG5cdFx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC52YWx1ZSkpICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuX3R5cGUgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAhPT0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldFxuXHQpIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwICYmICFwYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPVxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIlxuXHRcdFx0XHQ/IGAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnZhbHVlfWBcblx0XHRcdFx0OiBgJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lfWA7XG5cdH0gZWxzZSBpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgJiYgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuaGFzT3duUHJvcGVydHkoXCJ0ZXJtXCIpKSB7XG5cdFx0aWYgKHBhdGgubGVuZ3RoID4gMCAmJiAhcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gYEAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnRlcm19YDtcblx0XHRpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuaGFzT3duUHJvcGVydHkoXCJxdWFsaWZpZXJcIikgJiYgISFkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5xdWFsaWZpZXIpIHtcblx0XHRcdHBhdGggKz0gYCMke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnF1YWxpZmllcn1gO1xuXHRcdH1cblx0fSBlbHNlIGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBwYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aFVwZGF0YWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aD86IEV4dHJhY3Rpb25QYXJhbWV0ZXJzT25QYXRoXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGU7XG5cdFx0fSxcblx0XHRleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aFxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aFNlYXJjaGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0ZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGg/OiBFeHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25PYmplY3Q/LlNlYXJjaFJlc3RyaWN0aW9ucz8uU2VhcmNoYWJsZTtcblx0XHR9LFxuXHRcdGV4dHJhY3Rpb25QYXJhbWV0ZXJzT25QYXRoXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoRGVsZXRhYmxlID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQsXG5cdGV4dHJhY3Rpb25QYXJhbWV0ZXJzT25QYXRoPzogRXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGhcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0Py5EZWxldGVSZXN0cmljdGlvbnM/LkRlbGV0YWJsZTtcblx0XHR9LFxuXHRcdGV4dHJhY3Rpb25QYXJhbWV0ZXJzT25QYXRoXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoSW5zZXJ0YWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aD86IEV4dHJhY3Rpb25QYXJhbWV0ZXJzT25QYXRoXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uSW5zZXJ0UmVzdHJpY3Rpb25zPy5JbnNlcnRhYmxlO1xuXHRcdH0sXG5cdFx0ZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGhcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0YWxsb3dlZEV4cHJlc3Npb246IChzdHJpbmcgfCB1bmRlZmluZWQpW11cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCAmJiBcIkZpbHRlclJlc3RyaWN0aW9uc1wiIGluIGFubm90YXRpb25PYmplY3QpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzW10gPVxuXHRcdFx0XHRcdChhbm5vdGF0aW9uT2JqZWN0Py5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgYXMgRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzW10pIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24gPSBmaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZpbmQocmVzdHJpY3Rpb24gPT4ge1xuXHRcdFx0XHRcdHJldHVybiAocmVzdHJpY3Rpb24uUHJvcGVydHkgYXMgUHJvcGVydHlQYXRoKS4kdGFyZ2V0ID09PSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gYWxsb3dlZEV4cHJlc3Npb24uaW5kZXhPZihjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24/LkFsbG93ZWRFeHByZXNzaW9ucz8udG9TdHJpbmcoKSkgIT09IC0xO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja09uUGF0aCA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRjaGVja0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0ZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGg/OiBFeHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aCB8fCAhZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fVxuXG5cdGRhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLCBleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aD8ucHJvcGVydHlQYXRoKTtcblxuXHRsZXQgY3VycmVudEVudGl0eVNldDogRW50aXR5U2V0IHwgbnVsbCA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQ7XG5cdGxldCBwYXJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IG51bGwgPSBudWxsO1xuXHRsZXQgdmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWU6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IG51bGwgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgbnVsbCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0bGV0IHJlc2V0VmlzaXRlZE5hdlByb3BzID0gZmFsc2U7XG5cblx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKChuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4ge1xuXHRcdGlmIChyZXNldFZpc2l0ZWROYXZQcm9wcykge1xuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUgPSBbXTtcblx0XHR9XG5cdFx0dmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUucHVzaChuYXZpZ2F0aW9uUHJvcGVydHkubmFtZSk7XG5cdFx0YWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcy5wdXNoKG5hdmlnYXRpb25Qcm9wZXJ0eSk7XG5cdFx0aWYgKCFuYXZpZ2F0aW9uUHJvcGVydHkuY29udGFpbnNUYXJnZXQpIHtcblx0XHRcdC8vIFdlIHNob3VsZCBoYXZlIGEgbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhdGggc28gZmFyIHdoaWNoIGNhbiBjb25zaXN0IG9mIChbQ29udGFpbm1lbnROYXZQcm9wXS8pKltOYXZQcm9wXVxuXHRcdFx0Y29uc3QgZnVsbE5hdmlnYXRpb25QYXRoID0gdmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUuam9pbihcIi9cIik7XG5cdFx0XHRpZiAoY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkoZnVsbE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHRwYXJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2Z1bGxOYXZpZ2F0aW9uUGF0aF07XG5cdFx0XHRcdHRhcmdldEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdC8vIElmIHdlIHJlYWNoZWQgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGggYSBuYXZpZ2F0aW9ucHJvcGVydHliaW5kaW5nLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB2aXNpdGVkIHBhdGggb24gdGhlIG5leHQgaXRlcmF0aW9uIChpZiB0aGVyZSBpcyBvbmUpXG5cdFx0XHRcdHJlc2V0VmlzaXRlZE5hdlByb3BzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIHJlYWxseSBzaG91bGQgbm90IGVuZCB1cCBoZXJlIGJ1dCBhdCBsZWFzdCBsZXQncyB0cnkgdG8gYXZvaWQgaW5jb3JyZWN0IGJlaGF2aW9yXG5cdFx0XHRcdHBhcmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBudWxsO1xuXHRcdFx0XHRyZXNldFZpc2l0ZWROYXZQcm9wcyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQgPSBudWxsO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5hdmlnYXRlZCBkb3duIGFsbCB0aGUgbmF2IHByb3AgYW5kIHdlIHNob3VsZCBoYXZlXG5cdC8vIFRoZSB0YXJnZXQgZW50aXR5U2V0IHBvaW50aW5nIHRvIGVpdGhlciBudWxsIChpbiBjYXNlIG9mIGNvbnRhaW5tZW50IG5hdnByb3AgYSBsYXN0IHBhcnQpLCBvciB0aGUgYWN0dWFsIHRhcmdldCAobm9uIGNvbnRhaW5tZW50IGFzIHRhcmdldClcblx0Ly8gVGhlIHBhcmVudCBlbnRpdHlTZXQgcG9pbnRpbmcgdG8gdGhlIHByZXZpb3VzIGVudGl0eVNldCB1c2VkIGluIHRoZSBwYXRoXG5cdC8vIFZpc2l0ZWROYXZpZ2F0aW9uUGF0aCBzaG91bGQgY29udGFpbiB0aGUgcGF0aCB1cCB0byB0aGlzIHByb3BlcnR5XG5cblx0Ly8gUmVzdHJpY3Rpb25zIHNob3VsZCB0aGVuIGJlIGV2YWx1YXRlZCBhcyBQYXJlbnRFbnRpdHlTZXQuTmF2UmVzdHJpY3Rpb25zW05hdlByb3BlcnR5UGF0aF0gfHwgVGFyZ2V0RW50aXR5U2V0LlJlc3RyaWN0aW9uc1xuXHRjb25zdCBmdWxsTmF2aWdhdGlvblBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZS5qb2luKFwiL1wiKTtcblx0bGV0IHJlc3RyaWN0aW9ucywgdmlzaXRlZE5hdlByb3BzO1xuXHRpZiAocGFyZW50RW50aXR5U2V0ICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgX3BhcmVudEVudGl0eVNldDogRW50aXR5U2V0ID0gcGFyZW50RW50aXR5U2V0O1xuXHRcdF9wYXJlbnRFbnRpdHlTZXQuYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uUmVzdHJpY3RlZFByb3BlcnRpZXMuZm9yRWFjaChcblx0XHRcdChyZXN0cmljdGVkTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcykgPT4ge1xuXHRcdFx0XHRpZiAocmVzdHJpY3RlZE5hdlByb3AuTmF2aWdhdGlvblByb3BlcnR5Py50eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3RyaWN0aW9uRGVmaW5pdGlvbiA9IGNoZWNrRnVuY3Rpb24ocmVzdHJpY3RlZE5hdlByb3ApO1xuXHRcdFx0XHRcdGlmIChmdWxsTmF2aWdhdGlvblBhdGggPT09IHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZSAmJiByZXN0cmljdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMgPSBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLnNsaWNlKDAsIC0xKTtcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlTZXQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0dmlzaXRlZE5hdlByb3BzID0gX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKF9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHR2aXNpdGVkTmF2UHJvcHMgPSBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLnNsaWNlKDApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dmlzaXRlZE5hdlByb3BzID0gX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwYXRoUmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGg/LmNvbnRleHRMb2NhdGlvbiwgdmlzaXRlZE5hdlByb3BzKS5tYXAoXG5cdFx0XHRcdFx0XHRcdG5wID0+IG5wLm5hbWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXRoVmlzaXRvckZ1bmN0aW9uID0gZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGg/LnBhdGhWaXNpdG9yXG5cdFx0XHRcdFx0XHRcdD8gZ2V0UGF0aFZpc2l0b3JGb3JTaW5nbGV0b24oZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGgucGF0aFZpc2l0b3IsIHBhdGhSZWxhdGl2ZUxvY2F0aW9uKVxuXHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDsgLy8gc2VuZCBwYXRoVmlzaXRvciBmdW5jdGlvbiBvbmx5IHdoZW4gaXQgaXMgZGVmaW5lZCBhbmQgb25seSBzZW5kIGZ1bmN0aW9uIG9yIGRlZmluZWQgYXMgYSBwYXJhbWV0ZXJcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihyZXN0cmljdGlvbkRlZmluaXRpb24sIHBhdGhSZWxhdGl2ZUxvY2F0aW9uLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yRnVuY3Rpb24pLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblx0bGV0IHRhcmdldFJlc3RyaWN0aW9ucztcblx0aWYgKCFleHRyYWN0aW9uUGFyYW1ldGVyc09uUGF0aD8uaWdub3JlVGFyZ2V0Q29sbGVjdGlvbikge1xuXHRcdGxldCByZXN0cmljdGlvbkRlZmluaXRpb24gPSBjaGVja0Z1bmN0aW9uKHRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcyk7XG5cdFx0aWYgKHRhcmdldEVudGl0eVNldCA9PT0gbnVsbCAmJiByZXN0cmljdGlvbkRlZmluaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzdHJpY3Rpb25EZWZpbml0aW9uID0gY2hlY2tGdW5jdGlvbih0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzKTtcblx0XHR9XG5cdFx0aWYgKHJlc3RyaWN0aW9uRGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwYXRoUmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLCBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzKS5tYXAoXG5cdFx0XHRcdG5wID0+IG5wLm5hbWVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBwYXRoVmlzaXRvckZ1bmN0aW9uID0gZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGg/LnBhdGhWaXNpdG9yXG5cdFx0XHRcdD8gZ2V0UGF0aFZpc2l0b3JGb3JTaW5nbGV0b24oZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGgucGF0aFZpc2l0b3IsIHBhdGhSZWxhdGl2ZUxvY2F0aW9uKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdHRhcmdldFJlc3RyaWN0aW9ucyA9IGVxdWFsKFxuXHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihyZXN0cmljdGlvbkRlZmluaXRpb24sIHBhdGhSZWxhdGl2ZUxvY2F0aW9uLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yRnVuY3Rpb24pLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiAoXG5cdFx0cmVzdHJpY3Rpb25zIHx8IHRhcmdldFJlc3RyaWN0aW9ucyB8fCAoZXh0cmFjdGlvblBhcmFtZXRlcnNPblBhdGg/LmF1dGhvcml6ZVVucmVzb2x2YWJsZSA/IHVucmVzb2x2ZWFibGVFeHByZXNzaW9uIDogY29uc3RhbnQodHJ1ZSkpXG5cdCk7XG59O1xuLy8gVGhpcyBoZWxwZXIgbWV0aG9kIGlzIHVzZWQgdG8gYWRkIHJlbGF0aXZlIHBhdGggbG9jYXRpb24gYXJndW1lbnQgdG8gc2luZ2xldG9uUGF0aFZpc2l0b3JGdW5jdGlvbiBpLmUuIHBhdGhWaXNpdG9yXG4vLyBwYXRoVmlzaXRvciBtZXRob2QgaXMgdXNlZCBsYXRlciB0byBnZXQgdGhlIGNvcnJlY3QgYmluZGluZ3MgZm9yIHNpbmdsZXRvbiBlbnRpdHlcbi8vIG1ldGhvZCBpcyBpbnZva2VkIGxhdGVyIGluIGJpbmRpbmdFeHByZXNzaW9uKCkgbWV0aG9kIHRvIGdldCB0aGUgY29ycmVjdCBiaW5kaW5nLlxuY29uc3QgZ2V0UGF0aFZpc2l0b3JGb3JTaW5nbGV0b24gPSBmdW5jdGlvbihwYXRoVmlzaXRvcjogRnVuY3Rpb24sIHBhdGhSZWxhdGl2ZUxvY2F0aW9uOiBzdHJpbmdbXSkge1xuXHRyZXR1cm4gZnVuY3Rpb24ocGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHBhdGhWaXNpdG9yKHBhdGgsIHBhdGhSZWxhdGl2ZUxvY2F0aW9uKTtcblx0fTtcbn07XG4iXX0=