@sapui5/sap.fe.core 1.111.0 → 1.112.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 (524) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime-dbg.js +4 -4
  4. package/src/sap/fe/core/ActionRuntime.js +1 -1
  5. package/src/sap/fe/core/ActionRuntime.js.map +1 -1
  6. package/src/sap/fe/core/ActionRuntime.ts +11 -11
  7. package/src/sap/fe/core/AppComponent-dbg.js +27 -5
  8. package/src/sap/fe/core/AppComponent.js +1 -1
  9. package/src/sap/fe/core/AppComponent.js.map +1 -1
  10. package/src/sap/fe/core/AppComponent.ts +58 -3
  11. package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
  12. package/src/sap/fe/core/AppStateHandler.js +1 -1
  13. package/src/sap/fe/core/AppStateHandler.js.map +1 -1
  14. package/src/sap/fe/core/AppStateHandler.ts +10 -1
  15. package/src/sap/fe/core/BaseController-dbg.js +1 -1
  16. package/src/sap/fe/core/BaseController.ts +2 -1
  17. package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
  18. package/src/sap/fe/core/CommonUtils.js +1 -1
  19. package/src/sap/fe/core/CommonUtils.js.map +1 -1
  20. package/src/sap/fe/core/CommonUtils.ts +201 -478
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
  22. package/src/sap/fe/core/ExtensionAPI.js +1 -1
  23. package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
  24. package/src/sap/fe/core/ExtensionAPI.ts +9 -1
  25. package/src/sap/fe/core/PageController-dbg.js +26 -31
  26. package/src/sap/fe/core/PageController.js +1 -1
  27. package/src/sap/fe/core/PageController.js.map +1 -1
  28. package/src/sap/fe/core/PageController.ts +17 -3
  29. package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
  30. package/src/sap/fe/core/ResourceModel.js +6 -0
  31. package/src/sap/fe/core/ResourceModel.js.map +1 -0
  32. package/src/sap/fe/core/ResourceModel.ts +67 -0
  33. package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  34. package/src/sap/fe/core/TemplateComponent.ts +1 -0
  35. package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
  36. package/src/sap/fe/core/TemplateModel.ts +6 -1
  37. package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
  38. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  39. package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
  40. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
  41. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
  42. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
  43. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
  48. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
  52. package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +279 -335
  53. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
  54. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
  55. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
  56. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
  57. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
  58. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
  59. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
  60. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
  61. package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
  62. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  63. package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
  64. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
  65. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
  66. package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  67. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
  68. package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
  69. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
  70. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  71. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
  72. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
  73. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
  74. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  75. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
  76. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
  77. package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
  79. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
  80. package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
  82. package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
  83. package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
  84. package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
  85. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
  86. package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
  87. package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
  88. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
  89. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
  90. package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
  91. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
  93. package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
  94. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  95. package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
  96. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
  97. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  98. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  99. package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
  100. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
  101. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  103. package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
  104. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
  105. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  106. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
  107. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
  108. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
  109. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  111. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
  112. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
  113. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  114. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  115. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
  116. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
  117. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
  118. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
  119. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
  120. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
  121. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
  122. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
  123. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
  124. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
  125. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  126. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  127. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
  128. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
  129. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  130. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  131. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
  132. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  133. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
  134. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
  135. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
  136. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
  137. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
  138. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
  139. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
  140. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
  142. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  143. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
  144. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
  145. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
  146. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  147. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  148. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
  149. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
  150. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  151. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  152. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
  153. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
  154. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
  155. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
  156. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
  157. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  158. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
  159. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
  160. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
  161. package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
  162. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  163. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  164. package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
  165. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
  166. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  167. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
  168. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
  169. package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
  170. package/src/sap/fe/core/controls/FilterBar.ts +5 -0
  171. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
  172. package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
  173. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
  174. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
  175. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
  176. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
  177. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
  178. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
  179. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
  180. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  181. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  182. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
  183. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
  184. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
  185. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
  186. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
  187. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
  188. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
  189. package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
  190. package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
  191. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
  192. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  193. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
  194. package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
  195. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
  196. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  197. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
  198. package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
  199. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
  200. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  201. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  202. package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
  203. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
  204. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  205. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  206. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
  207. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  208. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  209. package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
  210. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
  211. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  212. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  213. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
  214. package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  215. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
  216. package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
  217. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
  218. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  219. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  220. package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
  221. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
  222. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  223. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  224. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
  225. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
  226. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
  227. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
  228. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  229. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
  230. package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
  231. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
  232. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  233. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  234. package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
  235. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
  236. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  237. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  238. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
  239. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
  240. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  241. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  242. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
  243. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
  244. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  245. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  246. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
  247. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
  248. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
  249. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
  250. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  251. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
  252. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
  253. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
  254. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  255. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
  256. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
  257. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
  258. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  259. package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
  260. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
  261. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  262. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
  263. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
  264. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
  265. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
  266. package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
  267. package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
  268. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
  269. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  270. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
  271. package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
  272. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
  273. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  274. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
  275. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
  276. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
  277. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  278. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  279. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
  280. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
  281. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  282. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  283. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
  284. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  285. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  286. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
  287. package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
  288. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
  289. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  290. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
  291. package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
  292. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
  293. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  294. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  295. package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
  296. package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
  297. package/src/sap/fe/core/fpm/Component.ts +1 -0
  298. package/src/sap/fe/core/fpm/manifest.json +1 -1
  299. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  300. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  301. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
  302. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  303. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
  304. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  305. package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
  306. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
  307. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
  308. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  309. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
  310. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  311. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  312. package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
  313. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
  314. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  315. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  316. package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
  317. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
  318. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  319. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
  320. package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
  321. package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
  322. package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
  323. package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
  324. package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
  325. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
  326. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
  327. package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
  328. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
  329. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  330. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
  331. package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
  332. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
  333. package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
  334. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
  335. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
  336. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
  337. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  338. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
  339. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
  340. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
  341. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  342. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
  343. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  344. package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
  345. package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
  346. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
  347. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  348. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
  349. package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
  350. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
  351. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  352. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
  353. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
  354. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
  355. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
  356. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  357. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  358. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  359. package/src/sap/fe/core/library-dbg.js +2 -2
  360. package/src/sap/fe/core/library-preload.js +127 -125
  361. package/src/sap/fe/core/library-preload.js.map +1 -1
  362. package/src/sap/fe/core/library.js +1 -1
  363. package/src/sap/fe/core/library.ts +7 -0
  364. package/src/sap/fe/core/manifest.json +1 -1
  365. package/src/sap/fe/core/messagebundle.properties +33 -0
  366. package/src/sap/fe/core/messagebundle_ar.properties +12 -10
  367. package/src/sap/fe/core/messagebundle_bg.properties +11 -9
  368. package/src/sap/fe/core/messagebundle_ca.properties +11 -9
  369. package/src/sap/fe/core/messagebundle_cs.properties +11 -9
  370. package/src/sap/fe/core/messagebundle_cy.properties +11 -9
  371. package/src/sap/fe/core/messagebundle_da.properties +11 -9
  372. package/src/sap/fe/core/messagebundle_de.properties +3 -1
  373. package/src/sap/fe/core/messagebundle_el.properties +11 -9
  374. package/src/sap/fe/core/messagebundle_en.properties +3 -1
  375. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  376. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
  377. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
  378. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
  379. package/src/sap/fe/core/messagebundle_es.properties +11 -9
  380. package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
  381. package/src/sap/fe/core/messagebundle_et.properties +11 -9
  382. package/src/sap/fe/core/messagebundle_fi.properties +11 -9
  383. package/src/sap/fe/core/messagebundle_fr.properties +11 -9
  384. package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
  385. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  386. package/src/sap/fe/core/messagebundle_hr.properties +11 -9
  387. package/src/sap/fe/core/messagebundle_hu.properties +11 -9
  388. package/src/sap/fe/core/messagebundle_id.properties +3 -1
  389. package/src/sap/fe/core/messagebundle_it.properties +11 -9
  390. package/src/sap/fe/core/messagebundle_iw.properties +11 -9
  391. package/src/sap/fe/core/messagebundle_ja.properties +11 -9
  392. package/src/sap/fe/core/messagebundle_kk.properties +11 -9
  393. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  394. package/src/sap/fe/core/messagebundle_lt.properties +11 -9
  395. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  396. package/src/sap/fe/core/messagebundle_ms.properties +12 -10
  397. package/src/sap/fe/core/messagebundle_nl.properties +12 -10
  398. package/src/sap/fe/core/messagebundle_no.properties +11 -9
  399. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  400. package/src/sap/fe/core/messagebundle_pt.properties +11 -9
  401. package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
  402. package/src/sap/fe/core/messagebundle_ro.properties +3 -1
  403. package/src/sap/fe/core/messagebundle_ru.properties +3 -1
  404. package/src/sap/fe/core/messagebundle_sh.properties +11 -9
  405. package/src/sap/fe/core/messagebundle_sk.properties +11 -9
  406. package/src/sap/fe/core/messagebundle_sl.properties +11 -9
  407. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  408. package/src/sap/fe/core/messagebundle_th.properties +11 -9
  409. package/src/sap/fe/core/messagebundle_tr.properties +11 -9
  410. package/src/sap/fe/core/messagebundle_uk.properties +11 -9
  411. package/src/sap/fe/core/messagebundle_vi.properties +12 -10
  412. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  413. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
  414. package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
  415. package/src/sap/fe/core/operationsHelper.js +1 -1
  416. package/src/sap/fe/core/operationsHelper.js.map +1 -1
  417. package/src/sap/fe/core/operationsHelper.ts +88 -63
  418. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
  419. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
  420. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
  421. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  422. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  423. package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
  424. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
  425. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  426. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  427. package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
  428. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  429. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  430. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
  431. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
  432. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
  433. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  434. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  435. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
  436. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
  437. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  438. package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
  439. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
  440. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  441. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
  442. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
  443. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
  444. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  445. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  446. package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
  447. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
  448. package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
  449. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
  450. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  451. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  452. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
  453. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
  454. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  455. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  456. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
  457. package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
  458. package/src/sap/fe/core/support/Diagnostics.ts +5 -0
  459. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
  460. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  461. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
  462. package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
  463. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
  464. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  465. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
  466. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
  467. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
  468. package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
  469. package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
  470. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  471. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  472. package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
  473. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
  474. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  475. package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
  476. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
  477. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
  478. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
  479. package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
  480. package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
  481. package/src/sap/fe/core/type/FiscalDate.ts +2 -1
  482. package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
  483. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  484. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  485. package/src/sap/fe/core/type/TypeUtil.ts +3 -6
  486. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
  487. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
  488. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
  489. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
  490. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
  491. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
  492. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
  493. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
  494. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -932
  495. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
  496. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
  497. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
  498. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
  499. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
  500. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
  501. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
  502. package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
  503. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
  504. package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
  505. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
  506. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
  507. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
  508. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
  509. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
  510. package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
  511. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
  512. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
  513. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
  514. package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
  515. package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
  516. package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
  517. package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
  518. package/src/sap/fe/core/controls/FileWrapper.js +0 -6
  519. package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
  520. package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
  521. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
  522. package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
  523. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
  524. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
@@ -3,368 +3,292 @@
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
5
  sap.ui.define([], function() {
6
- var AnnotationConverter;
6
+ var AnnotationConverter;
7
7
  /******/ (function() { // webpackBootstrap
8
8
  /******/ "use strict";
9
9
  /******/ var __webpack_modules__ = ({
10
10
 
11
- /***/ 634:
11
+ /***/ 203:
12
12
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
13
13
 
14
14
 
15
15
  Object.defineProperty(exports, "__esModule", ({ value: true }));
16
16
  exports.convert = void 0;
17
- const utils_1 = __webpack_require__(401);
17
+ const utils_1 = __webpack_require__(39);
18
18
  /**
19
- *
19
+ * Symbol to extend an annotation with the reference to its target.
20
20
  */
21
- class Path {
22
- /**
23
- * @param pathExpression
24
- * @param targetName
25
- * @param annotationsTerm
26
- * @param term
27
- */
28
- constructor(pathExpression, targetName, annotationsTerm, term) {
29
- this.path = pathExpression.Path;
30
- this.type = 'Path';
31
- this.$target = targetName;
32
- this.term = term;
33
- this.annotationsTerm = annotationsTerm;
34
- }
35
- }
21
+ const ANNOTATION_TARGET = Symbol('Annotation Target');
36
22
  /**
37
- * Creates a Map based on the fullyQualifiedName of each object part of the metadata.
23
+ * Append an object to the list of visited objects if it is different from the last object in the list.
38
24
  *
39
- * @param rawMetadata the rawMetadata we're working against
40
- * @returns the objectmap for easy access to the different object of the metadata
25
+ * @param objectPath The list of visited objects
26
+ * @param visitedObject The object
27
+ * @returns The list of visited objects
41
28
  */
42
- function buildObjectMap(rawMetadata) {
43
- var _a;
44
- const objectMap = {};
45
- if ((_a = rawMetadata.schema.entityContainer) === null || _a === void 0 ? void 0 : _a.fullyQualifiedName) {
46
- objectMap[rawMetadata.schema.entityContainer.fullyQualifiedName] = rawMetadata.schema.entityContainer;
47
- }
48
- for (const entitySet of rawMetadata.schema.entitySets) {
49
- objectMap[entitySet.fullyQualifiedName] = entitySet;
50
- }
51
- for (const singleton of rawMetadata.schema.singletons) {
52
- objectMap[singleton.fullyQualifiedName] = singleton;
53
- }
54
- for (const action of rawMetadata.schema.actions) {
55
- objectMap[action.fullyQualifiedName] = action;
56
- if (action.isBound) {
57
- const unBoundActionName = action.fullyQualifiedName.split('(')[0];
58
- if (!objectMap[unBoundActionName]) {
59
- objectMap[unBoundActionName] = {
60
- _type: 'UnboundGenericAction',
61
- actions: []
62
- };
63
- }
64
- objectMap[unBoundActionName].actions.push(action);
65
- const actionSplit = action.fullyQualifiedName.split('(');
66
- objectMap[`${actionSplit[1].split(')')[0]}/${actionSplit[0]}`] = action;
67
- }
68
- for (const parameter of action.parameters) {
69
- objectMap[parameter.fullyQualifiedName] = parameter;
70
- }
71
- }
72
- for (const actionImport of rawMetadata.schema.actionImports) {
73
- objectMap[actionImport.fullyQualifiedName] = actionImport;
74
- }
75
- for (const complexType of rawMetadata.schema.complexTypes) {
76
- objectMap[complexType.fullyQualifiedName] = complexType;
77
- for (const property of complexType.properties) {
78
- objectMap[property.fullyQualifiedName] = property;
79
- }
29
+ function appendObjectPath(objectPath, visitedObject) {
30
+ if (objectPath[objectPath.length - 1] !== visitedObject) {
31
+ objectPath.push(visitedObject);
80
32
  }
81
- for (const typeDefinition of rawMetadata.schema.typeDefinitions) {
82
- objectMap[typeDefinition.fullyQualifiedName] = typeDefinition;
83
- }
84
- for (const entityType of rawMetadata.schema.entityTypes) {
85
- entityType.annotations = {}; // 'annotations' property is mandatory
86
- objectMap[entityType.fullyQualifiedName] = entityType;
87
- objectMap[`Collection(${entityType.fullyQualifiedName})`] = entityType;
88
- for (const property of entityType.entityProperties) {
89
- objectMap[property.fullyQualifiedName] = property;
90
- // Handle complex types
91
- const complexTypeDefinition = objectMap[property.type];
92
- if ((0, utils_1.isComplexTypeDefinition)(complexTypeDefinition)) {
93
- for (const complexTypeProp of complexTypeDefinition.properties) {
94
- const complexTypePropTarget = Object.assign(complexTypeProp, {
95
- _type: 'Property',
96
- fullyQualifiedName: property.fullyQualifiedName + '/' + complexTypeProp.name
97
- });
98
- objectMap[complexTypePropTarget.fullyQualifiedName] = complexTypePropTarget;
99
- }
100
- }
101
- }
102
- for (const navProperty of entityType.navigationProperties) {
103
- objectMap[navProperty.fullyQualifiedName] = navProperty;
104
- }
105
- }
106
- for (const annotationSource of Object.keys(rawMetadata.schema.annotations)) {
107
- for (const annotationList of rawMetadata.schema.annotations[annotationSource]) {
108
- const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
109
- annotationList.annotations.forEach((annotation) => {
110
- let annotationFQN = `${currentTargetName}@${(0, utils_1.unalias)(rawMetadata.references, annotation.term)}`;
111
- if (annotation.qualifier) {
112
- annotationFQN += `#${annotation.qualifier}`;
113
- }
114
- objectMap[annotationFQN] = annotation;
115
- annotation.fullyQualifiedName = annotationFQN;
116
- });
117
- }
118
- }
119
- return objectMap;
33
+ return objectPath;
120
34
  }
121
35
  /**
122
- * Combine two strings representing path in the metamodel while ensuring their specificities (annotation...) are respected.
36
+ * Resolves a (possibly relative) path.
123
37
  *
124
- * @param currentTarget the current path
125
- * @param path the part we want to append
126
- * @returns the complete path including the extension.
38
+ * @param converter Converter
39
+ * @param startElement The starting point in case of relative path resolution
40
+ * @param path The path to resolve
41
+ * @param annotationsTerm Only for error reporting: The annotation term
42
+ * @returns An object containing the resolved target and the elements that were visited while getting to the target.
127
43
  */
128
- function combinePath(currentTarget, path) {
129
- if (path.startsWith('@')) {
130
- return currentTarget + (0, utils_1.unalias)(utils_1.defaultReferences, path);
131
- }
132
- else {
133
- return currentTarget + '/' + path;
134
- }
135
- }
136
- const ALL_ANNOTATION_ERRORS = {};
137
- let ANNOTATION_ERRORS = [];
138
- /**
139
- * @param path
140
- * @param oErrorMsg
141
- */
142
- function addAnnotationErrorMessage(path, oErrorMsg) {
143
- if (!ALL_ANNOTATION_ERRORS[path]) {
144
- ALL_ANNOTATION_ERRORS[path] = [oErrorMsg];
145
- }
146
- else {
147
- ALL_ANNOTATION_ERRORS[path].push(oErrorMsg);
148
- }
149
- }
150
- /**
151
- * Resolves a specific path based on the objectMap.
152
- *
153
- * @param objectMap
154
- * @param currentTarget
155
- * @param path
156
- * @param pathOnly
157
- * @param includeVisitedObjects
158
- * @param annotationsTerm
159
- * @returns the resolved object
160
- */
161
- function _resolveTarget(objectMap, currentTarget, path, pathOnly = false, includeVisitedObjects = false, annotationsTerm) {
162
- let oErrorMsg;
163
- if (!path) {
164
- return undefined;
165
- }
166
- const aVisitedObjects = [];
167
- if (currentTarget && currentTarget._type === 'Property') {
168
- currentTarget = objectMap[currentTarget.fullyQualifiedName.split('/')[0]];
169
- }
170
- path = combinePath(currentTarget.fullyQualifiedName, path);
171
- const pathSplit = path.split('/');
172
- const targetPathSplit = [];
173
- pathSplit.forEach((pathPart) => {
174
- // Separate out the annotation
175
- if (pathPart.indexOf('@') !== -1) {
176
- const [splittedPath, annotationPath] = pathPart.split('@');
177
- targetPathSplit.push(splittedPath);
178
- targetPathSplit.push(`@${annotationPath}`);
44
+ function resolveTarget(converter, startElement, path, annotationsTerm) {
45
+ var _a;
46
+ // absolute paths always start at the entity container
47
+ if (path.startsWith('/')) {
48
+ path = path.substring(1);
49
+ startElement = undefined; // will resolve to the entity container (see below)
50
+ }
51
+ const pathSegments = path.split('/').reduce((targetPath, segment) => {
52
+ if (segment.includes('@')) {
53
+ // Separate out the annotation
54
+ const [pathPart, annotationPart] = (0, utils_1.splitAtFirst)(segment, '@');
55
+ targetPath.push(pathPart);
56
+ targetPath.push(`@${annotationPart}`);
179
57
  }
180
58
  else {
181
- targetPathSplit.push(pathPart);
182
- }
183
- });
184
- let currentPath = path;
185
- let currentContext = currentTarget;
186
- const target = targetPathSplit.reduce((currentValue, pathPart) => {
187
- if (pathPart === '$Type' && currentValue._type === 'EntityType') {
188
- return currentValue;
189
- }
190
- if (pathPart === '$' && currentValue._type === 'EntitySet') {
191
- return currentValue;
192
- }
193
- if ((pathPart === '@$ui5.overload' || pathPart === '0') && currentValue._type === 'Action') {
194
- return currentValue;
195
- }
196
- if (pathPart.length === 0) {
197
- // Empty Path after an entitySet means entityType
198
- if (currentValue &&
199
- (currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') &&
200
- currentValue.entityType) {
201
- if (includeVisitedObjects) {
202
- aVisitedObjects.push(currentValue);
203
- }
204
- currentValue = currentValue.entityType;
205
- }
206
- if (currentValue && currentValue._type === 'NavigationProperty' && currentValue.targetType) {
207
- if (includeVisitedObjects) {
208
- aVisitedObjects.push(currentValue);
209
- }
210
- currentValue = currentValue.targetType;
211
- }
212
- return currentValue;
213
- }
214
- if (includeVisitedObjects && currentValue !== null && currentValue !== undefined) {
215
- aVisitedObjects.push(currentValue);
216
- }
217
- if (!currentValue) {
218
- currentPath = pathPart;
219
- }
220
- else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') && pathPart === '$Type') {
221
- currentValue = currentValue.targetType;
222
- return currentValue;
223
- }
224
- else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') &&
225
- pathPart === '$NavigationPropertyBinding') {
226
- currentValue = currentValue.navigationPropertyBinding;
227
- return currentValue;
228
- }
229
- else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') &&
230
- currentValue.entityType) {
231
- currentPath = combinePath(currentValue.entityTypeName, pathPart);
232
- }
233
- else if (currentValue._type === 'NavigationProperty') {
234
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
235
- if (!objectMap[currentPath]) {
236
- // Fallback log error
237
- currentPath = combinePath(currentValue.targetTypeName, pathPart);
59
+ targetPath.push(segment);
60
+ }
61
+ return targetPath;
62
+ }, []);
63
+ // determine the starting point for the resolution
64
+ if (startElement === undefined) {
65
+ // no starting point given: start at the entity container
66
+ startElement = converter.getConvertedEntityContainer();
67
+ }
68
+ else if (startElement[ANNOTATION_TARGET] !== undefined) {
69
+ // annotation: start at the annotation target
70
+ startElement = startElement[ANNOTATION_TARGET];
71
+ }
72
+ else if (startElement._type === 'Property') {
73
+ // property: start at the entity type or complex type the property belongs to
74
+ const parentElementFQN = (0, utils_1.substringBeforeFirst)(startElement.fullyQualifiedName, '/');
75
+ startElement =
76
+ (_a = converter.getConvertedEntityType(parentElementFQN)) !== null && _a !== void 0 ? _a : converter.getConvertedComplexType(parentElementFQN);
77
+ }
78
+ const result = pathSegments.reduce((current, segment) => {
79
+ var _a, _b, _c, _d, _e;
80
+ const error = (message) => {
81
+ current.messages.push({ message });
82
+ current.target = undefined;
83
+ return current;
84
+ };
85
+ if (current.target === undefined) {
86
+ return current;
87
+ }
88
+ current.objectPath = appendObjectPath(current.objectPath, current.target);
89
+ // Annotation
90
+ if (segment.startsWith('@') && segment !== '@$ui5.overload') {
91
+ const [vocabularyAlias, term] = converter.splitTerm(segment);
92
+ const annotation = (_a = current.target.annotations[vocabularyAlias.substring(1)]) === null || _a === void 0 ? void 0 : _a[term];
93
+ if (annotation !== undefined) {
94
+ current.target = annotation;
95
+ return current;
238
96
  }
97
+ return error(`Annotation '${segment.substring(1)}' not found on ${current.target._type} '${current.target.fullyQualifiedName}'`);
239
98
  }
240
- else if (currentValue._type === 'Property') {
241
- // ComplexType or Property
242
- if (currentValue.targetType) {
243
- currentPath = combinePath(currentValue.targetType.fullyQualifiedName, pathPart);
244
- }
245
- else {
246
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
99
+ // $Path / $AnnotationPath syntax
100
+ if (current.target.$target) {
101
+ let subPath;
102
+ if (segment === '$AnnotationPath') {
103
+ subPath = current.target.value;
247
104
  }
248
- }
249
- else if (currentValue._type === 'Action' && currentValue.isBound) {
250
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
251
- if (pathPart === '$Parameter') {
252
- return currentValue.parameters;
105
+ else if (segment === '$Path') {
106
+ subPath = current.target.path;
253
107
  }
254
- if (!objectMap[currentPath]) {
255
- currentPath = combinePath(currentValue.sourceType, pathPart);
108
+ if (subPath !== undefined) {
109
+ const subTarget = resolveTarget(converter, current.target[ANNOTATION_TARGET], subPath);
110
+ subTarget.objectPath.forEach((visitedSubObject) => {
111
+ if (!current.objectPath.includes(visitedSubObject)) {
112
+ current.objectPath = appendObjectPath(current.objectPath, visitedSubObject);
113
+ }
114
+ });
115
+ current.target = subTarget.target;
116
+ current.objectPath = appendObjectPath(current.objectPath, current.target);
117
+ return current;
256
118
  }
257
119
  }
258
- else if (currentValue._type === 'ActionParameter') {
259
- currentPath = combinePath(currentTarget.fullyQualifiedName.substring(0, currentTarget.fullyQualifiedName.lastIndexOf('/')), pathPart);
260
- if (!objectMap[currentPath]) {
261
- let lastIdx = currentTarget.fullyQualifiedName.lastIndexOf('/');
262
- if (lastIdx === -1) {
263
- lastIdx = currentTarget.fullyQualifiedName.length;
120
+ // traverse based on the element type
121
+ switch ((_b = current.target) === null || _b === void 0 ? void 0 : _b._type) {
122
+ case 'EntityContainer':
123
+ {
124
+ const thisElement = current.target;
125
+ if (segment === '' || segment === thisElement.fullyQualifiedName) {
126
+ return current;
127
+ }
128
+ // next element: EntitySet, Singleton or ActionImport?
129
+ const nextElement = (_d = (_c = thisElement.entitySets.by_name(segment)) !== null && _c !== void 0 ? _c : thisElement.singletons.by_name(segment)) !== null && _d !== void 0 ? _d : thisElement.actionImports.by_name(segment);
130
+ if (nextElement) {
131
+ current.target = nextElement;
132
+ return current;
133
+ }
264
134
  }
265
- currentPath = combinePath(objectMap[currentTarget.fullyQualifiedName.substring(0, lastIdx)].sourceType, pathPart);
266
- }
267
- }
268
- else {
269
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
270
- if (pathPart !== 'name' && currentValue[pathPart] !== undefined) {
271
- return currentValue[pathPart];
135
+ break;
136
+ case 'EntitySet':
137
+ case 'Singleton': {
138
+ const thisElement = current.target;
139
+ if (segment === '' || segment === '$Type') {
140
+ // Empty Path after an EntitySet or Singleton means EntityType
141
+ current.target = thisElement.entityType;
142
+ return current;
143
+ }
144
+ if (segment === '$') {
145
+ return current;
146
+ }
147
+ if (segment === '$NavigationPropertyBinding') {
148
+ const navigationPropertyBindings = thisElement.navigationPropertyBinding;
149
+ current.target = navigationPropertyBindings;
150
+ return current;
151
+ }
152
+ // continue resolving at the EntitySet's or Singleton's type
153
+ const result = resolveTarget(converter, thisElement.entityType, segment);
154
+ current.target = result.target;
155
+ current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
156
+ return current;
272
157
  }
273
- else if (pathPart === '$AnnotationPath' && currentValue.$target) {
274
- const contextToResolve = objectMap[currentValue.fullyQualifiedName.split('@')[0]];
275
- const subTarget = _resolveTarget(objectMap, contextToResolve, currentValue.value, false, true);
276
- subTarget.visitedObjects.forEach((visitedSubObject) => {
277
- if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
278
- aVisitedObjects.push(visitedSubObject);
158
+ case 'EntityType':
159
+ {
160
+ const thisElement = current.target;
161
+ if (segment === '' || segment === '$Type') {
162
+ return current;
163
+ }
164
+ const property = thisElement.entityProperties.by_name(segment);
165
+ if (property) {
166
+ current.target = property;
167
+ return current;
168
+ }
169
+ const navigationProperty = thisElement.navigationProperties.by_name(segment);
170
+ if (navigationProperty) {
171
+ current.target = navigationProperty;
172
+ return current;
173
+ }
174
+ const action = thisElement.actions[segment];
175
+ if (action) {
176
+ current.target = action;
177
+ return current;
279
178
  }
280
- });
281
- return subTarget.target;
282
- }
283
- else if (pathPart === '$Path' && currentValue.$target) {
284
- currentContext = aVisitedObjects
285
- .concat()
286
- .reverse()
287
- .find((obj) => obj._type === 'EntityType' ||
288
- obj._type === 'EntitySet' ||
289
- obj._type === 'Singleton' ||
290
- obj._type === 'NavigationProperty');
291
- if (currentContext) {
292
- const subTarget = _resolveTarget(objectMap, currentContext, currentValue.path, false, true);
293
- subTarget.visitedObjects.forEach((visitedSubObject) => {
294
- if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
295
- aVisitedObjects.push(visitedSubObject);
296
- }
297
- });
298
- return subTarget.target;
299
179
  }
300
- return currentValue.$target;
301
- }
302
- else if (pathPart.startsWith('$Path') && currentValue.$target) {
303
- const intermediateTarget = currentValue.$target;
304
- currentPath = combinePath(intermediateTarget.fullyQualifiedName, pathPart.substring(5));
180
+ break;
181
+ case 'ActionImport': {
182
+ // continue resolving at the Action
183
+ const result = resolveTarget(converter, current.target.action, segment);
184
+ current.target = result.target;
185
+ current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
186
+ return current;
305
187
  }
306
- else if (currentValue.hasOwnProperty('$Type') && !objectMap[currentPath]) {
307
- // This is now an annotation value
308
- const entityType = objectMap[currentValue.fullyQualifiedName.split('@')[0]];
309
- if (entityType) {
310
- currentPath = combinePath(entityType.fullyQualifiedName, pathPart);
188
+ case 'Action': {
189
+ const thisElement = current.target;
190
+ if (segment === '') {
191
+ return current;
192
+ }
193
+ if (segment === '@$ui5.overload' || segment === '0') {
194
+ return current;
195
+ }
196
+ if (segment === '$Parameter' && thisElement.isBound) {
197
+ current.target = thisElement.parameters;
198
+ return current;
199
+ }
200
+ const nextElement = (_e = thisElement.parameters[segment]) !== null && _e !== void 0 ? _e : thisElement.parameters.find((param) => param.name === segment);
201
+ if (nextElement) {
202
+ current.target = nextElement;
203
+ return current;
311
204
  }
205
+ break;
312
206
  }
207
+ case 'Property':
208
+ {
209
+ const thisElement = current.target;
210
+ // Property or NavigationProperty of the ComplexType
211
+ const type = thisElement.targetType;
212
+ if (type !== undefined) {
213
+ const property = type.properties.by_name(segment);
214
+ if (property) {
215
+ current.target = property;
216
+ return current;
217
+ }
218
+ const navigationProperty = type.navigationProperties.by_name(segment);
219
+ if (navigationProperty) {
220
+ current.target = navigationProperty;
221
+ return current;
222
+ }
223
+ }
224
+ }
225
+ break;
226
+ case 'ActionParameter':
227
+ const referencedType = current.target.typeReference;
228
+ if (referencedType !== undefined) {
229
+ const result = resolveTarget(converter, referencedType, segment);
230
+ current.target = result.target;
231
+ current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
232
+ return current;
233
+ }
234
+ break;
235
+ case 'NavigationProperty':
236
+ // continue at the NavigationProperty's target type
237
+ const result = resolveTarget(converter, current.target.targetType, segment);
238
+ current.target = result.target;
239
+ current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
240
+ return current;
241
+ default:
242
+ if (segment === '') {
243
+ return current;
244
+ }
245
+ if (current.target[segment]) {
246
+ current.target = current.target[segment];
247
+ current.objectPath = appendObjectPath(current.objectPath, current.target);
248
+ return current;
249
+ }
313
250
  }
314
- return objectMap[currentPath];
315
- }, null);
316
- if (!target) {
251
+ return error(`Element '${segment}' not found at ${current.target._type} '${current.target.fullyQualifiedName}'`);
252
+ }, { target: startElement, objectPath: [], messages: [] });
253
+ // Diagnostics
254
+ result.messages.forEach((message) => converter.logError(message.message));
255
+ if (!result.target) {
317
256
  if (annotationsTerm) {
318
- const annotationType = inferTypeFromTerm(annotationsTerm, currentTarget);
319
- oErrorMsg = {
320
- message: 'Unable to resolve the path expression: ' +
321
- '\n' +
322
- path +
323
- '\n' +
324
- '\n' +
325
- 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
326
- '<Annotation Term = ' +
327
- annotationsTerm +
328
- '>' +
329
- '\n' +
330
- '<Record Type = ' +
331
- annotationType +
332
- '>' +
333
- '\n' +
334
- '<AnnotationPath = ' +
335
- path +
336
- '>'
337
- };
338
- addAnnotationErrorMessage(path, oErrorMsg);
257
+ const annotationType = inferTypeFromTerm(converter, annotationsTerm, startElement.fullyQualifiedName);
258
+ converter.logError('Unable to resolve the path expression: ' +
259
+ '\n' +
260
+ path +
261
+ '\n' +
262
+ '\n' +
263
+ 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
264
+ '<Annotation Term = ' +
265
+ annotationsTerm +
266
+ '>' +
267
+ '\n' +
268
+ '<Record Type = ' +
269
+ annotationType +
270
+ '>' +
271
+ '\n' +
272
+ '<AnnotationPath = ' +
273
+ path +
274
+ '>');
339
275
  }
340
276
  else {
341
- oErrorMsg = {
342
- message: 'Unable to resolve the path expression: ' +
343
- path +
344
- '\n' +
345
- '\n' +
346
- 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
347
- '<Annotation Term = ' +
348
- pathSplit[0] +
349
- '>' +
350
- '\n' +
351
- '<PropertyValue Path= ' +
352
- pathSplit[1] +
353
- '>'
354
- };
355
- addAnnotationErrorMessage(path, oErrorMsg);
277
+ converter.logError('Unable to resolve the path expression: ' +
278
+ path +
279
+ '\n' +
280
+ '\n' +
281
+ 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
282
+ '<Annotation Term = ' +
283
+ pathSegments[0] +
284
+ '>' +
285
+ '\n' +
286
+ '<PropertyValue Path= ' +
287
+ pathSegments[1] +
288
+ '>');
356
289
  }
357
290
  }
358
- if (pathOnly) {
359
- return currentPath;
360
- }
361
- if (includeVisitedObjects) {
362
- return {
363
- visitedObjects: aVisitedObjects,
364
- target: target
365
- };
366
- }
367
- return target;
291
+ return result;
368
292
  }
369
293
  /**
370
294
  * Typeguard to check if the path contains an annotation.
@@ -373,9 +297,9 @@ function _resolveTarget(objectMap, currentTarget, path, pathOnly = false, includ
373
297
  * @returns true if there is an annotation in the path.
374
298
  */
375
299
  function isAnnotationPath(pathStr) {
376
- return pathStr.indexOf('@') !== -1;
300
+ return pathStr.includes('@');
377
301
  }
378
- function parseValue(propertyValue, valueFQN, objectMap, context) {
302
+ function parseValue(converter, currentTarget, currentTerm, currentProperty, currentSource, propertyValue, valueFQN) {
379
303
  if (propertyValue === undefined) {
380
304
  return undefined;
381
305
  }
@@ -391,46 +315,59 @@ function parseValue(propertyValue, valueFQN, objectMap, context) {
391
315
  case 'Date':
392
316
  return propertyValue.Date;
393
317
  case 'EnumMember':
394
- return (0, utils_1.alias)(context.rawMetadata.references, propertyValue.EnumMember);
318
+ const aliasedEnum = converter.alias(propertyValue.EnumMember);
319
+ const splitEnum = aliasedEnum.split(' ');
320
+ if (splitEnum[0] && utils_1.EnumIsFlag[(0, utils_1.substringBeforeFirst)(splitEnum[0], '/')]) {
321
+ return splitEnum;
322
+ }
323
+ return aliasedEnum;
395
324
  case 'PropertyPath':
396
325
  return {
397
326
  type: 'PropertyPath',
398
327
  value: propertyValue.PropertyPath,
399
328
  fullyQualifiedName: valueFQN,
400
- $target: _resolveTarget(objectMap, context.currentTarget, propertyValue.PropertyPath, false, false, context.currentTerm)
329
+ $target: resolveTarget(converter, currentTarget, propertyValue.PropertyPath, currentTerm).target,
330
+ [ANNOTATION_TARGET]: currentTarget
401
331
  };
402
332
  case 'NavigationPropertyPath':
403
333
  return {
404
334
  type: 'NavigationPropertyPath',
405
335
  value: propertyValue.NavigationPropertyPath,
406
336
  fullyQualifiedName: valueFQN,
407
- $target: _resolveTarget(objectMap, context.currentTarget, propertyValue.NavigationPropertyPath, false, false, context.currentTerm)
337
+ $target: resolveTarget(converter, currentTarget, propertyValue.NavigationPropertyPath, currentTerm)
338
+ .target,
339
+ [ANNOTATION_TARGET]: currentTarget
408
340
  };
409
341
  case 'AnnotationPath':
410
- const annotationTarget = _resolveTarget(objectMap, context.currentTarget, (0, utils_1.unalias)(context.rawMetadata.references, propertyValue.AnnotationPath), true, false, context.currentTerm);
411
- const annotationPath = {
342
+ return {
412
343
  type: 'AnnotationPath',
413
344
  value: propertyValue.AnnotationPath,
414
345
  fullyQualifiedName: valueFQN,
415
- $target: annotationTarget,
416
- annotationsTerm: context.currentTerm,
346
+ $target: resolveTarget(converter, currentTarget, converter.unalias(propertyValue.AnnotationPath), currentTerm).target,
347
+ annotationsTerm: currentTerm,
417
348
  term: '',
418
- path: ''
349
+ path: '',
350
+ [ANNOTATION_TARGET]: currentTarget
419
351
  };
420
- context.unresolvedAnnotations.push({ inline: false, toResolve: annotationPath });
421
- return annotationPath;
422
352
  case 'Path':
423
- const $target = _resolveTarget(objectMap, context.currentTarget, propertyValue.Path, true, false, context.currentTerm);
424
- const path = new Path(propertyValue, $target, context.currentTerm, '');
425
- context.unresolvedAnnotations.push({
426
- inline: isAnnotationPath(propertyValue.Path),
427
- toResolve: path
428
- });
429
- return path;
353
+ const $target = resolveTarget(converter, currentTarget, propertyValue.Path, currentTerm).target;
354
+ if (isAnnotationPath(propertyValue.Path)) {
355
+ // inline the target
356
+ return $target;
357
+ }
358
+ else {
359
+ return {
360
+ type: 'Path',
361
+ path: propertyValue.Path,
362
+ fullyQualifiedName: valueFQN,
363
+ $target: $target,
364
+ [ANNOTATION_TARGET]: currentTarget
365
+ };
366
+ }
430
367
  case 'Record':
431
- return parseRecord(propertyValue.Record, valueFQN, objectMap, context);
368
+ return parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, propertyValue.Record, valueFQN);
432
369
  case 'Collection':
433
- return parseCollection(propertyValue.Collection, valueFQN, objectMap, context);
370
+ return parseCollection(converter, currentTarget, currentTerm, currentProperty, currentSource, propertyValue.Collection, valueFQN);
434
371
  case 'Apply':
435
372
  case 'Null':
436
373
  case 'Not':
@@ -450,102 +387,96 @@ function parseValue(propertyValue, valueFQN, objectMap, context) {
450
387
  /**
451
388
  * Infer the type of a term based on its type.
452
389
  *
453
- * @param annotationsTerm The annotation term
454
- * @param annotationTarget the annotation target
455
- * @param currentProperty the current property of the record
456
- * @returns the inferred type.
390
+ * @param converter Converter
391
+ * @param annotationsTerm The annotation term
392
+ * @param annotationTarget The annotation target
393
+ * @param currentProperty The current property of the record
394
+ * @returns The inferred type.
457
395
  */
458
- function inferTypeFromTerm(annotationsTerm, annotationTarget, currentProperty) {
396
+ function inferTypeFromTerm(converter, annotationsTerm, annotationTarget, currentProperty) {
459
397
  let targetType = utils_1.TermToTypes[annotationsTerm];
460
398
  if (currentProperty) {
461
- annotationsTerm = annotationsTerm.split('.').slice(0, -1).join('.') + '.' + currentProperty;
399
+ annotationsTerm = `${(0, utils_1.substringBeforeLast)(annotationsTerm, '.')}.${currentProperty}`;
462
400
  targetType = utils_1.TermToTypes[annotationsTerm];
463
401
  }
464
- const oErrorMsg = {
465
- isError: false,
466
- message: `The type of the record used within the term ${annotationsTerm} was not defined and was inferred as ${targetType}.
402
+ converter.logError(`The type of the record used within the term ${annotationsTerm} was not defined and was inferred as ${targetType}.
467
403
  Hint: If possible, try to maintain the Type property for each Record.
468
404
  <Annotations Target="${annotationTarget}">
469
405
  <Annotation Term="${annotationsTerm}">
470
406
  <Record>...</Record>
471
407
  </Annotation>
472
- </Annotations>`
473
- };
474
- addAnnotationErrorMessage(annotationTarget + '/' + annotationsTerm, oErrorMsg);
408
+ </Annotations>`);
475
409
  return targetType;
476
410
  }
477
- function isDataFieldWithForAction(annotationContent, annotationTerm) {
411
+ function isDataFieldWithForAction(annotationContent) {
478
412
  return (annotationContent.hasOwnProperty('Action') &&
479
- (annotationTerm.$Type === 'com.sap.vocabularies.UI.v1.DataFieldForAction' ||
480
- annotationTerm.$Type === 'com.sap.vocabularies.UI.v1.DataFieldWithAction'));
413
+ (annotationContent.$Type === 'com.sap.vocabularies.UI.v1.DataFieldForAction' ||
414
+ annotationContent.$Type === 'com.sap.vocabularies.UI.v1.DataFieldWithAction'));
481
415
  }
482
- function parseRecordType(recordDefinition, context) {
416
+ function parseRecordType(converter, currentTerm, currentTarget, currentProperty, recordDefinition) {
483
417
  let targetType;
484
- if (!recordDefinition.type && context.currentTerm) {
485
- targetType = inferTypeFromTerm(context.currentTerm, context.currentTarget.fullyQualifiedName, context.currentProperty);
418
+ if (!recordDefinition.type && currentTerm) {
419
+ targetType = inferTypeFromTerm(converter, currentTerm, currentTarget.fullyQualifiedName, currentProperty);
486
420
  }
487
421
  else {
488
- targetType = (0, utils_1.unalias)(context.rawMetadata.references, recordDefinition.type);
422
+ targetType = converter.unalias(recordDefinition.type);
489
423
  }
490
424
  return targetType;
491
425
  }
492
- function parseRecord(recordDefinition, currentFQN, objectMap, context) {
493
- const targetType = parseRecordType(recordDefinition, context);
426
+ function parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, annotationRecord, currentFQN) {
427
+ var _a;
494
428
  const annotationTerm = {
495
- $Type: targetType,
429
+ $Type: parseRecordType(converter, currentTerm, currentTarget, currentProperty, annotationRecord),
496
430
  fullyQualifiedName: currentFQN,
497
- annotations: {}
431
+ [ANNOTATION_TARGET]: currentTarget
498
432
  };
499
- const annotationContent = {};
500
- if (Array.isArray(recordDefinition.annotations)) {
501
- const subAnnotationList = {
502
- target: currentFQN,
503
- annotations: recordDefinition.annotations,
504
- __source: context.currentSource
505
- };
506
- context.additionalAnnotations.push(subAnnotationList);
507
- }
508
- if (recordDefinition.propertyValues) {
509
- recordDefinition.propertyValues.forEach((propertyValue) => {
510
- var _a;
511
- context.currentProperty = propertyValue.name;
512
- annotationContent[propertyValue.name] = parseValue(propertyValue.value, `${currentFQN}/${propertyValue.name}`, objectMap, context);
513
- if (Array.isArray(propertyValue.annotations)) {
514
- const subAnnotationList = {
515
- target: `${currentFQN}/${propertyValue.name}`,
516
- annotations: propertyValue.annotations,
517
- __source: context.currentSource
518
- };
519
- context.additionalAnnotations.push(subAnnotationList);
433
+ // annotations on the record
434
+ (0, utils_1.lazy)(annotationTerm, 'annotations', () => {
435
+ var _a;
436
+ // be graceful when resolving annotations on annotations: Sometimes they are referenced directly, sometimes they
437
+ // are part of the global annotations list
438
+ let annotations;
439
+ if (annotationRecord.annotations && annotationRecord.annotations.length > 0) {
440
+ annotations = annotationRecord.annotations;
441
+ }
442
+ else {
443
+ annotations = (_a = converter.rawAnnotationsPerTarget[currentFQN]) === null || _a === void 0 ? void 0 : _a.annotations;
444
+ }
445
+ annotations === null || annotations === void 0 ? void 0 : annotations.forEach((annotation) => {
446
+ annotation.target = currentFQN;
447
+ annotation.__source = currentSource;
448
+ annotation[ANNOTATION_TARGET] = currentTarget;
449
+ annotation.fullyQualifiedName = `${currentFQN}@${annotation.term}`;
450
+ });
451
+ return createAnnotationsObject(converter, annotationTerm, annotations !== null && annotations !== void 0 ? annotations : []);
452
+ });
453
+ const annotationContent = (_a = annotationRecord.propertyValues) === null || _a === void 0 ? void 0 : _a.reduce((annotationContent, propertyValue) => {
454
+ (0, utils_1.lazy)(annotationContent, propertyValue.name, () => parseValue(converter, currentTarget, currentTerm, propertyValue.name, currentSource, propertyValue.value, `${currentFQN}/${propertyValue.name}`));
455
+ return annotationContent;
456
+ }, annotationTerm);
457
+ if (isDataFieldWithForAction(annotationContent)) {
458
+ (0, utils_1.lazy)(annotationContent, 'ActionTarget', () => {
459
+ var _a, _b;
460
+ // try to resolve to a bound action of the annotation target
461
+ let actionTarget = (_a = currentTarget.actions) === null || _a === void 0 ? void 0 : _a[annotationContent.Action];
462
+ if (!actionTarget) {
463
+ // try to find a corresponding unbound action
464
+ actionTarget = (_b = converter.getConvertedActionImport(annotationContent.Action)) === null || _b === void 0 ? void 0 : _b.action;
520
465
  }
521
- if (isDataFieldWithForAction(annotationContent, annotationTerm)) {
522
- // try to resolve to a bound action of the annotation target
523
- annotationContent.ActionTarget = (_a = context.currentTarget.actions) === null || _a === void 0 ? void 0 : _a[annotationContent.Action];
524
- if (!annotationContent.ActionTarget) {
525
- const action = objectMap[annotationContent.Action];
526
- if (action === null || action === void 0 ? void 0 : action.isBound) {
527
- // bound action of a different entity type
528
- annotationContent.ActionTarget = action;
529
- }
530
- else if (action) {
531
- // unbound action --> resolve via the action import
532
- annotationContent.ActionTarget = action.action;
533
- }
534
- }
535
- if (!annotationContent.ActionTarget) {
536
- // Add to diagnostics debugger;
537
- ANNOTATION_ERRORS.push({
538
- message: 'Unable to resolve the action ' +
539
- annotationContent.Action +
540
- ' defined for ' +
541
- annotationTerm.fullyQualifiedName
542
- });
466
+ if (!actionTarget) {
467
+ // try to find a corresponding bound (!) action
468
+ actionTarget = converter.getConvertedAction(annotationContent.Action);
469
+ if (!(actionTarget === null || actionTarget === void 0 ? void 0 : actionTarget.isBound)) {
470
+ actionTarget = undefined;
543
471
  }
544
472
  }
473
+ if (!actionTarget) {
474
+ converter.logError(`Unable to resolve the action '${annotationContent.Action}' defined for '${annotationTerm.fullyQualifiedName}'`);
475
+ }
476
+ return actionTarget;
545
477
  });
546
- context.currentProperty = undefined;
547
478
  }
548
- return Object.assign(annotationTerm, annotationContent);
479
+ return annotationContent;
549
480
  }
550
481
  /**
551
482
  * Retrieve or infer the collection type based on its content.
@@ -582,58 +513,56 @@ function getOrInferCollectionType(collectionDefinition) {
582
513
  }
583
514
  return type;
584
515
  }
585
- function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
516
+ function parseCollection(converter, currentTarget, currentTerm, currentProperty, currentSource, collectionDefinition, parentFQN) {
586
517
  const collectionDefinitionType = getOrInferCollectionType(collectionDefinition);
587
518
  switch (collectionDefinitionType) {
588
519
  case 'PropertyPath':
589
520
  return collectionDefinition.map((propertyPath, propertyIdx) => {
590
- return {
521
+ const result = {
591
522
  type: 'PropertyPath',
592
523
  value: propertyPath.PropertyPath,
593
- fullyQualifiedName: `${parentFQN}/${propertyIdx}`,
594
- $target: _resolveTarget(objectMap, context.currentTarget, propertyPath.PropertyPath, false, false, context.currentTerm)
524
+ fullyQualifiedName: `${parentFQN}/${propertyIdx}`
595
525
  };
526
+ (0, utils_1.lazy)(result, '$target', () => {
527
+ var _a;
528
+ return (_a = resolveTarget(converter, currentTarget, propertyPath.PropertyPath, currentTerm)
529
+ .target) !== null && _a !== void 0 ? _a : {};
530
+ } // TODO: $target is mandatory - throw an error?
531
+ );
532
+ return result;
596
533
  });
597
534
  case 'Path':
535
+ // TODO: make lazy?
598
536
  return collectionDefinition.map((pathValue) => {
599
- const $target = _resolveTarget(objectMap, context.currentTarget, pathValue.Path, true, false, context.currentTerm);
600
- const path = new Path(pathValue, $target, context.currentTerm, '');
601
- context.unresolvedAnnotations.push({
602
- inline: isAnnotationPath(pathValue.Path),
603
- toResolve: path
604
- });
605
- return path;
537
+ return resolveTarget(converter, currentTarget, pathValue.Path, currentTerm).target;
606
538
  });
607
539
  case 'AnnotationPath':
608
540
  return collectionDefinition.map((annotationPath, annotationIdx) => {
609
- const annotationTarget = _resolveTarget(objectMap, context.currentTarget, annotationPath.AnnotationPath, true, false, context.currentTerm);
610
- const annotationCollectionElement = {
541
+ const result = {
611
542
  type: 'AnnotationPath',
612
543
  value: annotationPath.AnnotationPath,
613
544
  fullyQualifiedName: `${parentFQN}/${annotationIdx}`,
614
- $target: annotationTarget,
615
- annotationsTerm: context.currentTerm,
545
+ annotationsTerm: currentTerm,
616
546
  term: '',
617
547
  path: ''
618
548
  };
619
- context.unresolvedAnnotations.push({
620
- inline: false,
621
- toResolve: annotationCollectionElement
622
- });
623
- return annotationCollectionElement;
549
+ (0, utils_1.lazy)(result, '$target', () => resolveTarget(converter, currentTarget, annotationPath.AnnotationPath, currentTerm).target);
550
+ return result;
624
551
  });
625
552
  case 'NavigationPropertyPath':
626
553
  return collectionDefinition.map((navPropertyPath, navPropIdx) => {
627
- return {
554
+ const result = {
628
555
  type: 'NavigationPropertyPath',
629
556
  value: navPropertyPath.NavigationPropertyPath,
630
- fullyQualifiedName: `${parentFQN}/${navPropIdx}`,
631
- $target: _resolveTarget(objectMap, context.currentTarget, navPropertyPath.NavigationPropertyPath, false, false, context.currentTerm)
557
+ fullyQualifiedName: `${parentFQN}/${navPropIdx}`
632
558
  };
559
+ (0, utils_1.lazy)(result, '$target', () => resolveTarget(converter, currentTarget, navPropertyPath.NavigationPropertyPath, currentTerm)
560
+ .target);
561
+ return result;
633
562
  });
634
563
  case 'Record':
635
564
  return collectionDefinition.map((recordDefinition, recordIdx) => {
636
- return parseRecord(recordDefinition, `${parentFQN}/${recordIdx}`, objectMap, context);
565
+ return parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, recordDefinition, `${parentFQN}/${recordIdx}`);
637
566
  });
638
567
  case 'Apply':
639
568
  case 'Null':
@@ -647,15 +576,10 @@ function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
647
576
  case 'Not':
648
577
  case 'And':
649
578
  case 'Or':
650
- return collectionDefinition.map((ifValue) => {
651
- return ifValue;
652
- });
579
+ return collectionDefinition.map((ifValue) => ifValue);
653
580
  case 'String':
654
581
  return collectionDefinition.map((stringValue) => {
655
- if (typeof stringValue === 'string') {
656
- return stringValue;
657
- }
658
- else if (stringValue === undefined) {
582
+ if (typeof stringValue === 'string' || stringValue === undefined) {
659
583
  return stringValue;
660
584
  }
661
585
  else {
@@ -669,471 +593,493 @@ function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
669
593
  throw new Error('Unsupported case');
670
594
  }
671
595
  }
672
- function convertAnnotation(annotation, objectMap, context) {
673
- if (annotation.record) {
674
- return parseRecord(annotation.record, annotation.fullyQualifiedName, objectMap, context);
596
+ function isV4NavigationProperty(navProp) {
597
+ return !!navProp.targetTypeName;
598
+ }
599
+ /**
600
+ * Split the alias from the term value.
601
+ *
602
+ * @param references the current set of references
603
+ * @param termValue the value of the term
604
+ * @returns the term alias and the actual term value
605
+ */
606
+ function splitTerm(references, termValue) {
607
+ return (0, utils_1.splitAtLast)((0, utils_1.alias)(references, termValue), '.');
608
+ }
609
+ function convertAnnotation(converter, target, rawAnnotation) {
610
+ var _a;
611
+ let annotation;
612
+ if (rawAnnotation.record) {
613
+ annotation = parseRecord(converter, rawAnnotation.term, target, '', rawAnnotation.__source, rawAnnotation.record, rawAnnotation.fullyQualifiedName);
675
614
  }
676
- else if (annotation.collection === undefined) {
677
- if (annotation.value) {
678
- return parseValue(annotation.value, annotation.fullyQualifiedName, objectMap, context);
679
- }
680
- else {
681
- return true;
682
- }
615
+ else if (rawAnnotation.collection === undefined) {
616
+ annotation = parseValue(converter, target, rawAnnotation.term, '', rawAnnotation.__source, (_a = rawAnnotation.value) !== null && _a !== void 0 ? _a : { type: 'Bool', Bool: true }, rawAnnotation.fullyQualifiedName);
683
617
  }
684
- else if (annotation.collection) {
685
- const collection = parseCollection(annotation.collection, annotation.fullyQualifiedName, objectMap, context);
686
- collection.fullyQualifiedName = annotation.fullyQualifiedName;
687
- return collection;
618
+ else if (rawAnnotation.collection) {
619
+ annotation = parseCollection(converter, target, rawAnnotation.term, '', rawAnnotation.__source, rawAnnotation.collection, rawAnnotation.fullyQualifiedName);
688
620
  }
689
621
  else {
690
622
  throw new Error('Unsupported case');
691
623
  }
624
+ switch (typeof annotation) {
625
+ case 'string':
626
+ // eslint-disable-next-line no-new-wrappers
627
+ annotation = new String(annotation);
628
+ break;
629
+ case 'boolean':
630
+ // eslint-disable-next-line no-new-wrappers
631
+ annotation = new Boolean(annotation);
632
+ break;
633
+ case 'number':
634
+ annotation = new Number(annotation);
635
+ break;
636
+ default:
637
+ // do nothing
638
+ break;
639
+ }
640
+ annotation.fullyQualifiedName = rawAnnotation.fullyQualifiedName;
641
+ annotation[ANNOTATION_TARGET] = target;
642
+ const [vocAlias, vocTerm] = converter.splitTerm(rawAnnotation.term);
643
+ annotation.term = converter.unalias(`${vocAlias}.${vocTerm}`);
644
+ annotation.qualifier = rawAnnotation.qualifier;
645
+ annotation.__source = rawAnnotation.__source;
646
+ try {
647
+ (0, utils_1.lazy)(annotation, 'annotations', () => {
648
+ var _a;
649
+ const annotationFQN = annotation.fullyQualifiedName;
650
+ // be graceful when resolving annotations on annotations: Sometimes they are referenced directly, sometimes they
651
+ // are part of the global annotations list
652
+ let annotations;
653
+ if (rawAnnotation.annotations && rawAnnotation.annotations.length > 0) {
654
+ annotations = rawAnnotation.annotations;
655
+ }
656
+ else {
657
+ annotations = (_a = converter.rawAnnotationsPerTarget[annotationFQN]) === null || _a === void 0 ? void 0 : _a.annotations;
658
+ }
659
+ annotations === null || annotations === void 0 ? void 0 : annotations.forEach((rawSubAnnotation) => {
660
+ rawSubAnnotation.target = annotationFQN;
661
+ rawSubAnnotation.__source = annotation.__source;
662
+ rawSubAnnotation[ANNOTATION_TARGET] = target;
663
+ rawSubAnnotation.fullyQualifiedName = `${annotationFQN}@${rawSubAnnotation.term}`;
664
+ });
665
+ return createAnnotationsObject(converter, annotation, annotations !== null && annotations !== void 0 ? annotations : []);
666
+ });
667
+ }
668
+ catch (e) {
669
+ // not an error: parseRecord() already adds annotations, but the other parseXXX functions don't, so this can happen
670
+ }
671
+ return annotation;
672
+ }
673
+ function getAnnotationFQN(currentTargetName, references, annotation) {
674
+ const annotationFQN = `${currentTargetName}@${(0, utils_1.unalias)(references, annotation.term)}`;
675
+ if (annotation.qualifier) {
676
+ return `${annotationFQN}#${annotation.qualifier}`;
677
+ }
678
+ else {
679
+ return annotationFQN;
680
+ }
692
681
  }
693
682
  /**
694
- * Creates a resolvePath function for a given entityType.
683
+ * Merge annotation from different source together by overwriting at the term level.
695
684
  *
696
- * @param entityType The entityType for which the function should be created
697
- * @param objectMap The current objectMap
698
- * @returns the resolvePath function that starts at the entityType
685
+ * @param rawMetadata
686
+ * @returns the resulting merged annotations
699
687
  */
700
- function createResolvePathFn(entityType, objectMap) {
701
- return function (relativePath, includeVisitedObjects) {
702
- const annotationTerm = '';
703
- return _resolveTarget(objectMap, entityType, relativePath, false, includeVisitedObjects, annotationTerm);
704
- };
688
+ function mergeAnnotations(rawMetadata) {
689
+ const annotationListPerTarget = {};
690
+ Object.keys(rawMetadata.schema.annotations).forEach((annotationSource) => {
691
+ rawMetadata.schema.annotations[annotationSource].forEach((annotationList) => {
692
+ const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
693
+ annotationList.__source = annotationSource;
694
+ if (!annotationListPerTarget[currentTargetName]) {
695
+ annotationListPerTarget[currentTargetName] = {
696
+ annotations: annotationList.annotations.map((annotation) => {
697
+ annotation.fullyQualifiedName = getAnnotationFQN(currentTargetName, rawMetadata.references, annotation);
698
+ annotation.__source = annotationSource;
699
+ return annotation;
700
+ }),
701
+ target: currentTargetName
702
+ };
703
+ annotationListPerTarget[currentTargetName].__source = annotationSource;
704
+ }
705
+ else {
706
+ annotationList.annotations.forEach((annotation) => {
707
+ const findIndex = annotationListPerTarget[currentTargetName].annotations.findIndex((referenceAnnotation) => {
708
+ return (referenceAnnotation.term === annotation.term &&
709
+ referenceAnnotation.qualifier === annotation.qualifier);
710
+ });
711
+ annotation.__source = annotationSource;
712
+ annotation.fullyQualifiedName = getAnnotationFQN(currentTargetName, rawMetadata.references, annotation);
713
+ if (findIndex !== -1) {
714
+ annotationListPerTarget[currentTargetName].annotations.splice(findIndex, 1, annotation);
715
+ }
716
+ else {
717
+ annotationListPerTarget[currentTargetName].annotations.push(annotation);
718
+ }
719
+ });
720
+ }
721
+ });
722
+ });
723
+ return annotationListPerTarget;
705
724
  }
706
- function resolveV2NavigationProperty(navProp, associations, objectMap, outNavProp) {
707
- const targetAssociation = associations.find((association) => association.fullyQualifiedName === navProp.relationship);
708
- if (targetAssociation) {
709
- const associationEnd = targetAssociation.associationEnd.find((end) => end.role === navProp.toRole);
710
- if (associationEnd) {
711
- outNavProp.targetType = objectMap[associationEnd.type];
712
- outNavProp.isCollection = associationEnd.multiplicity === '*';
725
+ class Converter {
726
+ get rawAnnotationsPerTarget() {
727
+ if (this._rawAnnotationsPerTarget === undefined) {
728
+ this._rawAnnotationsPerTarget = mergeAnnotations(this.rawMetadata);
729
+ }
730
+ return this._rawAnnotationsPerTarget;
731
+ }
732
+ getConvertedEntityContainer() {
733
+ return this.getConvertedElement(this.rawMetadata.schema.entityContainer.fullyQualifiedName, this.rawMetadata.schema.entityContainer, convertEntityContainer);
734
+ }
735
+ getConvertedEntitySet(fullyQualifiedName) {
736
+ return this.convertedOutput.entitySets.by_fullyQualifiedName(fullyQualifiedName);
737
+ }
738
+ getConvertedSingleton(fullyQualifiedName) {
739
+ return this.convertedOutput.singletons.by_fullyQualifiedName(fullyQualifiedName);
740
+ }
741
+ getConvertedEntityType(fullyQualifiedName) {
742
+ return this.convertedOutput.entityTypes.by_fullyQualifiedName(fullyQualifiedName);
743
+ }
744
+ getConvertedComplexType(fullyQualifiedName) {
745
+ return this.convertedOutput.complexTypes.by_fullyQualifiedName(fullyQualifiedName);
746
+ }
747
+ getConvertedTypeDefinition(fullyQualifiedName) {
748
+ return this.convertedOutput.typeDefinitions.by_fullyQualifiedName(fullyQualifiedName);
749
+ }
750
+ getConvertedActionImport(fullyQualifiedName) {
751
+ let actionImport = this.convertedOutput.actionImports.by_fullyQualifiedName(fullyQualifiedName);
752
+ if (!actionImport) {
753
+ actionImport = this.convertedOutput.actionImports.by_name(fullyQualifiedName);
754
+ }
755
+ return actionImport;
756
+ }
757
+ getConvertedAction(fullyQualifiedName) {
758
+ return this.convertedOutput.actions.by_fullyQualifiedName(fullyQualifiedName);
759
+ }
760
+ convert(rawValue, map) {
761
+ if (Array.isArray(rawValue)) {
762
+ return () => {
763
+ const converted = rawValue.reduce((convertedElements, rawElement) => {
764
+ const convertedElement = this.getConvertedElement(rawElement.fullyQualifiedName, rawElement, map);
765
+ if (convertedElement) {
766
+ convertedElements.push(convertedElement);
767
+ }
768
+ return convertedElements;
769
+ }, []);
770
+ (0, utils_1.addGetByValue)(converted, 'name');
771
+ (0, utils_1.addGetByValue)(converted, 'fullyQualifiedName');
772
+ return converted;
773
+ };
713
774
  }
775
+ else {
776
+ return () => this.getConvertedElement(rawValue.fullyQualifiedName, rawValue, map);
777
+ }
778
+ }
779
+ constructor(rawMetadata, convertedOutput) {
780
+ this.convertedElements = new Map();
781
+ this.rawMetadata = rawMetadata;
782
+ this.rawSchema = rawMetadata.schema;
783
+ this.convertedOutput = convertedOutput;
784
+ }
785
+ getConvertedElement(fullyQualifiedName, rawElement, map) {
786
+ let converted = this.convertedElements.get(fullyQualifiedName);
787
+ if (converted === undefined) {
788
+ const rawMetadata = typeof rawElement === 'function' ? rawElement.apply(undefined, [fullyQualifiedName]) : rawElement;
789
+ if (rawMetadata !== undefined) {
790
+ converted = map.apply(undefined, [this, rawMetadata]);
791
+ this.convertedElements.set(fullyQualifiedName, converted);
792
+ }
793
+ }
794
+ return converted;
795
+ }
796
+ logError(message) {
797
+ this.convertedOutput.diagnostics.push({ message });
798
+ }
799
+ splitTerm(term) {
800
+ return splitTerm(this.rawMetadata.references, term);
801
+ }
802
+ alias(value) {
803
+ return (0, utils_1.alias)(this.rawMetadata.references, value);
804
+ }
805
+ unalias(value) {
806
+ var _a;
807
+ return (_a = (0, utils_1.unalias)(this.rawMetadata.references, value)) !== null && _a !== void 0 ? _a : '';
714
808
  }
715
- outNavProp.referentialConstraint = navProp.referentialConstraint || [];
716
809
  }
717
- function resolveV4NavigationProperty(navProp, objectMap, outNavProp) {
718
- outNavProp.targetType = objectMap[navProp.targetTypeName];
719
- outNavProp.partner = navProp.partner;
720
- outNavProp.isCollection = navProp.isCollection;
721
- outNavProp.containsTarget = navProp.containsTarget;
722
- outNavProp.referentialConstraint = navProp.referentialConstraint;
810
+ function resolveEntityType(converter, fullyQualifiedName) {
811
+ return () => {
812
+ let entityType = converter.getConvertedEntityType(fullyQualifiedName);
813
+ if (!entityType) {
814
+ converter.logError(`EntityType '${fullyQualifiedName}' not found`);
815
+ entityType = {};
816
+ }
817
+ return entityType;
818
+ };
723
819
  }
724
- function isV4NavigationProperty(navProp) {
725
- return !!navProp.targetTypeName;
820
+ function resolveNavigationPropertyBindings(converter, rawNavigationPropertyBindings, rawElement) {
821
+ return () => Object.keys(rawNavigationPropertyBindings).reduce((navigationPropertyBindings, bindingName) => {
822
+ const rawBindingTarget = rawNavigationPropertyBindings[bindingName];
823
+ (0, utils_1.lazy)(navigationPropertyBindings, bindingName, () => {
824
+ let resolvedBindingTarget;
825
+ if (rawBindingTarget._type === 'Singleton') {
826
+ resolvedBindingTarget = converter.getConvertedSingleton(rawBindingTarget.fullyQualifiedName);
827
+ }
828
+ else {
829
+ resolvedBindingTarget = converter.getConvertedEntitySet(rawBindingTarget.fullyQualifiedName);
830
+ }
831
+ if (!resolvedBindingTarget) {
832
+ converter.logError(`${rawElement._type} '${rawElement.fullyQualifiedName}': Failed to resolve NavigationPropertyBinding ${bindingName}`);
833
+ resolvedBindingTarget = {};
834
+ }
835
+ return resolvedBindingTarget;
836
+ });
837
+ return navigationPropertyBindings;
838
+ }, {});
726
839
  }
727
- function prepareNavigationProperties(navigationProperties, associations, objectMap) {
728
- return navigationProperties.map((navProp) => {
729
- const outNavProp = {
730
- _type: 'NavigationProperty',
731
- name: navProp.name,
732
- fullyQualifiedName: navProp.fullyQualifiedName,
733
- isCollection: false,
734
- containsTarget: false,
735
- referentialConstraint: [],
736
- annotations: {},
737
- partner: '',
738
- targetType: undefined,
739
- targetTypeName: ''
740
- };
741
- if (isV4NavigationProperty(navProp)) {
742
- resolveV4NavigationProperty(navProp, objectMap, outNavProp);
743
- }
744
- else {
745
- resolveV2NavigationProperty(navProp, associations, objectMap, outNavProp);
840
+ function resolveAnnotations(converter, rawAnnotationTarget) {
841
+ const nestedAnnotations = rawAnnotationTarget.annotations;
842
+ return () => {
843
+ var _a, _b;
844
+ return createAnnotationsObject(converter, rawAnnotationTarget, (_b = nestedAnnotations !== null && nestedAnnotations !== void 0 ? nestedAnnotations : (_a = converter.rawAnnotationsPerTarget[rawAnnotationTarget.fullyQualifiedName]) === null || _a === void 0 ? void 0 : _a.annotations) !== null && _b !== void 0 ? _b : []);
845
+ };
846
+ }
847
+ function createAnnotationsObject(converter, target, rawAnnotations) {
848
+ return rawAnnotations.reduce((vocabularyAliases, annotation) => {
849
+ const [vocAlias, vocTerm] = converter.splitTerm(annotation.term);
850
+ const vocTermWithQualifier = `${vocTerm}${annotation.qualifier ? '#' + annotation.qualifier : ''}`;
851
+ if (vocabularyAliases[vocAlias] === undefined) {
852
+ vocabularyAliases[vocAlias] = {};
746
853
  }
747
- if (outNavProp.targetType) {
748
- outNavProp.targetTypeName = outNavProp.targetType.fullyQualifiedName;
854
+ if (!vocabularyAliases[vocAlias].hasOwnProperty(vocTermWithQualifier)) {
855
+ (0, utils_1.lazy)(vocabularyAliases[vocAlias], vocTermWithQualifier, () => converter.getConvertedElement(annotation.fullyQualifiedName, annotation, (converter, rawAnnotation) => convertAnnotation(converter, target, rawAnnotation)));
749
856
  }
750
- objectMap[outNavProp.fullyQualifiedName] = outNavProp;
751
- return outNavProp;
752
- });
857
+ return vocabularyAliases;
858
+ }, {});
753
859
  }
754
860
  /**
755
- * @param entityTypes
756
- * @param associations
757
- * @param objectMap
861
+ * Converts an EntityContainer.
862
+ *
863
+ * @param converter Converter
864
+ * @param rawEntityContainer Unconverted EntityContainer
865
+ * @returns The converted EntityContainer
758
866
  */
759
- function resolveNavigationProperties(entityTypes, associations, objectMap) {
760
- entityTypes.forEach((entityType) => {
761
- entityType.navigationProperties = prepareNavigationProperties(entityType.navigationProperties, associations, objectMap);
762
- entityType.resolvePath = createResolvePathFn(entityType, objectMap);
763
- });
867
+ function convertEntityContainer(converter, rawEntityContainer) {
868
+ const convertedEntityContainer = rawEntityContainer;
869
+ (0, utils_1.lazy)(convertedEntityContainer, 'annotations', resolveAnnotations(converter, rawEntityContainer));
870
+ (0, utils_1.lazy)(convertedEntityContainer, 'entitySets', converter.convert(converter.rawSchema.entitySets, convertEntitySet));
871
+ (0, utils_1.lazy)(convertedEntityContainer, 'singletons', converter.convert(converter.rawSchema.singletons, convertSingleton));
872
+ (0, utils_1.lazy)(convertedEntityContainer, 'actionImports', converter.convert(converter.rawSchema.actionImports, convertActionImport));
873
+ return convertedEntityContainer;
764
874
  }
765
875
  /**
766
- * @param namespace
767
- * @param actions
768
- * @param objectMap
876
+ * Converts a Singleton.
877
+ *
878
+ * @param converter Converter
879
+ * @param rawSingleton Unconverted Singleton
880
+ * @returns The converted Singleton
769
881
  */
770
- function linkActionsToEntityType(namespace, actions, objectMap) {
771
- actions.forEach((action) => {
772
- if (!action.annotations) {
773
- action.annotations = {};
774
- }
775
- if (action.isBound) {
776
- const sourceEntityType = objectMap[action.sourceType];
777
- action.sourceEntityType = sourceEntityType;
778
- if (sourceEntityType) {
779
- if (!sourceEntityType.actions) {
780
- sourceEntityType.actions = {};
781
- }
782
- sourceEntityType.actions[`${namespace}.${action.name}`] = action;
783
- }
784
- action.returnEntityType = objectMap[action.returnType];
785
- }
786
- });
787
- }
788
- function linkActionImportsToActions(actionImports, objectMap) {
789
- actionImports.forEach((actionImport) => {
790
- actionImport.action = objectMap[actionImport.actionName];
791
- });
882
+ function convertSingleton(converter, rawSingleton) {
883
+ const convertedSingleton = rawSingleton;
884
+ convertedSingleton.entityTypeName = converter.unalias(rawSingleton.entityTypeName);
885
+ (0, utils_1.lazy)(convertedSingleton, 'entityType', resolveEntityType(converter, rawSingleton.entityTypeName));
886
+ (0, utils_1.lazy)(convertedSingleton, 'annotations', resolveAnnotations(converter, rawSingleton));
887
+ const _rawNavigationPropertyBindings = rawSingleton.navigationPropertyBinding;
888
+ (0, utils_1.lazy)(convertedSingleton, 'navigationPropertyBinding', resolveNavigationPropertyBindings(converter, _rawNavigationPropertyBindings, rawSingleton));
889
+ return convertedSingleton;
792
890
  }
793
891
  /**
794
- * @param entitySets
795
- * @param objectMap
796
- * @param references
892
+ * Converts an EntitySet.
893
+ *
894
+ * @param converter Converter
895
+ * @param rawEntitySet Unconverted EntitySet
896
+ * @returns The converted EntitySet
797
897
  */
798
- function linkEntityTypeToEntitySet(entitySets, objectMap, references) {
799
- entitySets.forEach((entitySet) => {
800
- entitySet.entityType = objectMap[entitySet.entityTypeName];
801
- if (!entitySet.entityType) {
802
- entitySet.entityType = objectMap[(0, utils_1.unalias)(references, entitySet.entityTypeName)];
803
- }
804
- if (!entitySet.annotations) {
805
- entitySet.annotations = {};
806
- }
807
- if (!entitySet.entityType.annotations) {
808
- entitySet.entityType.annotations = {};
809
- }
810
- entitySet.entityType.keys.forEach((keyProp) => {
811
- keyProp.isKey = true;
812
- });
813
- });
898
+ function convertEntitySet(converter, rawEntitySet) {
899
+ const convertedEntitySet = rawEntitySet;
900
+ convertedEntitySet.entityTypeName = converter.unalias(rawEntitySet.entityTypeName);
901
+ (0, utils_1.lazy)(convertedEntitySet, 'entityType', resolveEntityType(converter, rawEntitySet.entityTypeName));
902
+ (0, utils_1.lazy)(convertedEntitySet, 'annotations', resolveAnnotations(converter, rawEntitySet));
903
+ const _rawNavigationPropertyBindings = rawEntitySet.navigationPropertyBinding;
904
+ (0, utils_1.lazy)(convertedEntitySet, 'navigationPropertyBinding', resolveNavigationPropertyBindings(converter, _rawNavigationPropertyBindings, rawEntitySet));
905
+ return convertedEntitySet;
814
906
  }
815
907
  /**
816
- * @param singletons
817
- * @param objectMap
818
- * @param references
908
+ * Converts an EntityType.
909
+ *
910
+ * @param converter Converter
911
+ * @param rawEntityType Unconverted EntityType
912
+ * @returns The converted EntityType
819
913
  */
820
- function linkEntityTypeToSingleton(singletons, objectMap, references) {
821
- singletons.forEach((singleton) => {
822
- singleton.entityType = objectMap[singleton.entityTypeName];
823
- if (!singleton.entityType) {
824
- singleton.entityType = objectMap[(0, utils_1.unalias)(references, singleton.entityTypeName)];
825
- }
826
- if (!singleton.annotations) {
827
- singleton.annotations = {};
914
+ function convertEntityType(converter, rawEntityType) {
915
+ const convertedEntityType = rawEntityType;
916
+ rawEntityType.keys.forEach((keyProp) => {
917
+ keyProp.isKey = true;
918
+ });
919
+ (0, utils_1.lazy)(convertedEntityType, 'annotations', resolveAnnotations(converter, rawEntityType));
920
+ (0, utils_1.lazy)(convertedEntityType, 'keys', converter.convert(rawEntityType.keys, convertProperty));
921
+ (0, utils_1.lazy)(convertedEntityType, 'entityProperties', converter.convert(rawEntityType.entityProperties, convertProperty));
922
+ (0, utils_1.lazy)(convertedEntityType, 'navigationProperties', converter.convert(rawEntityType.navigationProperties, convertNavigationProperty));
923
+ (0, utils_1.lazy)(convertedEntityType, 'actions', () => converter.rawSchema.actions
924
+ .filter((rawAction) => rawAction.isBound &&
925
+ (rawAction.sourceType === rawEntityType.fullyQualifiedName ||
926
+ rawAction.sourceType === `Collection(${rawEntityType.fullyQualifiedName})`))
927
+ .reduce((actions, rawAction) => {
928
+ const name = `${converter.rawSchema.namespace}.${rawAction.name}`;
929
+ actions[name] = converter.getConvertedAction(rawAction.fullyQualifiedName);
930
+ return actions;
931
+ }, {}));
932
+ convertedEntityType.resolvePath = (relativePath, includeVisitedObjects) => {
933
+ const resolved = resolveTarget(converter, rawEntityType, relativePath);
934
+ if (includeVisitedObjects) {
935
+ return { target: resolved.target, visitedObjects: resolved.objectPath, messages: resolved.messages };
828
936
  }
829
- if (!singleton.entityType.annotations) {
830
- singleton.entityType.annotations = {};
937
+ else {
938
+ return resolved.target;
831
939
  }
832
- singleton.entityType.keys.forEach((keyProp) => {
833
- keyProp.isKey = true;
834
- });
835
- });
940
+ };
941
+ return convertedEntityType;
836
942
  }
837
943
  /**
838
- * @param entityTypes
839
- * @param objectMap
944
+ * Converts a Property.
945
+ *
946
+ * @param converter Converter
947
+ * @param rawProperty Unconverted Property
948
+ * @returns The converted Property
840
949
  */
841
- function linkPropertiesToComplexTypes(entityTypes, objectMap) {
842
- /**
843
- * @param property
844
- */
845
- function link(property) {
846
- if (!property.annotations) {
847
- property.annotations = {};
848
- }
849
- try {
850
- if (property.type.indexOf('Edm') !== 0) {
851
- let complexType;
852
- if (property.type.startsWith('Collection')) {
853
- const complexTypeName = property.type.substring(11, property.type.length - 1);
854
- complexType = objectMap[complexTypeName];
855
- }
856
- else {
857
- complexType = objectMap[property.type];
858
- }
859
- if (complexType) {
860
- property.targetType = complexType;
861
- if (complexType.properties) {
862
- complexType.properties.forEach(link);
863
- }
864
- }
865
- }
866
- }
867
- catch (sError) {
868
- throw new Error('Property Type is not defined');
869
- }
870
- }
871
- entityTypes.forEach((entityType) => {
872
- entityType.entityProperties.forEach(link);
950
+ function convertProperty(converter, rawProperty) {
951
+ const convertedProperty = rawProperty;
952
+ convertedProperty.type = converter.unalias(rawProperty.type);
953
+ (0, utils_1.lazy)(convertedProperty, 'annotations', resolveAnnotations(converter, rawProperty));
954
+ (0, utils_1.lazy)(convertedProperty, 'targetType', () => {
955
+ var _a;
956
+ const type = rawProperty.type;
957
+ const typeName = type.startsWith('Collection') ? type.substring(11, type.length - 1) : type;
958
+ return (_a = converter.getConvertedComplexType(typeName)) !== null && _a !== void 0 ? _a : converter.getConvertedTypeDefinition(typeName);
873
959
  });
960
+ return convertedProperty;
874
961
  }
875
962
  /**
876
- * @param complexTypes
877
- * @param associations
878
- * @param objectMap
963
+ * Converts a NavigationProperty.
964
+ *
965
+ * @param converter Converter
966
+ * @param rawNavigationProperty Unconverted NavigationProperty
967
+ * @returns The converted NavigationProperty
879
968
  */
880
- function prepareComplexTypes(complexTypes, associations, objectMap) {
881
- complexTypes.forEach((complexType) => {
882
- complexType.annotations = {};
883
- complexType.properties.forEach((property) => {
884
- if (!property.annotations) {
885
- property.annotations = {};
886
- }
887
- });
888
- complexType.navigationProperties = prepareNavigationProperties(complexType.navigationProperties, associations, objectMap);
889
- });
969
+ function convertNavigationProperty(converter, rawNavigationProperty) {
970
+ var _a, _b, _c;
971
+ const convertedNavigationProperty = rawNavigationProperty;
972
+ convertedNavigationProperty.referentialConstraint = (_a = convertedNavigationProperty.referentialConstraint) !== null && _a !== void 0 ? _a : [];
973
+ if (isV4NavigationProperty(rawNavigationProperty)) {
974
+ convertedNavigationProperty.targetTypeName = converter.unalias(rawNavigationProperty.targetTypeName);
975
+ }
976
+ else {
977
+ const associationEnd = (_b = converter.rawSchema.associations
978
+ .find((association) => association.fullyQualifiedName === rawNavigationProperty.relationship)) === null || _b === void 0 ? void 0 : _b.associationEnd.find((end) => end.role === rawNavigationProperty.toRole);
979
+ convertedNavigationProperty.isCollection = (associationEnd === null || associationEnd === void 0 ? void 0 : associationEnd.multiplicity) === '*';
980
+ convertedNavigationProperty.targetTypeName = (_c = associationEnd === null || associationEnd === void 0 ? void 0 : associationEnd.type) !== null && _c !== void 0 ? _c : '';
981
+ }
982
+ (0, utils_1.lazy)(convertedNavigationProperty, 'targetType', resolveEntityType(converter, rawNavigationProperty.targetTypeName));
983
+ (0, utils_1.lazy)(convertedNavigationProperty, 'annotations', resolveAnnotations(converter, rawNavigationProperty));
984
+ return convertedNavigationProperty;
890
985
  }
891
986
  /**
892
- * Split the alias from the term value.
987
+ * Converts an ActionImport.
893
988
  *
894
- * @param references the current set of references
895
- * @param termValue the value of the term
896
- * @returns the term alias and the actual term value
989
+ * @param converter Converter
990
+ * @param rawActionImport Unconverted ActionImport
991
+ * @returns The converted ActionImport
897
992
  */
898
- function splitTerm(references, termValue) {
899
- const aliasedTerm = (0, utils_1.alias)(references, termValue);
900
- const lastDot = aliasedTerm.lastIndexOf('.');
901
- const termAlias = aliasedTerm.substring(0, lastDot);
902
- const term = aliasedTerm.substring(lastDot + 1);
903
- return [termAlias, term];
993
+ function convertActionImport(converter, rawActionImport) {
994
+ const convertedActionImport = rawActionImport;
995
+ convertedActionImport.actionName = converter.unalias(rawActionImport.actionName);
996
+ (0, utils_1.lazy)(convertedActionImport, 'annotations', resolveAnnotations(converter, rawActionImport));
997
+ (0, utils_1.lazy)(convertedActionImport, 'action', () => converter.getConvertedAction(rawActionImport.actionName));
998
+ return convertedActionImport;
904
999
  }
905
1000
  /**
906
- * Creates the function that will resolve a specific path.
1001
+ * Converts an Action.
907
1002
  *
908
- * @param convertedOutput
909
- * @param objectMap
910
- * @returns the function that will allow to resolve element globally.
1003
+ * @param converter Converter
1004
+ * @param rawAction Unconverted Action
1005
+ * @returns The converted Action
911
1006
  */
912
- function createGlobalResolve(convertedOutput, objectMap) {
913
- return function resolvePath(sPath, resolveDirectly = false) {
914
- if (resolveDirectly) {
915
- let targetPath = sPath;
916
- if (!sPath.startsWith('/')) {
917
- targetPath = `/${sPath}`;
1007
+ function convertAction(converter, rawAction) {
1008
+ const convertedAction = rawAction;
1009
+ convertedAction.sourceType = converter.unalias(rawAction.sourceType);
1010
+ if (convertedAction.sourceType) {
1011
+ (0, utils_1.lazy)(convertedAction, 'sourceEntityType', resolveEntityType(converter, rawAction.sourceType));
1012
+ }
1013
+ convertedAction.returnType = converter.unalias(rawAction.returnType);
1014
+ if (convertedAction.returnType) {
1015
+ (0, utils_1.lazy)(convertedAction, 'returnEntityType', resolveEntityType(converter, rawAction.returnType));
1016
+ }
1017
+ (0, utils_1.lazy)(convertedAction, 'parameters', converter.convert(rawAction.parameters, convertActionParameter));
1018
+ (0, utils_1.lazy)(convertedAction, 'annotations', () => {
1019
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
1020
+ // this.is.the.action(on.this.type) --> action: 'this.is.the.action', overload: 'on.this.type'
1021
+ // this.is.the.action() --> action: 'this.is.the.action', overload: undefined
1022
+ // this.is.the.action --> action: 'this.is.the.action', overload: undefined
1023
+ const actionAndOverload = rawAction.fullyQualifiedName.match(/(?<action>[^()]+)(?:\((?<overload>.*)\))?/);
1024
+ let rawAnnotations = [];
1025
+ if (actionAndOverload) {
1026
+ if ((_a = actionAndOverload.groups) === null || _a === void 0 ? void 0 : _a.overload) {
1027
+ rawAnnotations = (_c = (_b = converter.rawAnnotationsPerTarget[rawAction.fullyQualifiedName]) === null || _b === void 0 ? void 0 : _b.annotations) !== null && _c !== void 0 ? _c : [];
918
1028
  }
919
- const targetResolution = _resolveTarget(objectMap, convertedOutput, targetPath, false, true);
920
- if (targetResolution.target) {
921
- targetResolution.visitedObjects.push(targetResolution.target);
1029
+ else {
1030
+ rawAnnotations =
1031
+ (_f = (_e = converter.rawAnnotationsPerTarget[`${(_d = actionAndOverload.groups) === null || _d === void 0 ? void 0 : _d.action}()`]) === null || _e === void 0 ? void 0 : _e.annotations) !== null && _f !== void 0 ? _f : [];
922
1032
  }
923
- return {
924
- target: targetResolution.target,
925
- objectPath: targetResolution.visitedObjects
926
- };
927
- }
928
- const aPathSplit = sPath.split('/');
929
- if (aPathSplit.shift() !== '') {
930
- throw new Error('Cannot deal with relative path');
931
- }
932
- const entitySetName = aPathSplit.shift();
933
- const entitySet = convertedOutput.entitySets.find((et) => et.name === entitySetName);
934
- const singleton = convertedOutput.singletons.find((et) => et.name === entitySetName);
935
- if (!entitySet && !singleton) {
936
- return {
937
- target: convertedOutput.entityContainer,
938
- objectPath: [convertedOutput.entityContainer]
939
- };
940
- }
941
- if (aPathSplit.length === 0) {
942
- return {
943
- target: entitySet || singleton,
944
- objectPath: [convertedOutput.entityContainer, entitySet || singleton]
945
- };
946
- }
947
- else {
948
- const targetResolution = _resolveTarget(objectMap, entitySet || singleton, '/' + aPathSplit.join('/'), false, true);
949
- if (targetResolution.target) {
950
- targetResolution.visitedObjects.push(targetResolution.target);
1033
+ if (((_g = actionAndOverload.groups) === null || _g === void 0 ? void 0 : _g.action) && ((_h = actionAndOverload.groups) === null || _h === void 0 ? void 0 : _h.action) !== rawAction.fullyQualifiedName) {
1034
+ const baseAnnotations = (_l = (_k = converter.rawAnnotationsPerTarget[(_j = actionAndOverload.groups) === null || _j === void 0 ? void 0 : _j.action]) === null || _k === void 0 ? void 0 : _k.annotations) !== null && _l !== void 0 ? _l : [];
1035
+ rawAnnotations = rawAnnotations.concat(baseAnnotations);
951
1036
  }
952
- return {
953
- target: targetResolution.target,
954
- objectPath: targetResolution.visitedObjects
955
- };
956
1037
  }
957
- };
958
- }
959
- function ensureAnnotations(currentTarget, vocAlias) {
960
- if (!currentTarget.annotations) {
961
- currentTarget.annotations = {};
962
- }
963
- if (!currentTarget.annotations[vocAlias]) {
964
- currentTarget.annotations[vocAlias] = {};
965
- }
966
- if (!currentTarget.annotations._annotations) {
967
- currentTarget.annotations._annotations = {};
968
- }
1038
+ return createAnnotationsObject(converter, rawAction, rawAnnotations);
1039
+ });
1040
+ return convertedAction;
969
1041
  }
970
- function processAnnotations(currentContext, annotationList, objectMap, bOverrideExisting) {
971
- const currentTarget = currentContext.currentTarget;
972
- const currentTargetName = currentTarget.fullyQualifiedName;
973
- annotationList.annotations.forEach((annotation) => {
1042
+ /**
1043
+ * Converts an ActionParameter.
1044
+ *
1045
+ * @param converter Converter
1046
+ * @param rawActionParameter Unconverted ActionParameter
1047
+ * @returns The converted ActionParameter
1048
+ */
1049
+ function convertActionParameter(converter, rawActionParameter) {
1050
+ const convertedActionParameter = rawActionParameter;
1051
+ (0, utils_1.lazy)(convertedActionParameter, 'typeReference', () => {
974
1052
  var _a, _b;
975
- currentContext.currentSource = annotation.__source || annotationList.__source;
976
- const [vocAlias, vocTerm] = splitTerm(utils_1.defaultReferences, annotation.term);
977
- ensureAnnotations(currentTarget, vocAlias);
978
- const vocTermWithQualifier = `${vocTerm}${annotation.qualifier ? '#' + annotation.qualifier : ''}`;
979
- if (!bOverrideExisting && ((_b = (_a = currentTarget.annotations) === null || _a === void 0 ? void 0 : _a[vocAlias]) === null || _b === void 0 ? void 0 : _b[vocTermWithQualifier]) !== undefined) {
980
- return;
981
- }
982
- currentContext.currentTerm = annotation.term;
983
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = convertAnnotation(annotation, objectMap, currentContext);
984
- switch (typeof currentTarget.annotations[vocAlias][vocTermWithQualifier]) {
985
- case 'string':
986
- // eslint-disable-next-line no-new-wrappers
987
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = new String(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
988
- break;
989
- case 'boolean':
990
- // eslint-disable-next-line no-new-wrappers
991
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = new Boolean(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
992
- break;
993
- default:
994
- // do nothing
995
- break;
996
- }
997
- if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null &&
998
- typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === 'object' &&
999
- !currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
1000
- currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = {};
1001
- }
1002
- if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null &&
1003
- typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === 'object') {
1004
- currentTarget.annotations[vocAlias][vocTermWithQualifier].term = (0, utils_1.unalias)(utils_1.defaultReferences, `${vocAlias}.${vocTerm}`);
1005
- currentTarget.annotations[vocAlias][vocTermWithQualifier].qualifier = annotation.qualifier;
1006
- currentTarget.annotations[vocAlias][vocTermWithQualifier].__source = currentContext.currentSource;
1007
- }
1008
- const annotationTarget = `${currentTargetName}@${(0, utils_1.unalias)(utils_1.defaultReferences, vocAlias + '.' + vocTermWithQualifier)}`;
1009
- if (Array.isArray(annotation.annotations)) {
1010
- const subAnnotationList = {
1011
- target: annotationTarget,
1012
- annotations: annotation.annotations,
1013
- __source: currentContext.currentSource
1014
- };
1015
- currentContext.additionalAnnotations.push(subAnnotationList);
1016
- }
1017
- else if (annotation.annotations && !currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
1018
- currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = annotation.annotations;
1019
- }
1020
- currentTarget.annotations._annotations[`${vocAlias}.${vocTermWithQualifier}`] =
1021
- currentTarget.annotations._annotations[(0, utils_1.unalias)(utils_1.defaultReferences, `${vocAlias}.${vocTermWithQualifier}`)] =
1022
- currentTarget.annotations[vocAlias][vocTermWithQualifier];
1023
- objectMap[annotationTarget] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1053
+ return (_b = (_a = converter.getConvertedEntityType(rawActionParameter.type)) !== null && _a !== void 0 ? _a : converter.getConvertedComplexType(rawActionParameter.type)) !== null && _b !== void 0 ? _b : converter.getConvertedTypeDefinition(rawActionParameter.type);
1024
1054
  });
1055
+ (0, utils_1.lazy)(convertedActionParameter, 'annotations', resolveAnnotations(converter, rawActionParameter));
1056
+ return convertedActionParameter;
1025
1057
  }
1026
1058
  /**
1027
- * Process all the unresolved targets so far to try and see if they are resolveable in the end.
1059
+ * Converts a ComplexType.
1028
1060
  *
1029
- * @param unresolvedTargets
1030
- * @param objectMap
1061
+ * @param converter Converter
1062
+ * @param rawComplexType Unconverted ComplexType
1063
+ * @returns The converted ComplexType
1031
1064
  */
1032
- function processUnresolvedTargets(unresolvedTargets, objectMap) {
1033
- unresolvedTargets.forEach((resolvable) => {
1034
- const targetToResolve = resolvable.toResolve;
1035
- const targetStr = targetToResolve.$target;
1036
- const resolvedTarget = objectMap[targetStr];
1037
- const { annotationsTerm, annotationType } = targetToResolve;
1038
- delete targetToResolve.annotationType;
1039
- delete targetToResolve.annotationsTerm;
1040
- if (resolvable.inline && !(resolvedTarget instanceof String)) {
1041
- // inline the resolved target
1042
- let keys;
1043
- for (keys in targetToResolve) {
1044
- delete targetToResolve[keys];
1045
- }
1046
- Object.assign(targetToResolve, resolvedTarget);
1047
- }
1048
- else {
1049
- // assign the resolved target
1050
- targetToResolve.$target = resolvedTarget;
1051
- }
1052
- if (!resolvedTarget) {
1053
- targetToResolve.targetString = targetStr;
1054
- if (annotationsTerm && annotationType) {
1055
- const oErrorMsg = {
1056
- message: 'Unable to resolve the path expression: ' +
1057
- targetStr +
1058
- '\n' +
1059
- '\n' +
1060
- 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
1061
- '<Annotation Term = ' +
1062
- annotationsTerm +
1063
- '>' +
1064
- '\n' +
1065
- '<Record Type = ' +
1066
- annotationType +
1067
- '>' +
1068
- '\n' +
1069
- '<AnnotationPath = ' +
1070
- targetStr +
1071
- '>'
1072
- };
1073
- addAnnotationErrorMessage(targetStr, oErrorMsg);
1074
- }
1075
- else {
1076
- const property = targetToResolve.term;
1077
- const path = targetToResolve.path;
1078
- const termInfo = targetStr ? targetStr.split('/')[0] : targetStr;
1079
- const oErrorMsg = {
1080
- message: 'Unable to resolve the path expression: ' +
1081
- targetStr +
1082
- '\n' +
1083
- '\n' +
1084
- 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
1085
- '<Annotation Term = ' +
1086
- termInfo +
1087
- '>' +
1088
- '\n' +
1089
- '<PropertyValue Property = ' +
1090
- property +
1091
- ' Path= ' +
1092
- path +
1093
- '>'
1094
- };
1095
- addAnnotationErrorMessage(targetStr, oErrorMsg);
1096
- }
1097
- }
1098
- });
1065
+ function convertComplexType(converter, rawComplexType) {
1066
+ const convertedComplexType = rawComplexType;
1067
+ (0, utils_1.lazy)(convertedComplexType, 'properties', converter.convert(rawComplexType.properties, convertProperty));
1068
+ (0, utils_1.lazy)(convertedComplexType, 'navigationProperties', converter.convert(rawComplexType.navigationProperties, convertNavigationProperty));
1069
+ (0, utils_1.lazy)(convertedComplexType, 'annotations', resolveAnnotations(converter, rawComplexType));
1070
+ return convertedComplexType;
1099
1071
  }
1100
1072
  /**
1101
- * Merge annotation from different source together by overwriting at the term level.
1073
+ * Converts a TypeDefinition.
1102
1074
  *
1103
- * @param rawMetadata
1104
- * @returns the resulting merged annotations
1075
+ * @param converter Converter
1076
+ * @param rawTypeDefinition Unconverted TypeDefinition
1077
+ * @returns The converted TypeDefinition
1105
1078
  */
1106
- function mergeAnnotations(rawMetadata) {
1107
- const annotationListPerTarget = {};
1108
- Object.keys(rawMetadata.schema.annotations).forEach((annotationSource) => {
1109
- rawMetadata.schema.annotations[annotationSource].forEach((annotationList) => {
1110
- const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
1111
- annotationList.__source = annotationSource;
1112
- if (!annotationListPerTarget[currentTargetName]) {
1113
- annotationListPerTarget[currentTargetName] = {
1114
- annotations: annotationList.annotations.concat(),
1115
- target: currentTargetName
1116
- };
1117
- annotationListPerTarget[currentTargetName].__source = annotationSource;
1118
- }
1119
- else {
1120
- annotationList.annotations.forEach((annotation) => {
1121
- const findIndex = annotationListPerTarget[currentTargetName].annotations.findIndex((referenceAnnotation) => {
1122
- return (referenceAnnotation.term === annotation.term &&
1123
- referenceAnnotation.qualifier === annotation.qualifier);
1124
- });
1125
- annotation.__source = annotationSource;
1126
- if (findIndex !== -1) {
1127
- annotationListPerTarget[currentTargetName].annotations.splice(findIndex, 1, annotation);
1128
- }
1129
- else {
1130
- annotationListPerTarget[currentTargetName].annotations.push(annotation);
1131
- }
1132
- });
1133
- }
1134
- });
1135
- });
1136
- return annotationListPerTarget;
1079
+ function convertTypeDefinition(converter, rawTypeDefinition) {
1080
+ const convertedTypeDefinition = rawTypeDefinition;
1081
+ (0, utils_1.lazy)(convertedTypeDefinition, 'annotations', resolveAnnotations(converter, rawTypeDefinition));
1082
+ return convertedTypeDefinition;
1137
1083
  }
1138
1084
  /**
1139
1085
  * Convert a RawMetadata into an object representation to be used to easily navigate a metadata object and its annotation.
@@ -1142,95 +1088,35 @@ function mergeAnnotations(rawMetadata) {
1142
1088
  * @returns the converted representation of the metadata.
1143
1089
  */
1144
1090
  function convert(rawMetadata) {
1145
- ANNOTATION_ERRORS = [];
1146
- const objectMap = buildObjectMap(rawMetadata);
1147
- resolveNavigationProperties(rawMetadata.schema.entityTypes, rawMetadata.schema.associations, objectMap);
1148
- rawMetadata.schema.entityContainer.annotations = {};
1149
- linkActionsToEntityType(rawMetadata.schema.namespace, rawMetadata.schema.actions, objectMap);
1150
- linkActionImportsToActions(rawMetadata.schema.actionImports, objectMap);
1151
- linkEntityTypeToEntitySet(rawMetadata.schema.entitySets, objectMap, rawMetadata.references);
1152
- linkEntityTypeToSingleton(rawMetadata.schema.singletons, objectMap, rawMetadata.references);
1153
- linkPropertiesToComplexTypes(rawMetadata.schema.entityTypes, objectMap);
1154
- prepareComplexTypes(rawMetadata.schema.complexTypes, rawMetadata.schema.associations, objectMap);
1155
- const unresolvedTargets = [];
1156
- const unresolvedAnnotations = [];
1157
- const annotationListPerTarget = mergeAnnotations(rawMetadata);
1158
- Object.keys(annotationListPerTarget).forEach((currentTargetName) => {
1159
- const annotationList = annotationListPerTarget[currentTargetName];
1160
- const objectMapElement = objectMap[currentTargetName];
1161
- if (!objectMapElement && (currentTargetName === null || currentTargetName === void 0 ? void 0 : currentTargetName.indexOf('@')) > 0) {
1162
- unresolvedAnnotations.push(annotationList);
1163
- }
1164
- else if (objectMapElement) {
1165
- let allTargets = [objectMapElement];
1166
- let bOverrideExisting = true;
1167
- if (objectMapElement._type === 'UnboundGenericAction') {
1168
- allTargets = objectMapElement.actions;
1169
- bOverrideExisting = false;
1170
- }
1171
- allTargets.forEach((currentTarget) => {
1172
- const currentContext = {
1173
- additionalAnnotations: unresolvedAnnotations,
1174
- currentSource: annotationList.__source,
1175
- currentTarget: currentTarget,
1176
- currentTerm: '',
1177
- rawMetadata: rawMetadata,
1178
- unresolvedAnnotations: unresolvedTargets
1179
- };
1180
- processAnnotations(currentContext, annotationList, objectMap, bOverrideExisting);
1181
- });
1182
- }
1183
- });
1184
- const extraUnresolvedAnnotations = [];
1185
- unresolvedAnnotations.forEach((annotationList) => {
1186
- const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
1187
- let [baseObj, annotationPart] = currentTargetName.split('@');
1188
- const targetSplit = annotationPart.split('/');
1189
- baseObj = baseObj + '@' + targetSplit[0];
1190
- const currentTarget = targetSplit.slice(1).reduce((currentObj, path) => {
1191
- return currentObj === null || currentObj === void 0 ? void 0 : currentObj[path];
1192
- }, objectMap[baseObj]);
1193
- if (!currentTarget || typeof currentTarget !== 'object') {
1194
- ANNOTATION_ERRORS.push({
1195
- message: 'The following annotation target was not found on the service ' + currentTargetName
1196
- });
1197
- }
1198
- else {
1199
- const currentContext = {
1200
- additionalAnnotations: extraUnresolvedAnnotations,
1201
- currentSource: annotationList.__source,
1202
- currentTarget: currentTarget,
1203
- currentTerm: '',
1204
- rawMetadata: rawMetadata,
1205
- unresolvedAnnotations: unresolvedTargets
1206
- };
1207
- processAnnotations(currentContext, annotationList, objectMap, false);
1208
- }
1209
- });
1210
- processUnresolvedTargets(unresolvedTargets, objectMap);
1211
- for (const property in ALL_ANNOTATION_ERRORS) {
1212
- ANNOTATION_ERRORS.push(ALL_ANNOTATION_ERRORS[property][0]);
1091
+ // fall back on the default references if the caller does not specify any
1092
+ if (rawMetadata.references.length === 0) {
1093
+ rawMetadata.references = utils_1.defaultReferences;
1213
1094
  }
1214
- rawMetadata.entitySets = rawMetadata.schema.entitySets;
1215
- const extraReferences = rawMetadata.references.filter((reference) => {
1216
- return utils_1.defaultReferences.find((defaultRef) => defaultRef.namespace === reference.namespace) === undefined;
1217
- });
1095
+ // Converter Output
1218
1096
  const convertedOutput = {
1219
1097
  version: rawMetadata.version,
1220
- annotations: rawMetadata.schema.annotations,
1221
1098
  namespace: rawMetadata.schema.namespace,
1222
- entityContainer: rawMetadata.schema.entityContainer,
1223
- actions: rawMetadata.schema.actions,
1224
- actionImports: rawMetadata.schema.actionImports,
1225
- entitySets: rawMetadata.schema.entitySets,
1226
- singletons: rawMetadata.schema.singletons,
1227
- entityTypes: rawMetadata.schema.entityTypes,
1228
- complexTypes: rawMetadata.schema.complexTypes,
1229
- typeDefinitions: rawMetadata.schema.typeDefinitions,
1230
- references: utils_1.defaultReferences.concat(extraReferences),
1231
- diagnostics: ANNOTATION_ERRORS.concat()
1099
+ annotations: rawMetadata.schema.annotations,
1100
+ references: utils_1.defaultReferences.concat(rawMetadata.references),
1101
+ diagnostics: []
1102
+ };
1103
+ // Converter
1104
+ const converter = new Converter(rawMetadata, convertedOutput);
1105
+ (0, utils_1.lazy)(convertedOutput, 'entityContainer', converter.convert(converter.rawSchema.entityContainer, convertEntityContainer));
1106
+ (0, utils_1.lazy)(convertedOutput, 'entitySets', converter.convert(converter.rawSchema.entitySets, convertEntitySet));
1107
+ (0, utils_1.lazy)(convertedOutput, 'singletons', converter.convert(converter.rawSchema.singletons, convertSingleton));
1108
+ (0, utils_1.lazy)(convertedOutput, 'entityTypes', converter.convert(converter.rawSchema.entityTypes, convertEntityType));
1109
+ (0, utils_1.lazy)(convertedOutput, 'actions', converter.convert(converter.rawSchema.actions, convertAction));
1110
+ (0, utils_1.lazy)(convertedOutput, 'complexTypes', converter.convert(converter.rawSchema.complexTypes, convertComplexType));
1111
+ (0, utils_1.lazy)(convertedOutput, 'actionImports', converter.convert(converter.rawSchema.actionImports, convertActionImport));
1112
+ (0, utils_1.lazy)(convertedOutput, 'typeDefinitions', converter.convert(converter.rawSchema.typeDefinitions, convertTypeDefinition));
1113
+ convertedOutput.resolvePath = function resolvePath(path) {
1114
+ const targetResolution = resolveTarget(converter, undefined, path);
1115
+ if (targetResolution.target) {
1116
+ appendObjectPath(targetResolution.objectPath, targetResolution.target);
1117
+ }
1118
+ return targetResolution;
1232
1119
  };
1233
- convertedOutput.resolvePath = createGlobalResolve(convertedOutput, objectMap);
1234
1120
  return convertedOutput;
1235
1121
  }
1236
1122
  exports.convert = convert;
@@ -1238,7 +1124,7 @@ exports.convert = convert;
1238
1124
 
1239
1125
  /***/ }),
1240
1126
 
1241
- /***/ 995:
1127
+ /***/ 161:
1242
1128
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1243
1129
 
1244
1130
 
@@ -1257,19 +1143,19 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
1257
1143
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
1258
1144
  };
1259
1145
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1260
- __exportStar(__webpack_require__(634), exports);
1261
- __exportStar(__webpack_require__(127), exports);
1262
- __exportStar(__webpack_require__(401), exports);
1146
+ __exportStar(__webpack_require__(203), exports);
1147
+ __exportStar(__webpack_require__(176), exports);
1148
+ __exportStar(__webpack_require__(39), exports);
1263
1149
 
1264
1150
 
1265
1151
  /***/ }),
1266
1152
 
1267
- /***/ 401:
1153
+ /***/ 39:
1268
1154
  /***/ (function(__unused_webpack_module, exports) {
1269
1155
 
1270
1156
 
1271
1157
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1272
- exports.Decimal = exports.isComplexTypeDefinition = exports.TermToTypes = exports.unalias = exports.alias = exports.defaultReferences = void 0;
1158
+ exports.addGetByValue = exports.createIndexedFind = exports.lazy = exports.Decimal = exports.isComplexTypeDefinition = exports.TermToTypes = exports.EnumIsFlag = exports.unalias = exports.alias = exports.substringBeforeLast = exports.substringBeforeFirst = exports.splitAtLast = exports.splitAtFirst = exports.defaultReferences = void 0;
1273
1159
  exports.defaultReferences = [
1274
1160
  { alias: 'Capabilities', namespace: 'Org.OData.Capabilities.V1', uri: '' },
1275
1161
  { alias: 'Aggregation', namespace: 'Org.OData.Aggregation.V1', uri: '' },
@@ -1285,6 +1171,56 @@ exports.defaultReferences = [
1285
1171
  { namespace: 'com.sap.vocabularies.Communication.v1', alias: 'Communication', uri: '' },
1286
1172
  { namespace: 'com.sap.vocabularies.HTML5.v1', alias: 'HTML5', uri: '' }
1287
1173
  ];
1174
+ function splitAt(string, index) {
1175
+ return index < 0 ? [string, ''] : [string.substring(0, index), string.substring(index + 1)];
1176
+ }
1177
+ function substringAt(string, index) {
1178
+ return index < 0 ? string : string.substring(0, index);
1179
+ }
1180
+ /**
1181
+ * Splits a string at the first occurrence of a separator.
1182
+ *
1183
+ * @param string The string to split
1184
+ * @param separator Separator, e.g. a single character.
1185
+ * @returns An array consisting of two elements: the part before the first occurrence of the separator and the part after it. If the string does not contain the separator, the second element is the empty string.
1186
+ */
1187
+ function splitAtFirst(string, separator) {
1188
+ return splitAt(string, string.indexOf(separator));
1189
+ }
1190
+ exports.splitAtFirst = splitAtFirst;
1191
+ /**
1192
+ * Splits a string at the last occurrence of a separator.
1193
+ *
1194
+ * @param string The string to split
1195
+ * @param separator Separator, e.g. a single character.
1196
+ * @returns An array consisting of two elements: the part before the last occurrence of the separator and the part after it. If the string does not contain the separator, the second element is the empty string.
1197
+ */
1198
+ function splitAtLast(string, separator) {
1199
+ return splitAt(string, string.lastIndexOf(separator));
1200
+ }
1201
+ exports.splitAtLast = splitAtLast;
1202
+ /**
1203
+ * Returns the substring before the first occurrence of a separator.
1204
+ *
1205
+ * @param string The string
1206
+ * @param separator Separator, e.g. a single character.
1207
+ * @returns The substring before the first occurrence of the separator, or the input string if it does not contain the separator.
1208
+ */
1209
+ function substringBeforeFirst(string, separator) {
1210
+ return substringAt(string, string.indexOf(separator));
1211
+ }
1212
+ exports.substringBeforeFirst = substringBeforeFirst;
1213
+ /**
1214
+ * Returns the substring before the last occurrence of a separator.
1215
+ *
1216
+ * @param string The string
1217
+ * @param separator Separator, e.g. a single character.
1218
+ * @returns The substring before the last occurrence of the separator, or the input string if it does not contain the separator.
1219
+ */
1220
+ function substringBeforeLast(string, separator) {
1221
+ return substringAt(string, string.lastIndexOf(separator));
1222
+ }
1223
+ exports.substringBeforeLast = substringBeforeLast;
1288
1224
  /**
1289
1225
  * Transform an unaliased string representation annotation to the aliased version.
1290
1226
  *
@@ -1302,17 +1238,15 @@ function alias(references, unaliasedValue) {
1302
1238
  if (!unaliasedValue) {
1303
1239
  return unaliasedValue;
1304
1240
  }
1305
- const lastDotIndex = unaliasedValue.lastIndexOf('.');
1306
- const namespace = unaliasedValue.substring(0, lastDotIndex);
1307
- const value = unaliasedValue.substring(lastDotIndex + 1);
1241
+ const [namespace, value] = splitAtLast(unaliasedValue, '.');
1308
1242
  const reference = references.reverseReferenceMap[namespace];
1309
1243
  if (reference) {
1310
1244
  return `${reference.alias}.${value}`;
1311
1245
  }
1312
- else if (unaliasedValue.indexOf('@') !== -1) {
1246
+ else if (unaliasedValue.includes('@')) {
1313
1247
  // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
1314
- const [preAlias, ...postAlias] = unaliasedValue.split('@');
1315
- return `${preAlias}@${alias(references, postAlias.join('@'))}`;
1248
+ const [preAlias, postAlias] = splitAtFirst(unaliasedValue, '@');
1249
+ return `${preAlias}@${alias(references, postAlias)}`;
1316
1250
  }
1317
1251
  else {
1318
1252
  return unaliasedValue;
@@ -1336,21 +1270,56 @@ function unalias(references, aliasedValue) {
1336
1270
  if (!aliasedValue) {
1337
1271
  return aliasedValue;
1338
1272
  }
1339
- const [vocAlias, ...value] = aliasedValue.split('.');
1273
+ const [vocAlias, value] = splitAtFirst(aliasedValue, '.');
1340
1274
  const reference = references.referenceMap[vocAlias];
1341
1275
  if (reference) {
1342
- return `${reference.namespace}.${value.join('.')}`;
1276
+ return `${reference.namespace}.${value}`;
1343
1277
  }
1344
- else if (aliasedValue.indexOf('@') !== -1) {
1278
+ else if (aliasedValue.includes('@')) {
1345
1279
  // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
1346
- const [preAlias, ...postAlias] = aliasedValue.split('@');
1347
- return `${preAlias}@${unalias(references, postAlias.join('@'))}`;
1280
+ const [preAlias, postAlias] = splitAtFirst(aliasedValue, '@');
1281
+ return `${preAlias}@${unalias(references, postAlias)}`;
1348
1282
  }
1349
1283
  else {
1350
1284
  return aliasedValue;
1351
1285
  }
1352
1286
  }
1353
1287
  exports.unalias = unalias;
1288
+ exports.EnumIsFlag = {
1289
+ 'Auth.KeyLocation': false,
1290
+ 'Core.RevisionKind': false,
1291
+ 'Core.DataModificationOperationKind': false,
1292
+ 'Core.Permission': true,
1293
+ 'Capabilities.ConformanceLevelType': false,
1294
+ 'Capabilities.IsolationLevel': true,
1295
+ 'Capabilities.NavigationType': false,
1296
+ 'Capabilities.SearchExpressions': true,
1297
+ 'Capabilities.HttpMethod': true,
1298
+ 'Aggregation.RollupType': false,
1299
+ 'Common.TextFormatType': false,
1300
+ 'Common.FilterExpressionType': false,
1301
+ 'Common.FieldControlType': false,
1302
+ 'Common.EffectType': true,
1303
+ 'Communication.KindType': false,
1304
+ 'Communication.ContactInformationType': true,
1305
+ 'Communication.PhoneType': true,
1306
+ 'Communication.GenderType': false,
1307
+ 'UI.VisualizationType': false,
1308
+ 'UI.CriticalityType': false,
1309
+ 'UI.ImprovementDirectionType': false,
1310
+ 'UI.TrendType': false,
1311
+ 'UI.ChartType': false,
1312
+ 'UI.ChartAxisScaleBehaviorType': false,
1313
+ 'UI.ChartAxisAutoScaleDataScopeType': false,
1314
+ 'UI.ChartDimensionRoleType': false,
1315
+ 'UI.ChartMeasureRoleType': false,
1316
+ 'UI.SelectionRangeSignType': false,
1317
+ 'UI.SelectionRangeOptionType': false,
1318
+ 'UI.TextArrangementType': false,
1319
+ 'UI.ImportanceType': false,
1320
+ 'UI.CriticalityRepresentationType': false,
1321
+ 'UI.OperationGroupingType': false
1322
+ };
1354
1323
  var TermToTypes;
1355
1324
  (function (TermToTypes) {
1356
1325
  TermToTypes["Org.OData.Authorization.V1.SecuritySchemes"] = "Org.OData.Authorization.V1.SecurityScheme";
@@ -1363,6 +1332,7 @@ var TermToTypes;
1363
1332
  TermToTypes["Org.OData.Core.V1.ResourceException"] = "Org.OData.Core.V1.ResourceExceptionType";
1364
1333
  TermToTypes["Org.OData.Core.V1.DataModificationException"] = "Org.OData.Core.V1.DataModificationExceptionType";
1365
1334
  TermToTypes["Org.OData.Core.V1.IsLanguageDependent"] = "Org.OData.Core.V1.Tag";
1335
+ TermToTypes["Org.OData.Core.V1.AppliesViaContainer"] = "Org.OData.Core.V1.Tag";
1366
1336
  TermToTypes["Org.OData.Core.V1.DereferenceableIDs"] = "Org.OData.Core.V1.Tag";
1367
1337
  TermToTypes["Org.OData.Core.V1.ConventionalIDs"] = "Org.OData.Core.V1.Tag";
1368
1338
  TermToTypes["Org.OData.Core.V1.Permissions"] = "Org.OData.Core.V1.Permission";
@@ -1384,6 +1354,7 @@ var TermToTypes;
1384
1354
  TermToTypes["Org.OData.Core.V1.OptionalParameter"] = "Org.OData.Core.V1.OptionalParameterType";
1385
1355
  TermToTypes["Org.OData.Core.V1.OperationAvailable"] = "Edm.Boolean";
1386
1356
  TermToTypes["Org.OData.Core.V1.SymbolicName"] = "Org.OData.Core.V1.SimpleIdentifier";
1357
+ TermToTypes["Org.OData.Core.V1.GeometryFeature"] = "Org.OData.Core.V1.GeometryFeatureType";
1387
1358
  TermToTypes["Org.OData.Capabilities.V1.ConformanceLevel"] = "Org.OData.Capabilities.V1.ConformanceLevelType";
1388
1359
  TermToTypes["Org.OData.Capabilities.V1.AsynchronousRequestsSupported"] = "Org.OData.Core.V1.Tag";
1389
1360
  TermToTypes["Org.OData.Capabilities.V1.BatchContinueOnErrorSupported"] = "Org.OData.Core.V1.Tag";
@@ -1420,6 +1391,7 @@ var TermToTypes;
1420
1391
  TermToTypes["Org.OData.Capabilities.V1.CustomQueryOptions"] = "Org.OData.Capabilities.V1.CustomParameter";
1421
1392
  TermToTypes["Org.OData.Capabilities.V1.MediaLocationUpdateSupported"] = "Org.OData.Core.V1.Tag";
1422
1393
  TermToTypes["Org.OData.Aggregation.V1.ApplySupported"] = "Org.OData.Aggregation.V1.ApplySupportedType";
1394
+ TermToTypes["Org.OData.Aggregation.V1.ApplySupportedDefaults"] = "Org.OData.Aggregation.V1.ApplySupportedBase";
1423
1395
  TermToTypes["Org.OData.Aggregation.V1.Groupable"] = "Org.OData.Core.V1.Tag";
1424
1396
  TermToTypes["Org.OData.Aggregation.V1.Aggregatable"] = "Org.OData.Core.V1.Tag";
1425
1397
  TermToTypes["Org.OData.Aggregation.V1.ContextDefiningProperties"] = "Edm.PropertyPath";
@@ -1433,8 +1405,8 @@ var TermToTypes;
1433
1405
  TermToTypes["Org.OData.Validation.V1.MultipleOf"] = "Edm.Decimal";
1434
1406
  TermToTypes["Org.OData.Validation.V1.Constraint"] = "Org.OData.Validation.V1.ConstraintType";
1435
1407
  TermToTypes["Org.OData.Validation.V1.ItemsOf"] = "Org.OData.Validation.V1.ItemsOfType";
1436
- TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
1437
- TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
1408
+ TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.Validation.V1.SingleOrCollectionType";
1409
+ TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.Validation.V1.SingleOrCollectionType";
1438
1410
  TermToTypes["Org.OData.Validation.V1.AllowedTerms"] = "Org.OData.Core.V1.QualifiedTermName";
1439
1411
  TermToTypes["Org.OData.Validation.V1.ApplicableTerms"] = "Org.OData.Core.V1.QualifiedTermName";
1440
1412
  TermToTypes["Org.OData.Validation.V1.MaxItems"] = "Edm.Int64";
@@ -1447,6 +1419,8 @@ var TermToTypes;
1447
1419
  TermToTypes["com.sap.vocabularies.Analytics.v1.RolledUpPropertyCount"] = "Edm.Int16";
1448
1420
  TermToTypes["com.sap.vocabularies.Analytics.v1.PlanningAction"] = "Org.OData.Core.V1.Tag";
1449
1421
  TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperties"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
1422
+ TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperty"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
1423
+ TermToTypes["com.sap.vocabularies.Analytics.v1.AnalyticalContext"] = "com.sap.vocabularies.Analytics.v1.AnalyticalContextType";
1450
1424
  TermToTypes["com.sap.vocabularies.Common.v1.ServiceVersion"] = "Edm.Int32";
1451
1425
  TermToTypes["com.sap.vocabularies.Common.v1.ServiceSchemaVersion"] = "Edm.Int32";
1452
1426
  TermToTypes["com.sap.vocabularies.Common.v1.TextFor"] = "Edm.PropertyPath";
@@ -1464,7 +1438,7 @@ var TermToTypes;
1464
1438
  TermToTypes["com.sap.vocabularies.Common.v1.AssociationEntity"] = "Edm.NavigationPropertyPath";
1465
1439
  TermToTypes["com.sap.vocabularies.Common.v1.DerivedNavigation"] = "Edm.NavigationPropertyPath";
1466
1440
  TermToTypes["com.sap.vocabularies.Common.v1.Masked"] = "Org.OData.Core.V1.Tag";
1467
- TermToTypes["com.sap.vocabularies.Common.v1.MaskedAlways"] = "Org.OData.Core.V1.Tag";
1441
+ TermToTypes["com.sap.vocabularies.Common.v1.RevealOnDemand"] = "Edm.Boolean";
1468
1442
  TermToTypes["com.sap.vocabularies.Common.v1.SemanticObjectMapping"] = "com.sap.vocabularies.Common.v1.SemanticObjectMappingType";
1469
1443
  TermToTypes["com.sap.vocabularies.Common.v1.IsInstanceAnnotation"] = "Org.OData.Core.V1.Tag";
1470
1444
  TermToTypes["com.sap.vocabularies.Common.v1.FilterExpressionRestrictions"] = "com.sap.vocabularies.Common.v1.FilterExpressionRestrictionType";
@@ -1480,10 +1454,11 @@ var TermToTypes;
1480
1454
  TermToTypes["com.sap.vocabularies.Common.v1.RelatedRecursiveHierarchy"] = "Edm.AnnotationPath";
1481
1455
  TermToTypes["com.sap.vocabularies.Common.v1.Interval"] = "com.sap.vocabularies.Common.v1.IntervalType";
1482
1456
  TermToTypes["com.sap.vocabularies.Common.v1.ResultContext"] = "Org.OData.Core.V1.Tag";
1483
- TermToTypes["com.sap.vocabularies.Common.v1.WeakReferentialConstraint"] = "com.sap.vocabularies.Common.v1.WeakReferentialConstraintType";
1457
+ TermToTypes["com.sap.vocabularies.Common.v1.SAPObjectNodeType"] = "com.sap.vocabularies.Common.v1.SAPObjectNodeTypeType";
1458
+ TermToTypes["com.sap.vocabularies.Common.v1.Composition"] = "Org.OData.Core.V1.Tag";
1484
1459
  TermToTypes["com.sap.vocabularies.Common.v1.IsNaturalPerson"] = "Org.OData.Core.V1.Tag";
1485
1460
  TermToTypes["com.sap.vocabularies.Common.v1.ValueList"] = "com.sap.vocabularies.Common.v1.ValueListType";
1486
- TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
1461
+ TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "Org.OData.Core.V1.SimpleIdentifier";
1487
1462
  TermToTypes["com.sap.vocabularies.Common.v1.ValueListWithFixedValues"] = "Org.OData.Core.V1.Tag";
1488
1463
  TermToTypes["com.sap.vocabularies.Common.v1.ValueListMapping"] = "com.sap.vocabularies.Common.v1.ValueListMappingType";
1489
1464
  TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYear"] = "Org.OData.Core.V1.Tag";
@@ -1510,7 +1485,7 @@ var TermToTypes;
1510
1485
  TermToTypes["com.sap.vocabularies.Common.v1.MutuallyExclusiveTerm"] = "Org.OData.Core.V1.Tag";
1511
1486
  TermToTypes["com.sap.vocabularies.Common.v1.DraftRoot"] = "com.sap.vocabularies.Common.v1.DraftRootType";
1512
1487
  TermToTypes["com.sap.vocabularies.Common.v1.DraftNode"] = "com.sap.vocabularies.Common.v1.DraftNodeType";
1513
- TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
1488
+ TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "Org.OData.Core.V1.SimpleIdentifier";
1514
1489
  TermToTypes["com.sap.vocabularies.Common.v1.EditableFieldFor"] = "Edm.PropertyPath";
1515
1490
  TermToTypes["com.sap.vocabularies.Common.v1.SemanticKey"] = "Edm.PropertyPath";
1516
1491
  TermToTypes["com.sap.vocabularies.Common.v1.SideEffects"] = "com.sap.vocabularies.Common.v1.SideEffectsType";
@@ -1524,6 +1499,7 @@ var TermToTypes;
1524
1499
  TermToTypes["com.sap.vocabularies.Common.v1.ChangedAt"] = "Edm.DateTimeOffset";
1525
1500
  TermToTypes["com.sap.vocabularies.Common.v1.ChangedBy"] = "com.sap.vocabularies.Common.v1.UserID";
1526
1501
  TermToTypes["com.sap.vocabularies.Common.v1.ApplyMultiUnitBehaviorForSortingAndFiltering"] = "Org.OData.Core.V1.Tag";
1502
+ TermToTypes["com.sap.vocabularies.Common.v1.PrimitivePropertyPath"] = "Org.OData.Core.V1.Tag";
1527
1503
  TermToTypes["com.sap.vocabularies.CodeList.v1.CurrencyCodes"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
1528
1504
  TermToTypes["com.sap.vocabularies.CodeList.v1.UnitsOfMeasure"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
1529
1505
  TermToTypes["com.sap.vocabularies.CodeList.v1.StandardCode"] = "Edm.PropertyPath";
@@ -1578,10 +1554,12 @@ var TermToTypes;
1578
1554
  TermToTypes["com.sap.vocabularies.UI.v1.TextArrangement"] = "com.sap.vocabularies.UI.v1.TextArrangementType";
1579
1555
  TermToTypes["com.sap.vocabularies.UI.v1.Importance"] = "com.sap.vocabularies.UI.v1.ImportanceType";
1580
1556
  TermToTypes["com.sap.vocabularies.UI.v1.Hidden"] = "Org.OData.Core.V1.Tag";
1557
+ TermToTypes["com.sap.vocabularies.UI.v1.IsCopyAction"] = "Org.OData.Core.V1.Tag";
1581
1558
  TermToTypes["com.sap.vocabularies.UI.v1.CreateHidden"] = "Org.OData.Core.V1.Tag";
1582
1559
  TermToTypes["com.sap.vocabularies.UI.v1.UpdateHidden"] = "Org.OData.Core.V1.Tag";
1583
1560
  TermToTypes["com.sap.vocabularies.UI.v1.DeleteHidden"] = "Org.OData.Core.V1.Tag";
1584
1561
  TermToTypes["com.sap.vocabularies.UI.v1.HiddenFilter"] = "Org.OData.Core.V1.Tag";
1562
+ TermToTypes["com.sap.vocabularies.UI.v1.AdaptationHidden"] = "Org.OData.Core.V1.Tag";
1585
1563
  TermToTypes["com.sap.vocabularies.UI.v1.DataFieldDefault"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
1586
1564
  TermToTypes["com.sap.vocabularies.UI.v1.Criticality"] = "com.sap.vocabularies.UI.v1.CriticalityType";
1587
1565
  TermToTypes["com.sap.vocabularies.UI.v1.CriticalityCalculation"] = "com.sap.vocabularies.UI.v1.CriticalityCalculationType";
@@ -1591,10 +1569,12 @@ var TermToTypes;
1591
1569
  TermToTypes["com.sap.vocabularies.UI.v1.RecommendationState"] = "com.sap.vocabularies.UI.v1.RecommendationStateType";
1592
1570
  TermToTypes["com.sap.vocabularies.UI.v1.RecommendationList"] = "com.sap.vocabularies.UI.v1.RecommendationListType";
1593
1571
  TermToTypes["com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] = "Org.OData.Core.V1.Tag";
1572
+ TermToTypes["com.sap.vocabularies.UI.v1.DoNotCheckScaleOfMeasuredQuantity"] = "Edm.Boolean";
1594
1573
  TermToTypes["com.sap.vocabularies.HTML5.v1.CssDefaults"] = "com.sap.vocabularies.HTML5.v1.CssDefaultsType";
1595
1574
  })(TermToTypes = exports.TermToTypes || (exports.TermToTypes = {}));
1596
1575
  /**
1597
1576
  * Differentiate between a ComplexType and a TypeDefinition.
1577
+ *
1598
1578
  * @param complexTypeDefinition
1599
1579
  * @returns true if the value is a complex type
1600
1580
  */
@@ -1616,17 +1596,89 @@ function Decimal(value) {
1616
1596
  };
1617
1597
  }
1618
1598
  exports.Decimal = Decimal;
1599
+ /**
1600
+ * Defines a lazy property.
1601
+ *
1602
+ * The property is initialized by calling the init function on the first read access, or by directly assigning a value.
1603
+ *
1604
+ * @param object The host object
1605
+ * @param property The lazy property to add
1606
+ * @param init The function that initializes the property's value
1607
+ */
1608
+ function lazy(object, property, init) {
1609
+ const initial = Symbol('initial');
1610
+ let _value = initial;
1611
+ Object.defineProperty(object, property, {
1612
+ enumerable: true,
1613
+ get() {
1614
+ if (_value === initial) {
1615
+ _value = init();
1616
+ }
1617
+ return _value;
1618
+ },
1619
+ set(value) {
1620
+ _value = value;
1621
+ }
1622
+ });
1623
+ }
1624
+ exports.lazy = lazy;
1625
+ /**
1626
+ * Creates a function that allows to find an array element by property value.
1627
+ *
1628
+ * @param array The array
1629
+ * @param property Elements in the array are searched by this property
1630
+ * @returns A function that can be used to find an element of the array by property value.
1631
+ */
1632
+ function createIndexedFind(array, property) {
1633
+ const index = new Map();
1634
+ return function find(value) {
1635
+ const element = index.get(value);
1636
+ if ((element === null || element === void 0 ? void 0 : element[property]) === value) {
1637
+ return element;
1638
+ }
1639
+ return array.find((element) => {
1640
+ if (!(element === null || element === void 0 ? void 0 : element.hasOwnProperty(property))) {
1641
+ return false;
1642
+ }
1643
+ const propertyValue = element[property];
1644
+ index.set(propertyValue, element);
1645
+ return propertyValue === value;
1646
+ });
1647
+ };
1648
+ }
1649
+ exports.createIndexedFind = createIndexedFind;
1650
+ /**
1651
+ * Adds a 'get by value' function to an array.
1652
+ *
1653
+ * If this function is called with addIndex(myArray, 'name'), a new function 'by_name(value)' will be added that allows to
1654
+ * find a member of the array by the value of its 'name' property.
1655
+ *
1656
+ * @param array The array
1657
+ * @param property The property that will be used by the 'by_{property}()' function
1658
+ * @returns The array with the added function
1659
+ */
1660
+ function addGetByValue(array, property) {
1661
+ const indexName = `by_${property}`;
1662
+ if (!array.hasOwnProperty(indexName)) {
1663
+ Object.defineProperty(array, indexName, { writable: false, value: createIndexedFind(array, property) });
1664
+ }
1665
+ else {
1666
+ throw new Error(`Property '${indexName}' already exists`);
1667
+ }
1668
+ return array;
1669
+ }
1670
+ exports.addGetByValue = addGetByValue;
1619
1671
 
1620
1672
 
1621
1673
  /***/ }),
1622
1674
 
1623
- /***/ 127:
1675
+ /***/ 176:
1624
1676
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1625
1677
 
1626
1678
 
1627
1679
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1628
1680
  exports.revertTermToGenericType = void 0;
1629
- const utils_1 = __webpack_require__(401);
1681
+ const utils_1 = __webpack_require__(39);
1630
1682
  /**
1631
1683
  * Revert an object to its raw type equivalent.
1632
1684
  *
@@ -1938,11 +1990,12 @@ exports.revertTermToGenericType = revertTermToGenericType;
1938
1990
  /******/ // startup
1939
1991
  /******/ // Load entry module and return exports
1940
1992
  /******/ // This entry module is referenced by other modules so it can't be inlined
1941
- /******/ var __webpack_exports__ = __webpack_require__(995);
1993
+ /******/ var __webpack_exports__ = __webpack_require__(161);
1942
1994
  /******/ AnnotationConverter = __webpack_exports__;
1943
1995
  /******/
1944
1996
  /******/ })()
1945
1997
  ;
1946
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7VUV0QkE7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNS4yMi9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvY29udmVydGVyLnRzIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BzYXAtdXgrYW5ub3RhdGlvbi1jb252ZXJ0ZXJAMC41LjIyL25vZGVfbW9kdWxlcy9Ac2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNS4yMi9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjUuMjIvbm9kZV9tb2R1bGVzL0BzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXIvc3JjL3dyaXRlYmFjay50cyIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gICAgQW5ub3RhdGlvbkxpc3QsXG4gICAgQW5ub3RhdGlvblJlY29yZCxcbiAgICBFeHByZXNzaW9uLFxuICAgIFBhdGhFeHByZXNzaW9uLFxuICAgIFByb3BlcnR5VmFsdWUsXG4gICAgUmF3TWV0YWRhdGEsXG4gICAgUmVmZXJlbmNlLFxuICAgIENvbXBsZXhUeXBlLFxuICAgIFR5cGVEZWZpbml0aW9uLFxuICAgIFJhd1Byb3BlcnR5LFxuICAgIEFubm90YXRpb24sXG4gICAgQWN0aW9uLFxuICAgIEVudGl0eVR5cGUsXG4gICAgUmF3RW50aXR5VHlwZSxcbiAgICBSYXdBc3NvY2lhdGlvbixcbiAgICBOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgQmFzZU5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBFbnRpdHlTZXQsXG4gICAgUHJvcGVydHksXG4gICAgU2luZ2xldG9uLFxuICAgIFJhd0NvbXBsZXhUeXBlLFxuICAgIENvbnZlcnRlZE1ldGFkYXRhLFxuICAgIFJlc29sdXRpb25UYXJnZXQsXG4gICAgRW50aXR5Q29udGFpbmVyLFxuICAgIFJhd0Fubm90YXRpb24sXG4gICAgQWN0aW9uSW1wb3J0XG59IGZyb20gJ0BzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVmZXJlbmNlc1dpdGhNYXAgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGFsaWFzLCBEZWNpbWFsLCBkZWZhdWx0UmVmZXJlbmNlcywgaXNDb21wbGV4VHlwZURlZmluaXRpb24sIFRlcm1Ub1R5cGVzLCB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICpcbiAqL1xuY2xhc3MgUGF0aCB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgICR0YXJnZXQ6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgYW5ub3RhdGlvbnNUZXJtOiBzdHJpbmc7XG4gICAgYW5ub3RhdGlvblR5cGU6IHN0cmluZztcbiAgICB0ZXJtOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcGF0aEV4cHJlc3Npb25cbiAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZVxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uc1Rlcm1cbiAgICAgKiBAcGFyYW0gdGVybVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhdGhFeHByZXNzaW9uOiBQYXRoRXhwcmVzc2lvbiwgdGFyZ2V0TmFtZTogc3RyaW5nLCBhbm5vdGF0aW9uc1Rlcm06IHN0cmluZywgdGVybTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGhFeHByZXNzaW9uLlBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9ICdQYXRoJztcbiAgICAgICAgdGhpcy4kdGFyZ2V0ID0gdGFyZ2V0TmFtZTtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1Rlcm0gPSBhbm5vdGF0aW9uc1Rlcm07XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBNYXAgYmFzZWQgb24gdGhlIGZ1bGx5UXVhbGlmaWVkTmFtZSBvZiBlYWNoIG9iamVjdCBwYXJ0IG9mIHRoZSBtZXRhZGF0YS5cbiAqXG4gKiBAcGFyYW0gcmF3TWV0YWRhdGEgdGhlIHJhd01ldGFkYXRhIHdlJ3JlIHdvcmtpbmcgYWdhaW5zdFxuICogQHJldHVybnMgdGhlIG9iamVjdG1hcCBmb3IgZWFzeSBhY2Nlc3MgdG8gdGhlIGRpZmZlcmVudCBvYmplY3Qgb2YgdGhlIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkT2JqZWN0TWFwKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG9iamVjdE1hcDogYW55ID0ge307XG4gICAgaWYgKHJhd01ldGFkYXRhLnNjaGVtYS5lbnRpdHlDb250YWluZXI/LmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICBvYmplY3RNYXBbcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWVdID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lcjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRpdHlTZXQgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2VudGl0eVNldC5mdWxseVF1YWxpZmllZE5hbWVdID0gZW50aXR5U2V0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpbmdsZXRvbiBvZiByYXdNZXRhZGF0YS5zY2hlbWEuc2luZ2xldG9ucykge1xuICAgICAgICBvYmplY3RNYXBbc2luZ2xldG9uLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBzaW5nbGV0b247XG4gICAgfVxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHJhd01ldGFkYXRhLnNjaGVtYS5hY3Rpb25zKSB7XG4gICAgICAgIG9iamVjdE1hcFthY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IGFjdGlvbjtcbiAgICAgICAgaWYgKGFjdGlvbi5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjb25zdCB1bkJvdW5kQWN0aW9uTmFtZSA9IGFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJygnKVswXTtcbiAgICAgICAgICAgIGlmICghb2JqZWN0TWFwW3VuQm91bmRBY3Rpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgIG9iamVjdE1hcFt1bkJvdW5kQWN0aW9uTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIF90eXBlOiAnVW5ib3VuZEdlbmVyaWNBY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3RNYXBbdW5Cb3VuZEFjdGlvbk5hbWVdLmFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uU3BsaXQgPSBhY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KCcoJyk7XG4gICAgICAgICAgICBvYmplY3RNYXBbYCR7YWN0aW9uU3BsaXRbMV0uc3BsaXQoJyknKVswXX0vJHthY3Rpb25TcGxpdFswXX1gXSA9IGFjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGFjdGlvbi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbcGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBwYXJhbWV0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBhY3Rpb25JbXBvcnQgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbkltcG9ydHMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2FjdGlvbkltcG9ydC5mdWxseVF1YWxpZmllZE5hbWVdID0gYWN0aW9uSW1wb3J0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbXBsZXhUeXBlIG9mIHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2NvbXBsZXhUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBjb21wbGV4VHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBjb21wbGV4VHlwZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbcHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZURlZmluaXRpb24gb2YgcmF3TWV0YWRhdGEuc2NoZW1hLnR5cGVEZWZpbml0aW9ucykge1xuICAgICAgICBvYmplY3RNYXBbdHlwZURlZmluaXRpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IHR5cGVEZWZpbml0aW9uO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudGl0eVR5cGUgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzKSB7XG4gICAgICAgIChlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUpLmFubm90YXRpb25zID0ge307IC8vICdhbm5vdGF0aW9ucycgcHJvcGVydHkgaXMgbWFuZGF0b3J5XG4gICAgICAgIG9iamVjdE1hcFtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBlbnRpdHlUeXBlO1xuICAgICAgICBvYmplY3RNYXBbYENvbGxlY3Rpb24oJHtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZX0pYF0gPSBlbnRpdHlUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcykge1xuICAgICAgICAgICAgb2JqZWN0TWFwW3Byb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBjb21wbGV4IHR5cGVzXG4gICAgICAgICAgICBjb25zdCBjb21wbGV4VHlwZURlZmluaXRpb24gPSBvYmplY3RNYXBbcHJvcGVydHkudHlwZV0gYXMgQ29tcGxleFR5cGUgfCBUeXBlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmIChpc0NvbXBsZXhUeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wbGV4VHlwZVByb3Agb2YgY29tcGxleFR5cGVEZWZpbml0aW9uLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxleFR5cGVQcm9wVGFyZ2V0OiBSYXdQcm9wZXJ0eSA9IE9iamVjdC5hc3NpZ24oY29tcGxleFR5cGVQcm9wLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ1Byb3BlcnR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogcHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lICsgJy8nICsgY29tcGxleFR5cGVQcm9wLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcFtjb21wbGV4VHlwZVByb3BUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IGNvbXBsZXhUeXBlUHJvcFRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYXZQcm9wZXJ0eSBvZiBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbbmF2UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG5hdlByb3BlcnR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbm5vdGF0aW9uU291cmNlIG9mIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykpIHtcbiAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uTGlzdCBvZiByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gdW5hbGlhcyhyYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBhbm5vdGF0aW9uTGlzdC50YXJnZXQpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhbm5vdGF0aW9uRlFOID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhyYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBhbm5vdGF0aW9uLnRlcm0pfWA7XG4gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhbGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25GUU4gKz0gYCMke2Fubm90YXRpb24ucXVhbGlmaWVyfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdE1hcFthbm5vdGF0aW9uRlFOXSA9IGFubm90YXRpb247XG4gICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gYW5ub3RhdGlvbkZRTjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RNYXA7XG59XG5cbi8qKlxuICogQ29tYmluZSB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aCBpbiB0aGUgbWV0YW1vZGVsIHdoaWxlIGVuc3VyaW5nIHRoZWlyIHNwZWNpZmljaXRpZXMgKGFubm90YXRpb24uLi4pIGFyZSByZXNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRUYXJnZXQgdGhlIGN1cnJlbnQgcGF0aFxuICogQHBhcmFtIHBhdGggdGhlIHBhcnQgd2Ugd2FudCB0byBhcHBlbmRcbiAqIEByZXR1cm5zIHRoZSBjb21wbGV0ZSBwYXRoIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uLlxuICovXG5mdW5jdGlvbiBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0ICsgdW5hbGlhcyhkZWZhdWx0UmVmZXJlbmNlcywgcGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQgKyAnLycgKyBwYXRoO1xuICAgIH1cbn1cblxuY29uc3QgQUxMX0FOTk9UQVRJT05fRVJST1JTOiBhbnkgPSB7fTtcbmxldCBBTk5PVEFUSU9OX0VSUk9SUzogeyBtZXNzYWdlOiBzdHJpbmcgfVtdID0gW107XG5cbi8qKlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBvRXJyb3JNc2dcbiAqL1xuZnVuY3Rpb24gYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoOiBzdHJpbmcsIG9FcnJvck1zZzogYW55KSB7XG4gICAgaWYgKCFBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0pIHtcbiAgICAgICAgQUxMX0FOTk9UQVRJT05fRVJST1JTW3BhdGhdID0gW29FcnJvck1zZ107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQUxMX0FOTk9UQVRJT05fRVJST1JTW3BhdGhdLnB1c2gob0Vycm9yTXNnKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzcGVjaWZpYyBwYXRoIGJhc2VkIG9uIHRoZSBvYmplY3RNYXAuXG4gKlxuICogQHBhcmFtIG9iamVjdE1hcFxuICogQHBhcmFtIGN1cnJlbnRUYXJnZXRcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gcGF0aE9ubHlcbiAqIEBwYXJhbSBpbmNsdWRlVmlzaXRlZE9iamVjdHNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uc1Rlcm1cbiAqIEByZXR1cm5zIHRoZSByZXNvbHZlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX3Jlc29sdmVUYXJnZXQoXG4gICAgb2JqZWN0TWFwOiBhbnksXG4gICAgY3VycmVudFRhcmdldDogYW55LFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwYXRoT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVWaXNpdGVkT2JqZWN0czogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFubm90YXRpb25zVGVybT86IHN0cmluZ1xuKSB7XG4gICAgbGV0IG9FcnJvck1zZztcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYVZpc2l0ZWRPYmplY3RzOiBhbnlbXSA9IFtdO1xuICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQuX3R5cGUgPT09ICdQcm9wZXJ0eScpIHtcbiAgICAgICAgY3VycmVudFRhcmdldCA9IG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnLycpWzBdXTtcbiAgICB9XG4gICAgcGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoKTtcblxuICAgIGNvbnN0IHBhdGhTcGxpdCA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoU3BsaXQ6IHN0cmluZ1tdID0gW107XG4gICAgcGF0aFNwbGl0LmZvckVhY2goKHBhdGhQYXJ0KSA9PiB7XG4gICAgICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgYW5ub3RhdGlvblxuICAgICAgICBpZiAocGF0aFBhcnQuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgW3NwbGl0dGVkUGF0aCwgYW5ub3RhdGlvblBhdGhdID0gcGF0aFBhcnQuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgIHRhcmdldFBhdGhTcGxpdC5wdXNoKHNwbGl0dGVkUGF0aCk7XG4gICAgICAgICAgICB0YXJnZXRQYXRoU3BsaXQucHVzaChgQCR7YW5ub3RhdGlvblBhdGh9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoU3BsaXQucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgY3VycmVudFBhdGggPSBwYXRoO1xuICAgIGxldCBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0UGF0aFNwbGl0LnJlZHVjZSgoY3VycmVudFZhbHVlOiBhbnksIHBhdGhQYXJ0KSA9PiB7XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gJyRUeXBlJyAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlUeXBlJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09ICckJyAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlTZXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGF0aFBhcnQgPT09ICdAJHVpNS5vdmVybG9hZCcgfHwgcGF0aFBhcnQgPT09ICcwJykgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSBQYXRoIGFmdGVyIGFuIGVudGl0eVNldCBtZWFucyBlbnRpdHlUeXBlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlICYmXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0VudGl0eVNldCcgfHwgY3VycmVudFZhbHVlLl90eXBlID09PSAnU2luZ2xldG9uJykgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUuZW50aXR5VHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuZW50aXR5VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5JyAmJiBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYVZpc2l0ZWRPYmplY3RzLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRhcmdldFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMgJiYgY3VycmVudFZhbHVlICE9PSBudWxsICYmIGN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IHBhdGhQYXJ0O1xuICAgICAgICB9IGVsc2UgaWYgKChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlTZXQnIHx8IGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ1NpbmdsZXRvbicpICYmIHBhdGhQYXJ0ID09PSAnJFR5cGUnKSB7XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAoY3VycmVudFZhbHVlLl90eXBlID09PSAnRW50aXR5U2V0JyB8fCBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdTaW5nbGV0b24nKSAmJlxuICAgICAgICAgICAgcGF0aFBhcnQgPT09ICckTmF2aWdhdGlvblByb3BlcnR5QmluZGluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAoY3VycmVudFZhbHVlLl90eXBlID09PSAnRW50aXR5U2V0JyB8fCBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdTaW5nbGV0b24nKSAmJlxuICAgICAgICAgICAgY3VycmVudFZhbHVlLmVudGl0eVR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ05hdmlnYXRpb25Qcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKCFvYmplY3RNYXBbY3VycmVudFBhdGhdKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgbG9nIGVycm9yXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUudGFyZ2V0VHlwZU5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdQcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIC8vIENvbXBsZXhUeXBlIG9yIFByb3BlcnR5XG4gICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlLnRhcmdldFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdBY3Rpb24nICYmIGN1cnJlbnRWYWx1ZS5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gJyRQYXJhbWV0ZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5zb3VyY2VUeXBlLCBwYXRoUGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uUGFyYW1ldGVyJykge1xuICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy8nKSksXG4gICAgICAgICAgICAgICAgcGF0aFBhcnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdElkeCA9IGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RJZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RJZHggPSBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoXG4gICAgICAgICAgICAgICAgICAgIChvYmplY3RNYXBbY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpXSBhcyBBY3Rpb24pLnNvdXJjZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhQYXJ0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ICE9PSAnbmFtZScgJiYgY3VycmVudFZhbHVlW3BhdGhQYXJ0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZVtwYXRoUGFydF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0ID09PSAnJEFubm90YXRpb25QYXRoJyAmJiBjdXJyZW50VmFsdWUuJHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHRUb1Jlc29sdmUgPSBvYmplY3RNYXBbY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnQCcpWzBdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJUYXJnZXQ6IGFueSA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY29udGV4dFRvUmVzb2x2ZSwgY3VycmVudFZhbHVlLnZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3ViVGFyZ2V0LnZpc2l0ZWRPYmplY3RzLmZvckVhY2goKHZpc2l0ZWRTdWJPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYVZpc2l0ZWRPYmplY3RzLmluZGV4T2YodmlzaXRlZFN1Yk9iamVjdCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydCA9PT0gJyRQYXRoJyAmJiBjdXJyZW50VmFsdWUuJHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gYVZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQoKVxuICAgICAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKG9iaikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouX3R5cGUgPT09ICdFbnRpdHlUeXBlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5fdHlwZSA9PT0gJ0VudGl0eVNldCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouX3R5cGUgPT09ICdTaW5nbGV0b24nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLl90eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJUYXJnZXQ6IGFueSA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY3VycmVudENvbnRleHQsIGN1cnJlbnRWYWx1ZS5wYXRoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YlRhcmdldC52aXNpdGVkT2JqZWN0cy5mb3JFYWNoKCh2aXNpdGVkU3ViT2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmlzaXRlZE9iamVjdHMuaW5kZXhPZih2aXNpdGVkU3ViT2JqZWN0KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlLiR0YXJnZXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0LnN0YXJ0c1dpdGgoJyRQYXRoJykgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVUYXJnZXQgPSBjdXJyZW50VmFsdWUuJHRhcmdldDtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGludGVybWVkaWF0ZVRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0LnN1YnN0cmluZyg1KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSAmJiAhb2JqZWN0TWFwW2N1cnJlbnRQYXRoXSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm93IGFuIGFubm90YXRpb24gdmFsdWVcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlUeXBlID0gb2JqZWN0TWFwW2N1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJ0AnKVswXV07XG4gICAgICAgICAgICAgICAgaWYgKGVudGl0eVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0TWFwW2N1cnJlbnRQYXRoXTtcbiAgICB9LCBudWxsKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbnNUZXJtKSB7XG4gICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKGFubm90YXRpb25zVGVybSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBvRXJyb3JNc2cgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246ICcgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0hpbnQ6IENoZWNrIGFuZCBjb3JyZWN0IHRoZSBwYXRoIHZhbHVlcyB1bmRlciB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgbWV0YWRhdGEgKGFubm90YXRpb24ueG1sIGZpbGUgb3IgQ0RTIGFubm90YXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24pOiBcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtICtcbiAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPFJlY29yZCBUeXBlID0gJyArXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UeXBlICtcbiAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb25QYXRoID0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlKHBhdGgsIG9FcnJvck1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvRXJyb3JNc2cgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTcGxpdFswXSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxQcm9wZXJ0eVZhbHVlICBQYXRoPSAnICtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFNwbGl0WzFdICtcbiAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoLCBvRXJyb3JNc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoT25seSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFBhdGg7XG4gICAgfVxuICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZpc2l0ZWRPYmplY3RzOiBhVmlzaXRlZE9iamVjdHMsXG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFR5cGVndWFyZCB0byBjaGVjayBpZiB0aGUgcGF0aCBjb250YWlucyBhbiBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXRoU3RyIHRoZSBwYXRoIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24gaW4gdGhlIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGlvblBhdGgocGF0aFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhdGhTdHIuaW5kZXhPZignQCcpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VWYWx1ZShwcm9wZXJ0eVZhbHVlOiBFeHByZXNzaW9uLCB2YWx1ZUZRTjogc3RyaW5nLCBvYmplY3RNYXA6IGFueSwgY29udGV4dDogQ29udmVyc2lvbkNvbnRleHQpIHtcbiAgICBpZiAocHJvcGVydHlWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN3aXRjaCAocHJvcGVydHlWYWx1ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5TdHJpbmc7XG4gICAgICAgIGNhc2UgJ0ludCc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5JbnQ7XG4gICAgICAgIGNhc2UgJ0Jvb2wnOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWUuQm9vbDtcbiAgICAgICAgY2FzZSAnRGVjaW1hbCc6XG4gICAgICAgICAgICByZXR1cm4gRGVjaW1hbChwcm9wZXJ0eVZhbHVlLkRlY2ltYWwpO1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkRhdGU7XG4gICAgICAgIGNhc2UgJ0VudW1NZW1iZXInOlxuICAgICAgICAgICAgcmV0dXJuIGFsaWFzKGNvbnRleHQucmF3TWV0YWRhdGEucmVmZXJlbmNlcywgcHJvcGVydHlWYWx1ZS5FbnVtTWVtYmVyKTtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5VmFsdWUuUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25UYXJnZXQgPSBfcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgIHVuYWxpYXMoY29udGV4dC5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblBhdGggPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0Fubm90YXRpb25QYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5Bbm5vdGF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IHZhbHVlRlFOLFxuICAgICAgICAgICAgICAgICR0YXJnZXQ6IGFubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtOiBjb250ZXh0LmN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7IGlubGluZTogZmFsc2UsIHRvUmVzb2x2ZTogYW5ub3RhdGlvblBhdGggfSk7XG4gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvblBhdGg7XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5QYXRoLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBuZXcgUGF0aChwcm9wZXJ0eVZhbHVlLCAkdGFyZ2V0LCBjb250ZXh0LmN1cnJlbnRUZXJtLCAnJyk7XG4gICAgICAgICAgICBjb250ZXh0LnVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbmxpbmU6IGlzQW5ub3RhdGlvblBhdGgocHJvcGVydHlWYWx1ZS5QYXRoKSxcbiAgICAgICAgICAgICAgICB0b1Jlc29sdmU6IHBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICAgICAgY2FzZSAnUmVjb3JkJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJlY29yZChwcm9wZXJ0eVZhbHVlLlJlY29yZCwgdmFsdWVGUU4sIG9iamVjdE1hcCwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihwcm9wZXJ0eVZhbHVlLkNvbGxlY3Rpb24sIHZhbHVlRlFOLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBcHBseSc6XG4gICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICBjYXNlICdOb3QnOlxuICAgICAgICBjYXNlICdFcSc6XG4gICAgICAgIGNhc2UgJ05lJzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdHZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnTGUnOlxuICAgICAgICBjYXNlICdJZic6XG4gICAgICAgIGNhc2UgJ0FuZCc6XG4gICAgICAgIGNhc2UgJ09yJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmZlciB0aGUgdHlwZSBvZiBhIHRlcm0gYmFzZWQgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIGFubm90YXRpb25zVGVybSBUaGUgYW5ub3RhdGlvbiB0ZXJtXG4gKiBAcGFyYW0gYW5ub3RhdGlvblRhcmdldCB0aGUgYW5ub3RhdGlvbiB0YXJnZXRcbiAqIEBwYXJhbSBjdXJyZW50UHJvcGVydHkgdGhlIGN1cnJlbnQgcHJvcGVydHkgb2YgdGhlIHJlY29yZFxuICogQHJldHVybnMgdGhlIGluZmVycmVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGluZmVyVHlwZUZyb21UZXJtKGFubm90YXRpb25zVGVybTogc3RyaW5nLCBhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsIGN1cnJlbnRQcm9wZXJ0eT86IHN0cmluZykge1xuICAgIGxldCB0YXJnZXRUeXBlID0gKFRlcm1Ub1R5cGVzIGFzIGFueSlbYW5ub3RhdGlvbnNUZXJtXTtcbiAgICBpZiAoY3VycmVudFByb3BlcnR5KSB7XG4gICAgICAgIGFubm90YXRpb25zVGVybSA9IGFubm90YXRpb25zVGVybS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJykgKyAnLicgKyBjdXJyZW50UHJvcGVydHk7XG4gICAgICAgIHRhcmdldFR5cGUgPSAoVGVybVRvVHlwZXMgYXMgYW55KVthbm5vdGF0aW9uc1Rlcm1dO1xuICAgIH1cbiAgICBjb25zdCBvRXJyb3JNc2cgPSB7XG4gICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgVGhlIHR5cGUgb2YgdGhlIHJlY29yZCB1c2VkIHdpdGhpbiB0aGUgdGVybSAke2Fubm90YXRpb25zVGVybX0gd2FzIG5vdCBkZWZpbmVkIGFuZCB3YXMgaW5mZXJyZWQgYXMgJHt0YXJnZXRUeXBlfS5cbkhpbnQ6IElmIHBvc3NpYmxlLCB0cnkgdG8gbWFpbnRhaW4gdGhlIFR5cGUgcHJvcGVydHkgZm9yIGVhY2ggUmVjb3JkLlxuPEFubm90YXRpb25zIFRhcmdldD1cIiR7YW5ub3RhdGlvblRhcmdldH1cIj5cblx0PEFubm90YXRpb24gVGVybT1cIiR7YW5ub3RhdGlvbnNUZXJtfVwiPlxuXHRcdDxSZWNvcmQ+Li4uPC9SZWNvcmQ+XG5cdDwvQW5ub3RhdGlvbj5cbjwvQW5ub3RhdGlvbnM+YFxuICAgIH07XG4gICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShhbm5vdGF0aW9uVGFyZ2V0ICsgJy8nICsgYW5ub3RhdGlvbnNUZXJtLCBvRXJyb3JNc2cpO1xuICAgIHJldHVybiB0YXJnZXRUeXBlO1xufVxuXG5mdW5jdGlvbiBpc0RhdGFGaWVsZFdpdGhGb3JBY3Rpb24oYW5ub3RhdGlvbkNvbnRlbnQ6IGFueSwgYW5ub3RhdGlvblRlcm06IGFueSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIGFubm90YXRpb25Db250ZW50Lmhhc093blByb3BlcnR5KCdBY3Rpb24nKSAmJlxuICAgICAgICAoYW5ub3RhdGlvblRlcm0uJFR5cGUgPT09ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb24nIHx8XG4gICAgICAgICAgICBhbm5vdGF0aW9uVGVybS4kVHlwZSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhBY3Rpb24nKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkVHlwZShyZWNvcmREZWZpbml0aW9uOiBBbm5vdGF0aW9uUmVjb3JkLCBjb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCkge1xuICAgIGxldCB0YXJnZXRUeXBlO1xuICAgIGlmICghcmVjb3JkRGVmaW5pdGlvbi50eXBlICYmIGNvbnRleHQuY3VycmVudFRlcm0pIHtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKFxuICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybSxcbiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRQcm9wZXJ0eVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFR5cGUgPSB1bmFsaWFzKGNvbnRleHQucmF3TWV0YWRhdGEucmVmZXJlbmNlcywgcmVjb3JkRGVmaW5pdGlvbi50eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFR5cGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKFxuICAgIHJlY29yZERlZmluaXRpb246IEFubm90YXRpb25SZWNvcmQsXG4gICAgY3VycmVudEZRTjogc3RyaW5nLFxuICAgIG9iamVjdE1hcDogYW55LFxuICAgIGNvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0XG4pIHtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gcGFyc2VSZWNvcmRUeXBlKHJlY29yZERlZmluaXRpb24sIGNvbnRleHQpO1xuXG4gICAgY29uc3QgYW5ub3RhdGlvblRlcm06IGFueSA9IHtcbiAgICAgICAgJFR5cGU6IHRhcmdldFR5cGUsXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogY3VycmVudEZRTixcbiAgICAgICAgYW5ub3RhdGlvbnM6IHt9XG4gICAgfTtcbiAgICBjb25zdCBhbm5vdGF0aW9uQ29udGVudDogYW55ID0ge307XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucykpIHtcbiAgICAgICAgY29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IGN1cnJlbnRGUU4sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogcmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIF9fc291cmNlOiBjb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5hZGRpdGlvbmFsQW5ub3RhdGlvbnMucHVzaChzdWJBbm5vdGF0aW9uTGlzdCk7XG4gICAgfVxuICAgIGlmIChyZWNvcmREZWZpbml0aW9uLnByb3BlcnR5VmFsdWVzKSB7XG4gICAgICAgIHJlY29yZERlZmluaXRpb24ucHJvcGVydHlWYWx1ZXMuZm9yRWFjaCgocHJvcGVydHlWYWx1ZTogUHJvcGVydHlWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29udGV4dC5jdXJyZW50UHJvcGVydHkgPSBwcm9wZXJ0eVZhbHVlLm5hbWU7XG4gICAgICAgICAgICBhbm5vdGF0aW9uQ29udGVudFtwcm9wZXJ0eVZhbHVlLm5hbWVdID0gcGFyc2VWYWx1ZShcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgICAgIGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFubm90YXRpb25MaXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBfX3NvdXJjZTogY29udGV4dC5jdXJyZW50U291cmNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmFkZGl0aW9uYWxBbm5vdGF0aW9ucy5wdXNoKHN1YkFubm90YXRpb25MaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RhdGFGaWVsZFdpdGhGb3JBY3Rpb24oYW5ub3RhdGlvbkNvbnRlbnQsIGFubm90YXRpb25UZXJtKSkge1xuICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXNvbHZlIHRvIGEgYm91bmQgYWN0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCA9IGNvbnRleHQuY3VycmVudFRhcmdldC5hY3Rpb25zPy5bYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uXTtcblxuICAgICAgICAgICAgICAgIGlmICghYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IG9iamVjdE1hcFthbm5vdGF0aW9uQ29udGVudC5BY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uPy5pc0JvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZCBhY3Rpb24gb2YgYSBkaWZmZXJlbnQgZW50aXR5IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCA9IGFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYm91bmQgYWN0aW9uIC0tPiByZXNvbHZlIHZpYSB0aGUgYWN0aW9uIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0ID0gYWN0aW9uLmFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBkaWFnbm9zdGljcyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgQU5OT1RBVElPTl9FUlJPUlMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgYWN0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkZWZpbmVkIGZvciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVGVybS5mdWxseVF1YWxpZmllZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5jdXJyZW50UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFubm90YXRpb25UZXJtLCBhbm5vdGF0aW9uQ29udGVudCk7XG59XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25UeXBlID1cbiAgICB8ICdQcm9wZXJ0eVBhdGgnXG4gICAgfCAnUGF0aCdcbiAgICB8ICdJZidcbiAgICB8ICdBcHBseSdcbiAgICB8ICdOdWxsJ1xuICAgIHwgJ0FuZCdcbiAgICB8ICdFcSdcbiAgICB8ICdOZSdcbiAgICB8ICdOb3QnXG4gICAgfCAnR3QnXG4gICAgfCAnR2UnXG4gICAgfCAnTHQnXG4gICAgfCAnTGUnXG4gICAgfCAnT3InXG4gICAgfCAnQW5ub3RhdGlvblBhdGgnXG4gICAgfCAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCdcbiAgICB8ICdSZWNvcmQnXG4gICAgfCAnU3RyaW5nJ1xuICAgIHwgJ0VtcHR5Q29sbGVjdGlvbic7XG5cbi8qKlxuICogUmV0cmlldmUgb3IgaW5mZXIgdGhlIGNvbGxlY3Rpb24gdHlwZSBiYXNlZCBvbiBpdHMgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uRGVmaW5pdGlvbjogYW55W10pOiBDb2xsZWN0aW9uVHlwZSB7XG4gICAgbGV0IHR5cGU6IENvbGxlY3Rpb25UeXBlID0gKGNvbGxlY3Rpb25EZWZpbml0aW9uIGFzIGFueSkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RDb2xJdGVtID0gY29sbGVjdGlvbkRlZmluaXRpb25bMF07XG4gICAgICAgIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ1Byb3BlcnR5UGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1Byb3BlcnR5UGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdQYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnUGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdBbm5vdGF0aW9uUGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ0Fubm90YXRpb25QYXRoJztcbiAgICAgICAgfSBlbHNlIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBmaXJzdENvbEl0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCd0eXBlJykgfHwgZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdwcm9wZXJ0eVZhbHVlcycpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHR5cGUgPSAnUmVjb3JkJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmlyc3RDb2xJdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHlwZSA9ICdTdHJpbmcnO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHlwZSA9ICdFbXB0eUNvbGxlY3Rpb24nO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xsZWN0aW9uKGNvbGxlY3Rpb25EZWZpbml0aW9uOiBhbnlbXSwgcGFyZW50RlFOOiBzdHJpbmcsIG9iamVjdE1hcDogYW55LCBjb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25EZWZpbml0aW9uVHlwZSA9IGdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uRGVmaW5pdGlvbik7XG4gICAgc3dpdGNoIChjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHByb3BlcnR5UGF0aCwgcHJvcGVydHlJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke3Byb3BlcnR5SWR4fWAsXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocGF0aFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlLlBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gbmV3IFBhdGgocGF0aFZhbHVlLCAkdGFyZ2V0LCBjb250ZXh0LmN1cnJlbnRUZXJtLCAnJyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogaXNBbm5vdGF0aW9uUGF0aChwYXRoVmFsdWUuUGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHRvUmVzb2x2ZTogcGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGFubm90YXRpb25QYXRoLCBhbm5vdGF0aW9uSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uQ29sbGVjdGlvbkVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhbm5vdGF0aW9uUGF0aC5Bbm5vdGF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7YW5ub3RhdGlvbklkeH1gLFxuICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0OiBhbm5vdGF0aW9uVGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm06IGNvbnRleHQuY3VycmVudFRlcm0sXG4gICAgICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRvUmVzb2x2ZTogYW5ub3RhdGlvbkNvbGxlY3Rpb25FbGVtZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKG5hdlByb3BlcnR5UGF0aCwgbmF2UHJvcElkeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5hdlByb3BlcnR5UGF0aC5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IGAke3BhcmVudEZRTn0vJHtuYXZQcm9wSWR4fWAsXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdSZWNvcmQnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocmVjb3JkRGVmaW5pdGlvbiwgcmVjb3JkSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlY29yZERlZmluaXRpb24sIGAke3BhcmVudEZRTn0vJHtyZWNvcmRJZHh9YCwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdBcHBseSc6XG4gICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICBjYXNlICdJZic6XG4gICAgICAgIGNhc2UgJ0VxJzpcbiAgICAgICAgY2FzZSAnTmUnOlxuICAgICAgICBjYXNlICdMdCc6XG4gICAgICAgIGNhc2UgJ0d0JzpcbiAgICAgICAgY2FzZSAnTGUnOlxuICAgICAgICBjYXNlICdHZSc6XG4gICAgICAgIGNhc2UgJ05vdCc6XG4gICAgICAgIGNhc2UgJ0FuZCc6XG4gICAgICAgIGNhc2UgJ09yJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGlmVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWZWYWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoc3RyaW5nVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0cmluZ1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUuU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxudHlwZSBSZXNvbHZlYWJsZSA9IHtcbiAgICBpbmxpbmU6IGJvb2xlYW47XG4gICAgdG9SZXNvbHZlOiB7XG4gICAgICAgICR0YXJnZXQ6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0U3RyaW5nPzogc3RyaW5nO1xuICAgICAgICBhbm5vdGF0aW9uc1Rlcm0/OiBzdHJpbmc7XG4gICAgICAgIGFubm90YXRpb25UeXBlPzogc3RyaW5nO1xuICAgICAgICB0ZXJtOiBzdHJpbmc7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICB9O1xufTtcblxuZnVuY3Rpb24gY29udmVydEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgb2JqZWN0TWFwOiBhbnksIGNvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0KTogYW55IHtcbiAgICBpZiAoYW5ub3RhdGlvbi5yZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUmVjb3JkKGFubm90YXRpb24ucmVjb3JkLCBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uY29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZShhbm5vdGF0aW9uLnZhbHVlLCBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbjogYW55ID0gcGFyc2VDb2xsZWN0aW9uKFxuICAgICAgICAgICAgYW5ub3RhdGlvbi5jb2xsZWN0aW9uLFxuICAgICAgICAgICAgYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGNvbGxlY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVzb2x2ZVBhdGggZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0gb2JqZWN0TWFwIFRoZSBjdXJyZW50IG9iamVjdE1hcFxuICogQHJldHVybnMgdGhlIHJlc29sdmVQYXRoIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIGF0IHRoZSBlbnRpdHlUeXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVQYXRoRm4oZW50aXR5VHlwZTogRW50aXR5VHlwZSwgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGg6IHN0cmluZywgaW5jbHVkZVZpc2l0ZWRPYmplY3RzOiBib29sZWFuKTogYW55IHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblRlcm06IHN0cmluZyA9ICcnO1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBlbnRpdHlUeXBlLCByZWxhdGl2ZVBhdGgsIGZhbHNlLCBpbmNsdWRlVmlzaXRlZE9iamVjdHMsIGFubm90YXRpb25UZXJtKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVjJOYXZpZ2F0aW9uUHJvcGVydHkoXG4gICAgbmF2UHJvcDogUmF3VjJOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgYXNzb2NpYXRpb25zOiBSYXdBc3NvY2lhdGlvbltdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvdXROYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldEFzc29jaWF0aW9uID0gYXNzb2NpYXRpb25zLmZpbmQoXG4gICAgICAgIChhc3NvY2lhdGlvbikgPT4gYXNzb2NpYXRpb24uZnVsbHlRdWFsaWZpZWROYW1lID09PSBuYXZQcm9wLnJlbGF0aW9uc2hpcFxuICAgICk7XG4gICAgaWYgKHRhcmdldEFzc29jaWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFzc29jaWF0aW9uRW5kID0gdGFyZ2V0QXNzb2NpYXRpb24uYXNzb2NpYXRpb25FbmQuZmluZCgoZW5kKSA9PiBlbmQucm9sZSA9PT0gbmF2UHJvcC50b1JvbGUpO1xuICAgICAgICBpZiAoYXNzb2NpYXRpb25FbmQpIHtcbiAgICAgICAgICAgIG91dE5hdlByb3AudGFyZ2V0VHlwZSA9IG9iamVjdE1hcFthc3NvY2lhdGlvbkVuZC50eXBlXTtcbiAgICAgICAgICAgIG91dE5hdlByb3AuaXNDb2xsZWN0aW9uID0gYXNzb2NpYXRpb25FbmQubXVsdGlwbGljaXR5ID09PSAnKic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3V0TmF2UHJvcC5yZWZlcmVudGlhbENvbnN0cmFpbnQgPSBuYXZQcm9wLnJlZmVyZW50aWFsQ29uc3RyYWludCB8fCBbXTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVY0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIG5hdlByb3A6IFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5LFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvdXROYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlcbik6IHZvaWQge1xuICAgIG91dE5hdlByb3AudGFyZ2V0VHlwZSA9IG9iamVjdE1hcFtuYXZQcm9wLnRhcmdldFR5cGVOYW1lXTtcbiAgICBvdXROYXZQcm9wLnBhcnRuZXIgPSBuYXZQcm9wLnBhcnRuZXI7XG4gICAgb3V0TmF2UHJvcC5pc0NvbGxlY3Rpb24gPSBuYXZQcm9wLmlzQ29sbGVjdGlvbjtcbiAgICBvdXROYXZQcm9wLmNvbnRhaW5zVGFyZ2V0ID0gbmF2UHJvcC5jb250YWluc1RhcmdldDtcbiAgICBvdXROYXZQcm9wLnJlZmVyZW50aWFsQ29uc3RyYWludCA9IG5hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50O1xufVxuXG5mdW5jdGlvbiBpc1Y0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIG5hdlByb3A6IFJhd1YyTmF2aWdhdGlvblByb3BlcnR5IHwgUmF3VjROYXZpZ2F0aW9uUHJvcGVydHlcbik6IG5hdlByb3AgaXMgUmF3VjROYXZpZ2F0aW9uUHJvcGVydHkge1xuICAgIHJldHVybiAhIShuYXZQcm9wIGFzIEJhc2VOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGVOYW1lO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgbmF2aWdhdGlvblByb3BlcnRpZXM6IChSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSB8IFJhd1YyTmF2aWdhdGlvblByb3BlcnR5KVtdLFxuICAgIGFzc29jaWF0aW9uczogUmF3QXNzb2NpYXRpb25bXSxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICAgIHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydGllcy5tYXAoKG5hdlByb3ApID0+IHtcbiAgICAgICAgY29uc3Qgb3V0TmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5ID0ge1xuICAgICAgICAgICAgX3R5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHknLFxuICAgICAgICAgICAgbmFtZTogbmF2UHJvcC5uYW1lLFxuICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBuYXZQcm9wLmZ1bGx5UXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgIGlzQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBjb250YWluc1RhcmdldDogZmFsc2UsXG4gICAgICAgICAgICByZWZlcmVudGlhbENvbnN0cmFpbnQ6IFtdLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHt9LFxuICAgICAgICAgICAgcGFydG5lcjogJycsXG4gICAgICAgICAgICB0YXJnZXRUeXBlOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICAgICAgdGFyZ2V0VHlwZU5hbWU6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpc1Y0TmF2aWdhdGlvblByb3BlcnR5KG5hdlByb3ApKSB7XG4gICAgICAgICAgICByZXNvbHZlVjROYXZpZ2F0aW9uUHJvcGVydHkobmF2UHJvcCwgb2JqZWN0TWFwLCBvdXROYXZQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVWMk5hdmlnYXRpb25Qcm9wZXJ0eShuYXZQcm9wLCBhc3NvY2lhdGlvbnMsIG9iamVjdE1hcCwgb3V0TmF2UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dE5hdlByb3AudGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgb3V0TmF2UHJvcC50YXJnZXRUeXBlTmFtZSA9IG91dE5hdlByb3AudGFyZ2V0VHlwZS5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0TWFwW291dE5hdlByb3AuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG91dE5hdlByb3A7XG4gICAgICAgIHJldHVybiBvdXROYXZQcm9wO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIGFzc29jaWF0aW9uc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgZW50aXR5VHlwZXM6IFJhd0VudGl0eVR5cGVbXSxcbiAgICBhc3NvY2lhdGlvbnM6IFJhd0Fzc29jaWF0aW9uW10sXG4gICAgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiB2b2lkIHtcbiAgICBlbnRpdHlUeXBlcy5mb3JFYWNoKChlbnRpdHlUeXBlKSA9PiB7XG4gICAgICAgIGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgICAgICAgICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgYXNzb2NpYXRpb25zLFxuICAgICAgICAgICAgb2JqZWN0TWFwXG4gICAgICAgICk7XG4gICAgICAgIChlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUpLnJlc29sdmVQYXRoID0gY3JlYXRlUmVzb2x2ZVBhdGhGbihlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsIG9iamVjdE1hcCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5hbWVzcGFjZVxuICogQHBhcmFtIGFjdGlvbnNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqL1xuZnVuY3Rpb24gbGlua0FjdGlvbnNUb0VudGl0eVR5cGUobmFtZXNwYWNlOiBzdHJpbmcsIGFjdGlvbnM6IEFjdGlvbltdLCBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbi5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgYWN0aW9uLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbi5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VFbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5zb3VyY2VUeXBlXTtcbiAgICAgICAgICAgIGFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID0gc291cmNlRW50aXR5VHlwZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VFbnRpdHlUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VFbnRpdHlUeXBlLmFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRW50aXR5VHlwZS5hY3Rpb25zID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvdXJjZUVudGl0eVR5cGUuYWN0aW9uc1tgJHtuYW1lc3BhY2V9LiR7YWN0aW9uLm5hbWV9YF0gPSBhY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY3Rpb24ucmV0dXJuRW50aXR5VHlwZSA9IG9iamVjdE1hcFthY3Rpb24ucmV0dXJuVHlwZV07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbGlua0FjdGlvbkltcG9ydHNUb0FjdGlvbnMoYWN0aW9uSW1wb3J0czogQWN0aW9uSW1wb3J0W10sIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGFjdGlvbkltcG9ydHMuZm9yRWFjaCgoYWN0aW9uSW1wb3J0KSA9PiB7XG4gICAgICAgIGFjdGlvbkltcG9ydC5hY3Rpb24gPSBvYmplY3RNYXBbYWN0aW9uSW1wb3J0LmFjdGlvbk5hbWVdO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlTZXRzXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcGFyYW0gcmVmZXJlbmNlc1xuICovXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvRW50aXR5U2V0KFxuICAgIGVudGl0eVNldHM6IEVudGl0eVNldFtdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcFxuKTogdm9pZCB7XG4gICAgZW50aXR5U2V0cy5mb3JFYWNoKChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUgPSBvYmplY3RNYXBbZW50aXR5U2V0LmVudGl0eVR5cGVOYW1lXTtcbiAgICAgICAgaWYgKCFlbnRpdHlTZXQuZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUgPSBvYmplY3RNYXBbdW5hbGlhcyhyZWZlcmVuY2VzLCBlbnRpdHlTZXQuZW50aXR5VHlwZU5hbWUpIGFzIHN0cmluZ107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRpdHlTZXQuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGVudGl0eVNldC5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50aXR5U2V0LmVudGl0eVR5cGUuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGVudGl0eVNldC5lbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wOiBQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAga2V5UHJvcC5pc0tleSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBzaW5nbGV0b25zXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcGFyYW0gcmVmZXJlbmNlc1xuICovXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uKFxuICAgIHNpbmdsZXRvbnM6IFNpbmdsZXRvbltdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcFxuKTogdm9pZCB7XG4gICAgc2luZ2xldG9ucy5mb3JFYWNoKChzaW5nbGV0b24pID0+IHtcbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbc2luZ2xldG9uLmVudGl0eVR5cGVOYW1lXTtcbiAgICAgICAgaWYgKCFzaW5nbGV0b24uZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbdW5hbGlhcyhyZWZlcmVuY2VzLCBzaW5nbGV0b24uZW50aXR5VHlwZU5hbWUpIGFzIHN0cmluZ107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaW5nbGV0b24uYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2luZ2xldG9uLmVudGl0eVR5cGUuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5lbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wOiBQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAga2V5UHJvcC5pc0tleSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiBsaW5rUHJvcGVydGllc1RvQ29tcGxleFR5cGVzKGVudGl0eVR5cGVzOiBFbnRpdHlUeXBlW10sIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpbmsocHJvcGVydHk6IFByb3BlcnR5KSB7XG4gICAgICAgIGlmICghcHJvcGVydHkuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5LmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUuaW5kZXhPZignRWRtJykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tcGxleFR5cGU6IENvbXBsZXhUeXBlIHwgVHlwZURlZmluaXRpb247XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUuc3RhcnRzV2l0aCgnQ29sbGVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhUeXBlTmFtZSA9IHByb3BlcnR5LnR5cGUuc3Vic3RyaW5nKDExLCBwcm9wZXJ0eS50eXBlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV4VHlwZSA9IG9iamVjdE1hcFtjb21wbGV4VHlwZU5hbWVdIGFzIENvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlID0gb2JqZWN0TWFwW3Byb3BlcnR5LnR5cGVdIGFzIENvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudGFyZ2V0VHlwZSA9IGNvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGUucHJvcGVydGllcy5mb3JFYWNoKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChzRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvcGVydHkgVHlwZSBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW50aXR5VHlwZXMuZm9yRWFjaCgoZW50aXR5VHlwZSkgPT4ge1xuICAgICAgICBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaChsaW5rKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29tcGxleFR5cGVzXG4gKiBAcGFyYW0gYXNzb2NpYXRpb25zXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVDb21wbGV4VHlwZXMoXG4gICAgY29tcGxleFR5cGVzOiBSYXdDb21wbGV4VHlwZVtdLFxuICAgIGFzc29jaWF0aW9uczogUmF3QXNzb2NpYXRpb25bXSxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICAgIGNvbXBsZXhUeXBlcy5mb3JFYWNoKChjb21wbGV4VHlwZSkgPT4ge1xuICAgICAgICAoY29tcGxleFR5cGUgYXMgQ29tcGxleFR5cGUpLmFubm90YXRpb25zID0ge307XG4gICAgICAgIGNvbXBsZXhUeXBlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmICghKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgICAgICAgICBjb21wbGV4VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcbiAgICAgICAgICAgIGFzc29jaWF0aW9ucyxcbiAgICAgICAgICAgIG9iamVjdE1hcFxuICAgICAgICApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBhbGlhcyBmcm9tIHRoZSB0ZXJtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VzXG4gKiBAcGFyYW0gdGVybVZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgdGVybVxuICogQHJldHVybnMgdGhlIHRlcm0gYWxpYXMgYW5kIHRoZSBhY3R1YWwgdGVybSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzcGxpdFRlcm0ocmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAsIHRlcm1WYWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWxpYXNlZFRlcm0gPSBhbGlhcyhyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpO1xuICAgIGNvbnN0IGxhc3REb3QgPSBhbGlhc2VkVGVybS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IHRlcm1BbGlhcyA9IGFsaWFzZWRUZXJtLnN1YnN0cmluZygwLCBsYXN0RG90KTtcbiAgICBjb25zdCB0ZXJtID0gYWxpYXNlZFRlcm0uc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcbiAgICByZXR1cm4gW3Rlcm1BbGlhcywgdGVybV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHJlc29sdmUgYSBzcGVjaWZpYyBwYXRoLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZWRPdXRwdXRcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqIEByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gcmVzb2x2ZSBlbGVtZW50IGdsb2JhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dDogQ29udmVydGVkTWV0YWRhdGEsIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXNvbHZlUGF0aDxUPihzUGF0aDogc3RyaW5nLCByZXNvbHZlRGlyZWN0bHk6IGJvb2xlYW4gPSBmYWxzZSk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuICAgICAgICBpZiAocmVzb2x2ZURpcmVjdGx5KSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0UGF0aCA9IHNQYXRoO1xuICAgICAgICAgICAgaWYgKCFzUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gYC8ke3NQYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZXNvbHV0aW9uOiBhbnkgPSBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGNvbnZlcnRlZE91dHB1dCwgdGFyZ2V0UGF0aCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UmVzb2x1dGlvbi52aXNpdGVkT2JqZWN0cy5wdXNoKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCxcbiAgICAgICAgICAgICAgICBvYmplY3RQYXRoOiB0YXJnZXRSZXNvbHV0aW9uLnZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoYVBhdGhTcGxpdC5zaGlmdCgpICE9PSAnJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVhbCB3aXRoIHJlbGF0aXZlIHBhdGgnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRpdHlTZXROYW1lID0gYVBhdGhTcGxpdC5zaGlmdCgpO1xuICAgICAgICBjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRPdXRwdXQuZW50aXR5U2V0cy5maW5kKChldDogRW50aXR5U2V0KSA9PiBldC5uYW1lID09PSBlbnRpdHlTZXROYW1lKTtcbiAgICAgICAgY29uc3Qgc2luZ2xldG9uID0gY29udmVydGVkT3V0cHV0LnNpbmdsZXRvbnMuZmluZCgoZXQ6IFNpbmdsZXRvbikgPT4gZXQubmFtZSA9PT0gZW50aXR5U2V0TmFtZSk7XG4gICAgICAgIGlmICghZW50aXR5U2V0ICYmICFzaW5nbGV0b24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBjb252ZXJ0ZWRPdXRwdXQuZW50aXR5Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIG9iamVjdFBhdGg6IFtjb252ZXJ0ZWRPdXRwdXQuZW50aXR5Q29udGFpbmVyXVxuICAgICAgICAgICAgfSBhcyBSZXNvbHV0aW9uVGFyZ2V0PFQ+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChhUGF0aFNwbGl0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eVNldCB8fCBzaW5nbGV0b24sXG4gICAgICAgICAgICAgICAgb2JqZWN0UGF0aDogW2NvbnZlcnRlZE91dHB1dC5lbnRpdHlDb250YWluZXIsIGVudGl0eVNldCB8fCBzaW5nbGV0b25dXG4gICAgICAgICAgICB9IGFzIFJlc29sdXRpb25UYXJnZXQ8VD47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZXNvbHV0aW9uOiBhbnkgPSBfcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgZW50aXR5U2V0IHx8IHNpbmdsZXRvbixcbiAgICAgICAgICAgICAgICAnLycgKyBhUGF0aFNwbGl0LmpvaW4oJy8nKSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UmVzb2x1dGlvbi52aXNpdGVkT2JqZWN0cy5wdXNoKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCxcbiAgICAgICAgICAgICAgICBvYmplY3RQYXRoOiB0YXJnZXRSZXNvbHV0aW9uLnZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxudHlwZSBDb252ZXJzaW9uQ29udGV4dCA9IHtcbiAgICB1bnJlc29sdmVkQW5ub3RhdGlvbnM6IFJlc29sdmVhYmxlW107XG4gICAgYWRkaXRpb25hbEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdO1xuICAgIHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YTtcbiAgICBjdXJyZW50U291cmNlOiBzdHJpbmc7XG4gICAgY3VycmVudFRhcmdldDogYW55O1xuICAgIGN1cnJlbnRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBjdXJyZW50VGVybTogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZW5zdXJlQW5ub3RhdGlvbnMoY3VycmVudFRhcmdldDogYW55LCB2b2NBbGlhczogc3RyaW5nKSB7XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zKSB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXSkge1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXSA9IHt9O1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zKSB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zID0ge307XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQW5ub3RhdGlvbnMoXG4gICAgY3VycmVudENvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0LFxuICAgIGFubm90YXRpb25MaXN0OiBBbm5vdGF0aW9uTGlzdCxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYk92ZXJyaWRlRXhpc3Rpbmc6IGJvb2xlYW5cbikge1xuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50Q29udGV4dC5jdXJyZW50VGFyZ2V0O1xuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGV4dC5jdXJyZW50U291cmNlID0gKGFubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSB8fCAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZTtcbiAgICAgICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IHNwbGl0VGVybShkZWZhdWx0UmVmZXJlbmNlcywgYW5ub3RhdGlvbi50ZXJtKTtcbiAgICAgICAgZW5zdXJlQW5ub3RhdGlvbnMoY3VycmVudFRhcmdldCwgdm9jQWxpYXMpO1xuXG4gICAgICAgIGNvbnN0IHZvY1Rlcm1XaXRoUXVhbGlmaWVyID0gYCR7dm9jVGVybX0ke2Fubm90YXRpb24ucXVhbGlmaWVyID8gJyMnICsgYW5ub3RhdGlvbi5xdWFsaWZpZXIgOiAnJ31gO1xuICAgICAgICBpZiAoIWJPdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnM/Llt2b2NBbGlhc10/Llt2b2NUZXJtV2l0aFF1YWxpZmllcl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb250ZXh0LmN1cnJlbnRUZXJtID0gYW5ub3RhdGlvbi50ZXJtO1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBjb252ZXJ0QW5ub3RhdGlvbihcbiAgICAgICAgICAgIGFubm90YXRpb24gYXMgQW5ub3RhdGlvbixcbiAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctd3JhcHBlcnNcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBuZXcgU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy13cmFwcGVyc1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9IG5ldyBCb29sZWFuKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9uc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0udGVybSA9IHVuYWxpYXMoXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgYCR7dm9jQWxpYXN9LiR7dm9jVGVybX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLnF1YWxpZmllciA9IGFubm90YXRpb24ucXVhbGlmaWVyO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLl9fc291cmNlID0gY3VycmVudENvbnRleHQuY3VycmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVGFyZ2V0ID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhcbiAgICAgICAgICAgIGRlZmF1bHRSZWZlcmVuY2VzLFxuICAgICAgICAgICAgdm9jQWxpYXMgKyAnLicgKyB2b2NUZXJtV2l0aFF1YWxpZmllclxuICAgICAgICApfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb24uYW5ub3RhdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJBbm5vdGF0aW9uTGlzdCA9IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGFubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb24uYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgX19zb3VyY2U6IGN1cnJlbnRDb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5hZGRpdGlvbmFsQW5ub3RhdGlvbnMucHVzaChzdWJBbm5vdGF0aW9uTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9ucyAmJiAhY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLmFubm90YXRpb25zKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0uYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zW2Ake3ZvY0FsaWFzfS4ke3ZvY1Rlcm1XaXRoUXVhbGlmaWVyfWBdID1cbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zW3VuYWxpYXMoZGVmYXVsdFJlZmVyZW5jZXMsIGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm1XaXRoUXVhbGlmaWVyfWApIV0gPVxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXTtcbiAgICAgICAgb2JqZWN0TWFwW2Fubm90YXRpb25UYXJnZXRdID0gY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgYWxsIHRoZSB1bnJlc29sdmVkIHRhcmdldHMgc28gZmFyIHRvIHRyeSBhbmQgc2VlIGlmIHRoZXkgYXJlIHJlc29sdmVhYmxlIGluIHRoZSBlbmQuXG4gKlxuICogQHBhcmFtIHVucmVzb2x2ZWRUYXJnZXRzXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyh1bnJlc29sdmVkVGFyZ2V0czogUmVzb2x2ZWFibGVbXSwgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdW5yZXNvbHZlZFRhcmdldHMuZm9yRWFjaCgocmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUb1Jlc29sdmUgPSByZXNvbHZhYmxlLnRvUmVzb2x2ZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gdGFyZ2V0VG9SZXNvbHZlLiR0YXJnZXQ7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gb2JqZWN0TWFwW3RhcmdldFN0cl07XG4gICAgICAgIGNvbnN0IHsgYW5ub3RhdGlvbnNUZXJtLCBhbm5vdGF0aW9uVHlwZSB9ID0gdGFyZ2V0VG9SZXNvbHZlO1xuICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlLmFubm90YXRpb25UeXBlO1xuICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlLmFubm90YXRpb25zVGVybTtcblxuICAgICAgICBpZiAocmVzb2x2YWJsZS5pbmxpbmUgJiYgIShyZXNvbHZlZFRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgICAgICAgIC8vIGlubGluZSB0aGUgcmVzb2x2ZWQgdGFyZ2V0XG4gICAgICAgICAgICBsZXQga2V5czoga2V5b2YgdHlwZW9mIHRhcmdldFRvUmVzb2x2ZTtcbiAgICAgICAgICAgIGZvciAoa2V5cyBpbiB0YXJnZXRUb1Jlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlW2tleXNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldFRvUmVzb2x2ZSwgcmVzb2x2ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSByZXNvbHZlZCB0YXJnZXRcbiAgICAgICAgICAgIHRhcmdldFRvUmVzb2x2ZS4kdGFyZ2V0ID0gcmVzb2x2ZWRUYXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc29sdmVkVGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXRUb1Jlc29sdmUudGFyZ2V0U3RyaW5nID0gdGFyZ2V0U3RyO1xuICAgICAgICAgICAgaWYgKGFubm90YXRpb25zVGVybSAmJiBhbm5vdGF0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9FcnJvck1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zVGVybSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxSZWNvcmQgVHlwZSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvblBhdGggPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRhcmdldFRvUmVzb2x2ZS50ZXJtO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB0YXJnZXRUb1Jlc29sdmUucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXJtSW5mbyA9IHRhcmdldFN0ciA/IHRhcmdldFN0ci5zcGxpdCgnLycpWzBdIDogdGFyZ2V0U3RyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9FcnJvck1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1JbmZvICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPFByb3BlcnR5VmFsdWUgUHJvcGVydHkgPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIFBhdGg9ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5ub3RhdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2UgdG9nZXRoZXIgYnkgb3ZlcndyaXRpbmcgYXQgdGhlIHRlcm0gbGV2ZWwuXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1lcmdlZCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQ6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3Q6IEFubm90YXRpb25MaXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBpZiAoIWFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLmNvbmNhdCgpLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGN1cnJlbnRUYXJnZXROYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdIGFzIGFueSkuX19zb3VyY2UgPSBhbm5vdGF0aW9uU291cmNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdC5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVmZXJlbmNlQW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUFubm90YXRpb24udGVybSA9PT0gYW5ub3RhdGlvbi50ZXJtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUFubm90YXRpb24ucXVhbGlmaWVyID09PSBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIChhbm5vdGF0aW9uIGFzIGFueSkuX19zb3VyY2UgPSBhbm5vdGF0aW9uU291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdLmFubm90YXRpb25zLnNwbGljZShmaW5kSW5kZXgsIDEsIGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdLmFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBSYXdNZXRhZGF0YSBpbnRvIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiB0byBiZSB1c2VkIHRvIGVhc2lseSBuYXZpZ2F0ZSBhIG1ldGFkYXRhIG9iamVjdCBhbmQgaXRzIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgY29udmVydGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnQocmF3TWV0YWRhdGE6IFJhd01ldGFkYXRhKTogQ29udmVydGVkTWV0YWRhdGEge1xuICAgIEFOTk9UQVRJT05fRVJST1JTID0gW107XG4gICAgY29uc3Qgb2JqZWN0TWFwID0gYnVpbGRPYmplY3RNYXAocmF3TWV0YWRhdGEpO1xuICAgIHJlc29sdmVOYXZpZ2F0aW9uUHJvcGVydGllcyhcbiAgICAgICAgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSxcbiAgICAgICAgcmF3TWV0YWRhdGEuc2NoZW1hLmFzc29jaWF0aW9ucyxcbiAgICAgICAgb2JqZWN0TWFwXG4gICAgKTtcbiAgICAocmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lciBhcyBFbnRpdHlDb250YWluZXIpLmFubm90YXRpb25zID0ge307XG4gICAgbGlua0FjdGlvbnNUb0VudGl0eVR5cGUocmF3TWV0YWRhdGEuc2NoZW1hLm5hbWVzcGFjZSwgcmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbnMgYXMgQWN0aW9uW10sIG9iamVjdE1hcCk7XG4gICAgbGlua0FjdGlvbkltcG9ydHNUb0FjdGlvbnMocmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbkltcG9ydHMsIG9iamVjdE1hcCk7XG4gICAgbGlua0VudGl0eVR5cGVUb0VudGl0eVNldChyYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5U2V0cyBhcyBFbnRpdHlTZXRbXSwgb2JqZWN0TWFwLCByYXdNZXRhZGF0YS5yZWZlcmVuY2VzKTtcbiAgICBsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uKHJhd01ldGFkYXRhLnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLCBvYmplY3RNYXAsIHJhd01ldGFkYXRhLnJlZmVyZW5jZXMpO1xuICAgIGxpbmtQcm9wZXJ0aWVzVG9Db21wbGV4VHlwZXMocmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSwgb2JqZWN0TWFwKTtcbiAgICBwcmVwYXJlQ29tcGxleFR5cGVzKHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMgYXMgQ29tcGxleFR5cGVbXSwgcmF3TWV0YWRhdGEuc2NoZW1hLmFzc29jaWF0aW9ucywgb2JqZWN0TWFwKTtcbiAgICBjb25zdCB1bnJlc29sdmVkVGFyZ2V0czogUmVzb2x2ZWFibGVbXSA9IFtdO1xuICAgIGNvbnN0IHVucmVzb2x2ZWRBbm5vdGF0aW9uczogQW5ub3RhdGlvbkxpc3RbXSA9IFtdO1xuICAgIGNvbnN0IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4gPSBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhKTtcbiAgICBPYmplY3Qua2V5cyhhbm5vdGF0aW9uTGlzdFBlclRhcmdldCkuZm9yRWFjaCgoY3VycmVudFRhcmdldE5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkxpc3QgPSBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV07XG4gICAgICAgIGNvbnN0IG9iamVjdE1hcEVsZW1lbnQgPSBvYmplY3RNYXBbY3VycmVudFRhcmdldE5hbWVdO1xuICAgICAgICBpZiAoIW9iamVjdE1hcEVsZW1lbnQgJiYgY3VycmVudFRhcmdldE5hbWU/LmluZGV4T2YoJ0AnKSA+IDApIHtcbiAgICAgICAgICAgIHVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25MaXN0KTtcbiAgICAgICAgfSBlbHNlIGlmIChvYmplY3RNYXBFbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgYWxsVGFyZ2V0cyA9IFtvYmplY3RNYXBFbGVtZW50XTtcbiAgICAgICAgICAgIGxldCBiT3ZlcnJpZGVFeGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAob2JqZWN0TWFwRWxlbWVudC5fdHlwZSA9PT0gJ1VuYm91bmRHZW5lcmljQWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGFsbFRhcmdldHMgPSBvYmplY3RNYXBFbGVtZW50LmFjdGlvbnM7XG4gICAgICAgICAgICAgICAgYk92ZXJyaWRlRXhpc3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsbFRhcmdldHMuZm9yRWFjaCgoY3VycmVudFRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFubm90YXRpb25zOiB1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2U6IChhbm5vdGF0aW9uTGlzdCBhcyBhbnkpLl9fc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgICAgIHJhd01ldGFkYXRhOiByYXdNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZEFubm90YXRpb25zOiB1bnJlc29sdmVkVGFyZ2V0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDb250ZXh0LCBhbm5vdGF0aW9uTGlzdCwgb2JqZWN0TWFwLCBiT3ZlcnJpZGVFeGlzdGluZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFVbnJlc29sdmVkQW5ub3RhdGlvbnM6IEFubm90YXRpb25MaXN0W10gPSBbXTtcbiAgICB1bnJlc29sdmVkQW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3QpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldE5hbWUgPSB1bmFsaWFzKHJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIGFubm90YXRpb25MaXN0LnRhcmdldCkgYXMgc3RyaW5nO1xuICAgICAgICBsZXQgW2Jhc2VPYmosIGFubm90YXRpb25QYXJ0XSA9IGN1cnJlbnRUYXJnZXROYW1lLnNwbGl0KCdAJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFNwbGl0ID0gYW5ub3RhdGlvblBhcnQuc3BsaXQoJy8nKTtcbiAgICAgICAgYmFzZU9iaiA9IGJhc2VPYmogKyAnQCcgKyB0YXJnZXRTcGxpdFswXTtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHRhcmdldFNwbGl0LnNsaWNlKDEpLnJlZHVjZSgoY3VycmVudE9iaiwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmo/LltwYXRoXTtcbiAgICAgICAgfSwgb2JqZWN0TWFwW2Jhc2VPYmpdKTtcbiAgICAgICAgaWYgKCFjdXJyZW50VGFyZ2V0IHx8IHR5cGVvZiBjdXJyZW50VGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgQU5OT1RBVElPTl9FUlJPUlMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbiB0YXJnZXQgd2FzIG5vdCBmb3VuZCBvbiB0aGUgc2VydmljZSAnICsgY3VycmVudFRhcmdldE5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBbm5vdGF0aW9uczogZXh0cmFVbnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZTogKGFubm90YXRpb25MaXN0IGFzIGFueSkuX19zb3VyY2UsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgcmF3TWV0YWRhdGE6IHJhd01ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRBbm5vdGF0aW9uczogdW5yZXNvbHZlZFRhcmdldHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwcm9jZXNzQW5ub3RhdGlvbnMoY3VycmVudENvbnRleHQsIGFubm90YXRpb25MaXN0LCBvYmplY3RNYXAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyh1bnJlc29sdmVkVGFyZ2V0cywgb2JqZWN0TWFwKTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIEFMTF9BTk5PVEFUSU9OX0VSUk9SUykge1xuICAgICAgICBBTk5PVEFUSU9OX0VSUk9SUy5wdXNoKEFMTF9BTk5PVEFUSU9OX0VSUk9SU1twcm9wZXJ0eV1bMF0pO1xuICAgIH1cbiAgICAocmF3TWV0YWRhdGEgYXMgYW55KS5lbnRpdHlTZXRzID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHM7XG4gICAgY29uc3QgZXh0cmFSZWZlcmVuY2VzID0gcmF3TWV0YWRhdGEucmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UmVmZXJlbmNlcy5maW5kKChkZWZhdWx0UmVmKSA9PiBkZWZhdWx0UmVmLm5hbWVzcGFjZSA9PT0gcmVmZXJlbmNlLm5hbWVzcGFjZSkgPT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0ZWRPdXRwdXQ6IFBhcnRpYWw8Q29udmVydGVkTWV0YWRhdGE+ID0ge1xuICAgICAgICB2ZXJzaW9uOiByYXdNZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhbm5vdGF0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLmFubm90YXRpb25zLFxuICAgICAgICBuYW1lc3BhY2U6IHJhd01ldGFkYXRhLnNjaGVtYS5uYW1lc3BhY2UsXG4gICAgICAgIGVudGl0eUNvbnRhaW5lcjogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lciBhcyBFbnRpdHlDb250YWluZXIsXG4gICAgICAgIGFjdGlvbnM6IHJhd01ldGFkYXRhLnNjaGVtYS5hY3Rpb25zIGFzIEFjdGlvbltdLFxuICAgICAgICBhY3Rpb25JbXBvcnRzOiByYXdNZXRhZGF0YS5zY2hlbWEuYWN0aW9uSW1wb3J0cyxcbiAgICAgICAgZW50aXR5U2V0czogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMgYXMgRW50aXR5U2V0W10sXG4gICAgICAgIHNpbmdsZXRvbnM6IHJhd01ldGFkYXRhLnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLFxuICAgICAgICBlbnRpdHlUeXBlczogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSxcbiAgICAgICAgY29tcGxleFR5cGVzOiByYXdNZXRhZGF0YS5zY2hlbWEuY29tcGxleFR5cGVzIGFzIENvbXBsZXhUeXBlW10sXG4gICAgICAgIHR5cGVEZWZpbml0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLnR5cGVEZWZpbml0aW9ucyBhcyBUeXBlRGVmaW5pdGlvbltdLFxuICAgICAgICByZWZlcmVuY2VzOiBkZWZhdWx0UmVmZXJlbmNlcy5jb25jYXQoZXh0cmFSZWZlcmVuY2VzKSxcbiAgICAgICAgZGlhZ25vc3RpY3M6IEFOTk9UQVRJT05fRVJST1JTLmNvbmNhdCgpXG4gICAgfTtcbiAgICBjb252ZXJ0ZWRPdXRwdXQucmVzb2x2ZVBhdGggPSBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dCBhcyBDb252ZXJ0ZWRNZXRhZGF0YSwgb2JqZWN0TWFwKTtcbiAgICByZXR1cm4gY29udmVydGVkT3V0cHV0IGFzIENvbnZlcnRlZE1ldGFkYXRhO1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi93cml0ZWJhY2snO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZmVyZW5jZSwgQ29tcGxleFR5cGUsIFR5cGVEZWZpbml0aW9uIH0gZnJvbSAnQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCA9IFtcbiAgICB7IGFsaWFzOiAnQ2FwYWJpbGl0aWVzJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMScsIHVyaTogJycgfSxcbiAgICB7IGFsaWFzOiAnQWdncmVnYXRpb24nLCBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBhbGlhczogJ1ZhbGlkYXRpb24nLCBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ09yZy5PRGF0YS5Db3JlLlYxJywgYWxpYXM6ICdDb3JlJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxJywgYWxpYXM6ICdNZWFzdXJlcycsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MScsIGFsaWFzOiAnQ29tbW9uJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEnLCBhbGlhczogJ1VJJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MScsIGFsaWFzOiAnU2Vzc2lvbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MScsIGFsaWFzOiAnQW5hbHl0aWNzJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEnLCBhbGlhczogJ0NvZGVMaXN0JywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxJywgYWxpYXM6ICdQZXJzb25hbERhdGEnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxJywgYWxpYXM6ICdDb21tdW5pY2F0aW9uJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEnLCBhbGlhczogJ0hUTUw1JywgdXJpOiAnJyB9XG5dO1xuXG5leHBvcnQgdHlwZSBSZWZlcmVuY2VzV2l0aE1hcCA9IFJlZmVyZW5jZVtdICYge1xuICAgIHJlZmVyZW5jZU1hcD86IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT47XG4gICAgcmV2ZXJzZVJlZmVyZW5jZU1hcD86IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT47XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFubm90YXRpb24gdG8gdGhlIGFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB1bmFsaWFzZWRWYWx1ZSB0aGUgdW5hbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgdW5hbGlhc2VkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZXZlcnNlUmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLm5hbWVzcGFjZV0gPSByZWY7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmICghdW5hbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0RG90SW5kZXggPSB1bmFsaWFzZWRWYWx1ZS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHVuYWxpYXNlZFZhbHVlLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gdW5hbGlhc2VkVmFsdWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpO1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMucmV2ZXJzZVJlZmVyZW5jZU1hcFtuYW1lc3BhY2VdO1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3JlZmVyZW5jZS5hbGlhc30uJHt2YWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAodW5hbGlhc2VkVmFsdWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAvLyBUcnkgdG8gc2VlIGlmIGl0J3MgYW4gYW5ub3RhdGlvbiBQYXRoIGxpa2UgdG9fU2FsZXNPcmRlci9AVUkuTGluZUl0ZW1cbiAgICAgICAgY29uc3QgW3ByZUFsaWFzLCAuLi5wb3N0QWxpYXNdID0gdW5hbGlhc2VkVmFsdWUuc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke2FsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcy5qb2luKCdAJykpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gYW5ub3RhdGlvbiB0byB0aGUgdW5hbGlhc2VkIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgY3VycmVudFJlZmVyZW5jZXMgZm9yIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gYWxpYXNlZFZhbHVlIHRoZSBhbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgdW5hbGlhc2VkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNhbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYWxpYXMocmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAsIGFsaWFzZWRWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXJlZmVyZW5jZXMucmVmZXJlbmNlTWFwKSB7XG4gICAgICAgIHJlZmVyZW5jZXMucmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLmFsaWFzXSA9IHJlZjtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgaWYgKCFhbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzZWRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgW3ZvY0FsaWFzLCAuLi52YWx1ZV0gPSBhbGlhc2VkVmFsdWUuc3BsaXQoJy4nKTtcbiAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLnJlZmVyZW5jZU1hcFt2b2NBbGlhc107XG4gICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gYCR7cmVmZXJlbmNlLm5hbWVzcGFjZX0uJHt2YWx1ZS5qb2luKCcuJyl9YDtcbiAgICB9IGVsc2UgaWYgKGFsaWFzZWRWYWx1ZS5pbmRleE9mKCdAJykgIT09IC0xKSB7XG4gICAgICAgIC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuICAgICAgICBjb25zdCBbcHJlQWxpYXMsIC4uLnBvc3RBbGlhc10gPSBhbGlhc2VkVmFsdWUuc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke3VuYWxpYXMocmVmZXJlbmNlcywgcG9zdEFsaWFzLmpvaW4oJ0AnKSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gVGVybVRvVHlwZXMge1xuICAgICdPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5TZWN1cml0eVNjaGVtZXMnID0gJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lJyxcbiAgICAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuQXV0aG9yaXphdGlvbnMnID0gJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLkF1dGhvcml6YXRpb24nLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5SZXZpc2lvbnMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlJldmlzaW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkxpbmtzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5MaW5rJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRXhhbXBsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuRXhhbXBsZVZhbHVlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLk1lc3NhZ2VUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuVmFsdWVFeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlZhbHVlRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlJlc291cmNlRXhjZXB0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5SZXNvdXJjZUV4Y2VwdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5EYXRhTW9kaWZpY2F0aW9uRXhjZXB0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5EYXRhTW9kaWZpY2F0aW9uRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLklzTGFuZ3VhZ2VEZXBlbmRlbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRlcmVmZXJlbmNlYWJsZUlEcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udmVudGlvbmFsSURzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5QZXJtaXNzaW9ucycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUGVybWlzc2lvbicsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRlZmF1bHROYW1lc3BhY2UnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkRGVmYXVsdFZhbHVlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Jc1VSTCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSXNNZWRpYVR5cGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkNvbnRlbnREaXNwb3NpdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGltaXN0aWNDb25jdXJyZW5jeScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkFkZGl0aW9uYWxQcm9wZXJ0aWVzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5BdXRvRXhwYW5kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5BdXRvRXhwYW5kUmVmZXJlbmNlcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTWF5SW1wbGVtZW50JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUeXBlTmFtZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9yZGVyZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlBvc2l0aW9uYWxJbnNlcnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGlvbmFsUGFyYW1ldGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5PcHRpb25hbFBhcmFtZXRlclR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGUnID0gJ0VkbS5Cb29sZWFuJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuU3ltYm9saWNOYW1lJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5TaW1wbGVJZGVudGlmaWVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db25mb3JtYW5jZUxldmVsJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWxUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Bc3luY2hyb25vdXNSZXF1ZXN0c1N1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaENvbnRpbnVlT25FcnJvclN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Jc29sYXRpb25TdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSXNvbGF0aW9uTGV2ZWwnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNyb3NzSm9pblN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1N1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNoYW5nZVRyYWNraW5nJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNoYW5nZVRyYWNraW5nVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ291bnRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ291bnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbmRleGFibGVCeUtleScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ub3BTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2tpcFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db21wdXRlU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlbGVjdFN1cHBvcnQnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VsZWN0U3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaFN1cHBvcnRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU29ydFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRXhwYW5kUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkV4cGFuZFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWFyY2hSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5LZXlBc1NlZ21lbnRTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUXVlcnlTZWdtZW50U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwVXBkYXRlU3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwVXBkYXRlU3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWxldGVSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db2xsZWN0aW9uUHJvcGVydHlSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29sbGVjdGlvblByb3BlcnR5UmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk9wZXJhdGlvblJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkFubm90YXRpb25WYWx1ZXNJblF1ZXJ5U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1vZGlmaWNhdGlvblF1ZXJ5T3B0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Nb2RpZmljYXRpb25RdWVyeU9wdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5SZWFkUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlJlYWRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21IZWFkZXJzJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlcicsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUXVlcnlPcHRpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlcicsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTWVkaWFMb2NhdGlvblVwZGF0ZVN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkdyb3VwYWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFnZ3JlZ2F0YWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMnID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuTGV2ZWxlZEhpZXJhcmNoeScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5SZWN1cnNpdmVIaWVyYXJjaHknID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5SZWN1cnNpdmVIaWVyYXJjaHlUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlcycgPSAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0nID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuRXhjbHVzaXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVmFsdWVzJyA9ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVmFsdWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NdWx0aXBsZU9mJyA9ICdFZG0uRGVjaW1hbCcsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuSXRlbXNPZicgPSAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuSXRlbXNPZlR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5PcGVuUHJvcGVydHlUeXBlQ29uc3RyYWludCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUXVhbGlmaWVkVHlwZU5hbWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5EZXJpdmVkVHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFRlcm1zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFwcGxpY2FibGVUZXJtcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUXVhbGlmaWVkVGVybU5hbWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhJdGVtcycgPSAnRWRtLkludDY0JyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluSXRlbXMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ09yZy5PRGF0YS5NZWFzdXJlcy5WMS5TY2FsZScgPSAnRWRtLkJ5dGUnLFxuICAgICdPcmcuT0RhdGEuTWVhc3VyZXMuVjEuRHVyYXRpb25HcmFudWxhcml0eScgPSAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxLkR1cmF0aW9uR3JhbnVsYXJpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkRpbWVuc2lvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BY2N1bXVsYXRpdmVNZWFzdXJlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuUm9sbGVkVXBQcm9wZXJ0eUNvdW50JyA9ICdFZG0uSW50MTYnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuUGxhbm5pbmdBY3Rpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydGllcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VydmljZVZlcnNpb24nID0gJ0VkbS5JbnQzMicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZXJ2aWNlU2NoZW1hVmVyc2lvbicgPSAnRWRtLkludDMyJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3InID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNMYW5ndWFnZUlkZW50aWZpZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9ybWF0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvcm1hdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNVcHBlckNhc2UnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0N1cnJlbmN5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNVbml0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVW5pdFNwZWNpZmljU2NhbGUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1ByZWNpc2lvbicgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2Vjb25kYXJ5S2V5JyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1pbk9jY3VycycgPSAnRWRtLkludDY0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1heE9jY3VycycgPSAnRWRtLkludDY0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFzc29jaWF0aW9uRW50aXR5JyA9ICdFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZXJpdmVkTmF2aWdhdGlvbicgPSAnRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkQWx3YXlzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RNYXBwaW5nJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0luc3RhbmNlQW5ub3RhdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbGljYXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BcHBsaWNhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGltZXN0YW1wJyA9ICdFZG0uRGF0ZVRpbWVPZmZzZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRXJyb3JSZXNvbHV0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRXJyb3JSZXNvbHV0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcycgPSAnRWRtLkNvbXBsZXhUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLm51bWVyaWNTZXZlcml0eScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk51bWVyaWNNZXNzYWdlU2V2ZXJpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1heGltdW1OdW1lcmljTWVzc2FnZVNldmVyaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTnVtZXJpY01lc3NhZ2VTZXZlcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbCcgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXR0cmlidXRlcycgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWxhdGVkUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdFZG0uQW5ub3RhdGlvblBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSW50ZXJ2YWwnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5JbnRlcnZhbFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLldlYWtSZWZlcmVudGlhbENvbnN0cmFpbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5XZWFrUmVmZXJlbnRpYWxDb25zdHJhaW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc05hdHVyYWxQZXJzb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdE1hcHBpbmdUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckhhbGZ5ZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyV2VlaycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGF5T2ZDYWxlbmRhck1vbnRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkNhbGVuZGFyWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFySGFsZnllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhck1vbnRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckRhdGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFBlcmlvZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclBlcmlvZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFdlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkZpc2NhbFllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJWYXJpYW50JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTXV0dWFsbHlFeGNsdXNpdmVUZXJtJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0QWN0aXZhdGlvblZpYScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRWRpdGFibGVGaWVsZEZvcicgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5RdWFsaWZpZWROYW1lJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZScgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRGVmYXVsdFZhbHVlSGlnaCcgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU29ydE9yZGVyJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU29ydE9yZGVyVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNyZWF0ZWRBdCcgPSAnRWRtLkRhdGVUaW1lT2Zmc2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNyZWF0ZWRCeScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVzZXJJRCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DaGFuZ2VkQXQnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DaGFuZ2VkQnknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySUQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbHlNdWx0aVVuaXRCZWhhdmlvckZvclNvcnRpbmdBbmRGaWx0ZXJpbmcnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkN1cnJlbmN5Q29kZXMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuVW5pdHNPZk1lYXN1cmUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuU3RhbmRhcmRDb2RlJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuRXh0ZXJuYWxDb2RlJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuSXNDb25maWd1cmF0aW9uRGVwcmVjYXRpb25Db2RlJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Db250YWN0VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5BZGRyZXNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuSXNFbWFpbEFkZHJlc3MnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuSXNQaG9uZU51bWJlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudERhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLlRhc2snID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuVGFza0RhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuTWVzc2FnZURhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5FbnRpdHlTZW1hbnRpY3MnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5FbnRpdHlTZW1hbnRpY3NUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRmllbGRTZW1hbnRpY3NUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlQZXJzb25hbCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSWRlbnRpZmljYXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQmFkZ2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkJhZGdlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlN0YXR1c0luZm8nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvbnMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db250YWN0cycgPSAnRWRtLkFubm90YXRpb25QYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWVkaWFSZXNvdXJjZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWVkaWFSZXNvdXJjZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUEknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLktQSVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlZhbHVlQ3JpdGljYWxpdHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlZhbHVlQ3JpdGljYWxpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlMYWJlbHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5TGFiZWxUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uRmllbGRzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5RdWlja1ZpZXdGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tDcmVhdGVGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmlsdGVyRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWZlcmVuY2VGYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRoaW5nUGVyc3BlY3RpdmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzU3VtbWFyeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFydE9mUHJldmlldycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWFwJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HYWxsZXJ5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NdWx0aUxpbmVUZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JbXBvcnRhbmNlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JbXBvcnRhbmNlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JlYXRlSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5VcGRhdGVIaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRlbGV0ZUhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkVtcGhhc2l6ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9yZGVyQnknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlJlY29tbWVuZGF0aW9uTGlzdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5IVE1MNS52MS5Dc3NEZWZhdWx0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHNUeXBlJ1xufVxuXG4vKipcbiAqIERpZmZlcmVudGlhdGUgYmV0d2VlbiBhIENvbXBsZXhUeXBlIGFuZCBhIFR5cGVEZWZpbml0aW9uLlxuICogQHBhcmFtIGNvbXBsZXhUeXBlRGVmaW5pdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBjb21wbGV4IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleFR5cGVEZWZpbml0aW9uKFxuICAgIGNvbXBsZXhUeXBlRGVmaW5pdGlvbj86IENvbXBsZXhUeXBlIHwgVHlwZURlZmluaXRpb25cbik6IGNvbXBsZXhUeXBlRGVmaW5pdGlvbiBpcyBDb21wbGV4VHlwZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgISFjb21wbGV4VHlwZURlZmluaXRpb24gJiYgY29tcGxleFR5cGVEZWZpbml0aW9uLl90eXBlID09PSAnQ29tcGxleFR5cGUnICYmICEhY29tcGxleFR5cGVEZWZpbml0aW9uLnByb3BlcnRpZXNcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXNEZWNpbWFsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlT2YoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIEFubm90YXRpb25QYXRoRXhwcmVzc2lvbixcbiAgICBBbm5vdGF0aW9uUmVjb3JkLFxuICAgIEFubm90YXRpb25UZXJtLFxuICAgIEV4cHJlc3Npb24sXG4gICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb24sXG4gICAgUGF0aEV4cHJlc3Npb24sXG4gICAgUHJvcGVydHlQYXRoRXhwcmVzc2lvbixcbiAgICBSYXdBbm5vdGF0aW9uLFxuICAgIFJlZmVyZW5jZVxufSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5pbXBvcnQgeyB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUmV2ZXJ0IGFuIG9iamVjdCB0byBpdHMgcmF3IHR5cGUgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCByZWZlcmVuY2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSkge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIENvbGxlY3Rpb246IHZhbHVlLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RlY2ltYWw/LigpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNpbWFsJyxcbiAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNTdHJpbmc/LigpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLnZhbHVlT2YoKS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmFsdWVNYXRjaGVzLmxlbmd0aCA+IDEgJiYgcmVmZXJlbmNlcy5maW5kKChyZWYpID0+IHJlZi5hbGlhcyA9PT0gdmFsdWVNYXRjaGVzWzBdKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICBFbnVtTWVtYmVyOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW50Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0Zsb2F0Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQnLFxuICAgICAgICAgICAgRmxvYXQ6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNEYXRlPy4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGF0ZScsXG4gICAgICAgICAgICBEYXRlOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzQm9vbGVhbj8uKCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2wnLFxuICAgICAgICAgICAgQm9vbDogdmFsdWUudmFsdWVPZigpID09PSAndHJ1ZSdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdQYXRoJykge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUGF0aCcsXG4gICAgICAgICAgICBQYXRoOiB2YWx1ZS5wYXRoXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICBBbm5vdGF0aW9uUGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdBcHBseScpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0FwcGx5JyxcbiAgICAgICAgICAgIEFwcGx5OiB2YWx1ZS5BcHBseVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ051bGwnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdOdWxsJ1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICBQcm9wZXJ0eVBhdGg6IHZhbHVlLnZhbHVlXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJyRUeXBlJykpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1JlY29yZCcsXG4gICAgICAgICAgICBSZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSBhcyBBbm5vdGF0aW9uUmVjb3JkXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV2ZXJ0IGEgdmFsdWUgdG8gaXRzIHJhdyB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiByZXZlcnRWYWx1ZVRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3RvciA9IHZhbHVlPy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHN3aXRjaCAodmFsdWVDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY29uc3QgdmFsdWVNYXRjaGVzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHZhbHVlTWF0Y2hlcy5sZW5ndGggPiAxICYmIHJlZmVyZW5jZXMuZmluZCgocmVmKSA9PiByZWYuYWxpYXMgPT09IHZhbHVlTWF0Y2hlc1swXSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgRW51bU1lbWJlcjogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZzogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdCb29sJyxcbiAgICAgICAgICAgICAgICBCb29sOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkgPT09IHZhbHVlLnRvRml4ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlc3VsdCA9IHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgcmVzdHJpY3RlZEtleXMgPSBbJyRUeXBlJywgJ3Rlcm0nLCAnX19zb3VyY2UnLCAncXVhbGlmaWVyJywgJ0FjdGlvblRhcmdldCcsICdmdWxseVF1YWxpZmllZE5hbWUnLCAnYW5ub3RhdGlvbnMnXTtcblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgZW1iZWRkZWQgYW5ub3RhdGlvbnMgdG8gdGhlaXIgcmF3IHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGN1cnJlbnRBbm5vdGF0aW9ucyB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvbnMgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gYWRkIHRoZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKFxuICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLFxuICAgIGN1cnJlbnRBbm5vdGF0aW9uczogYW55LFxuICAgIHRhcmdldEFubm90YXRpb25zOiBSYXdBbm5vdGF0aW9uW11cbikge1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRBbm5vdGF0aW9ucylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfYW5ub3RhdGlvbnMnKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFubm90YXRpb24gPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBjdXJyZW50QW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBbm5vdGF0aW9uLnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5hbGlhc2VkVGVybSA9IHVuYWxpYXMocmVmZXJlbmNlcywgYCR7a2V5fS4ke3Rlcm19YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmFsaWFzZWRUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaWZpZWRTcGxpdCA9IHVuYWxpYXNlZFRlcm0uc3BsaXQoJyMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24udGVybSA9IHF1YWxpZmllZFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgQW5ub3RhdGlvbiB3aXRoIGEgcXVhbGlmaWVyLCBub3Qgc3VyZSB3aGVuIHRoYXQgY2FuIGhhcHBlbiBpbiByZWFsIHNjZW5hcmlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24ucXVhbGlmaWVyID0gcXVhbGlmaWVkU3BsaXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0QW5ub3RhdGlvbnMucHVzaChwYXJzZWRBbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJhdyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VcbiAqIEBwYXJhbSBjb2xsZWN0aW9uSXRlbSB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0aGUgcmF3IHR5cGUgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvUmF3VHlwZShcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSxcbiAgICBjb2xsZWN0aW9uSXRlbTogYW55XG4pOlxuICAgIHwgQW5ub3RhdGlvblJlY29yZFxuICAgIHwgc3RyaW5nXG4gICAgfCBQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG4gICAgfCBQYXRoRXhwcmVzc2lvblxuICAgIHwgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb25cbiAgICB8IEFubm90YXRpb25QYXRoRXhwcmVzc2lvblxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbkl0ZW07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBSZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IG91dEl0ZW06IEFubm90YXRpb25SZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbkl0ZW0uJFR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZXM6IFtdIGFzIGFueVtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goKGNvbGxlY3Rpb25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZEtleXMuaW5kZXhPZihjb2xsZWN0aW9uS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2xsZWN0aW9uSXRlbVtjb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SXRlbS5wcm9wZXJ0eVZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbGxlY3Rpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpIGFzIEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uS2V5ID09PSAnYW5ub3RhdGlvbnMnICYmIE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtW2NvbGxlY3Rpb25LZXldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEl0ZW0uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0QW5ub3RhdGlvbnNUb1Jhd1R5cGUocmVmZXJlbmNlcywgY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV0sIG91dEl0ZW0uYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dEl0ZW07XG4gICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgUHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZlcnQgYW4gYW5ub3RhdGlvbiB0ZXJtIHRvIGl0J3MgZ2VuZXJpYyBvciByYXcgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRlcm0gdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVydFRlcm1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uVGVybTxhbnk+KTogUmF3QW5ub3RhdGlvbiB7XG4gICAgY29uc3QgYmFzZUFubm90YXRpb246IFJhd0Fubm90YXRpb24gPSB7XG4gICAgICAgIHRlcm06IGFubm90YXRpb24udGVybSxcbiAgICAgICAgcXVhbGlmaWVyOiBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvblxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbnMnKSAmJiBPYmplY3Qua2V5cygoYW5ub3RhdGlvbiBhcyBhbnkpLmFubm90YXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uIG9uIGEgY29sbGVjdGlvbiBpdHNlbGYsIG5vdCBzdXJlIHdoZW4gdGhhdCBoYXBwZW5zIGlmIGF0IGFsbFxuICAgICAgICAgICAgYmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKHJlZmVyZW5jZXMsIChhbm5vdGF0aW9uIGFzIGFueSkuYW5ub3RhdGlvbnMsIGJhc2VBbm5vdGF0aW9uLmFubm90YXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUFubm90YXRpb24sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBhbm5vdGF0aW9uLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmhhc093blByb3BlcnR5KCckVHlwZScpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCByZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm90YXRpb24pIGFzIGFueSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbikgfTtcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NSk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
1998
+
1947
1999
  return AnnotationConverter;
1948
- },true);
2000
+ },true);
2001
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNi4zL25vZGVfbW9kdWxlcy9Ac2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyL3NyYy9jb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvd3JpdGViYWNrLnRzIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci93ZWJwYWNrL3N0YXJ0dXAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXdDQSx3Q0FhaUI7QUFFakI7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXREOzs7Ozs7R0FNRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBaUIsRUFBRSxhQUFrQjtJQUMzRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxH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QyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBRSxVQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckcsMEVBQTBFO1lBQzFFLGNBQWMsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLDBCQUEwQixDQUFDLFVBQVUsRUFBRyxVQUFrQixDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdkc7UUFDRCxPQUFPO1lBQ0gsR0FBRyxjQUFjO1lBQ2pCLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQVU7U0FDakcsQ0FBQztLQUNMO1NBQU0sSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNDLE9BQU8sRUFBRSxHQUFHLGNBQWMsRUFBRSxNQUFNLEVBQUUsNkJBQTZCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBUSxFQUFFLENBQUM7S0FDdEc7U0FBTTtRQUNILE9BQU8sRUFBRSxHQUFHLGNBQWMsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7S0FDckY7QUFDTCxDQUFDO0FBckJELDBEQXFCQzs7Ozs7OztVQzNSRDtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7O1VDdEJBO1VBQ0E7VUFDQTtVQUNBIiwiZmlsZSI6IkFubm90YXRpb25Db252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIEFjdGlvbixcbiAgICBBY3Rpb25JbXBvcnQsXG4gICAgQWN0aW9uUGFyYW1ldGVyLFxuICAgIEFubm90YXRpb24sXG4gICAgQW5ub3RhdGlvbkxpc3QsXG4gICAgQW5ub3RhdGlvblJlY29yZCxcbiAgICBBcnJheVdpdGhJbmRleCxcbiAgICBCYXNlTmF2aWdhdGlvblByb3BlcnR5LFxuICAgIENvbXBsZXhUeXBlLFxuICAgIENvbnZlcnRlZE1ldGFkYXRhLFxuICAgIEVudGl0eUNvbnRhaW5lcixcbiAgICBFbnRpdHlTZXQsXG4gICAgRW50aXR5VHlwZSxcbiAgICBFeHByZXNzaW9uLFxuICAgIEZ1bGx5UXVhbGlmaWVkTmFtZSxcbiAgICBOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgUHJvcGVydHksXG4gICAgUHJvcGVydHlQYXRoLFxuICAgIFJhd0FjdGlvbixcbiAgICBSYXdBY3Rpb25JbXBvcnQsXG4gICAgUmF3QW5ub3RhdGlvbixcbiAgICBSYXdDb21wbGV4VHlwZSxcbiAgICBSYXdFbnRpdHlDb250YWluZXIsXG4gICAgUmF3RW50aXR5U2V0LFxuICAgIFJhd0VudGl0eVR5cGUsXG4gICAgUmF3TWV0YWRhdGEsXG4gICAgUmF3UHJvcGVydHksXG4gICAgUmF3U2NoZW1hLFxuICAgIFJhd1NpbmdsZXRvbixcbiAgICBSYXdUeXBlRGVmaW5pdGlvbixcbiAgICBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSZWZlcmVuY2UsXG4gICAgUmVtb3ZlQW5ub3RhdGlvbkFuZFR5cGUsXG4gICAgUmVzb2x1dGlvblRhcmdldCxcbiAgICBTaW5nbGV0b24sXG4gICAgVHlwZURlZmluaXRpb25cbn0gZnJvbSAnQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWZlcmVuY2VzV2l0aE1hcCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBhZGRHZXRCeVZhbHVlLFxuICAgIGFsaWFzLFxuICAgIERlY2ltYWwsXG4gICAgZGVmYXVsdFJlZmVyZW5jZXMsXG4gICAgRW51bUlzRmxhZyxcbiAgICBsYXp5LFxuICAgIHNwbGl0QXRGaXJzdCxcbiAgICBzcGxpdEF0TGFzdCxcbiAgICBzdWJzdHJpbmdCZWZvcmVGaXJzdCxcbiAgICBzdWJzdHJpbmdCZWZvcmVMYXN0LFxuICAgIFRlcm1Ub1R5cGVzLFxuICAgIHVuYWxpYXNcbn0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogU3ltYm9sIHRvIGV4dGVuZCBhbiBhbm5vdGF0aW9uIHdpdGggdGhlIHJlZmVyZW5jZSB0byBpdHMgdGFyZ2V0LlxuICovXG5jb25zdCBBTk5PVEFUSU9OX1RBUkdFVCA9IFN5bWJvbCgnQW5ub3RhdGlvbiBUYXJnZXQnKTtcblxuLyoqXG4gKiBBcHBlbmQgYW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIHZpc2l0ZWQgb2JqZWN0cyBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3QuXG4gKlxuICogQHBhcmFtIG9iamVjdFBhdGggICAgVGhlIGxpc3Qgb2YgdmlzaXRlZCBvYmplY3RzXG4gKiBAcGFyYW0gdmlzaXRlZE9iamVjdCBUaGUgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiB2aXNpdGVkIG9iamVjdHNcbiAqL1xuZnVuY3Rpb24gYXBwZW5kT2JqZWN0UGF0aChvYmplY3RQYXRoOiBhbnlbXSwgdmlzaXRlZE9iamVjdDogYW55KTogYW55W10ge1xuICAgIGlmIChvYmplY3RQYXRoW29iamVjdFBhdGgubGVuZ3RoIC0gMV0gIT09IHZpc2l0ZWRPYmplY3QpIHtcbiAgICAgICAgb2JqZWN0UGF0aC5wdXNoKHZpc2l0ZWRPYmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0UGF0aDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIChwb3NzaWJseSByZWxhdGl2ZSkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgICAgICAgQ29udmVydGVyXG4gKiBAcGFyYW0gc3RhcnRFbGVtZW50ICAgICAgVGhlIHN0YXJ0aW5nIHBvaW50IGluIGNhc2Ugb2YgcmVsYXRpdmUgcGF0aCByZXNvbHV0aW9uXG4gKiBAcGFyYW0gcGF0aCAgICAgICAgICAgICAgVGhlIHBhdGggdG8gcmVzb2x2ZVxuICogQHBhcmFtIGFubm90YXRpb25zVGVybSAgIE9ubHkgZm9yIGVycm9yIHJlcG9ydGluZzogVGhlIGFubm90YXRpb24gdGVybVxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc29sdmVkIHRhcmdldCBhbmQgdGhlIGVsZW1lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIHdoaWxlIGdldHRpbmcgdG8gdGhlIHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldDxUPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBzdGFydEVsZW1lbnQ6IGFueSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYW5ub3RhdGlvbnNUZXJtPzogc3RyaW5nXG4pOiBSZXNvbHV0aW9uVGFyZ2V0PFQ+IHtcbiAgICAvLyBhYnNvbHV0ZSBwYXRocyBhbHdheXMgc3RhcnQgYXQgdGhlIGVudGl0eSBjb250YWluZXJcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpO1xuICAgICAgICBzdGFydEVsZW1lbnQgPSB1bmRlZmluZWQ7IC8vIHdpbGwgcmVzb2x2ZSB0byB0aGUgZW50aXR5IGNvbnRhaW5lciAoc2VlIGJlbG93KVxuICAgIH1cblxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoJy8nKS5yZWR1Y2UoKHRhcmdldFBhdGgsIHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICAgICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBhbm5vdGF0aW9uXG4gICAgICAgICAgICBjb25zdCBbcGF0aFBhcnQsIGFubm90YXRpb25QYXJ0XSA9IHNwbGl0QXRGaXJzdChzZWdtZW50LCAnQCcpO1xuICAgICAgICAgICAgdGFyZ2V0UGF0aC5wdXNoKHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaChgQCR7YW5ub3RhdGlvblBhcnR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gICAgfSwgW10gYXMgc3RyaW5nW10pO1xuXG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHJlc29sdXRpb25cbiAgICBpZiAoc3RhcnRFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbm8gc3RhcnRpbmcgcG9pbnQgZ2l2ZW46IHN0YXJ0IGF0IHRoZSBlbnRpdHkgY29udGFpbmVyXG4gICAgICAgIHN0YXJ0RWxlbWVudCA9IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlDb250YWluZXIoKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RWxlbWVudFtBTk5PVEFUSU9OX1RBUkdFVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBhbm5vdGF0aW9uOiBzdGFydCBhdCB0aGUgYW5ub3RhdGlvbiB0YXJnZXRcbiAgICAgICAgc3RhcnRFbGVtZW50ID0gc3RhcnRFbGVtZW50W0FOTk9UQVRJT05fVEFSR0VUXTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RWxlbWVudC5fdHlwZSA9PT0gJ1Byb3BlcnR5Jykge1xuICAgICAgICAvLyBwcm9wZXJ0eTogc3RhcnQgYXQgdGhlIGVudGl0eSB0eXBlIG9yIGNvbXBsZXggdHlwZSB0aGUgcHJvcGVydHkgYmVsb25ncyB0b1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50RlFOID0gc3Vic3RyaW5nQmVmb3JlRmlyc3Qoc3RhcnRFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSwgJy8nKTtcbiAgICAgICAgc3RhcnRFbGVtZW50ID1cbiAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlUeXBlKHBhcmVudEVsZW1lbnRGUU4pID8/IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRDb21wbGV4VHlwZShwYXJlbnRFbGVtZW50RlFOKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBwYXRoU2VnbWVudHMucmVkdWNlKFxuICAgICAgICAoY3VycmVudDogUmVzb2x1dGlvblRhcmdldDxhbnk+LCBzZWdtZW50OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubWVzc2FnZXMucHVzaCh7IG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudC50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSBhcHBlbmRPYmplY3RQYXRoKGN1cnJlbnQub2JqZWN0UGF0aCwgY3VycmVudC50YXJnZXQpO1xuXG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uXG4gICAgICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKCdAJykgJiYgc2VnbWVudCAhPT0gJ0AkdWk1Lm92ZXJsb2FkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFt2b2NhYnVsYXJ5QWxpYXMsIHRlcm1dID0gY29udmVydGVyLnNwbGl0VGVybShzZWdtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gY3VycmVudC50YXJnZXQuYW5ub3RhdGlvbnNbdm9jYWJ1bGFyeUFsaWFzLnN1YnN0cmluZygxKV0/Llt0ZXJtXTtcblxuICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQW5ub3RhdGlvbiAnJHtzZWdtZW50LnN1YnN0cmluZygxKX0nIG5vdCBmb3VuZCBvbiAke2N1cnJlbnQudGFyZ2V0Ll90eXBlfSAnJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZVxuICAgICAgICAgICAgICAgICAgICB9J2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAkUGF0aCAvICRBbm5vdGF0aW9uUGF0aCBzeW50YXhcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnRhcmdldC4kdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJyRBbm5vdGF0aW9uUGF0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IGN1cnJlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gJyRQYXRoJykge1xuICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gY3VycmVudC50YXJnZXQucGF0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ViUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YlRhcmdldCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50LnRhcmdldFtBTk5PVEFUSU9OX1RBUkdFVF0sIHN1YlBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBzdWJUYXJnZXQub2JqZWN0UGF0aC5mb3JFYWNoKCh2aXNpdGVkU3ViT2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudC5vYmplY3RQYXRoLmluY2x1ZGVzKHZpc2l0ZWRTdWJPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gYXBwZW5kT2JqZWN0UGF0aChjdXJyZW50Lm9iamVjdFBhdGgsIHZpc2l0ZWRTdWJPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnRhcmdldCA9IHN1YlRhcmdldC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQub2JqZWN0UGF0aCA9IGFwcGVuZE9iamVjdFBhdGgoY3VycmVudC5vYmplY3RQYXRoLCBjdXJyZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHJhdmVyc2UgYmFzZWQgb24gdGhlIGVsZW1lbnQgdHlwZVxuICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LnRhcmdldD8uX3R5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRpdHlDb250YWluZXInOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEVudGl0eUNvbnRhaW5lcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnIHx8IHNlZ21lbnQgPT09IHRoaXNFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGVsZW1lbnQ6IEVudGl0eVNldCwgU2luZ2xldG9uIG9yIEFjdGlvbkltcG9ydD9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCBBY3Rpb25JbXBvcnQgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LmVudGl0eVNldHMuYnlfbmFtZShzZWdtZW50KSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LnNpbmdsZXRvbnMuYnlfbmFtZShzZWdtZW50KSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LmFjdGlvbkltcG9ydHMuYnlfbmFtZShzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBuZXh0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGl0eVNldCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU2luZ2xldG9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEVudGl0eVNldCB8IFNpbmdsZXRvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJycgfHwgc2VnbWVudCA9PT0gJyRUeXBlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgUGF0aCBhZnRlciBhbiBFbnRpdHlTZXQgb3IgU2luZ2xldG9uIG1lYW5zIEVudGl0eVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gdGhpc0VsZW1lbnQuZW50aXR5VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSB0aGlzRWxlbWVudC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5ncztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgcmVzb2x2aW5nIGF0IHRoZSBFbnRpdHlTZXQncyBvciBTaW5nbGV0b24ncyB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCB0aGlzRWxlbWVudC5lbnRpdHlUeXBlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSByZXN1bHQub2JqZWN0UGF0aC5yZWR1Y2UoYXBwZW5kT2JqZWN0UGF0aCwgY3VycmVudC5vYmplY3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50aXR5VHlwZSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNFbGVtZW50ID0gY3VycmVudC50YXJnZXQgYXMgRW50aXR5VHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnIHx8IHNlZ21lbnQgPT09ICckVHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzRWxlbWVudC5lbnRpdHlQcm9wZXJ0aWVzLmJ5X25hbWUoc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnRhcmdldCA9IHByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uUHJvcGVydHkgPSB0aGlzRWxlbWVudC5uYXZpZ2F0aW9uUHJvcGVydGllcy5ieV9uYW1lKHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmF2aWdhdGlvblByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzRWxlbWVudC5hY3Rpb25zW3NlZ21lbnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQWN0aW9uSW1wb3J0Jzoge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSByZXNvbHZpbmcgYXQgdGhlIEFjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudC50YXJnZXQuYWN0aW9uLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSByZXN1bHQub2JqZWN0UGF0aC5yZWR1Y2UoYXBwZW5kT2JqZWN0UGF0aCwgY3VycmVudC5vYmplY3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnQWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEFjdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICdAJHVpNS5vdmVybG9hZCcgfHwgc2VnbWVudCA9PT0gJzAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSAnJFBhcmFtZXRlcicgJiYgdGhpc0VsZW1lbnQuaXNCb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSB0aGlzRWxlbWVudC5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzRWxlbWVudC5wYXJhbWV0ZXJzW3NlZ21lbnQgYXMgYW55XSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0VsZW1lbnQucGFyYW1ldGVycy5maW5kKChwYXJhbTogQWN0aW9uUGFyYW1ldGVyKSA9PiBwYXJhbS5uYW1lID09PSBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNFbGVtZW50ID0gY3VycmVudC50YXJnZXQgYXMgUHJvcGVydHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBvZiB0aGUgQ29tcGxleFR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzRWxlbWVudC50YXJnZXRUeXBlIGFzIENvbXBsZXhUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdHlwZS5wcm9wZXJ0aWVzLmJ5X25hbWUoc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gcHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IHR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuYnlfbmFtZShzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdGlvblByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmF2aWdhdGlvblByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdBY3Rpb25QYXJhbWV0ZXInOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkVHlwZSA9IChjdXJyZW50LnRhcmdldCBhcyBBY3Rpb25QYXJhbWV0ZXIpLnR5cGVSZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgcmVmZXJlbmNlZFR5cGUsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gcmVzdWx0Lm9iamVjdFBhdGgucmVkdWNlKGFwcGVuZE9iamVjdFBhdGgsIGN1cnJlbnQub2JqZWN0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ05hdmlnYXRpb25Qcm9wZXJ0eSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGF0IHRoZSBOYXZpZ2F0aW9uUHJvcGVydHkncyB0YXJnZXQgdHlwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgKGN1cnJlbnQudGFyZ2V0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gcmVzdWx0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gcmVzdWx0Lm9iamVjdFBhdGgucmVkdWNlKGFwcGVuZE9iamVjdFBhdGgsIGN1cnJlbnQub2JqZWN0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnRhcmdldFtzZWdtZW50XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBjdXJyZW50LnRhcmdldFtzZWdtZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQub2JqZWN0UGF0aCA9IGFwcGVuZE9iamVjdFBhdGgoY3VycmVudC5vYmplY3RQYXRoLCBjdXJyZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgICAgICAgICAgYEVsZW1lbnQgJyR7c2VnbWVudH0nIG5vdCBmb3VuZCBhdCAke2N1cnJlbnQudGFyZ2V0Ll90eXBlfSAnJHtjdXJyZW50LnRhcmdldC5mdWxseVF1YWxpZmllZE5hbWV9J2BcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0OiBzdGFydEVsZW1lbnQsIG9iamVjdFBhdGg6IFtdLCBtZXNzYWdlczogW10gfVxuICAgICk7XG5cbiAgICAvLyBEaWFnbm9zdGljc1xuICAgIHJlc3VsdC5tZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiBjb252ZXJ0ZXIubG9nRXJyb3IobWVzc2FnZS5tZXNzYWdlKSk7XG4gICAgaWYgKCFyZXN1bHQudGFyZ2V0KSB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uc1Rlcm0pIHtcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gaW5mZXJUeXBlRnJvbVRlcm0oY29udmVydGVyLCBhbm5vdGF0aW9uc1Rlcm0sIHN0YXJ0RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zVGVybSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxSZWNvcmQgVHlwZSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uUGF0aCA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb24gVGVybSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoU2VnbWVudHNbMF0gK1xuICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8UHJvcGVydHlWYWx1ZSAgUGF0aD0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTZWdtZW50c1sxXSArXG4gICAgICAgICAgICAgICAgICAgICc+J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVHlwZWd1YXJkIHRvIGNoZWNrIGlmIHRoZSBwYXRoIGNvbnRhaW5zIGFuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHBhdGhTdHIgdGhlIHBhdGggdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW4gYW5ub3RhdGlvbiBpbiB0aGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gaXNBbm5vdGF0aW9uUGF0aChwYXRoU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0aFN0ci5pbmNsdWRlcygnQCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVZhbHVlKFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGFueSxcbiAgICBjdXJyZW50VGVybTogc3RyaW5nLFxuICAgIGN1cnJlbnRQcm9wZXJ0eTogc3RyaW5nLFxuICAgIGN1cnJlbnRTb3VyY2U6IHN0cmluZyxcbiAgICBwcm9wZXJ0eVZhbHVlOiBFeHByZXNzaW9uLFxuICAgIHZhbHVlRlFOOiBzdHJpbmdcbikge1xuICAgIGlmIChwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eVZhbHVlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLlN0cmluZztcbiAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkludDtcbiAgICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5Cb29sO1xuICAgICAgICBjYXNlICdEZWNpbWFsJzpcbiAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHByb3BlcnR5VmFsdWUuRGVjaW1hbCk7XG4gICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWUuRGF0ZTtcbiAgICAgICAgY2FzZSAnRW51bU1lbWJlcic6XG4gICAgICAgICAgICBjb25zdCBhbGlhc2VkRW51bSA9IGNvbnZlcnRlci5hbGlhcyhwcm9wZXJ0eVZhbHVlLkVudW1NZW1iZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRFbnVtID0gYWxpYXNlZEVudW0uc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGlmIChzcGxpdEVudW1bMF0gJiYgRW51bUlzRmxhZ1tzdWJzdHJpbmdCZWZvcmVGaXJzdChzcGxpdEVudW1bMF0sICcvJyldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0RW51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbGlhc2VkRW51bTtcblxuICAgICAgICBjYXNlICdQcm9wZXJ0eVBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiB2YWx1ZUZRTixcbiAgICAgICAgICAgICAgICAkdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudFRhcmdldCwgcHJvcGVydHlWYWx1ZS5Qcm9wZXJ0eVBhdGgsIGN1cnJlbnRUZXJtKS50YXJnZXQsXG4gICAgICAgICAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogcmVzb2x2ZVRhcmdldChjb252ZXJ0ZXIsIGN1cnJlbnRUYXJnZXQsIHByb3BlcnR5VmFsdWUuTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgY3VycmVudFRlcm0pXG4gICAgICAgICAgICAgICAgICAgIC50YXJnZXQsXG4gICAgICAgICAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnQW5ub3RhdGlvblBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIudW5hbGlhcyhwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRlcm1cbiAgICAgICAgICAgICAgICApLnRhcmdldCxcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm06IGN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIFtBTk5PVEFUSU9OX1RBUkdFVF06IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwcm9wZXJ0eVZhbHVlLlBhdGgsIGN1cnJlbnRUZXJtKS50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoaXNBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eVZhbHVlLlBhdGgpKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5saW5lIHRoZSB0YXJnZXRcbiAgICAgICAgICAgICAgICByZXR1cm4gJHRhcmdldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BhdGgnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwcm9wZXJ0eVZhbHVlLlBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6ICR0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIFtBTk5PVEFUSU9OX1RBUkdFVF06IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5SZWNvcmQsXG4gICAgICAgICAgICAgICAgdmFsdWVGUU5cbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHksXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLkNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdmFsdWVGUU5cbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ0FwcGx5JzpcbiAgICAgICAgY2FzZSAnTnVsbCc6XG4gICAgICAgIGNhc2UgJ05vdCc6XG4gICAgICAgIGNhc2UgJ0VxJzpcbiAgICAgICAgY2FzZSAnTmUnOlxuICAgICAgICBjYXNlICdHdCc6XG4gICAgICAgIGNhc2UgJ0dlJzpcbiAgICAgICAgY2FzZSAnTHQnOlxuICAgICAgICBjYXNlICdMZSc6XG4gICAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgY2FzZSAnQW5kJzpcbiAgICAgICAgY2FzZSAnT3InOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEluZmVyIHRoZSB0eXBlIG9mIGEgdGVybSBiYXNlZCBvbiBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgICAgICAgQ29udmVydGVyXG4gKiBAcGFyYW0gYW5ub3RhdGlvbnNUZXJtICAgVGhlIGFubm90YXRpb24gdGVybVxuICogQHBhcmFtIGFubm90YXRpb25UYXJnZXQgIFRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICogQHBhcmFtIGN1cnJlbnRQcm9wZXJ0eSAgIFRoZSBjdXJyZW50IHByb3BlcnR5IG9mIHRoZSByZWNvcmRcbiAqIEByZXR1cm5zIFRoZSBpbmZlcnJlZCB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlclR5cGVGcm9tVGVybShcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBhbm5vdGF0aW9uc1Rlcm06IHN0cmluZyxcbiAgICBhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsXG4gICAgY3VycmVudFByb3BlcnR5Pzogc3RyaW5nXG4pIHtcbiAgICBsZXQgdGFyZ2V0VHlwZSA9IChUZXJtVG9UeXBlcyBhcyBhbnkpW2Fubm90YXRpb25zVGVybV07XG4gICAgaWYgKGN1cnJlbnRQcm9wZXJ0eSkge1xuICAgICAgICBhbm5vdGF0aW9uc1Rlcm0gPSBgJHtzdWJzdHJpbmdCZWZvcmVMYXN0KGFubm90YXRpb25zVGVybSwgJy4nKX0uJHtjdXJyZW50UHJvcGVydHl9YDtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IChUZXJtVG9UeXBlcyBhcyBhbnkpW2Fubm90YXRpb25zVGVybV07XG4gICAgfVxuXG4gICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICBgVGhlIHR5cGUgb2YgdGhlIHJlY29yZCB1c2VkIHdpdGhpbiB0aGUgdGVybSAke2Fubm90YXRpb25zVGVybX0gd2FzIG5vdCBkZWZpbmVkIGFuZCB3YXMgaW5mZXJyZWQgYXMgJHt0YXJnZXRUeXBlfS5cbkhpbnQ6IElmIHBvc3NpYmxlLCB0cnkgdG8gbWFpbnRhaW4gdGhlIFR5cGUgcHJvcGVydHkgZm9yIGVhY2ggUmVjb3JkLlxuPEFubm90YXRpb25zIFRhcmdldD1cIiR7YW5ub3RhdGlvblRhcmdldH1cIj5cblx0PEFubm90YXRpb24gVGVybT1cIiR7YW5ub3RhdGlvbnNUZXJtfVwiPlxuXHRcdDxSZWNvcmQ+Li4uPC9SZWNvcmQ+XG5cdDwvQW5ub3RhdGlvbj5cbjwvQW5ub3RhdGlvbnM+YFxuICAgICk7XG5cbiAgICByZXR1cm4gdGFyZ2V0VHlwZTtcbn1cblxuZnVuY3Rpb24gaXNEYXRhRmllbGRXaXRoRm9yQWN0aW9uKGFubm90YXRpb25Db250ZW50OiBhbnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBhbm5vdGF0aW9uQ29udGVudC5oYXNPd25Qcm9wZXJ0eSgnQWN0aW9uJykgJiZcbiAgICAgICAgKGFubm90YXRpb25Db250ZW50LiRUeXBlID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uJyB8fFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuJFR5cGUgPT09ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoQWN0aW9uJylcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZFR5cGUoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb3JkRGVmaW5pdGlvbjogQW5ub3RhdGlvblJlY29yZFxuKSB7XG4gICAgbGV0IHRhcmdldFR5cGU7XG4gICAgaWYgKCFyZWNvcmREZWZpbml0aW9uLnR5cGUgJiYgY3VycmVudFRlcm0pIHtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKGNvbnZlcnRlciwgY3VycmVudFRlcm0sIGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjdXJyZW50UHJvcGVydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyZWNvcmREZWZpbml0aW9uLnR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0VHlwZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY3VycmVudFNvdXJjZTogc3RyaW5nLFxuICAgIGFubm90YXRpb25SZWNvcmQ6IEFubm90YXRpb25SZWNvcmQsXG4gICAgY3VycmVudEZRTjogc3RyaW5nXG4pIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uVGVybTogYW55ID0ge1xuICAgICAgICAkVHlwZTogcGFyc2VSZWNvcmRUeXBlKGNvbnZlcnRlciwgY3VycmVudFRlcm0sIGN1cnJlbnRUYXJnZXQsIGN1cnJlbnRQcm9wZXJ0eSwgYW5ub3RhdGlvblJlY29yZCksXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogY3VycmVudEZRTixcbiAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgIH07XG5cbiAgICAvLyBhbm5vdGF0aW9ucyBvbiB0aGUgcmVjb3JkXG4gICAgbGF6eShhbm5vdGF0aW9uVGVybSwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAvLyBiZSBncmFjZWZ1bCB3aGVuIHJlc29sdmluZyBhbm5vdGF0aW9ucyBvbiBhbm5vdGF0aW9uczogU29tZXRpbWVzIHRoZXkgYXJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHNvbWV0aW1lcyB0aGV5XG4gICAgICAgIC8vIGFyZSBwYXJ0IG9mIHRoZSBnbG9iYWwgYW5ub3RhdGlvbnMgbGlzdFxuICAgICAgICBsZXQgYW5ub3RhdGlvbnM7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uUmVjb3JkLmFubm90YXRpb25zICYmIGFubm90YXRpb25SZWNvcmQuYW5ub3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uUmVjb3JkLmFubm90YXRpb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbY3VycmVudEZRTl0/LmFubm90YXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgYW5ub3RhdGlvbnM/LmZvckVhY2goKGFubm90YXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbi50YXJnZXQgPSBjdXJyZW50RlFOO1xuICAgICAgICAgICAgYW5ub3RhdGlvbi5fX3NvdXJjZSA9IGN1cnJlbnRTb3VyY2U7XG4gICAgICAgICAgICBhbm5vdGF0aW9uW0FOTk9UQVRJT05fVEFSR0VUXSA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGAke2N1cnJlbnRGUU59QCR7YW5ub3RhdGlvbi50ZXJtfWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVBbm5vdGF0aW9uc09iamVjdChjb252ZXJ0ZXIsIGFubm90YXRpb25UZXJtLCBhbm5vdGF0aW9ucyA/PyBbXSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbm5vdGF0aW9uQ29udGVudCA9IGFubm90YXRpb25SZWNvcmQucHJvcGVydHlWYWx1ZXM/LnJlZHVjZSgoYW5ub3RhdGlvbkNvbnRlbnQsIHByb3BlcnR5VmFsdWUpID0+IHtcbiAgICAgICAgbGF6eShhbm5vdGF0aW9uQ29udGVudCwgcHJvcGVydHlWYWx1ZS5uYW1lLCAoKSA9PlxuICAgICAgICAgICAgcGFyc2VWYWx1ZShcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgICAgIGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNvbnRlbnQ7XG4gICAgfSwgYW5ub3RhdGlvblRlcm0pO1xuXG4gICAgaWYgKGlzRGF0YUZpZWxkV2l0aEZvckFjdGlvbihhbm5vdGF0aW9uQ29udGVudCkpIHtcbiAgICAgICAgbGF6eShhbm5vdGF0aW9uQ29udGVudCwgJ0FjdGlvblRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIHRyeSB0byByZXNvbHZlIHRvIGEgYm91bmQgYWN0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICAgICAgICAgICAgbGV0IGFjdGlvblRhcmdldCA9IGN1cnJlbnRUYXJnZXQuYWN0aW9ucz8uW2Fubm90YXRpb25Db250ZW50LkFjdGlvbl07XG5cbiAgICAgICAgICAgIGlmICghYWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBjb3JyZXNwb25kaW5nIHVuYm91bmQgYWN0aW9uXG4gICAgICAgICAgICAgICAgYWN0aW9uVGFyZ2V0ID0gY29udmVydGVyLmdldENvbnZlcnRlZEFjdGlvbkltcG9ydChhbm5vdGF0aW9uQ29udGVudC5BY3Rpb24pPy5hY3Rpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBjb3JyZXNwb25kaW5nIGJvdW5kICghKSBhY3Rpb25cbiAgICAgICAgICAgICAgICBhY3Rpb25UYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKGFubm90YXRpb25Db250ZW50LkFjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25UYXJnZXQ/LmlzQm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhY3Rpb25UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIubG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgYWN0aW9uICcke2Fubm90YXRpb25Db250ZW50LkFjdGlvbn0nIGRlZmluZWQgZm9yICcke2Fubm90YXRpb25UZXJtLmZ1bGx5UXVhbGlmaWVkTmFtZX0nYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uVGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFubm90YXRpb25Db250ZW50O1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uVHlwZSA9XG4gICAgfCAnUHJvcGVydHlQYXRoJ1xuICAgIHwgJ1BhdGgnXG4gICAgfCAnSWYnXG4gICAgfCAnQXBwbHknXG4gICAgfCAnTnVsbCdcbiAgICB8ICdBbmQnXG4gICAgfCAnRXEnXG4gICAgfCAnTmUnXG4gICAgfCAnTm90J1xuICAgIHwgJ0d0J1xuICAgIHwgJ0dlJ1xuICAgIHwgJ0x0J1xuICAgIHwgJ0xlJ1xuICAgIHwgJ09yJ1xuICAgIHwgJ0Fubm90YXRpb25QYXRoJ1xuICAgIHwgJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnXG4gICAgfCAnUmVjb3JkJ1xuICAgIHwgJ1N0cmluZydcbiAgICB8ICdFbXB0eUNvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFJldHJpZXZlIG9yIGluZmVyIHRoZSBjb2xsZWN0aW9uIHR5cGUgYmFzZWQgb24gaXRzIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvblxuICovXG5mdW5jdGlvbiBnZXRPckluZmVyQ29sbGVjdGlvblR5cGUoY29sbGVjdGlvbkRlZmluaXRpb246IGFueVtdKTogQ29sbGVjdGlvblR5cGUge1xuICAgIGxldCB0eXBlOiBDb2xsZWN0aW9uVHlwZSA9IChjb2xsZWN0aW9uRGVmaW5pdGlvbiBhcyBhbnkpLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29sSXRlbSA9IGNvbGxlY3Rpb25EZWZpbml0aW9uWzBdO1xuICAgICAgICBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdQcm9wZXJ0eVBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdQcm9wZXJ0eVBhdGgnO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnUGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1BhdGgnO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnQW5ub3RhdGlvblBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdBbm5vdGF0aW9uUGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmlyc3RDb2xJdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpIHx8IGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgncHJvcGVydHlWYWx1ZXMnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1JlY29yZCc7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0Q29sSXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnU3RyaW5nJztcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cGUgPSAnRW1wdHlDb2xsZWN0aW9uJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29sbGVjdGlvbihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50UHJvcGVydHk6IHN0cmluZyxcbiAgICBjdXJyZW50U291cmNlOiBzdHJpbmcsXG4gICAgY29sbGVjdGlvbkRlZmluaXRpb246IGFueVtdLFxuICAgIHBhcmVudEZRTjogc3RyaW5nXG4pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUgPSBnZXRPckluZmVyQ29sbGVjdGlvblR5cGUoY29sbGVjdGlvbkRlZmluaXRpb24pO1xuXG4gICAgc3dpdGNoIChjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHByb3BlcnR5UGF0aCwgcHJvcGVydHlJZHgpOiBQcm9wZXJ0eVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUHJvcGVydHlQYXRoID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke3Byb3BlcnR5SWR4fWBcbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGxhenkoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgJyR0YXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldDxQcm9wZXJ0eT4oY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwcm9wZXJ0eVBhdGguUHJvcGVydHlQYXRoLCBjdXJyZW50VGVybSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGFyZ2V0ID8/ICh7fSBhcyBQcm9wZXJ0eSkgLy8gVE9ETzogJHRhcmdldCBpcyBtYW5kYXRvcnkgLSB0aHJvdyBhbiBlcnJvcj9cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSBsYXp5P1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocGF0aFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwYXRoVmFsdWUuUGF0aCwgY3VycmVudFRlcm0pLnRhcmdldDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGFubm90YXRpb25QYXRoLCBhbm5vdGF0aW9uSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke2Fubm90YXRpb25JZHh9YCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtOiBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICAgICAgdGVybTogJycsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICcnXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBsYXp5KFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICckdGFyZ2V0JyxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZVRhcmdldChjb252ZXJ0ZXIsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25QYXRoLkFubm90YXRpb25QYXRoLCBjdXJyZW50VGVybSkudGFyZ2V0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKG5hdlByb3BlcnR5UGF0aCwgbmF2UHJvcElkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke25hdlByb3BJZHh9YFxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgbGF6eShcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAnJHRhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudFRhcmdldCwgbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGN1cnJlbnRUZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXRcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChyZWNvcmREZWZpbml0aW9uLCByZWNvcmRJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRlcm0sXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkRGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7cGFyZW50RlFOfS8ke3JlY29yZElkeH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0FwcGx5JzpcbiAgICAgICAgY2FzZSAnTnVsbCc6XG4gICAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgY2FzZSAnRXEnOlxuICAgICAgICBjYXNlICdOZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdMZSc6XG4gICAgICAgIGNhc2UgJ0dlJzpcbiAgICAgICAgY2FzZSAnTm90JzpcbiAgICAgICAgY2FzZSAnQW5kJzpcbiAgICAgICAgY2FzZSAnT3InOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoaWZWYWx1ZSkgPT4gaWZWYWx1ZSk7XG5cbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHN0cmluZ1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHJpbmdWYWx1ZSA9PT0gJ3N0cmluZycgfHwgc3RyaW5nVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlLlN0cmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNWNE5hdmlnYXRpb25Qcm9wZXJ0eShcbiAgICBuYXZQcm9wOiBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSB8IFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5XG4pOiBuYXZQcm9wIGlzIFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4gISEobmF2UHJvcCBhcyBCYXNlTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgYWxpYXMgZnJvbSB0aGUgdGVybSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCBzZXQgb2YgcmVmZXJlbmNlc1xuICogQHBhcmFtIHRlcm1WYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHRlcm1cbiAqIEByZXR1cm5zIHRoZSB0ZXJtIGFsaWFzIGFuZCB0aGUgYWN0dWFsIHRlcm0gdmFsdWVcbiAqL1xuZnVuY3Rpb24gc3BsaXRUZXJtKHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNXaXRoTWFwLCB0ZXJtVmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiBzcGxpdEF0TGFzdChhbGlhcyhyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpLCAnLicpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0QW5ub3RhdGlvbihjb252ZXJ0ZXI6IENvbnZlcnRlciwgdGFyZ2V0OiBhbnksIHJhd0Fubm90YXRpb246IFJhd0Fubm90YXRpb24pOiBBbm5vdGF0aW9uIHtcbiAgICBsZXQgYW5ub3RhdGlvbjogYW55O1xuICAgIGlmIChyYXdBbm5vdGF0aW9uLnJlY29yZCkge1xuICAgICAgICBhbm5vdGF0aW9uID0gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICByYXdBbm5vdGF0aW9uLnRlcm0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuX19zb3VyY2UsXG4gICAgICAgICAgICByYXdBbm5vdGF0aW9uLnJlY29yZCxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyYXdBbm5vdGF0aW9uLmNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhbm5vdGF0aW9uID0gcGFyc2VWYWx1ZShcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udGVybSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udmFsdWUgPz8geyB0eXBlOiAnQm9vbCcsIEJvb2w6IHRydWUgfSxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyYXdBbm5vdGF0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgYW5ub3RhdGlvbiA9IHBhcnNlQ29sbGVjdGlvbihcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udGVybSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24uY29sbGVjdGlvbixcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjYXNlJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlb2YgYW5ub3RhdGlvbikge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy13cmFwcGVyc1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG5ldyBTdHJpbmcoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LXdyYXBwZXJzXG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gbmV3IEJvb2xlYW4oYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBuZXcgTnVtYmVyKGFubm90YXRpb24pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lO1xuICAgIGFubm90YXRpb25bQU5OT1RBVElPTl9UQVJHRVRdID0gdGFyZ2V0O1xuXG4gICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IGNvbnZlcnRlci5zcGxpdFRlcm0ocmF3QW5ub3RhdGlvbi50ZXJtKTtcblxuICAgIGFubm90YXRpb24udGVybSA9IGNvbnZlcnRlci51bmFsaWFzKGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm19YCk7XG4gICAgYW5ub3RhdGlvbi5xdWFsaWZpZXIgPSByYXdBbm5vdGF0aW9uLnF1YWxpZmllcjtcbiAgICBhbm5vdGF0aW9uLl9fc291cmNlID0gKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZTtcblxuICAgIHRyeSB7XG4gICAgICAgIGxhenkoYW5ub3RhdGlvbiwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkZRTiA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXG4gICAgICAgICAgICAvLyBiZSBncmFjZWZ1bCB3aGVuIHJlc29sdmluZyBhbm5vdGF0aW9ucyBvbiBhbm5vdGF0aW9uczogU29tZXRpbWVzIHRoZXkgYXJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHNvbWV0aW1lcyB0aGV5XG4gICAgICAgICAgICAvLyBhcmUgcGFydCBvZiB0aGUgZ2xvYmFsIGFubm90YXRpb25zIGxpc3RcbiAgICAgICAgICAgIGxldCBhbm5vdGF0aW9ucztcbiAgICAgICAgICAgIGlmIChyYXdBbm5vdGF0aW9uLmFubm90YXRpb25zICYmIHJhd0Fubm90YXRpb24uYW5ub3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gcmF3QW5ub3RhdGlvbi5hbm5vdGF0aW9ucztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbYW5ub3RhdGlvbkZRTl0/LmFubm90YXRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbm5vdGF0aW9ucz8uZm9yRWFjaCgocmF3U3ViQW5ub3RhdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmF3U3ViQW5ub3RhdGlvbi50YXJnZXQgPSBhbm5vdGF0aW9uRlFOO1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb24uX19zb3VyY2UgPSBhbm5vdGF0aW9uLl9fc291cmNlO1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb25bQU5OT1RBVElPTl9UQVJHRVRdID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gYCR7YW5ub3RhdGlvbkZRTn1AJHtyYXdTdWJBbm5vdGF0aW9uLnRlcm19YDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5ub3RhdGlvbnNPYmplY3QoY29udmVydGVyLCBhbm5vdGF0aW9uLCBhbm5vdGF0aW9ucyA/PyBbXSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90IGFuIGVycm9yOiBwYXJzZVJlY29yZCgpIGFscmVhZHkgYWRkcyBhbm5vdGF0aW9ucywgYnV0IHRoZSBvdGhlciBwYXJzZVhYWCBmdW5jdGlvbnMgZG9uJ3QsIHNvIHRoaXMgY2FuIGhhcHBlblxuICAgIH1cblxuICAgIHJldHVybiBhbm5vdGF0aW9uIGFzIEFubm90YXRpb247XG59XG5cbmZ1bmN0aW9uIGdldEFubm90YXRpb25GUU4oY3VycmVudFRhcmdldE5hbWU6IHN0cmluZywgcmVmZXJlbmNlczogUmVmZXJlbmNlW10sIGFubm90YXRpb246IFJhd0Fubm90YXRpb24pIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uRlFOID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhyZWZlcmVuY2VzLCBhbm5vdGF0aW9uLnRlcm0pfWA7XG5cbiAgICBpZiAoYW5ub3RhdGlvbi5xdWFsaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGAke2Fubm90YXRpb25GUU59IyR7YW5ub3RhdGlvbi5xdWFsaWZpZXJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkZRTjtcbiAgICB9XG59XG5cbi8qKlxuICogTWVyZ2UgYW5ub3RhdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2UgdG9nZXRoZXIgYnkgb3ZlcndyaXRpbmcgYXQgdGhlIHRlcm0gbGV2ZWwuXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1lcmdlZCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQ6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3Q6IEFubm90YXRpb25MaXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBpZiAoIWFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLm1hcCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gZ2V0QW5ub3RhdGlvbkZRTihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdNZXRhZGF0YS5yZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjdXJyZW50VGFyZ2V0TmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgKGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kSW5kZXggPSBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV0uYW5ub3RhdGlvbnMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmVyZW5jZUFubm90YXRpb246IFJhd0Fubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VBbm5vdGF0aW9uLnRlcm0gPT09IGFubm90YXRpb24udGVybSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VBbm5vdGF0aW9uLnF1YWxpZmllciA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gZ2V0QW5ub3RhdGlvbkZRTihcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3TWV0YWRhdGEucmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5zcGxpY2UoZmluZEluZGV4LCAxLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhbm5vdGF0aW9uTGlzdFBlclRhcmdldDtcbn1cblxuY2xhc3MgQ29udmVydGVyIHtcbiAgICBwcml2YXRlIF9yYXdBbm5vdGF0aW9uc1BlclRhcmdldDogUmVjb3JkPEZ1bGx5UXVhbGlmaWVkTmFtZSwgQW5ub3RhdGlvbkxpc3Q+O1xuICAgIGdldCByYXdBbm5vdGF0aW9uc1BlclRhcmdldCgpOiBSZWNvcmQ8RnVsbHlRdWFsaWZpZWROYW1lLCBBbm5vdGF0aW9uTGlzdD4ge1xuICAgICAgICBpZiAodGhpcy5fcmF3QW5ub3RhdGlvbnNQZXJUYXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmF3QW5ub3RhdGlvbnNQZXJUYXJnZXQgPSBtZXJnZUFubm90YXRpb25zKHRoaXMucmF3TWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdBbm5vdGF0aW9uc1BlclRhcmdldDtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRFbnRpdHlDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnZlcnRlZEVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLnJhd01ldGFkYXRhLnNjaGVtYS5lbnRpdHlDb250YWluZXIuZnVsbHlRdWFsaWZpZWROYW1lLFxuICAgICAgICAgICAgdGhpcy5yYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5Q29udGFpbmVyLFxuICAgICAgICAgICAgY29udmVydEVudGl0eUNvbnRhaW5lclxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldENvbnZlcnRlZEVudGl0eVNldChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuZW50aXR5U2V0cy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRTaW5nbGV0b24oZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkT3V0cHV0LnNpbmdsZXRvbnMuYnlfZnVsbHlRdWFsaWZpZWROYW1lKGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkRW50aXR5VHlwZShmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuZW50aXR5VHlwZXMuYnlfZnVsbHlRdWFsaWZpZWROYW1lKGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkQ29tcGxleFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkT3V0cHV0LmNvbXBsZXhUeXBlcy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbihmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQudHlwZURlZmluaXRpb25zLmJ5X2Z1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgIH1cblxuICAgIGdldENvbnZlcnRlZEFjdGlvbkltcG9ydChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICBsZXQgYWN0aW9uSW1wb3J0ID0gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuYWN0aW9uSW1wb3J0cy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgaWYgKCFhY3Rpb25JbXBvcnQpIHtcbiAgICAgICAgICAgIGFjdGlvbkltcG9ydCA9IHRoaXMuY29udmVydGVkT3V0cHV0LmFjdGlvbkltcG9ydHMuYnlfbmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBvcnQ7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkQWN0aW9uKGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRlZE91dHB1dC5hY3Rpb25zLmJ5X2Z1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnZlcnQ8Q29udmVydGVkLCBSYXcgZXh0ZW5kcyBSYXdUeXBlPENvbnZlcnRlZD4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3LFxuICAgICAgICBtYXA6IChjb252ZXJ0ZXI6IENvbnZlcnRlciwgcmF3OiBSYXcpID0+IENvbnZlcnRlZFxuICAgICk6ICgpID0+IENvbnZlcnRlZDtcbiAgICBjb252ZXJ0PENvbnZlcnRlZCwgUmF3IGV4dGVuZHMgUmF3VHlwZTxDb252ZXJ0ZWQ+LCBJbmRleFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBDb252ZXJ0ZWQsIHN0cmluZz4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3W10sXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhdykgPT4gQ29udmVydGVkXG4gICAgKTogKCkgPT4gQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5PjtcbiAgICBjb252ZXJ0PENvbnZlcnRlZCwgUmF3IGV4dGVuZHMgUmF3VHlwZTxDb252ZXJ0ZWQ+LCBJbmRleFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBDb252ZXJ0ZWQsIHN0cmluZz4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3IHwgUmF3W10sXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhdykgPT4gQ29udmVydGVkXG4gICAgKTogKCgpID0+IENvbnZlcnRlZCkgfCAoKCkgPT4gQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5Pikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gcmF3VmFsdWUucmVkdWNlKChjb252ZXJ0ZWRFbGVtZW50cywgcmF3RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRFbGVtZW50ID0gdGhpcy5nZXRDb252ZXJ0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJhd0VsZW1lbnQgYXMgYW55KS5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRFbGVtZW50cy5wdXNoKGNvbnZlcnRlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRFbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCBbXSBhcyBDb252ZXJ0ZWRbXSk7XG4gICAgICAgICAgICAgICAgYWRkR2V0QnlWYWx1ZShjb252ZXJ0ZWQsICduYW1lJyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGFkZEdldEJ5VmFsdWUoY29udmVydGVkLCAnZnVsbHlRdWFsaWZpZWROYW1lJyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQgYXMgQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5PjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5nZXRDb252ZXJ0ZWRFbGVtZW50KHJhd1ZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcmF3VmFsdWUsIG1hcCkhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByYXdNZXRhZGF0YTogUmF3TWV0YWRhdGE7XG4gICAgcHJpdmF0ZSBjb252ZXJ0ZWRFbGVtZW50czogTWFwPEZ1bGx5UXVhbGlmaWVkTmFtZSwgYW55PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGNvbnZlcnRlZE91dHB1dDogQ29udmVydGVkTWV0YWRhdGE7XG5cbiAgICByYXdTY2hlbWE6IFJhd1NjaGVtYTtcblxuICAgIGNvbnN0cnVjdG9yKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSwgY29udmVydGVkT3V0cHV0OiBDb252ZXJ0ZWRNZXRhZGF0YSkge1xuICAgICAgICB0aGlzLnJhd01ldGFkYXRhID0gcmF3TWV0YWRhdGE7XG4gICAgICAgIHRoaXMucmF3U2NoZW1hID0gcmF3TWV0YWRhdGEuc2NoZW1hO1xuICAgICAgICB0aGlzLmNvbnZlcnRlZE91dHB1dCA9IGNvbnZlcnRlZE91dHB1dDtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRFbGVtZW50PENvbnZlcnRlZFR5cGUsIFJhd1R5cGUgZXh0ZW5kcyBSZW1vdmVBbm5vdGF0aW9uQW5kVHlwZTxDb252ZXJ0ZWRUeXBlPj4oXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lLFxuICAgICAgICByYXdFbGVtZW50OiBSYXdUeXBlIHwgdW5kZWZpbmVkIHwgKChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkgPT4gUmF3VHlwZSB8IHVuZGVmaW5lZCksXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhd1R5cGUpID0+IENvbnZlcnRlZFR5cGVcbiAgICApOiBDb252ZXJ0ZWRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGNvbnZlcnRlZDogQ29udmVydGVkVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuY29udmVydGVkRWxlbWVudHMuZ2V0KGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgICAgIGlmIChjb252ZXJ0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmF3TWV0YWRhdGEgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiByYXdFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gcmF3RWxlbWVudC5hcHBseSh1bmRlZmluZWQsIFtmdWxseVF1YWxpZmllZE5hbWVdKSA6IHJhd0VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocmF3TWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IG1hcC5hcHBseSh1bmRlZmluZWQsIFt0aGlzLCByYXdNZXRhZGF0YV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udmVydGVkRWxlbWVudHMuc2V0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgIH1cblxuICAgIGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbnZlcnRlZE91dHB1dC5kaWFnbm9zdGljcy5wdXNoKHsgbWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICBzcGxpdFRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzcGxpdFRlcm0odGhpcy5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCB0ZXJtKTtcbiAgICB9XG5cbiAgICBhbGlhcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhbGlhcyh0aGlzLnJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB1bmFsaWFzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXModGhpcy5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCB2YWx1ZSkgPz8gJyc7XG4gICAgfVxufVxuXG50eXBlIFJhd1R5cGU8VD4gPSBSZW1vdmVBbm5vdGF0aW9uQW5kVHlwZTxUPiAmIHsgZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUgfTtcblxuZnVuY3Rpb24gcmVzb2x2ZUVudGl0eVR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbGV0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkRW50aXR5VHlwZShmdWxseVF1YWxpZmllZE5hbWUpO1xuXG4gICAgICAgIGlmICghZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKGBFbnRpdHlUeXBlICcke2Z1bGx5UXVhbGlmaWVkTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgZW50aXR5VHlwZSA9IHt9IGFzIEVudGl0eVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudGl0eVR5cGU7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzOiBTaW5nbGV0b25bJ25hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcnXSB8IEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgIHJhd0VsZW1lbnQ6IFJhd1NpbmdsZXRvbiB8IFJhd0VudGl0eVNldFxuKSB7XG4gICAgcmV0dXJuICgpID0+XG4gICAgICAgIE9iamVjdC5rZXlzKHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKS5yZWR1Y2UoKG5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzLCBiaW5kaW5nTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmF3QmluZGluZ1RhcmdldCA9IHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzW2JpbmRpbmdOYW1lXTtcblxuICAgICAgICAgICAgbGF6eShuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5ncywgYmluZGluZ05hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmIChyYXdCaW5kaW5nVGFyZ2V0Ll90eXBlID09PSAnU2luZ2xldG9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJpbmRpbmdUYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkU2luZ2xldG9uKHJhd0JpbmRpbmdUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJpbmRpbmdUYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkRW50aXR5U2V0KHJhd0JpbmRpbmdUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmRpbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cmF3RWxlbWVudC5fdHlwZX0gJyR7cmF3RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWV9JzogRmFpbGVkIHRvIHJlc29sdmUgTmF2aWdhdGlvblByb3BlcnR5QmluZGluZyAke2JpbmRpbmdOYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0ID0ge30gYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3M7XG4gICAgICAgIH0sIHt9IGFzIEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddIHwgU2luZ2xldG9uWyduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJ10pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0Fubm90YXRpb25UYXJnZXQ6IGFueSkge1xuICAgIGNvbnN0IG5lc3RlZEFubm90YXRpb25zID0gcmF3QW5ub3RhdGlvblRhcmdldC5hbm5vdGF0aW9ucztcblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgICBjcmVhdGVBbm5vdGF0aW9uc09iamVjdChcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICBuZXN0ZWRBbm5vdGF0aW9ucyA/P1xuICAgICAgICAgICAgICAgIGNvbnZlcnRlci5yYXdBbm5vdGF0aW9uc1BlclRhcmdldFtyYXdBbm5vdGF0aW9uVGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0/LmFubm90YXRpb25zID8/XG4gICAgICAgICAgICAgICAgW11cbiAgICAgICAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5ub3RhdGlvbnNPYmplY3QoY29udmVydGVyOiBDb252ZXJ0ZXIsIHRhcmdldDogYW55LCByYXdBbm5vdGF0aW9uczogUmF3QW5ub3RhdGlvbltdKSB7XG4gICAgcmV0dXJuIHJhd0Fubm90YXRpb25zLnJlZHVjZSgodm9jYWJ1bGFyeUFsaWFzZXMsIGFubm90YXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IGNvbnZlcnRlci5zcGxpdFRlcm0oYW5ub3RhdGlvbi50ZXJtKTtcbiAgICAgICAgY29uc3Qgdm9jVGVybVdpdGhRdWFsaWZpZXIgPSBgJHt2b2NUZXJtfSR7YW5ub3RhdGlvbi5xdWFsaWZpZXIgPyAnIycgKyBhbm5vdGF0aW9uLnF1YWxpZmllciA6ICcnfWA7XG5cbiAgICAgICAgaWYgKHZvY2FidWxhcnlBbGlhc2VzW3ZvY0FsaWFzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2b2NhYnVsYXJ5QWxpYXNlc1t2b2NBbGlhc10gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdm9jYWJ1bGFyeUFsaWFzZXNbdm9jQWxpYXNdLmhhc093blByb3BlcnR5KHZvY1Rlcm1XaXRoUXVhbGlmaWVyKSkge1xuICAgICAgICAgICAgbGF6eSh2b2NhYnVsYXJ5QWxpYXNlc1t2b2NBbGlhc10sIHZvY1Rlcm1XaXRoUXVhbGlmaWVyLCAoKSA9PlxuICAgICAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBBbm5vdGF0aW9uKS5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIChjb252ZXJ0ZXIsIHJhd0Fubm90YXRpb24pID0+IGNvbnZlcnRBbm5vdGF0aW9uKGNvbnZlcnRlciwgdGFyZ2V0LCByYXdBbm5vdGF0aW9uKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvY2FidWxhcnlBbGlhc2VzO1xuICAgIH0sIHt9IGFzIGFueSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gRW50aXR5Q29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0VudGl0eUNvbnRhaW5lciAgICBVbmNvbnZlcnRlZCBFbnRpdHlDb250YWluZXJcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgRW50aXR5Q29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRFbnRpdHlDb250YWluZXIoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0VudGl0eUNvbnRhaW5lcjogUmF3RW50aXR5Q29udGFpbmVyKTogRW50aXR5Q29udGFpbmVyIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIgPSByYXdFbnRpdHlDb250YWluZXIgYXMgRW50aXR5Q29udGFpbmVyO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIsICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd0VudGl0eUNvbnRhaW5lcikpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIsICdlbnRpdHlTZXRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5lbnRpdHlTZXRzLCBjb252ZXJ0RW50aXR5U2V0KSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEVudGl0eUNvbnRhaW5lciwgJ3NpbmdsZXRvbnMnLCBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLnNpbmdsZXRvbnMsIGNvbnZlcnRTaW5nbGV0b24pKTtcblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZEVudGl0eUNvbnRhaW5lcixcbiAgICAgICAgJ2FjdGlvbkltcG9ydHMnLFxuICAgICAgICBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLmFjdGlvbkltcG9ydHMsIGNvbnZlcnRBY3Rpb25JbXBvcnQpXG4gICAgKTtcblxuICAgIHJldHVybiBjb252ZXJ0ZWRFbnRpdHlDb250YWluZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBTaW5nbGV0b24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd1NpbmdsZXRvbiAgVW5jb252ZXJ0ZWQgU2luZ2xldG9uXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIFNpbmdsZXRvblxuICovXG5mdW5jdGlvbiBjb252ZXJ0U2luZ2xldG9uKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdTaW5nbGV0b246IFJhd1NpbmdsZXRvbik6IFNpbmdsZXRvbiB7XG4gICAgY29uc3QgY29udmVydGVkU2luZ2xldG9uID0gcmF3U2luZ2xldG9uIGFzIFNpbmdsZXRvbjtcblxuICAgIGNvbnZlcnRlZFNpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd1NpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZFNpbmdsZXRvbiwgJ2VudGl0eVR5cGUnLCByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIHJhd1NpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSkpO1xuICAgIGxhenkoY29udmVydGVkU2luZ2xldG9uLCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdTaW5nbGV0b24gYXMgU2luZ2xldG9uKSk7XG5cbiAgICBjb25zdCBfcmF3TmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSByYXdTaW5nbGV0b24ubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRTaW5nbGV0b24sXG4gICAgICAgICduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJyxcbiAgICAgICAgcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgX3Jhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzIGFzIFNpbmdsZXRvblsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgICAgICAgICAgcmF3U2luZ2xldG9uXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZFNpbmdsZXRvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBFbnRpdHlTZXQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0VudGl0eVNldCAgVW5jb252ZXJ0ZWQgRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb252ZXJ0RW50aXR5U2V0KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdFbnRpdHlTZXQ6IFJhd0VudGl0eVNldCk6IEVudGl0eVNldCB7XG4gICAgY29uc3QgY29udmVydGVkRW50aXR5U2V0ID0gcmF3RW50aXR5U2V0IGFzIEVudGl0eVNldDtcblxuICAgIGNvbnZlcnRlZEVudGl0eVNldC5lbnRpdHlUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd0VudGl0eVNldC5lbnRpdHlUeXBlTmFtZSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEVudGl0eVNldCwgJ2VudGl0eVR5cGUnLCByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIHJhd0VudGl0eVNldC5lbnRpdHlUeXBlTmFtZSkpO1xuICAgIGxhenkoY29udmVydGVkRW50aXR5U2V0LCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KSk7XG5cbiAgICBjb25zdCBfcmF3TmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSByYXdFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRFbnRpdHlTZXQsXG4gICAgICAgICduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJyxcbiAgICAgICAgcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgX3Jhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzIGFzIEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgICAgICAgICAgcmF3RW50aXR5U2V0XG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZEVudGl0eVNldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBFbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICBDb252ZXJ0ZXJcbiAqIEBwYXJhbSByYXdFbnRpdHlUeXBlICBVbmNvbnZlcnRlZCBFbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEVudGl0eVR5cGVcbiAqL1xuZnVuY3Rpb24gY29udmVydEVudGl0eVR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0VudGl0eVR5cGU6IFJhd0VudGl0eVR5cGUpOiBFbnRpdHlUeXBlIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRFbnRpdHlUeXBlID0gcmF3RW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlO1xuXG4gICAgcmF3RW50aXR5VHlwZS5rZXlzLmZvckVhY2goKGtleVByb3A6IGFueSkgPT4ge1xuICAgICAgICBrZXlQcm9wLmlzS2V5ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGxhenkoY29udmVydGVkRW50aXR5VHlwZSwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3RW50aXR5VHlwZSkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAna2V5cycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0VudGl0eVR5cGUua2V5cywgY29udmVydFByb3BlcnR5KSk7XG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAnZW50aXR5UHJvcGVydGllcycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0VudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcywgY29udmVydFByb3BlcnR5KSk7XG4gICAgbGF6eShcbiAgICAgICAgY29udmVydGVkRW50aXR5VHlwZSxcbiAgICAgICAgJ25hdmlnYXRpb25Qcm9wZXJ0aWVzJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQocmF3RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcyBhcyBhbnlbXSwgY29udmVydE5hdmlnYXRpb25Qcm9wZXJ0eSlcbiAgICApO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAnYWN0aW9ucycsICgpID0+XG4gICAgICAgIGNvbnZlcnRlci5yYXdTY2hlbWEuYWN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocmF3QWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICByYXdBY3Rpb24uaXNCb3VuZCAmJlxuICAgICAgICAgICAgICAgICAgICAocmF3QWN0aW9uLnNvdXJjZVR5cGUgPT09IHJhd0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdBY3Rpb24uc291cmNlVHlwZSA9PT0gYENvbGxlY3Rpb24oJHtyYXdFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZX0pYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjdGlvbnMsIHJhd0FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBgJHtjb252ZXJ0ZXIucmF3U2NoZW1hLm5hbWVzcGFjZX0uJHtyYXdBY3Rpb24ubmFtZX1gO1xuICAgICAgICAgICAgICAgIGFjdGlvbnNbbmFtZV0gPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKHJhd0FjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpITtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICAgICAgICAgIH0sIHt9IGFzIEVudGl0eVR5cGVbJ2FjdGlvbnMnXSlcbiAgICApO1xuXG4gICAgY29udmVydGVkRW50aXR5VHlwZS5yZXNvbHZlUGF0aCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZywgaW5jbHVkZVZpc2l0ZWRPYmplY3RzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCByYXdFbnRpdHlUeXBlLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpZiAoaW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0YXJnZXQ6IHJlc29sdmVkLnRhcmdldCwgdmlzaXRlZE9iamVjdHM6IHJlc29sdmVkLm9iamVjdFBhdGgsIG1lc3NhZ2VzOiByZXNvbHZlZC5tZXNzYWdlcyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkLnRhcmdldDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gY29udmVydGVkRW50aXR5VHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICBDb252ZXJ0ZXJcbiAqIEBwYXJhbSByYXdQcm9wZXJ0eSAgVW5jb252ZXJ0ZWQgUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgUHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gY29udmVydFByb3BlcnR5KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdQcm9wZXJ0eTogUmF3UHJvcGVydHkpOiBQcm9wZXJ0eSB7XG4gICAgY29uc3QgY29udmVydGVkUHJvcGVydHkgPSByYXdQcm9wZXJ0eSBhcyBQcm9wZXJ0eTtcblxuICAgIGNvbnZlcnRlZFByb3BlcnR5LnR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyYXdQcm9wZXJ0eS50eXBlKTtcbiAgICBsYXp5KGNvbnZlcnRlZFByb3BlcnR5LCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdQcm9wZXJ0eSkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRQcm9wZXJ0eSwgJ3RhcmdldFR5cGUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByYXdQcm9wZXJ0eS50eXBlO1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IHR5cGUuc3RhcnRzV2l0aCgnQ29sbGVjdGlvbicpID8gdHlwZS5zdWJzdHJpbmcoMTEsIHR5cGUubGVuZ3RoIC0gMSkgOiB0eXBlO1xuXG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQ29tcGxleFR5cGUodHlwZU5hbWUpID8/IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkUHJvcGVydHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBOYXZpZ2F0aW9uUHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd05hdmlnYXRpb25Qcm9wZXJ0eSAgVW5jb252ZXJ0ZWQgTmF2aWdhdGlvblByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIE5hdmlnYXRpb25Qcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBjb252ZXJ0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIHJhd05hdmlnYXRpb25Qcm9wZXJ0eTogUmF3VjJOYXZpZ2F0aW9uUHJvcGVydHkgfCBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eVxuKTogTmF2aWdhdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBjb252ZXJ0ZWROYXZpZ2F0aW9uUHJvcGVydHkgPSByYXdOYXZpZ2F0aW9uUHJvcGVydHkgYXMgTmF2aWdhdGlvblByb3BlcnR5O1xuXG4gICAgY29udmVydGVkTmF2aWdhdGlvblByb3BlcnR5LnJlZmVyZW50aWFsQ29uc3RyYWludCA9IGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS5yZWZlcmVudGlhbENvbnN0cmFpbnQgPz8gW107XG5cbiAgICBpZiAoaXNWNE5hdmlnYXRpb25Qcm9wZXJ0eShyYXdOYXZpZ2F0aW9uUHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd05hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25FbmQgPSBjb252ZXJ0ZXIucmF3U2NoZW1hLmFzc29jaWF0aW9uc1xuICAgICAgICAgICAgLmZpbmQoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUgPT09IHJhd05hdmlnYXRpb25Qcm9wZXJ0eS5yZWxhdGlvbnNoaXApXG4gICAgICAgICAgICA/LmFzc29jaWF0aW9uRW5kLmZpbmQoKGVuZCkgPT4gZW5kLnJvbGUgPT09IHJhd05hdmlnYXRpb25Qcm9wZXJ0eS50b1JvbGUpO1xuXG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS5pc0NvbGxlY3Rpb24gPSBhc3NvY2lhdGlvbkVuZD8ubXVsdGlwbGljaXR5ID09PSAnKic7XG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSA9IGFzc29jaWF0aW9uRW5kPy50eXBlID8/ICcnO1xuICAgIH1cblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICAgICAgJ3RhcmdldFR5cGUnLFxuICAgICAgICByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIChyYXdOYXZpZ2F0aW9uUHJvcGVydHkgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZSlcbiAgICApO1xuXG4gICAgbGF6eShjb252ZXJ0ZWROYXZpZ2F0aW9uUHJvcGVydHksICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd05hdmlnYXRpb25Qcm9wZXJ0eSkpO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBY3Rpb25JbXBvcnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0FjdGlvbkltcG9ydCAgVW5jb252ZXJ0ZWQgQWN0aW9uSW1wb3J0XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEFjdGlvbkltcG9ydFxuICovXG5mdW5jdGlvbiBjb252ZXJ0QWN0aW9uSW1wb3J0KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdBY3Rpb25JbXBvcnQ6IFJhd0FjdGlvbkltcG9ydCk6IEFjdGlvbkltcG9ydCB7XG4gICAgY29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gcmF3QWN0aW9uSW1wb3J0IGFzIEFjdGlvbkltcG9ydDtcblxuICAgIGNvbnZlcnRlZEFjdGlvbkltcG9ydC5hY3Rpb25OYW1lID0gY29udmVydGVyLnVuYWxpYXMocmF3QWN0aW9uSW1wb3J0LmFjdGlvbk5hbWUpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRBY3Rpb25JbXBvcnQsICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd0FjdGlvbkltcG9ydCkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRBY3Rpb25JbXBvcnQsICdhY3Rpb24nLCAoKSA9PiBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKHJhd0FjdGlvbkltcG9ydC5hY3Rpb25OYW1lKSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uSW1wb3J0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgQ29udmVydGVyXG4gKiBAcGFyYW0gcmF3QWN0aW9uICBVbmNvbnZlcnRlZCBBY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgQWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBY3Rpb24oY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0FjdGlvbjogUmF3QWN0aW9uKTogQWN0aW9uIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSByYXdBY3Rpb24gYXMgQWN0aW9uO1xuXG4gICAgY29udmVydGVkQWN0aW9uLnNvdXJjZVR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyYXdBY3Rpb24uc291cmNlVHlwZSk7XG4gICAgaWYgKGNvbnZlcnRlZEFjdGlvbi5zb3VyY2VUeXBlKSB7XG4gICAgICAgIGxhenkoY29udmVydGVkQWN0aW9uLCAnc291cmNlRW50aXR5VHlwZScsIHJlc29sdmVFbnRpdHlUeXBlKGNvbnZlcnRlciwgcmF3QWN0aW9uLnNvdXJjZVR5cGUpKTtcbiAgICB9XG5cbiAgICBjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuVHlwZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd0FjdGlvbi5yZXR1cm5UeXBlKTtcbiAgICBpZiAoY29udmVydGVkQWN0aW9uLnJldHVyblR5cGUpIHtcbiAgICAgICAgbGF6eShjb252ZXJ0ZWRBY3Rpb24sICdyZXR1cm5FbnRpdHlUeXBlJywgcmVzb2x2ZUVudGl0eVR5cGUoY29udmVydGVyLCByYXdBY3Rpb24ucmV0dXJuVHlwZSkpO1xuICAgIH1cblxuICAgIGxhenkoY29udmVydGVkQWN0aW9uLCAncGFyYW1ldGVycycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0FjdGlvbi5wYXJhbWV0ZXJzLCBjb252ZXJ0QWN0aW9uUGFyYW1ldGVyKSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEFjdGlvbiwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLmlzLnRoZS5hY3Rpb24ob24udGhpcy50eXBlKSAtLT4gYWN0aW9uOiAndGhpcy5pcy50aGUuYWN0aW9uJywgb3ZlcmxvYWQ6ICdvbi50aGlzLnR5cGUnXG4gICAgICAgIC8vIHRoaXMuaXMudGhlLmFjdGlvbigpICAgICAgICAgICAgIC0tPiBhY3Rpb246ICd0aGlzLmlzLnRoZS5hY3Rpb24nLCBvdmVybG9hZDogdW5kZWZpbmVkXG4gICAgICAgIC8vIHRoaXMuaXMudGhlLmFjdGlvbiAgICAgICAgICAgICAgIC0tPiBhY3Rpb246ICd0aGlzLmlzLnRoZS5hY3Rpb24nLCBvdmVybG9hZDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGFjdGlvbkFuZE92ZXJsb2FkID0gcmF3QWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5tYXRjaCgvKD88YWN0aW9uPlteKCldKykoPzpcXCgoPzxvdmVybG9hZD4uKilcXCkpPy8pO1xuXG4gICAgICAgIGxldCByYXdBbm5vdGF0aW9uczogUmF3QW5ub3RhdGlvbltdID0gW107XG4gICAgICAgIGlmIChhY3Rpb25BbmRPdmVybG9hZCkge1xuICAgICAgICAgICAgaWYgKGFjdGlvbkFuZE92ZXJsb2FkLmdyb3Vwcz8ub3ZlcmxvYWQpIHtcbiAgICAgICAgICAgICAgICByYXdBbm5vdGF0aW9ucyA9IGNvbnZlcnRlci5yYXdBbm5vdGF0aW9uc1BlclRhcmdldFtyYXdBY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lXT8uYW5ub3RhdGlvbnMgPz8gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJhd0Fubm90YXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLnJhd0Fubm90YXRpb25zUGVyVGFyZ2V0W2Ake2FjdGlvbkFuZE92ZXJsb2FkLmdyb3Vwcz8uYWN0aW9ufSgpYF0/LmFubm90YXRpb25zID8/IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb24gJiYgYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb24gIT09IHJhd0FjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlQW5ub3RhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb25dPy5hbm5vdGF0aW9ucyA/PyBbXTtcbiAgICAgICAgICAgICAgICByYXdBbm5vdGF0aW9ucyA9IHJhd0Fubm90YXRpb25zLmNvbmNhdChiYXNlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFubm90YXRpb25zT2JqZWN0KGNvbnZlcnRlciwgcmF3QWN0aW9uLCByYXdBbm5vdGF0aW9ucyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFjdGlvblBhcmFtZXRlci5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgQ29udmVydGVyXG4gKiBAcGFyYW0gcmF3QWN0aW9uUGFyYW1ldGVyICBVbmNvbnZlcnRlZCBBY3Rpb25QYXJhbWV0ZXJcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgQWN0aW9uUGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBY3Rpb25QYXJhbWV0ZXIoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgcmF3QWN0aW9uUGFyYW1ldGVyOiBSYXdBY3Rpb25bJ3BhcmFtZXRlcnMnXVtudW1iZXJdXG4pOiBBY3Rpb25QYXJhbWV0ZXIge1xuICAgIGNvbnN0IGNvbnZlcnRlZEFjdGlvblBhcmFtZXRlciA9IHJhd0FjdGlvblBhcmFtZXRlciBhcyBBY3Rpb25QYXJhbWV0ZXI7XG5cbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRBY3Rpb25QYXJhbWV0ZXIsXG4gICAgICAgICd0eXBlUmVmZXJlbmNlJyxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlUeXBlKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKSA/P1xuICAgICAgICAgICAgY29udmVydGVyLmdldENvbnZlcnRlZENvbXBsZXhUeXBlKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKSA/P1xuICAgICAgICAgICAgY29udmVydGVyLmdldENvbnZlcnRlZFR5cGVEZWZpbml0aW9uKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKVxuICAgICk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEFjdGlvblBhcmFtZXRlciwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3QWN0aW9uUGFyYW1ldGVyKSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgQ29tcGxleFR5cGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0NvbXBsZXhUeXBlICBVbmNvbnZlcnRlZCBDb21wbGV4VHlwZVxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBDb21wbGV4VHlwZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q29tcGxleFR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0NvbXBsZXhUeXBlOiBSYXdDb21wbGV4VHlwZSk6IENvbXBsZXhUeXBlIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRDb21wbGV4VHlwZSA9IHJhd0NvbXBsZXhUeXBlIGFzIENvbXBsZXhUeXBlO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRDb21wbGV4VHlwZSwgJ3Byb3BlcnRpZXMnLCBjb252ZXJ0ZXIuY29udmVydChyYXdDb21wbGV4VHlwZS5wcm9wZXJ0aWVzLCBjb252ZXJ0UHJvcGVydHkpKTtcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRDb21wbGV4VHlwZSxcbiAgICAgICAgJ25hdmlnYXRpb25Qcm9wZXJ0aWVzJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQocmF3Q29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgYXMgYW55W10sIGNvbnZlcnROYXZpZ2F0aW9uUHJvcGVydHkpXG4gICAgKTtcbiAgICBsYXp5KGNvbnZlcnRlZENvbXBsZXhUeXBlLCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdDb21wbGV4VHlwZSkpO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZENvbXBsZXhUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgVHlwZURlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd1R5cGVEZWZpbml0aW9uICBVbmNvbnZlcnRlZCBUeXBlRGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBUeXBlRGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZURlZmluaXRpb24oY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd1R5cGVEZWZpbml0aW9uOiBSYXdUeXBlRGVmaW5pdGlvbik6IFR5cGVEZWZpbml0aW9uIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbiA9IHJhd1R5cGVEZWZpbml0aW9uIGFzIFR5cGVEZWZpbml0aW9uO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbiwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3VHlwZURlZmluaXRpb24pKTtcblxuICAgIHJldHVybiBjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgUmF3TWV0YWRhdGEgaW50byBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gdG8gYmUgdXNlZCB0byBlYXNpbHkgbmF2aWdhdGUgYSBtZXRhZGF0YSBvYmplY3QgYW5kIGl0cyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByYXdNZXRhZGF0YVxuICogQHJldHVybnMgdGhlIGNvbnZlcnRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0KHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IENvbnZlcnRlZE1ldGFkYXRhIHtcbiAgICAvLyBmYWxsIGJhY2sgb24gdGhlIGRlZmF1bHQgcmVmZXJlbmNlcyBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IHNwZWNpZnkgYW55XG4gICAgaWYgKHJhd01ldGFkYXRhLnJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJhd01ldGFkYXRhLnJlZmVyZW5jZXMgPSBkZWZhdWx0UmVmZXJlbmNlcztcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ZXIgT3V0cHV0XG4gICAgY29uc3QgY29udmVydGVkT3V0cHV0OiBDb252ZXJ0ZWRNZXRhZGF0YSA9IHtcbiAgICAgICAgdmVyc2lvbjogcmF3TWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgbmFtZXNwYWNlOiByYXdNZXRhZGF0YS5zY2hlbWEubmFtZXNwYWNlLFxuICAgICAgICBhbm5vdGF0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLmFubm90YXRpb25zLFxuICAgICAgICByZWZlcmVuY2VzOiBkZWZhdWx0UmVmZXJlbmNlcy5jb25jYXQocmF3TWV0YWRhdGEucmVmZXJlbmNlcyksXG4gICAgICAgIGRpYWdub3N0aWNzOiBbXVxuICAgIH0gYXMgYW55O1xuXG4gICAgLy8gQ29udmVydGVyXG4gICAgY29uc3QgY29udmVydGVyID0gbmV3IENvbnZlcnRlcihyYXdNZXRhZGF0YSwgY29udmVydGVkT3V0cHV0KTtcblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZE91dHB1dCxcbiAgICAgICAgJ2VudGl0eUNvbnRhaW5lcicsXG4gICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGNvbnZlcnRlci5yYXdTY2hlbWEuZW50aXR5Q29udGFpbmVyLCBjb252ZXJ0RW50aXR5Q29udGFpbmVyKVxuICAgICk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdlbnRpdHlTZXRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5lbnRpdHlTZXRzLCBjb252ZXJ0RW50aXR5U2V0KSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdzaW5nbGV0b25zJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5zaW5nbGV0b25zLCBjb252ZXJ0U2luZ2xldG9uKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdlbnRpdHlUeXBlcycsIGNvbnZlcnRlci5jb252ZXJ0KGNvbnZlcnRlci5yYXdTY2hlbWEuZW50aXR5VHlwZXMsIGNvbnZlcnRFbnRpdHlUeXBlKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdhY3Rpb25zJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5hY3Rpb25zLCBjb252ZXJ0QWN0aW9uKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdjb21wbGV4VHlwZXMnLCBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLmNvbXBsZXhUeXBlcywgY29udmVydENvbXBsZXhUeXBlKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdhY3Rpb25JbXBvcnRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5hY3Rpb25JbXBvcnRzLCBjb252ZXJ0QWN0aW9uSW1wb3J0KSk7XG4gICAgbGF6eShcbiAgICAgICAgY29udmVydGVkT3V0cHV0LFxuICAgICAgICAndHlwZURlZmluaXRpb25zJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS50eXBlRGVmaW5pdGlvbnMsIGNvbnZlcnRUeXBlRGVmaW5pdGlvbilcbiAgICApO1xuXG4gICAgY29udmVydGVkT3V0cHV0LnJlc29sdmVQYXRoID0gZnVuY3Rpb24gcmVzb2x2ZVBhdGg8VD4ocGF0aDogc3RyaW5nKTogUmVzb2x1dGlvblRhcmdldDxUPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSByZXNvbHZlVGFyZ2V0PFQ+KGNvbnZlcnRlciwgdW5kZWZpbmVkLCBwYXRoKTtcbiAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICBhcHBlbmRPYmplY3RQYXRoKHRhcmdldFJlc29sdXRpb24ub2JqZWN0UGF0aCwgdGFyZ2V0UmVzb2x1dGlvbi50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXRSZXNvbHV0aW9uO1xuICAgIH07XG5cbiAgICByZXR1cm4gY29udmVydGVkT3V0cHV0O1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi93cml0ZWJhY2snO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iLCJpbXBvcnQgdHlwZSB7IEluZGV4LCBDb21wbGV4VHlwZSwgUmVmZXJlbmNlLCBUeXBlRGVmaW5pdGlvbiwgQXJyYXlXaXRoSW5kZXggfSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAgPSBbXG4gICAgeyBhbGlhczogJ0NhcGFiaWxpdGllcycsIG5hbWVzcGFjZTogJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBhbGlhczogJ0FnZ3JlZ2F0aW9uJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxJywgdXJpOiAnJyB9LFxuICAgIHsgYWxpYXM6ICdWYWxpZGF0aW9uJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuQ29yZS5WMScsIGFsaWFzOiAnQ29yZScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ09yZy5PRGF0YS5NZWFzdXJlcy5WMScsIGFsaWFzOiAnTWVhc3VyZXMnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEnLCBhbGlhczogJ0NvbW1vbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxJywgYWxpYXM6ICdVSScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEnLCBhbGlhczogJ1Nlc3Npb24nLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEnLCBhbGlhczogJ0FuYWx5dGljcycsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxJywgYWxpYXM6ICdDb2RlTGlzdCcsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MScsIGFsaWFzOiAnUGVyc29uYWxEYXRhJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MScsIGFsaWFzOiAnQ29tbXVuaWNhdGlvbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkhUTUw1LnYxJywgYWxpYXM6ICdIVE1MNScsIHVyaTogJycgfVxuXTtcblxuZXhwb3J0IHR5cGUgUmVmZXJlbmNlc1dpdGhNYXAgPSBSZWZlcmVuY2VbXSAmIHtcbiAgICByZWZlcmVuY2VNYXA/OiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+O1xuICAgIHJldmVyc2VSZWZlcmVuY2VNYXA/OiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+O1xufTtcblxuZnVuY3Rpb24gc3BsaXRBdChzdHJpbmc6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIHJldHVybiBpbmRleCA8IDAgPyBbc3RyaW5nLCAnJ10gOiBbc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCksIHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKV07XG59XG5cbmZ1bmN0aW9uIHN1YnN0cmluZ0F0KHN0cmluZzogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4IDwgMCA/IHN0cmluZyA6IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gc3RyaW5nICAgIFRoZSBzdHJpbmcgdG8gc3BsaXRcbiAqIEBwYXJhbSBzZXBhcmF0b3IgU2VwYXJhdG9yLCBlLmcuIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnNpc3Rpbmcgb2YgdHdvIGVsZW1lbnRzOiB0aGUgcGFydCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiB0aGUgc2VwYXJhdG9yLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIGVtcHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QXRGaXJzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICByZXR1cm4gc3BsaXRBdChzdHJpbmcsIHN0cmluZy5pbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBhdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSBzdHJpbmcgICAgVGhlIHN0cmluZyB0byBzcGxpdFxuICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IsIGUuZy4gYSBzaW5nbGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgQW4gYXJyYXkgY29uc2lzdGluZyBvZiB0d28gZWxlbWVudHM6IHRoZSBwYXJ0IGJlZm9yZSB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdGhlIHNlcGFyYXRvciwgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0TGFzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICByZXR1cm4gc3BsaXRBdChzdHJpbmcsIHN0cmluZy5sYXN0SW5kZXhPZihzZXBhcmF0b3IpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSBzdHJpbmcgICAgVGhlIHN0cmluZ1xuICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IsIGUuZy4gYSBzaW5nbGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgVGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciwgb3IgdGhlIGlucHV0IHN0cmluZyBpZiBpdCBkb2VzIG5vdCBjb250YWluIHRoZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHJpbmdCZWZvcmVGaXJzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWJzdHJpbmdBdChzdHJpbmcsIHN0cmluZy5pbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gc3RyaW5nICAgIFRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzZXBhcmF0b3IgU2VwYXJhdG9yLCBlLmcuIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIFRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciwgb3IgdGhlIGlucHV0IHN0cmluZyBpZiBpdCBkb2VzIG5vdCBjb250YWluIHRoZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHJpbmdCZWZvcmVMYXN0KHN0cmluZzogc3RyaW5nLCBzZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1YnN0cmluZ0F0KHN0cmluZywgc3RyaW5nLmxhc3RJbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFubm90YXRpb24gdG8gdGhlIGFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB1bmFsaWFzZWRWYWx1ZSB0aGUgdW5hbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgdW5hbGlhc2VkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZXZlcnNlUmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLm5hbWVzcGFjZV0gPSByZWY7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmICghdW5hbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbbmFtZXNwYWNlLCB2YWx1ZV0gPSBzcGxpdEF0TGFzdCh1bmFsaWFzZWRWYWx1ZSwgJy4nKTtcbiAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXBbbmFtZXNwYWNlXTtcbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBgJHtyZWZlcmVuY2UuYWxpYXN9LiR7dmFsdWV9YDtcbiAgICB9IGVsc2UgaWYgKHVuYWxpYXNlZFZhbHVlLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgLy8gVHJ5IHRvIHNlZSBpZiBpdCdzIGFuIGFubm90YXRpb24gUGF0aCBsaWtlIHRvX1NhbGVzT3JkZXIvQFVJLkxpbmVJdGVtXG4gICAgICAgIGNvbnN0IFtwcmVBbGlhcywgcG9zdEFsaWFzXSA9IHNwbGl0QXRGaXJzdCh1bmFsaWFzZWRWYWx1ZSwgJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke2FsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5hbGlhc2VkVmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhbGlhc2VkIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbm5vdGF0aW9uIHRvIHRoZSB1bmFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBhbGlhc2VkVmFsdWUgdGhlIGFsaWFzZWQgdmFsdWVcbiAqIEByZXR1cm5zIHRoZSB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2FtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgYWxpYXNlZFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXAgPSByZWZlcmVuY2VzLnJlZHVjZSgobWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+LCByZWYpID0+IHtcbiAgICAgICAgICAgIG1hcFtyZWYuYWxpYXNdID0gcmVmO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBpZiAoIWFsaWFzZWRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdm9jQWxpYXMsIHZhbHVlXSA9IHNwbGl0QXRGaXJzdChhbGlhc2VkVmFsdWUsICcuJyk7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXBbdm9jQWxpYXNdO1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3JlZmVyZW5jZS5uYW1lc3BhY2V9LiR7dmFsdWV9YDtcbiAgICB9IGVsc2UgaWYgKGFsaWFzZWRWYWx1ZS5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuICAgICAgICBjb25zdCBbcHJlQWxpYXMsIHBvc3RBbGlhc10gPSBzcGxpdEF0Rmlyc3QoYWxpYXNlZFZhbHVlLCAnQCcpO1xuICAgICAgICByZXR1cm4gYCR7cHJlQWxpYXN9QCR7dW5hbGlhcyhyZWZlcmVuY2VzLCBwb3N0QWxpYXMpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzZWRWYWx1ZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgRW51bUlzRmxhZzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7XG4gICAgJ0F1dGguS2V5TG9jYXRpb24nOiBmYWxzZSxcbiAgICAnQ29yZS5SZXZpc2lvbktpbmQnOiBmYWxzZSxcbiAgICAnQ29yZS5EYXRhTW9kaWZpY2F0aW9uT3BlcmF0aW9uS2luZCc6IGZhbHNlLFxuICAgICdDb3JlLlBlcm1pc3Npb24nOiB0cnVlLFxuICAgICdDYXBhYmlsaXRpZXMuQ29uZm9ybWFuY2VMZXZlbFR5cGUnOiBmYWxzZSxcbiAgICAnQ2FwYWJpbGl0aWVzLklzb2xhdGlvbkxldmVsJzogdHJ1ZSxcbiAgICAnQ2FwYWJpbGl0aWVzLk5hdmlnYXRpb25UeXBlJzogZmFsc2UsXG4gICAgJ0NhcGFiaWxpdGllcy5TZWFyY2hFeHByZXNzaW9ucyc6IHRydWUsXG4gICAgJ0NhcGFiaWxpdGllcy5IdHRwTWV0aG9kJzogdHJ1ZSxcbiAgICAnQWdncmVnYXRpb24uUm9sbHVwVHlwZSc6IGZhbHNlLFxuICAgICdDb21tb24uVGV4dEZvcm1hdFR5cGUnOiBmYWxzZSxcbiAgICAnQ29tbW9uLkZpbHRlckV4cHJlc3Npb25UeXBlJzogZmFsc2UsXG4gICAgJ0NvbW1vbi5GaWVsZENvbnRyb2xUeXBlJzogZmFsc2UsXG4gICAgJ0NvbW1vbi5FZmZlY3RUeXBlJzogdHJ1ZSxcbiAgICAnQ29tbXVuaWNhdGlvbi5LaW5kVHlwZSc6IGZhbHNlLFxuICAgICdDb21tdW5pY2F0aW9uLkNvbnRhY3RJbmZvcm1hdGlvblR5cGUnOiB0cnVlLFxuICAgICdDb21tdW5pY2F0aW9uLlBob25lVHlwZSc6IHRydWUsXG4gICAgJ0NvbW11bmljYXRpb24uR2VuZGVyVHlwZSc6IGZhbHNlLFxuICAgICdVSS5WaXN1YWxpemF0aW9uVHlwZSc6IGZhbHNlLFxuICAgICdVSS5Dcml0aWNhbGl0eVR5cGUnOiBmYWxzZSxcbiAgICAnVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlJzogZmFsc2UsXG4gICAgJ1VJLlRyZW5kVHlwZSc6IGZhbHNlLFxuICAgICdVSS5DaGFydFR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ2hhcnRBeGlzU2NhbGVCZWhhdmlvclR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ2hhcnRBeGlzQXV0b1NjYWxlRGF0YVNjb3BlVHlwZSc6IGZhbHNlLFxuICAgICdVSS5DaGFydERpbWVuc2lvblJvbGVUeXBlJzogZmFsc2UsXG4gICAgJ1VJLkNoYXJ0TWVhc3VyZVJvbGVUeXBlJzogZmFsc2UsXG4gICAgJ1VJLlNlbGVjdGlvblJhbmdlU2lnblR5cGUnOiBmYWxzZSxcbiAgICAnVUkuU2VsZWN0aW9uUmFuZ2VPcHRpb25UeXBlJzogZmFsc2UsXG4gICAgJ1VJLlRleHRBcnJhbmdlbWVudFR5cGUnOiBmYWxzZSxcbiAgICAnVUkuSW1wb3J0YW5jZVR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ3JpdGljYWxpdHlSZXByZXNlbnRhdGlvblR5cGUnOiBmYWxzZSxcbiAgICAnVUkuT3BlcmF0aW9uR3JvdXBpbmdUeXBlJzogZmFsc2Vcbn07XG5leHBvcnQgZW51bSBUZXJtVG9UeXBlcyB7XG4gICAgJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lcycgPSAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuU2VjdXJpdHlTY2hlbWUnLFxuICAgICdPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5BdXRob3JpemF0aW9ucycgPSAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuQXV0aG9yaXphdGlvbicsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlJldmlzaW9ucycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUmV2aXNpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTGlua3MnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkxpbmsnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlVmFsdWUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5NZXNzYWdlcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5WYWx1ZUV4Y2VwdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVmFsdWVFeGNlcHRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuUmVzb3VyY2VFeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlJlc291cmNlRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRhdGFNb2RpZmljYXRpb25FeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLkRhdGFNb2RpZmljYXRpb25FeGNlcHRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSXNMYW5ndWFnZURlcGVuZGVudCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQXBwbGllc1ZpYUNvbnRhaW5lcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRGVyZWZlcmVuY2VhYmxlSURzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Db252ZW50aW9uYWxJRHMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlBlcm1pc3Npb25zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5QZXJtaXNzaW9uJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRGVmYXVsdE5hbWVzcGFjZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWREZWZhdWx0VmFsdWUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLklzVVJMJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Jc01lZGlhVHlwZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5Db250ZW50RGlzcG9zaXRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3B0aW1pc3RpY0NvbmN1cnJlbmN5JyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQWRkaXRpb25hbFByb3BlcnRpZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkF1dG9FeHBhbmQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkF1dG9FeHBhbmRSZWZlcmVuY2VzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5NYXlJbXBsZW1lbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3JkZXJlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuUG9zaXRpb25hbEluc2VydCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQWx0ZXJuYXRlS2V5cycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuQWx0ZXJuYXRlS2V5JyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3B0aW9uYWxQYXJhbWV0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGlvbmFsUGFyYW1ldGVyVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZScgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5TeW1ib2xpY05hbWUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5HZW9tZXRyeUZlYXR1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkdlb21ldHJ5RmVhdHVyZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWwnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29uZm9ybWFuY2VMZXZlbFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkFzeW5jaHJvbm91c1JlcXVlc3RzU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoQ29udGludWVPbkVycm9yU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLklzb2xhdGlvblN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Jc29sYXRpb25MZXZlbCcsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3Jvc3NKb2luU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNhbGxiYWNrU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNhbGxiYWNrVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmcnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmdUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db3VudFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db3VudFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTmF2aWdhdGlvblJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluZGV4YWJsZUJ5S2V5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlRvcFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ta2lwU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbXB1dGVTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VsZWN0U3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWxlY3RTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNvcnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5FeHBhbmRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRXhwYW5kUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VhcmNoUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLktleUFzU2VnbWVudFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5RdWVyeVNlZ21lbnRTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBJbnNlcnRTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBJbnNlcnRTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBVcGRhdGVTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBVcGRhdGVTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVsZXRlUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbGxlY3Rpb25Qcm9wZXJ0eVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db2xsZWN0aW9uUHJvcGVydHlSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5PcGVyYXRpb25SZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQW5ub3RhdGlvblZhbHVlc0luUXVlcnlTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTW9kaWZpY2F0aW9uUXVlcnlPcHRpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1vZGlmaWNhdGlvblF1ZXJ5T3B0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlJlYWRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUmVhZFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbUhlYWRlcnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUGFyYW1ldGVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21RdWVyeU9wdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUGFyYW1ldGVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5NZWRpYUxvY2F0aW9uVXBkYXRlU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BcHBseVN1cHBvcnRlZFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWREZWZhdWx0cycgPSAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkQmFzZScsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5Hcm91cGFibGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BZ2dyZWdhdGFibGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkxldmVsZWRIaWVyYXJjaHknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BdmFpbGFibGVPbkFnZ3JlZ2F0ZXMnID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BdmFpbGFibGVPbkFnZ3JlZ2F0ZXNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bScgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkV4Y2x1c2l2ZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFZhbHVlcycgPSAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFZhbHVlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTXVsdGlwbGVPZicgPSAnRWRtLkRlY2ltYWwnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5Db25zdHJhaW50JyA9ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5Db25zdHJhaW50VHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkl0ZW1zT2YnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkl0ZW1zT2ZUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuT3BlblByb3BlcnR5VHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLlNpbmdsZU9yQ29sbGVjdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5EZXJpdmVkVHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLlNpbmdsZU9yQ29sbGVjdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVGVybXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFRlcm1OYW1lJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQXBwbGljYWJsZVRlcm1zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heEl0ZW1zJyA9ICdFZG0uSW50NjQnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5JdGVtcycgPSAnRWRtLkludDY0JyxcbiAgICAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlNjYWxlJyA9ICdFZG0uQnl0ZScsXG4gICAgJ09yZy5PRGF0YS5NZWFzdXJlcy5WMS5EdXJhdGlvbkdyYW51bGFyaXR5JyA9ICdPcmcuT0RhdGEuTWVhc3VyZXMuVjEuRHVyYXRpb25HcmFudWxhcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuRGltZW5zaW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFjY3VtdWxhdGl2ZU1lYXN1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5Sb2xsZWRVcFByb3BlcnR5Q291bnQnID0gJ0VkbS5JbnQxNicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5QbGFubmluZ0FjdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuQWdncmVnYXRlZFByb3BlcnR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFuYWx5dGljYWxDb250ZXh0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuQW5hbHl0aWNhbENvbnRleHRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlcnZpY2VWZXJzaW9uJyA9ICdFZG0uSW50MzInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VydmljZVNjaGVtYVZlcnNpb24nID0gJ0VkbS5JbnQzMicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9yJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzTGFuZ3VhZ2VJZGVudGlmaWVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvcm1hdCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3JtYXRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzVXBwZXJDYXNlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDdXJyZW5jeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzVW5pdCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1NjYWxlJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vbml0U3BlY2lmaWNQcmVjaXNpb24nID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlY29uZGFyeUtleScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NaW5PY2N1cnMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NYXhPY2N1cnMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Bc3NvY2lhdGlvbkVudGl0eScgPSAnRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVyaXZlZE5hdmlnYXRpb24nID0gJ0VkbS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1hc2tlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJldmVhbE9uRGVtYW5kJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmcnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzSW5zdGFuY2VBbm5vdGF0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BcHBsaWNhdGlvbicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGxpY2F0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UaW1lc3RhbXAnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzJyA9ICdFZG0uQ29tcGxleFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEubnVtZXJpY1NldmVyaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTnVtZXJpY01lc3NhZ2VTZXZlcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWF4aW11bU51bWVyaWNNZXNzYWdlU2V2ZXJpdHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5OdW1lcmljTWVzc2FnZVNldmVyaXR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0FjdGlvbkNyaXRpY2FsJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BdHRyaWJ1dGVzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlbGF0ZWRSZWN1cnNpdmVIaWVyYXJjaHknID0gJ0VkbS5Bbm5vdGF0aW9uUGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5JbnRlcnZhbCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkludGVydmFsVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU0FQT2JqZWN0Tm9kZVR5cGUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TQVBPYmplY3ROb2RlVHlwZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ29tcG9zaXRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc05hdHVyYWxQZXJzb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuU2ltcGxlSWRlbnRpZmllcicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RNYXBwaW5nJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZ1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFySGFsZnllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJNb250aCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkNhbGVuZGFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RheU9mQ2FsZW5kYXJZZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJIYWxmeWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhcldlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyRGF0ZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsUGVyaW9kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyUGVyaW9kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxRdWFydGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsV2VlaycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhcldlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RheU9mRmlzY2FsWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclZhcmlhbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NdXR1YWxseUV4Y2x1c2l2ZVRlcm0nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRBY3RpdmF0aW9uVmlhJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5TaW1wbGVJZGVudGlmaWVyJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkVkaXRhYmxlRmllbGRGb3InID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUXVhbGlmaWVkTmFtZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZUhpZ2gnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlcicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlclR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQXQnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQnknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySUQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ2hhbmdlZEF0JyA9ICdFZG0uRGF0ZVRpbWVPZmZzZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ2hhbmdlZEJ5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVXNlcklEJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGx5TXVsdGlVbml0QmVoYXZpb3JGb3JTb3J0aW5nQW5kRmlsdGVyaW5nJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUHJpbWl0aXZlUHJvcGVydHlQYXRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5DdXJyZW5jeUNvZGVzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Db2RlTGlzdFNvdXJjZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlVuaXRzT2ZNZWFzdXJlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Db2RlTGlzdFNvdXJjZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlN0YW5kYXJkQ29kZScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkV4dGVybmFsQ29kZScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLklzQ29uZmlndXJhdGlvbkRlcHJlY2F0aW9uQ29kZScgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkFkZHJlc3MnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzc1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzRW1haWxBZGRyZXNzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzUGhvbmVOdW1iZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuRXZlbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuRXZlbnREYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5UYXNrJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLlRhc2tEYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5NZXNzYWdlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2VEYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuSGllcmFyY2h5LnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuSGllcmFyY2h5LnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRW50aXR5U2VtYW50aWNzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRW50aXR5U2VtYW50aWNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5GaWVsZFNlbWFudGljcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5UGVyc29uYWwnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklkZW50aWZpY2F0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkJhZGdlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5CYWRnZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkQWJzdHJhY3QnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TdGF0dXNJbmZvJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXAnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXBUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ29ubmVjdGVkRmllbGRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25zJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvbicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ29udGFjdHMnID0gJ0VkbS5Bbm5vdGF0aW9uUGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1lZGlhUmVzb3VyY2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1lZGlhUmVzb3VyY2VUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuS1BJJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUElUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5TGFiZWxzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUxhYmVsVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvbkZpZWxkcycgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tWaWV3RmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlF1aWNrQ3JlYXRlRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVmZXJlbmNlRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uVmFyaWFudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uVmFyaWFudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UaGluZ1BlcnNwZWN0aXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc1N1bW1hcnknID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlBhcnRPZlByZXZpZXcnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1hcCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2FsbGVyeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTXVsdGlMaW5lVGV4dCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSW1wb3J0YW5jZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSW1wb3J0YW5jZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzQ29weUFjdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JlYXRlSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5VcGRhdGVIaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRlbGV0ZUhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5BZGFwdGF0aW9uSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkVtcGhhc2l6ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9yZGVyQnknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlJlY29tbWVuZGF0aW9uTGlzdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Eb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHknID0gJ0VkbS5Cb29sZWFuJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkhUTUw1LnYxLkNzc0RlZmF1bHRzVHlwZSdcbn1cblxuLyoqXG4gKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBDb21wbGV4VHlwZSBhbmQgYSBUeXBlRGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29tcGxleFR5cGVEZWZpbml0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGNvbXBsZXggdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wbGV4VHlwZURlZmluaXRpb24oXG4gICAgY29tcGxleFR5cGVEZWZpbml0aW9uPzogQ29tcGxleFR5cGUgfCBUeXBlRGVmaW5pdGlvblxuKTogY29tcGxleFR5cGVEZWZpbml0aW9uIGlzIENvbXBsZXhUeXBlIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAhIWNvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjb21wbGV4VHlwZURlZmluaXRpb24uX3R5cGUgPT09ICdDb21wbGV4VHlwZScgJiYgISFjb21wbGV4VHlwZURlZmluaXRpb24ucHJvcGVydGllc1xuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZWNpbWFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpc0RlY2ltYWwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVPZigpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIGxhenkgcHJvcGVydHkuXG4gKlxuICogVGhlIHByb3BlcnR5IGlzIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24gb24gdGhlIGZpcnN0IHJlYWQgYWNjZXNzLCBvciBieSBkaXJlY3RseSBhc3NpZ25pbmcgYSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0ICAgIFRoZSBob3N0IG9iamVjdFxuICogQHBhcmFtIHByb3BlcnR5ICBUaGUgbGF6eSBwcm9wZXJ0eSB0byBhZGRcbiAqIEBwYXJhbSBpbml0ICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHByb3BlcnR5J3MgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenk8VHlwZSwgS2V5IGV4dGVuZHMga2V5b2YgVHlwZT4ob2JqZWN0OiBUeXBlLCBwcm9wZXJ0eTogS2V5LCBpbml0OiAoKSA9PiBUeXBlW0tleV0pIHtcbiAgICBjb25zdCBpbml0aWFsID0gU3ltYm9sKCdpbml0aWFsJyk7XG4gICAgbGV0IF92YWx1ZTogVHlwZVtLZXldIHwgdHlwZW9mIGluaXRpYWwgPSBpbml0aWFsO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoX3ZhbHVlID09PSBpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgX3ZhbHVlID0gaW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF92YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWU6IFR5cGVbS2V5XSkge1xuICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gZmluZCBhbiBhcnJheSBlbGVtZW50IGJ5IHByb3BlcnR5IHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhcnJheSAgICAgVGhlIGFycmF5XG4gKiBAcGFyYW0gcHJvcGVydHkgIEVsZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgc2VhcmNoZWQgYnkgdGhpcyBwcm9wZXJ0eVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbmQgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgYnkgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleGVkRmluZDxUPihhcnJheTogQXJyYXk8VD4sIHByb3BlcnR5OiBrZXlvZiBUKSB7XG4gICAgY29uc3QgaW5kZXg6IE1hcDxUW2tleW9mIFRdLCBUIHwgdW5kZWZpbmVkPiA9IG5ldyBNYXAoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kKHZhbHVlOiBUW2tleW9mIFRdKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBpbmRleC5nZXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50Py5bcHJvcGVydHldID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXkuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50Py5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBlbGVtZW50W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGluZGV4LnNldChwcm9wZXJ0eVZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgJ2dldCBieSB2YWx1ZScgZnVuY3Rpb24gdG8gYW4gYXJyYXkuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhZGRJbmRleChteUFycmF5LCAnbmFtZScpLCBhIG5ldyBmdW5jdGlvbiAnYnlfbmFtZSh2YWx1ZSknIHdpbGwgYmUgYWRkZWQgdGhhdCBhbGxvd3MgdG9cbiAqIGZpbmQgYSBtZW1iZXIgb2YgdGhlIGFycmF5IGJ5IHRoZSB2YWx1ZSBvZiBpdHMgJ25hbWUnIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBhcnJheSAgICAgIFRoZSBhcnJheVxuICogQHBhcmFtIHByb3BlcnR5ICAgVGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSAnYnlfe3Byb3BlcnR5fSgpJyBmdW5jdGlvblxuICogQHJldHVybnMgVGhlIGFycmF5IHdpdGggdGhlIGFkZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHZXRCeVZhbHVlPFQsIFAgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHk6IFApIHtcbiAgICBjb25zdCBpbmRleE5hbWU6IGtleW9mIEluZGV4PFQsIFA+ID0gYGJ5XyR7cHJvcGVydHl9YDtcblxuICAgIGlmICghYXJyYXkuaGFzT3duUHJvcGVydHkoaW5kZXhOYW1lKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksIGluZGV4TmFtZSwgeyB3cml0YWJsZTogZmFsc2UsIHZhbHVlOiBjcmVhdGVJbmRleGVkRmluZChhcnJheSwgcHJvcGVydHkpIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJyR7aW5kZXhOYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5IGFzIEFycmF5V2l0aEluZGV4PFQsIFA+O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIEFubm90YXRpb25QYXRoRXhwcmVzc2lvbixcbiAgICBBbm5vdGF0aW9uUmVjb3JkLFxuICAgIEFubm90YXRpb25UZXJtLFxuICAgIEV4cHJlc3Npb24sXG4gICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb24sXG4gICAgUGF0aEV4cHJlc3Npb24sXG4gICAgUHJvcGVydHlQYXRoRXhwcmVzc2lvbixcbiAgICBSYXdBbm5vdGF0aW9uLFxuICAgIFJlZmVyZW5jZVxufSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5pbXBvcnQgeyB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUmV2ZXJ0IGFuIG9iamVjdCB0byBpdHMgcmF3IHR5cGUgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCByZWZlcmVuY2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSkge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIENvbGxlY3Rpb246IHZhbHVlLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RlY2ltYWw/LigpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNpbWFsJyxcbiAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNTdHJpbmc/LigpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLnZhbHVlT2YoKS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmFsdWVNYXRjaGVzLmxlbmd0aCA+IDEgJiYgcmVmZXJlbmNlcy5maW5kKChyZWYpID0+IHJlZi5hbGlhcyA9PT0gdmFsdWVNYXRjaGVzWzBdKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICBFbnVtTWVtYmVyOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW50Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0Zsb2F0Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQnLFxuICAgICAgICAgICAgRmxvYXQ6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNEYXRlPy4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGF0ZScsXG4gICAgICAgICAgICBEYXRlOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzQm9vbGVhbj8uKCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2wnLFxuICAgICAgICAgICAgQm9vbDogdmFsdWUudmFsdWVPZigpID09PSAndHJ1ZSdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdQYXRoJykge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUGF0aCcsXG4gICAgICAgICAgICBQYXRoOiB2YWx1ZS5wYXRoXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICBBbm5vdGF0aW9uUGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdBcHBseScpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0FwcGx5JyxcbiAgICAgICAgICAgIEFwcGx5OiB2YWx1ZS5BcHBseVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ051bGwnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdOdWxsJ1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICBQcm9wZXJ0eVBhdGg6IHZhbHVlLnZhbHVlXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJyRUeXBlJykpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1JlY29yZCcsXG4gICAgICAgICAgICBSZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSBhcyBBbm5vdGF0aW9uUmVjb3JkXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV2ZXJ0IGEgdmFsdWUgdG8gaXRzIHJhdyB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiByZXZlcnRWYWx1ZVRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3RvciA9IHZhbHVlPy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHN3aXRjaCAodmFsdWVDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY29uc3QgdmFsdWVNYXRjaGVzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHZhbHVlTWF0Y2hlcy5sZW5ndGggPiAxICYmIHJlZmVyZW5jZXMuZmluZCgocmVmKSA9PiByZWYuYWxpYXMgPT09IHZhbHVlTWF0Y2hlc1swXSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgRW51bU1lbWJlcjogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZzogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdCb29sJyxcbiAgICAgICAgICAgICAgICBCb29sOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkgPT09IHZhbHVlLnRvRml4ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlc3VsdCA9IHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgcmVzdHJpY3RlZEtleXMgPSBbJyRUeXBlJywgJ3Rlcm0nLCAnX19zb3VyY2UnLCAncXVhbGlmaWVyJywgJ0FjdGlvblRhcmdldCcsICdmdWxseVF1YWxpZmllZE5hbWUnLCAnYW5ub3RhdGlvbnMnXTtcblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgZW1iZWRkZWQgYW5ub3RhdGlvbnMgdG8gdGhlaXIgcmF3IHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGN1cnJlbnRBbm5vdGF0aW9ucyB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvbnMgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gYWRkIHRoZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKFxuICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLFxuICAgIGN1cnJlbnRBbm5vdGF0aW9uczogYW55LFxuICAgIHRhcmdldEFubm90YXRpb25zOiBSYXdBbm5vdGF0aW9uW11cbikge1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRBbm5vdGF0aW9ucylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfYW5ub3RhdGlvbnMnKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFubm90YXRpb24gPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBjdXJyZW50QW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBbm5vdGF0aW9uLnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5hbGlhc2VkVGVybSA9IHVuYWxpYXMocmVmZXJlbmNlcywgYCR7a2V5fS4ke3Rlcm19YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmFsaWFzZWRUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaWZpZWRTcGxpdCA9IHVuYWxpYXNlZFRlcm0uc3BsaXQoJyMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24udGVybSA9IHF1YWxpZmllZFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgQW5ub3RhdGlvbiB3aXRoIGEgcXVhbGlmaWVyLCBub3Qgc3VyZSB3aGVuIHRoYXQgY2FuIGhhcHBlbiBpbiByZWFsIHNjZW5hcmlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24ucXVhbGlmaWVyID0gcXVhbGlmaWVkU3BsaXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0QW5ub3RhdGlvbnMucHVzaChwYXJzZWRBbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJhdyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VcbiAqIEBwYXJhbSBjb2xsZWN0aW9uSXRlbSB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0aGUgcmF3IHR5cGUgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvUmF3VHlwZShcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSxcbiAgICBjb2xsZWN0aW9uSXRlbTogYW55XG4pOlxuICAgIHwgQW5ub3RhdGlvblJlY29yZFxuICAgIHwgc3RyaW5nXG4gICAgfCBQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG4gICAgfCBQYXRoRXhwcmVzc2lvblxuICAgIHwgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb25cbiAgICB8IEFubm90YXRpb25QYXRoRXhwcmVzc2lvblxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbkl0ZW07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBSZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IG91dEl0ZW06IEFubm90YXRpb25SZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbkl0ZW0uJFR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZXM6IFtdIGFzIGFueVtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goKGNvbGxlY3Rpb25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZEtleXMuaW5kZXhPZihjb2xsZWN0aW9uS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2xsZWN0aW9uSXRlbVtjb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SXRlbS5wcm9wZXJ0eVZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbGxlY3Rpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpIGFzIEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uS2V5ID09PSAnYW5ub3RhdGlvbnMnICYmIE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtW2NvbGxlY3Rpb25LZXldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEl0ZW0uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0QW5ub3RhdGlvbnNUb1Jhd1R5cGUocmVmZXJlbmNlcywgY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV0sIG91dEl0ZW0uYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dEl0ZW07XG4gICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgUHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZlcnQgYW4gYW5ub3RhdGlvbiB0ZXJtIHRvIGl0J3MgZ2VuZXJpYyBvciByYXcgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRlcm0gdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVydFRlcm1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uVGVybTxhbnk+KTogUmF3QW5ub3RhdGlvbiB7XG4gICAgY29uc3QgYmFzZUFubm90YXRpb246IFJhd0Fubm90YXRpb24gPSB7XG4gICAgICAgIHRlcm06IGFubm90YXRpb24udGVybSxcbiAgICAgICAgcXVhbGlmaWVyOiBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvblxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbnMnKSAmJiBPYmplY3Qua2V5cygoYW5ub3RhdGlvbiBhcyBhbnkpLmFubm90YXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uIG9uIGEgY29sbGVjdGlvbiBpdHNlbGYsIG5vdCBzdXJlIHdoZW4gdGhhdCBoYXBwZW5zIGlmIGF0IGFsbFxuICAgICAgICAgICAgYmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKHJlZmVyZW5jZXMsIChhbm5vdGF0aW9uIGFzIGFueSkuYW5ub3RhdGlvbnMsIGJhc2VBbm5vdGF0aW9uLmFubm90YXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUFubm90YXRpb24sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBhbm5vdGF0aW9uLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmhhc093blByb3BlcnR5KCckVHlwZScpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCByZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm90YXRpb24pIGFzIGFueSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbikgfTtcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG4iLCIiXX0=