@sapui5/sap.fe.core 1.99.0 → 1.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -5,28 +5,12 @@
5
5
  sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/base/BindingParser", "sap/fe/core/helpers/SemanticKeyHelper", "sap/base/Log", "sap/ui/base/EventProvider", "sap/fe/core/BusyLocker", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/EditState", "sap/fe/core/actions/messageHandling", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/AppStartupHelper", "sap/ui/model/odata/v4/ODataUtils"], function (Service, ServiceFactory, BindingParser, SemanticKeyHelper, Log, EventProvider, BusyLocker, ModelHelper, EditState, messageHandling, Placeholder, AppStartupHelper, ODataUtils) {
6
6
  "use strict";
7
7
 
8
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9
-
10
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
11
-
12
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
8
+ var _exports = {};
13
9
 
14
10
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
15
11
 
16
12
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
17
13
 
18
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
19
-
20
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
21
-
22
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
23
-
24
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
25
-
26
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
27
-
28
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
-
30
14
  var RoutingServiceEventing = EventProvider.extend("sap.fe.core.services.RoutingServiceEventing", {
31
15
  metadata: {
32
16
  events: {
@@ -39,951 +23,907 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
39
23
  var RoutingService = /*#__PURE__*/function (_Service) {
40
24
  _inherits(RoutingService, _Service);
41
25
 
42
- var _super = _createSuper(RoutingService);
43
-
44
26
  function RoutingService() {
45
27
  var _this;
46
28
 
47
- _classCallCheck(this, RoutingService);
48
-
49
29
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
50
30
  args[_key] = arguments[_key];
51
31
  }
52
32
 
53
- _this = _super.call.apply(_super, [this].concat(args));
54
-
55
- _defineProperty(_assertThisInitialized(_this), "navigationInfoQueue", []);
56
-
33
+ _this = _Service.call.apply(_Service, [this].concat(args)) || this;
34
+ _this.navigationInfoQueue = [];
57
35
  return _this;
58
36
  }
59
37
 
60
- _createClass(RoutingService, [{
61
- key: "init",
62
- value: function init() {
63
- var oContext = this.getContext();
64
-
65
- if (oContext.scopeType === "component") {
66
- this.oAppComponent = oContext.scopeObject;
67
- this.oModel = this.oAppComponent.getModel();
68
- this.oMetaModel = this.oModel.getMetaModel();
69
- this.oRouter = this.oAppComponent.getRouter();
70
- this.oRouterProxy = this.oAppComponent.getRouterProxy();
71
- this.eventProvider = new RoutingServiceEventing();
72
- var oRoutingConfig = this.oAppComponent.getManifestEntry("/sap.ui5/routing");
73
- var oRootViewConfig = this.oAppComponent.getManifestEntry("/sap.ui5/rootView");
74
-
75
- this._parseRoutingConfiguration(oRoutingConfig, oRootViewConfig);
76
-
77
- var oAppConfig = this.oAppComponent.getManifestEntry("/sap.app");
78
- this.outbounds = oAppConfig && oAppConfig.crossNavigation && oAppConfig.crossNavigation.outbounds;
79
- }
38
+ _exports.RoutingService = RoutingService;
39
+ var _proto = RoutingService.prototype;
80
40
 
81
- this.initPromise = Promise.resolve(this);
82
- }
83
- }, {
84
- key: "beforeExit",
85
- value: function beforeExit() {
86
- this.oRouter.detachRouteMatched(this._fnOnRouteMatched, this);
87
- this.eventProvider.fireEvent("routeMatched", {});
88
- }
89
- }, {
90
- key: "exit",
91
- value: function exit() {
92
- this.eventProvider.destroy();
41
+ _proto.init = function init() {
42
+ var oContext = this.getContext();
43
+
44
+ if (oContext.scopeType === "component") {
45
+ this.oAppComponent = oContext.scopeObject;
46
+ this.oModel = this.oAppComponent.getModel();
47
+ this.oMetaModel = this.oModel.getMetaModel();
48
+ this.oRouter = this.oAppComponent.getRouter();
49
+ this.oRouterProxy = this.oAppComponent.getRouterProxy();
50
+ this.eventProvider = new RoutingServiceEventing();
51
+ var oRoutingConfig = this.oAppComponent.getManifestEntry("/sap.ui5/routing");
52
+ var oRootViewConfig = this.oAppComponent.getManifestEntry("/sap.ui5/rootView");
53
+
54
+ this._parseRoutingConfiguration(oRoutingConfig, oRootViewConfig);
55
+
56
+ var oAppConfig = this.oAppComponent.getManifestEntry("/sap.app");
57
+ this.outbounds = oAppConfig && oAppConfig.crossNavigation && oAppConfig.crossNavigation.outbounds;
93
58
  }
94
- /**
95
- * Parse a manifest routing configuration for internal usage.
96
- *
97
- * @param {object} oRoutingConfig The routing configuration from the manifest
98
- * @param {object} oRootViewConfig The root view configuration from the manifest
99
- * @private
100
- */
101
-
102
- }, {
103
- key: "_parseRoutingConfiguration",
104
- value: function _parseRoutingConfiguration(oRoutingConfig, oRootViewConfig) {
105
- var _this2 = this;
106
-
107
- var isFCL = oRootViewConfig && oRootViewConfig.viewName === "sap.fe.templates.RootContainer.view.Fcl"; // Information of targets
108
-
109
- this._mTargets = {};
110
- Object.keys(oRoutingConfig.targets).forEach(function (sTargetName) {
111
- _this2._mTargets[sTargetName] = Object.assign({
112
- targetName: sTargetName
113
- }, oRoutingConfig.targets[sTargetName]); // View level for FCL cases is calculated from the target pattern
114
-
115
- if (_this2._mTargets[sTargetName].contextPattern !== undefined) {
116
- _this2._mTargets[sTargetName].viewLevel = _this2._getViewLevelFromPattern(_this2._mTargets[sTargetName].contextPattern, 0);
117
- }
118
- }); // Information of routes
119
59
 
120
- this._mRoutes = {};
60
+ this.initPromise = Promise.resolve(this);
61
+ };
121
62
 
122
- for (var sRouteKey in oRoutingConfig.routes) {
123
- var oRouteManifestInfo = oRoutingConfig.routes[sRouteKey],
124
- aRouteTargets = Array.isArray(oRouteManifestInfo.target) ? oRouteManifestInfo.target : [oRouteManifestInfo.target],
125
- sRouteName = Array.isArray(oRoutingConfig.routes) ? oRouteManifestInfo.name : sRouteKey,
126
- sRoutePattern = oRouteManifestInfo.pattern; // Check route pattern: all patterns need to end with ':?query:', that we use for parameters
63
+ _proto.beforeExit = function beforeExit() {
64
+ this.oRouter.detachRouteMatched(this._fnOnRouteMatched, this);
65
+ this.eventProvider.fireEvent("routeMatched", {});
66
+ };
127
67
 
128
- if (sRoutePattern.length < 8 || sRoutePattern.indexOf(":?query:") !== sRoutePattern.length - 8) {
129
- Log.warning("Pattern for route " + sRouteName + " doesn't end with ':?query:' : " + sRoutePattern);
130
- }
68
+ _proto.exit = function exit() {
69
+ this.eventProvider.destroy();
70
+ }
71
+ /**
72
+ * Parse a manifest routing configuration for internal usage.
73
+ *
74
+ * @param {object} oRoutingConfig The routing configuration from the manifest
75
+ * @param {object} oRootViewConfig The root view configuration from the manifest
76
+ * @private
77
+ */
78
+ ;
79
+
80
+ _proto._parseRoutingConfiguration = function _parseRoutingConfiguration(oRoutingConfig, oRootViewConfig) {
81
+ var _this2 = this;
82
+
83
+ var isFCL = oRootViewConfig && oRootViewConfig.viewName === "sap.fe.templates.RootContainer.view.Fcl"; // Information of targets
84
+
85
+ this._mTargets = {};
86
+ Object.keys(oRoutingConfig.targets).forEach(function (sTargetName) {
87
+ _this2._mTargets[sTargetName] = Object.assign({
88
+ targetName: sTargetName
89
+ }, oRoutingConfig.targets[sTargetName]); // View level for FCL cases is calculated from the target pattern
90
+
91
+ if (_this2._mTargets[sTargetName].contextPattern !== undefined) {
92
+ _this2._mTargets[sTargetName].viewLevel = _this2._getViewLevelFromPattern(_this2._mTargets[sTargetName].contextPattern, 0);
93
+ }
94
+ }); // Information of routes
131
95
 
132
- var iRouteLevel = this._getViewLevelFromPattern(sRoutePattern, 0);
96
+ this._mRoutes = {};
133
97
 
134
- this._mRoutes[sRouteName] = {
135
- name: sRouteName,
136
- pattern: sRoutePattern,
137
- targets: aRouteTargets,
138
- routeLevel: iRouteLevel
139
- }; // Add the parent targets in the list of targets for the route
98
+ for (var sRouteKey in oRoutingConfig.routes) {
99
+ var oRouteManifestInfo = oRoutingConfig.routes[sRouteKey],
100
+ aRouteTargets = Array.isArray(oRouteManifestInfo.target) ? oRouteManifestInfo.target : [oRouteManifestInfo.target],
101
+ sRouteName = Array.isArray(oRoutingConfig.routes) ? oRouteManifestInfo.name : sRouteKey,
102
+ sRoutePattern = oRouteManifestInfo.pattern; // Check route pattern: all patterns need to end with ':?query:', that we use for parameters
140
103
 
141
- for (var i = 0; i < aRouteTargets.length; i++) {
142
- var sParentTargetName = this._mTargets[aRouteTargets[i]].parent;
104
+ if (sRoutePattern.length < 8 || sRoutePattern.indexOf(":?query:") !== sRoutePattern.length - 8) {
105
+ Log.warning("Pattern for route " + sRouteName + " doesn't end with ':?query:' : " + sRoutePattern);
106
+ }
143
107
 
144
- if (sParentTargetName) {
145
- aRouteTargets.push(sParentTargetName);
146
- }
147
- }
108
+ var iRouteLevel = this._getViewLevelFromPattern(sRoutePattern, 0);
148
109
 
149
- if (!isFCL) {
150
- // View level for non-FCL cases is calculated from the route pattern
151
- if (this._mTargets[aRouteTargets[0]].viewLevel === undefined || this._mTargets[aRouteTargets[0]].viewLevel < iRouteLevel) {
152
- // There are cases when different routes point to the same target. We take the
153
- // largest viewLevel in that case.
154
- this._mTargets[aRouteTargets[0]].viewLevel = iRouteLevel;
155
- } // FCL level for non-FCL cases is equal to -1
110
+ this._mRoutes[sRouteName] = {
111
+ name: sRouteName,
112
+ pattern: sRoutePattern,
113
+ targets: aRouteTargets,
114
+ routeLevel: iRouteLevel
115
+ }; // Add the parent targets in the list of targets for the route
156
116
 
117
+ for (var i = 0; i < aRouteTargets.length; i++) {
118
+ var sParentTargetName = this._mTargets[aRouteTargets[i]].parent;
157
119
 
158
- this._mTargets[aRouteTargets[0]].FCLLevel = -1;
159
- } else if (aRouteTargets.length === 1 && this._mTargets[aRouteTargets[0]].controlAggregation !== "beginColumnPages") {
160
- // We're in the case where there's only 1 target for the route, and it's not in the first column
161
- // --> this is a fullscreen column after all columns in the FCL have been used
162
- this._mTargets[aRouteTargets[0]].FCLLevel = 3;
163
- } else {
164
- // Other FCL cases
165
- aRouteTargets.forEach(function (sTargetName) {
166
- switch (_this2._mTargets[sTargetName].controlAggregation) {
167
- case "beginColumnPages":
168
- _this2._mTargets[sTargetName].FCLLevel = 0;
169
- break;
170
-
171
- case "midColumnPages":
172
- _this2._mTargets[sTargetName].FCLLevel = 1;
173
- break;
174
-
175
- default:
176
- _this2._mTargets[sTargetName].FCLLevel = 2;
177
- }
178
- });
120
+ if (sParentTargetName) {
121
+ aRouteTargets.push(sParentTargetName);
179
122
  }
180
- } // Propagate viewLevel, contextPattern, FCLLevel and controlAggregation to parent targets
123
+ }
181
124
 
125
+ if (!isFCL) {
126
+ // View level for non-FCL cases is calculated from the route pattern
127
+ if (this._mTargets[aRouteTargets[0]].viewLevel === undefined || this._mTargets[aRouteTargets[0]].viewLevel < iRouteLevel) {
128
+ // There are cases when different routes point to the same target. We take the
129
+ // largest viewLevel in that case.
130
+ this._mTargets[aRouteTargets[0]].viewLevel = iRouteLevel;
131
+ } // FCL level for non-FCL cases is equal to -1
182
132
 
183
- Object.keys(this._mTargets).forEach(function (sTargetName) {
184
- while (_this2._mTargets[sTargetName].parent) {
185
- var _sParentTargetName = _this2._mTargets[sTargetName].parent;
186
- _this2._mTargets[_sParentTargetName].viewLevel = _this2._mTargets[_sParentTargetName].viewLevel || _this2._mTargets[sTargetName].viewLevel;
187
- _this2._mTargets[_sParentTargetName].contextPattern = _this2._mTargets[_sParentTargetName].contextPattern || _this2._mTargets[sTargetName].contextPattern;
188
- _this2._mTargets[_sParentTargetName].FCLLevel = _this2._mTargets[_sParentTargetName].FCLLevel || _this2._mTargets[sTargetName].FCLLevel;
189
- _this2._mTargets[_sParentTargetName].controlAggregation = _this2._mTargets[_sParentTargetName].controlAggregation || _this2._mTargets[sTargetName].controlAggregation;
190
- sTargetName = _sParentTargetName;
191
- }
192
- }); // Determine the root entity for the app
193
133
 
194
- var aLevel0RouteNames = [];
195
- var aLevel1RouteNames = [];
196
- var sDefaultRouteName;
134
+ this._mTargets[aRouteTargets[0]].FCLLevel = -1;
135
+ } else if (aRouteTargets.length === 1 && this._mTargets[aRouteTargets[0]].controlAggregation !== "beginColumnPages") {
136
+ // We're in the case where there's only 1 target for the route, and it's not in the first column
137
+ // --> this is a fullscreen column after all columns in the FCL have been used
138
+ this._mTargets[aRouteTargets[0]].FCLLevel = 3;
139
+ } else {
140
+ // Other FCL cases
141
+ aRouteTargets.forEach(function (sTargetName) {
142
+ switch (_this2._mTargets[sTargetName].controlAggregation) {
143
+ case "beginColumnPages":
144
+ _this2._mTargets[sTargetName].FCLLevel = 0;
145
+ break;
146
+
147
+ case "midColumnPages":
148
+ _this2._mTargets[sTargetName].FCLLevel = 1;
149
+ break;
150
+
151
+ default:
152
+ _this2._mTargets[sTargetName].FCLLevel = 2;
153
+ }
154
+ });
155
+ }
156
+ } // Propagate viewLevel, contextPattern, FCLLevel and controlAggregation to parent targets
197
157
 
198
- for (var sName in this._mRoutes) {
199
- var iLevel = this._mRoutes[sName].routeLevel;
200
158
 
201
- if (iLevel === 0) {
202
- aLevel0RouteNames.push(sName);
203
- } else if (iLevel === 1) {
204
- aLevel1RouteNames.push(sName);
205
- }
159
+ Object.keys(this._mTargets).forEach(function (sTargetName) {
160
+ while (_this2._mTargets[sTargetName].parent) {
161
+ var _sParentTargetName = _this2._mTargets[sTargetName].parent;
162
+ _this2._mTargets[_sParentTargetName].viewLevel = _this2._mTargets[_sParentTargetName].viewLevel || _this2._mTargets[sTargetName].viewLevel;
163
+ _this2._mTargets[_sParentTargetName].contextPattern = _this2._mTargets[_sParentTargetName].contextPattern || _this2._mTargets[sTargetName].contextPattern;
164
+ _this2._mTargets[_sParentTargetName].FCLLevel = _this2._mTargets[_sParentTargetName].FCLLevel || _this2._mTargets[sTargetName].FCLLevel;
165
+ _this2._mTargets[_sParentTargetName].controlAggregation = _this2._mTargets[_sParentTargetName].controlAggregation || _this2._mTargets[sTargetName].controlAggregation;
166
+ sTargetName = _sParentTargetName;
206
167
  }
168
+ }); // Determine the root entity for the app
169
+
170
+ var aLevel0RouteNames = [];
171
+ var aLevel1RouteNames = [];
172
+ var sDefaultRouteName;
207
173
 
208
- if (aLevel0RouteNames.length === 1) {
209
- sDefaultRouteName = aLevel0RouteNames[0];
210
- } else if (aLevel1RouteNames.length === 1) {
211
- sDefaultRouteName = aLevel1RouteNames[0];
174
+ for (var sName in this._mRoutes) {
175
+ var iLevel = this._mRoutes[sName].routeLevel;
176
+
177
+ if (iLevel === 0) {
178
+ aLevel0RouteNames.push(sName);
179
+ } else if (iLevel === 1) {
180
+ aLevel1RouteNames.push(sName);
212
181
  }
182
+ }
213
183
 
214
- if (sDefaultRouteName) {
215
- var sDefaultTargetName = this._mRoutes[sDefaultRouteName].targets.slice(-1)[0];
184
+ if (aLevel0RouteNames.length === 1) {
185
+ sDefaultRouteName = aLevel0RouteNames[0];
186
+ } else if (aLevel1RouteNames.length === 1) {
187
+ sDefaultRouteName = aLevel1RouteNames[0];
188
+ }
216
189
 
217
- this.sContextPath = "";
190
+ if (sDefaultRouteName) {
191
+ var sDefaultTargetName = this._mRoutes[sDefaultRouteName].targets.slice(-1)[0];
218
192
 
219
- if (this._mTargets[sDefaultTargetName].options && this._mTargets[sDefaultTargetName].options.settings) {
220
- var oSettings = this._mTargets[sDefaultTargetName].options.settings;
221
- this.sContextPath = oSettings.contextPath || "/" + oSettings.entitySet;
222
- }
193
+ this.sContextPath = "";
194
+
195
+ if (this._mTargets[sDefaultTargetName].options && this._mTargets[sDefaultTargetName].options.settings) {
196
+ var oSettings = this._mTargets[sDefaultTargetName].options.settings;
197
+ this.sContextPath = oSettings.contextPath || "/" + oSettings.entitySet;
198
+ }
223
199
 
224
- if (!this.sContextPath) {
225
- Log.warning("Cannot determine default contextPath: contextPath or entitySet missing in default target: " + sDefaultTargetName);
200
+ if (!this.sContextPath) {
201
+ Log.warning("Cannot determine default contextPath: contextPath or entitySet missing in default target: " + sDefaultTargetName);
202
+ }
203
+ } else {
204
+ Log.warning("Cannot determine default contextPath: no default route found.");
205
+ } // We need to establish the correct path to the different pages, including the navigation properties
206
+
207
+
208
+ Object.keys(this._mTargets).map(function (sTargetKey) {
209
+ return _this2._mTargets[sTargetKey];
210
+ }).sort(function (a, b) {
211
+ return a.viewLevel < b.viewLevel ? -1 : 1;
212
+ }).forEach(function (target) {
213
+ // After sorting the targets per level we can then go through their navigation object and update the paths accordingly.
214
+ if (target.options) {
215
+ var settings = target.options.settings;
216
+ var sContextPath = settings.contextPath || (settings.entitySet ? "/" + settings.entitySet : "");
217
+
218
+ if (!settings.fullContextPath && sContextPath) {
219
+ settings.fullContextPath = sContextPath + "/";
226
220
  }
227
- } else {
228
- Log.warning("Cannot determine default contextPath: no default route found.");
229
- } // We need to establish the correct path to the different pages, including the navigation properties
230
-
231
-
232
- Object.keys(this._mTargets).map(function (sTargetKey) {
233
- return _this2._mTargets[sTargetKey];
234
- }).sort(function (a, b) {
235
- return a.viewLevel < b.viewLevel ? -1 : 1;
236
- }).forEach(function (target) {
237
- // After sorting the targets per level we can then go through their navigation object and update the paths accordingly.
238
- if (target.options) {
239
- var settings = target.options.settings;
240
- var sContextPath = settings.contextPath || (settings.entitySet ? "/" + settings.entitySet : "");
241
-
242
- if (!settings.fullContextPath && sContextPath) {
243
- settings.fullContextPath = sContextPath + "/";
244
- }
245
221
 
246
- Object.keys(settings.navigation || {}).forEach(function (sNavName) {
247
- // Check if it's a navigation property
248
- var targetRoute = _this2._mRoutes[settings.navigation[sNavName].detail.route];
249
-
250
- if (targetRoute && targetRoute.targets) {
251
- targetRoute.targets.forEach(function (sTargetName) {
252
- if (_this2._mTargets[sTargetName].options && _this2._mTargets[sTargetName].options.settings && !_this2._mTargets[sTargetName].options.settings.fullContextPath) {
253
- if (target.viewLevel === 0) {
254
- _this2._mTargets[sTargetName].options.settings.fullContextPath = "/" + sNavName + "/";
255
- } else {
256
- _this2._mTargets[sTargetName].options.settings.fullContextPath = settings.fullContextPath + sNavName + "/";
257
- }
222
+ Object.keys(settings.navigation || {}).forEach(function (sNavName) {
223
+ // Check if it's a navigation property
224
+ var targetRoute = _this2._mRoutes[settings.navigation[sNavName].detail.route];
225
+
226
+ if (targetRoute && targetRoute.targets) {
227
+ targetRoute.targets.forEach(function (sTargetName) {
228
+ if (_this2._mTargets[sTargetName].options && _this2._mTargets[sTargetName].options.settings && !_this2._mTargets[sTargetName].options.settings.fullContextPath) {
229
+ if (target.viewLevel === 0) {
230
+ _this2._mTargets[sTargetName].options.settings.fullContextPath = "/" + sNavName + "/";
231
+ } else {
232
+ _this2._mTargets[sTargetName].options.settings.fullContextPath = settings.fullContextPath + sNavName + "/";
258
233
  }
259
- });
260
- }
261
- });
262
- }
263
- });
264
- }
265
- /**
266
- * Calculates a view level from a pattern by counting the number of segments.
267
- *
268
- * @param {string} sPattern The pattern
269
- * @param {number} viewLevel The current level of view
270
- * @returns {number} The level
271
- */
272
-
273
- }, {
274
- key: "_getViewLevelFromPattern",
275
- value: function _getViewLevelFromPattern(sPattern, viewLevel) {
276
- sPattern = sPattern.replace(":?query:", "");
277
- var regex = new RegExp("/[^/]*$");
278
-
279
- if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
280
- sPattern = "/" + sPattern;
234
+ }
235
+ });
236
+ }
237
+ });
281
238
  }
239
+ });
240
+ }
241
+ /**
242
+ * Calculates a view level from a pattern by counting the number of segments.
243
+ *
244
+ * @param {string} sPattern The pattern
245
+ * @param {number} viewLevel The current level of view
246
+ * @returns {number} The level
247
+ */
248
+ ;
282
249
 
283
- if (sPattern.length) {
284
- sPattern = sPattern.replace(regex, "");
250
+ _proto._getViewLevelFromPattern = function _getViewLevelFromPattern(sPattern, viewLevel) {
251
+ sPattern = sPattern.replace(":?query:", "");
252
+ var regex = new RegExp("/[^/]*$");
285
253
 
286
- if (this.oRouter.match(sPattern) || sPattern === "") {
287
- return this._getViewLevelFromPattern(sPattern, ++viewLevel);
288
- } else {
289
- return this._getViewLevelFromPattern(sPattern, viewLevel);
290
- }
254
+ if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
255
+ sPattern = "/" + sPattern;
256
+ }
257
+
258
+ if (sPattern.length) {
259
+ sPattern = sPattern.replace(regex, "");
260
+
261
+ if (this.oRouter.match(sPattern) || sPattern === "") {
262
+ return this._getViewLevelFromPattern(sPattern, ++viewLevel);
291
263
  } else {
292
- return viewLevel;
264
+ return this._getViewLevelFromPattern(sPattern, viewLevel);
293
265
  }
266
+ } else {
267
+ return viewLevel;
294
268
  }
295
- }, {
296
- key: "_getRouteInformation",
297
- value: function _getRouteInformation(sRouteName) {
298
- return this._mRoutes[sRouteName];
299
- }
300
- }, {
301
- key: "_getTargetInformation",
302
- value: function _getTargetInformation(sTargetName) {
303
- return this._mTargets[sTargetName];
269
+ };
270
+
271
+ _proto._getRouteInformation = function _getRouteInformation(sRouteName) {
272
+ return this._mRoutes[sRouteName];
273
+ };
274
+
275
+ _proto._getTargetInformation = function _getTargetInformation(sTargetName) {
276
+ return this._mTargets[sTargetName];
277
+ };
278
+
279
+ _proto._getComponentId = function _getComponentId(sOwnerId, sComponentId) {
280
+ if (sComponentId.indexOf(sOwnerId + "---") === 0) {
281
+ return sComponentId.substr(sOwnerId.length + 3);
304
282
  }
305
- }, {
306
- key: "_getComponentId",
307
- value: function _getComponentId(sOwnerId, sComponentId) {
308
- if (sComponentId.indexOf(sOwnerId + "---") === 0) {
309
- return sComponentId.substr(sOwnerId.length + 3);
283
+
284
+ return sComponentId;
285
+ }
286
+ /**
287
+ * Get target information for a given component.
288
+ *
289
+ * @param {object} oComponentInstance Instance of the component
290
+ * @returns {object} The configuration for the target
291
+ */
292
+ ;
293
+
294
+ _proto.getTargetInformationFor = function getTargetInformationFor(oComponentInstance) {
295
+ var _this3 = this;
296
+
297
+ var sTargetComponentId = this._getComponentId(oComponentInstance._sOwnerId, oComponentInstance.getId());
298
+
299
+ var sCorrectTargetName = null;
300
+ Object.keys(this._mTargets).forEach(function (sTargetName) {
301
+ if (_this3._mTargets[sTargetName].id === sTargetComponentId || _this3._mTargets[sTargetName].viewId === sTargetComponentId) {
302
+ sCorrectTargetName = sTargetName;
310
303
  }
304
+ });
305
+ return this._getTargetInformation(sCorrectTargetName);
306
+ };
311
307
 
312
- return sComponentId;
313
- }
314
- /**
315
- * Get target information for a given component.
316
- *
317
- * @param {object} oComponentInstance Instance of the component
318
- * @returns {object} The configuration for the target
319
- */
320
-
321
- }, {
322
- key: "getTargetInformationFor",
323
- value: function getTargetInformationFor(oComponentInstance) {
324
- var _this3 = this;
325
-
326
- var sTargetComponentId = this._getComponentId(oComponentInstance._sOwnerId, oComponentInstance.getId());
327
-
328
- var sCorrectTargetName = null;
329
- Object.keys(this._mTargets).forEach(function (sTargetName) {
330
- if (_this3._mTargets[sTargetName].id === sTargetComponentId || _this3._mTargets[sTargetName].viewId === sTargetComponentId) {
331
- sCorrectTargetName = sTargetName;
332
- }
333
- });
334
- return this._getTargetInformation(sCorrectTargetName);
335
- }
336
- }, {
337
- key: "getLastSemanticMapping",
338
- value: function getLastSemanticMapping() {
339
- return this.oLastSemanticMapping;
340
- }
341
- }, {
342
- key: "setLastSemanticMapping",
343
- value: function setLastSemanticMapping(oMapping) {
344
- this.oLastSemanticMapping = oMapping;
345
- }
346
- }, {
347
- key: "navigateTo",
348
- value: function navigateTo(oContext, sRouteName, mParameterMapping, bPreserveHistory) {
349
- var _this4 = this;
308
+ _proto.getLastSemanticMapping = function getLastSemanticMapping() {
309
+ return this.oLastSemanticMapping;
310
+ };
350
311
 
351
- var sTargetURLPromise, bIsStickyMode;
312
+ _proto.setLastSemanticMapping = function setLastSemanticMapping(oMapping) {
313
+ this.oLastSemanticMapping = oMapping;
314
+ };
352
315
 
353
- if (oContext.getModel() && oContext.getModel().getMetaModel) {
354
- bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
355
- }
316
+ _proto.navigateTo = function navigateTo(oContext, sRouteName, mParameterMapping, bPreserveHistory) {
317
+ var _this4 = this;
356
318
 
357
- if (!mParameterMapping) {
358
- // if there is no parameter mapping define this mean we rely entirely on the binding context path
359
- sTargetURLPromise = Promise.resolve(SemanticKeyHelper.getSemanticPath(oContext));
360
- } else {
361
- sTargetURLPromise = this.prepareParameters(mParameterMapping, sRouteName, oContext).then(function (mParameters) {
362
- return _this4.oRouter.getURL(sRouteName, mParameters);
363
- });
364
- }
319
+ var sTargetURLPromise, bIsStickyMode;
320
+
321
+ if (oContext.getModel() && oContext.getModel().getMetaModel) {
322
+ bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
323
+ }
365
324
 
366
- return sTargetURLPromise.then(function (sTargetURL) {
367
- _this4.oRouterProxy.navToHash(sTargetURL, bPreserveHistory, false, false, !bIsStickyMode);
325
+ if (!mParameterMapping) {
326
+ // if there is no parameter mapping define this mean we rely entirely on the binding context path
327
+ sTargetURLPromise = Promise.resolve(SemanticKeyHelper.getSemanticPath(oContext));
328
+ } else {
329
+ sTargetURLPromise = this.prepareParameters(mParameterMapping, sRouteName, oContext).then(function (mParameters) {
330
+ return _this4.oRouter.getURL(sRouteName, mParameters);
368
331
  });
369
332
  }
370
- /**
371
- * Method to return a map of routing target parameters where the binding syntax is resolved to the current model.
372
- *
373
- * @param {object} mParameters Parameters map in the format [k: string] : ComplexBindingSyntax
374
- * @param {string} sTargetRoute Name of the target route
375
- * @param {object} oContext The instance of the binding context
376
- * @returns {Promise} A promise which resolves to the routing target parameters
377
- */
378
-
379
- }, {
380
- key: "prepareParameters",
381
- value: function prepareParameters(mParameters, sTargetRoute, oContext) {
382
- var _this5 = this;
383
-
384
- var oParametersPromise;
385
-
386
- try {
387
- var sContextPath = oContext.getPath();
388
- var oMetaModel = oContext.getModel().getMetaModel();
389
- var aContextPathParts = sContextPath.split("/");
390
- var aAllResolvedParameterPromises = Object.keys(mParameters).map(function (sParameterKey) {
391
- var sParameterMappingExpression = mParameters[sParameterKey]; // We assume the defined parameters will be compatible with a binding expression
392
-
393
- var oParsedExpression = BindingParser.complexParser(sParameterMappingExpression);
394
- var aParts = oParsedExpression.parts || [oParsedExpression];
395
- var aResolvedParameterPromises = aParts.map(function (oPathPart) {
396
- var aRelativeParts = oPathPart.path.split("../"); // We go up the current context path as many times as necessary
397
-
398
- var aLocalParts = aContextPathParts.slice(0, aContextPathParts.length - aRelativeParts.length + 1);
399
- aLocalParts.push(aRelativeParts[aRelativeParts.length - 1]);
400
- var sPropertyPath = aLocalParts.join("/");
401
- var oMetaContext = oMetaModel.getMetaContext(sPropertyPath);
402
- return oContext.requestProperty(sPropertyPath).then(function (oValue) {
403
- var oPropertyInfo = oMetaContext.getObject();
404
- var sEdmType = oPropertyInfo.$Type;
405
- return ODataUtils.formatLiteral(oValue, sEdmType);
406
- });
407
- });
408
- return Promise.all(aResolvedParameterPromises).then(function (aResolvedParameters) {
409
- var value = oParsedExpression.formatter ? oParsedExpression.formatter.apply(_this5, aResolvedParameters) : aResolvedParameters.join("");
410
- return {
411
- key: sParameterKey,
412
- value: value
413
- };
333
+
334
+ return sTargetURLPromise.then(function (sTargetURL) {
335
+ _this4.oRouterProxy.navToHash(sTargetURL, bPreserveHistory, false, false, !bIsStickyMode);
336
+ });
337
+ }
338
+ /**
339
+ * Method to return a map of routing target parameters where the binding syntax is resolved to the current model.
340
+ *
341
+ * @param {object} mParameters Parameters map in the format [k: string] : ComplexBindingSyntax
342
+ * @param {string} sTargetRoute Name of the target route
343
+ * @param {object} oContext The instance of the binding context
344
+ * @returns {Promise} A promise which resolves to the routing target parameters
345
+ */
346
+ ;
347
+
348
+ _proto.prepareParameters = function prepareParameters(mParameters, sTargetRoute, oContext) {
349
+ var _this5 = this;
350
+
351
+ var oParametersPromise;
352
+
353
+ try {
354
+ var sContextPath = oContext.getPath();
355
+ var oMetaModel = oContext.getModel().getMetaModel();
356
+ var aContextPathParts = sContextPath.split("/");
357
+ var aAllResolvedParameterPromises = Object.keys(mParameters).map(function (sParameterKey) {
358
+ var sParameterMappingExpression = mParameters[sParameterKey]; // We assume the defined parameters will be compatible with a binding expression
359
+
360
+ var oParsedExpression = BindingParser.complexParser(sParameterMappingExpression);
361
+ var aParts = oParsedExpression.parts || [oParsedExpression];
362
+ var aResolvedParameterPromises = aParts.map(function (oPathPart) {
363
+ var aRelativeParts = oPathPart.path.split("../"); // We go up the current context path as many times as necessary
364
+
365
+ var aLocalParts = aContextPathParts.slice(0, aContextPathParts.length - aRelativeParts.length + 1);
366
+ aLocalParts.push(aRelativeParts[aRelativeParts.length - 1]);
367
+ var sPropertyPath = aLocalParts.join("/");
368
+ var oMetaContext = oMetaModel.getMetaContext(sPropertyPath);
369
+ return oContext.requestProperty(sPropertyPath).then(function (oValue) {
370
+ var oPropertyInfo = oMetaContext.getObject();
371
+ var sEdmType = oPropertyInfo.$Type;
372
+ return ODataUtils.formatLiteral(oValue, sEdmType);
414
373
  });
415
374
  });
416
- oParametersPromise = Promise.all(aAllResolvedParameterPromises).then(function (aAllResolvedParameters) {
417
- var oParameters = {};
418
- aAllResolvedParameters.forEach(function (oResolvedParameter) {
419
- oParameters[oResolvedParameter.key] = oResolvedParameter.value;
420
- });
421
- return oParameters;
375
+ return Promise.all(aResolvedParameterPromises).then(function (aResolvedParameters) {
376
+ var value = oParsedExpression.formatter ? oParsedExpression.formatter.apply(_this5, aResolvedParameters) : aResolvedParameters.join("");
377
+ return {
378
+ key: sParameterKey,
379
+ value: value
380
+ };
422
381
  });
423
- } catch (oError) {
424
- Log.error("Could not parse the parameters for the navigation to route " + sTargetRoute);
425
- oParametersPromise = Promise.resolve(undefined);
426
- }
427
-
428
- return oParametersPromise;
429
- }
430
- }, {
431
- key: "_fireRouteMatchEvents",
432
- value: function _fireRouteMatchEvents(mParameters) {
433
- this.eventProvider.fireEvent("routeMatched", mParameters);
434
- this.eventProvider.fireEvent("afterRouteMatched", mParameters);
435
- EditState.cleanProcessedEditState(); // Reset UI state when all bindings have been refreshed
382
+ });
383
+ oParametersPromise = Promise.all(aAllResolvedParameterPromises).then(function (aAllResolvedParameters) {
384
+ var oParameters = {};
385
+ aAllResolvedParameters.forEach(function (oResolvedParameter) {
386
+ oParameters[oResolvedParameter.key] = oResolvedParameter.value;
387
+ });
388
+ return oParameters;
389
+ });
390
+ } catch (oError) {
391
+ Log.error("Could not parse the parameters for the navigation to route " + sTargetRoute);
392
+ oParametersPromise = Promise.resolve(undefined);
436
393
  }
437
- /**
438
- * Navigates to a context.
439
- *
440
- * @param {sap.ui.model.odata.v4.Context} oContext The Context to be navigated to
441
- * @param {object} [mParameters] Optional, map containing the following attributes:
442
- * @param {boolean} [mParameters.checkNoHashChange] Navigate to the context without changing the URL
443
- * @param {Promise} [mParameters.asyncContext] The context is created async, navigate to (...) and
444
- * wait for Promise to be resolved and then navigate into the context
445
- * @param {boolean} [mParameters.bDeferredContext] The context shall be created deferred at the target page
446
- * @param {boolean} [mParameters.editable] The target page shall be immediately in the edit mode to avoid flickering
447
- * @param {boolean} [mParameters.bPersistOPScroll] The bPersistOPScroll will be used for scrolling to first tab
448
- * @param {number} [mParameters.updateFCLLevel] `+1` if we add a column in FCL, `-1` to remove a column, 0 to stay on the same column
449
- * @param {boolean} [mParameters.noPreservationCache] Do navigation without taking into account the preserved cache mechanism
450
- * @param {boolean} [mParameters.bRecreateContext] Force re-creation of the context instead of using the one passed as parameter
451
- * @param {boolean} [mParameters.bForceFocus] Forces focus selection after navigation
452
- * @param {object} [oViewData] View data
453
- * @param {object} [oCurrentTargetInfo] The target information from which the navigation is triggered
454
- * @returns {Promise} Promise which is resolved once the navigation is triggered
455
- *
456
- * @ui5-restricted
457
- * @final
458
- */
459
-
460
- }, {
461
- key: "navigateToContext",
462
- value: function navigateToContext(oContext, mParameters, oViewData, oCurrentTargetInfo) {
463
- var _this6 = this;
464
-
465
- var sTargetRoute = "",
466
- oRouteParametersPromise,
467
- bIsStickyMode = false;
468
-
469
- if (oContext.getModel() && oContext.getModel().getMetaModel) {
470
- bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
471
- } // Manage parameter mapping
472
-
473
-
474
- if (mParameters && mParameters.targetPath && oViewData && oViewData.navigation) {
475
- var oRouteDetail = oViewData.navigation[mParameters.targetPath].detail;
476
- sTargetRoute = oRouteDetail.route;
477
-
478
- if (oRouteDetail.parameters) {
479
- oRouteParametersPromise = this.prepareParameters(oRouteDetail.parameters, sTargetRoute, oContext);
480
- }
394
+
395
+ return oParametersPromise;
396
+ };
397
+
398
+ _proto._fireRouteMatchEvents = function _fireRouteMatchEvents(mParameters) {
399
+ this.eventProvider.fireEvent("routeMatched", mParameters);
400
+ this.eventProvider.fireEvent("afterRouteMatched", mParameters);
401
+ EditState.cleanProcessedEditState(); // Reset UI state when all bindings have been refreshed
402
+ }
403
+ /**
404
+ * Navigates to a context.
405
+ *
406
+ * @param {sap.ui.model.odata.v4.Context} oContext The Context to be navigated to
407
+ * @param {object} [mParameters] Optional, map containing the following attributes:
408
+ * @param {boolean} [mParameters.checkNoHashChange] Navigate to the context without changing the URL
409
+ * @param {Promise} [mParameters.asyncContext] The context is created async, navigate to (...) and
410
+ * wait for Promise to be resolved and then navigate into the context
411
+ * @param {boolean} [mParameters.bDeferredContext] The context shall be created deferred at the target page
412
+ * @param {boolean} [mParameters.editable] The target page shall be immediately in the edit mode to avoid flickering
413
+ * @param {boolean} [mParameters.bPersistOPScroll] The bPersistOPScroll will be used for scrolling to first tab
414
+ * @param {number} [mParameters.updateFCLLevel] `+1` if we add a column in FCL, `-1` to remove a column, 0 to stay on the same column
415
+ * @param {boolean} [mParameters.noPreservationCache] Do navigation without taking into account the preserved cache mechanism
416
+ * @param {boolean} [mParameters.bRecreateContext] Force re-creation of the context instead of using the one passed as parameter
417
+ * @param {boolean} [mParameters.bForceFocus] Forces focus selection after navigation
418
+ * @param {object} [oViewData] View data
419
+ * @param {object} [oCurrentTargetInfo] The target information from which the navigation is triggered
420
+ * @returns {Promise} Promise which is resolved once the navigation is triggered
421
+ *
422
+ * @ui5-restricted
423
+ * @final
424
+ */
425
+ ;
426
+
427
+ _proto.navigateToContext = function navigateToContext(oContext, mParameters, oViewData, oCurrentTargetInfo) {
428
+ var _this6 = this;
429
+
430
+ var sTargetRoute = "",
431
+ oRouteParametersPromise,
432
+ bIsStickyMode = false;
433
+
434
+ if (oContext.getModel() && oContext.getModel().getMetaModel) {
435
+ bIsStickyMode = ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel());
436
+ } // Manage parameter mapping
437
+
438
+
439
+ if (mParameters && mParameters.targetPath && oViewData && oViewData.navigation) {
440
+ var oRouteDetail = oViewData.navigation[mParameters.targetPath].detail;
441
+ sTargetRoute = oRouteDetail.route;
442
+
443
+ if (oRouteDetail.parameters) {
444
+ oRouteParametersPromise = this.prepareParameters(oRouteDetail.parameters, sTargetRoute, oContext);
481
445
  }
446
+ }
482
447
 
483
- var sTargetPath = this._getPathFromContext(oContext, mParameters); // If the path is empty, we're supposed to navigate to the first page of the app
484
- // Check if we need to exit from the app instead
448
+ var sTargetPath = this._getPathFromContext(oContext, mParameters); // If the path is empty, we're supposed to navigate to the first page of the app
449
+ // Check if we need to exit from the app instead
485
450
 
486
451
 
487
- if (sTargetPath.length === 0 && this.bExitOnNavigateBackToRoot) {
488
- return this.oRouterProxy.exitFromApp();
489
- } // If the context is deferred or async, we add (...) to the path
452
+ if (sTargetPath.length === 0 && this.bExitOnNavigateBackToRoot) {
453
+ return Promise.resolve(this.oRouterProxy.exitFromApp());
454
+ } // If the context is deferred or async, we add (...) to the path
490
455
 
491
456
 
492
- if (mParameters !== null && mParameters !== void 0 && mParameters.asyncContext || mParameters !== null && mParameters !== void 0 && mParameters.bDeferredContext) {
493
- sTargetPath += "(...)";
494
- } // Add layout parameter if needed
457
+ if (mParameters !== null && mParameters !== void 0 && mParameters.asyncContext || mParameters !== null && mParameters !== void 0 && mParameters.bDeferredContext) {
458
+ sTargetPath += "(...)";
459
+ } // Add layout parameter if needed
495
460
 
496
461
 
497
- var sLayout = this._calculateLayout(sTargetPath, mParameters);
462
+ var sLayout = this._calculateLayout(sTargetPath, mParameters);
498
463
 
499
- if (sLayout) {
500
- sTargetPath += "?layout=" + sLayout;
501
- } // Navigation parameters for later usage
464
+ if (sLayout) {
465
+ sTargetPath += "?layout=" + sLayout;
466
+ } // Navigation parameters for later usage
502
467
 
503
468
 
504
- var oNavigationInfo = {
505
- oAsyncContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.asyncContext,
506
- bDeferredContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDeferredContext,
507
- bTargetEditable: mParameters === null || mParameters === void 0 ? void 0 : mParameters.editable,
508
- bPersistOPScroll: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bPersistOPScroll,
509
- useContext: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.updateFCLLevel) === -1 || mParameters !== null && mParameters !== void 0 && mParameters.bRecreateContext ? undefined : oContext,
510
- bDraftNavigation: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDraftNavigation,
511
- bShowPlaceholder: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder) !== undefined ? mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder : true
512
- };
469
+ var oNavigationInfo = {
470
+ oAsyncContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.asyncContext,
471
+ bDeferredContext: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDeferredContext,
472
+ bTargetEditable: mParameters === null || mParameters === void 0 ? void 0 : mParameters.editable,
473
+ bPersistOPScroll: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bPersistOPScroll,
474
+ useContext: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.updateFCLLevel) === -1 || mParameters !== null && mParameters !== void 0 && mParameters.bRecreateContext ? undefined : oContext,
475
+ bDraftNavigation: mParameters === null || mParameters === void 0 ? void 0 : mParameters.bDraftNavigation,
476
+ bShowPlaceholder: (mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder) !== undefined ? mParameters === null || mParameters === void 0 ? void 0 : mParameters.showPlaceholder : true
477
+ };
513
478
 
514
- if (mParameters !== null && mParameters !== void 0 && mParameters.checkNoHashChange) {
515
- // Check if the new hash is different from the current one
516
- var sCurrentHashNoAppState = this.oRouterProxy.getHash().replace(/[&?]{1}sap-iapp-state=[A-Z0-9]+/, "");
479
+ if (mParameters !== null && mParameters !== void 0 && mParameters.checkNoHashChange) {
480
+ // Check if the new hash is different from the current one
481
+ var sCurrentHashNoAppState = this.oRouterProxy.getHash().replace(/[&?]{1}sap-iapp-state=[A-Z0-9]+/, "");
517
482
 
518
- if (sTargetPath === sCurrentHashNoAppState) {
519
- // The hash doesn't change, but we fire the routeMatch event to trigger page refresh / binding
520
- var mEventParameters = this.oRouter.getRouteInfoByHash(this.oRouterProxy.getHash());
483
+ if (sTargetPath === sCurrentHashNoAppState) {
484
+ // The hash doesn't change, but we fire the routeMatch event to trigger page refresh / binding
485
+ var mEventParameters = this.oRouter.getRouteInfoByHash(this.oRouterProxy.getHash());
521
486
 
522
- if (mEventParameters) {
523
- mEventParameters.navigationInfo = oNavigationInfo;
524
- mEventParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
525
- mEventParameters.routePattern = this.sCurrentRoutePattern;
526
- mEventParameters.views = this.aCurrentViews;
527
- }
487
+ if (mEventParameters) {
488
+ mEventParameters.navigationInfo = oNavigationInfo;
489
+ mEventParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
490
+ mEventParameters.routePattern = this.sCurrentRoutePattern;
491
+ mEventParameters.views = this.aCurrentViews;
492
+ }
528
493
 
529
- this.oRouterProxy.setFocusForced(!!mParameters.bForceFocus);
494
+ this.oRouterProxy.setFocusForced(!!mParameters.bForceFocus);
530
495
 
531
- this._fireRouteMatchEvents(mEventParameters);
496
+ this._fireRouteMatchEvents(mEventParameters);
532
497
 
533
- return Promise.resolve();
534
- }
498
+ return Promise.resolve();
535
499
  }
500
+ }
536
501
 
537
- if (mParameters !== null && mParameters !== void 0 && mParameters.transient && mParameters.editable == true && sTargetPath.indexOf("(...)") === -1) {
538
- if (sTargetPath.indexOf("?") > -1) {
539
- sTargetPath += "&i-action=create";
540
- } else {
541
- sTargetPath += "?i-action=create";
542
- }
543
- } // Clear unbound messages upon navigating from LR to OP
544
- // This is to ensure stale error messages from LR are not shown to the user after navigation to OP.
502
+ if (mParameters !== null && mParameters !== void 0 && mParameters.transient && mParameters.editable == true && sTargetPath.indexOf("(...)") === -1) {
503
+ if (sTargetPath.indexOf("?") > -1) {
504
+ sTargetPath += "&i-action=create";
505
+ } else {
506
+ sTargetPath += "?i-action=create";
507
+ }
508
+ } // Clear unbound messages upon navigating from LR to OP
509
+ // This is to ensure stale error messages from LR are not shown to the user after navigation to OP.
545
510
 
546
511
 
547
- if (oCurrentTargetInfo && oCurrentTargetInfo.name === "sap.fe.templates.ListReport") {
548
- var oRouteInfo = this.oRouter.getRouteInfoByHash(sTargetPath);
512
+ if (oCurrentTargetInfo && oCurrentTargetInfo.name === "sap.fe.templates.ListReport") {
513
+ var oRouteInfo = this.oRouter.getRouteInfoByHash(sTargetPath);
549
514
 
550
- if (oRouteInfo) {
551
- var oRoute = this._getRouteInformation(oRouteInfo.name);
515
+ if (oRouteInfo) {
516
+ var oRoute = this._getRouteInformation(oRouteInfo.name);
552
517
 
553
- if (oRoute && oRoute.targets && oRoute.targets.length > 0) {
554
- var sLastTargetName = oRoute.targets[oRoute.targets.length - 1];
518
+ if (oRoute && oRoute.targets && oRoute.targets.length > 0) {
519
+ var sLastTargetName = oRoute.targets[oRoute.targets.length - 1];
555
520
 
556
- var oTarget = this._getTargetInformation(sLastTargetName);
521
+ var oTarget = this._getTargetInformation(sLastTargetName);
557
522
 
558
- if (oTarget && oTarget.name === "sap.fe.templates.ObjectPage") {
559
- messageHandling.removeUnboundTransitionMessages();
560
- }
523
+ if (oTarget && oTarget.name === "sap.fe.templates.ObjectPage") {
524
+ messageHandling.removeUnboundTransitionMessages();
561
525
  }
562
526
  }
563
- } // Add the navigation parameters in the queue
564
-
527
+ }
528
+ } // Add the navigation parameters in the queue
565
529
 
566
- this.navigationInfoQueue.push(oNavigationInfo);
567
530
 
568
- if (sTargetRoute && oRouteParametersPromise) {
569
- return oRouteParametersPromise.then(function (oRouteParameters) {
570
- oRouteParameters.bIsStickyMode = bIsStickyMode;
531
+ this.navigationInfoQueue.push(oNavigationInfo);
571
532
 
572
- _this6.oRouter.navTo(sTargetRoute, oRouteParameters);
533
+ if (sTargetRoute && oRouteParametersPromise) {
534
+ return oRouteParametersPromise.then(function (oRouteParameters) {
535
+ oRouteParameters.bIsStickyMode = bIsStickyMode;
573
536
 
574
- return Promise.resolve();
575
- });
576
- }
537
+ _this6.oRouter.navTo(sTargetRoute, oRouteParameters);
577
538
 
578
- return this.oRouterProxy.navToHash(sTargetPath, false, mParameters === null || mParameters === void 0 ? void 0 : mParameters.noPreservationCache, mParameters === null || mParameters === void 0 ? void 0 : mParameters.bForceFocus, !bIsStickyMode).then(function (bNavigated) {
579
- if (!bNavigated) {
580
- // The navigation did not happen --> remove the navigation parameters from the queue as they shouldn't be used
581
- _this6.navigationInfoQueue.pop();
582
- }
539
+ return Promise.resolve();
583
540
  });
584
541
  }
585
- /**
586
- * Navigates to a route.
587
- *
588
- * @function
589
- * @name sap.fe.core.controllerextensions.Routing#navigateToRoute
590
- * @memberof sap.fe.core.controllerextensions.Routing
591
- * @static
592
- * @param {string} [sTargetRouteName] Name of the target route
593
- * @param {object} [oRouteParameters] Parameters to be used with route to create the target hash
594
- * @returns {Promise} Promise that is resolved when the navigation is finalized
595
- *
596
- * @ui5-restricted
597
- * @final
598
- */
599
-
600
- }, {
601
- key: "navigateToRoute",
602
- value: function navigateToRoute(sTargetRouteName, oRouteParameters) {
603
- var sTargetURL = this.oRouter.getURL(sTargetRouteName, oRouteParameters);
604
- return this.oRouterProxy.navToHash(sTargetURL, undefined, undefined, undefined, !oRouteParameters.bIsStickyMode);
605
- }
606
- /**
607
- * Checks if one of the current views on the screen is bound to a given context.
608
- *
609
- * @param {sap.ui.model.odata.v4.Context} oContext The context
610
- * @returns {boolean} `true` or `false` if the current state is impacted or not
611
- */
612
-
613
- }, {
614
- key: "isCurrentStateImpactedBy",
615
- value: function isCurrentStateImpactedBy(oContext) {
616
- var sPath = oContext.getPath(); // First, check with the technical path. We have to try it, because for level > 1, we
617
- // uses technical keys even if Semantic keys are enabled
618
-
619
- if (this.oRouterProxy.isCurrentStateImpactedBy(sPath)) {
620
- return true;
621
- } else if (/^[^\(\)]+\([^\(\)]+\)$/.test(sPath)) {
622
- // If the current path can be semantic (i.e. is like xxx(yyy))
623
- // check with the semantic path if we can find it
624
- var sSemanticPath;
625
-
626
- if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
627
- // We have already resolved this semantic path
628
- sSemanticPath = this.oLastSemanticMapping.semanticPath;
629
- } else {
630
- sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext);
631
- }
632
542
 
633
- return sSemanticPath != sPath ? this.oRouterProxy.isCurrentStateImpactedBy(sSemanticPath) : false;
634
- } else {
635
- return false;
543
+ return this.oRouterProxy.navToHash(sTargetPath, false, mParameters === null || mParameters === void 0 ? void 0 : mParameters.noPreservationCache, mParameters === null || mParameters === void 0 ? void 0 : mParameters.bForceFocus, !bIsStickyMode).then(function (bNavigated) {
544
+ if (!bNavigated) {
545
+ // The navigation did not happen --> remove the navigation parameters from the queue as they shouldn't be used
546
+ _this6.navigationInfoQueue.pop();
636
547
  }
637
- }
638
- }, {
639
- key: "_findPathToNavigate",
640
- value: function _findPathToNavigate(sPath) {
641
- var regex = new RegExp("/[^/]*$");
642
- sPath = sPath.replace(regex, "");
643
-
644
- if (this.oRouter.match(sPath) || sPath === "") {
645
- return sPath;
548
+ });
549
+ }
550
+ /**
551
+ * Navigates to a route.
552
+ *
553
+ * @function
554
+ * @name sap.fe.core.controllerextensions.Routing#navigateToRoute
555
+ * @memberof sap.fe.core.controllerextensions.Routing
556
+ * @static
557
+ * @param {string} sTargetRouteName Name of the target route
558
+ * @param {object} [oRouteParameters] Parameters to be used with route to create the target hash
559
+ * @returns {Promise} Promise that is resolved when the navigation is finalized
560
+ *
561
+ * @ui5-restricted
562
+ * @final
563
+ */
564
+ ;
565
+
566
+ _proto.navigateToRoute = function navigateToRoute(sTargetRouteName, oRouteParameters) {
567
+ var sTargetURL = this.oRouter.getURL(sTargetRouteName, oRouteParameters);
568
+ return this.oRouterProxy.navToHash(sTargetURL, undefined, undefined, undefined, !oRouteParameters.bIsStickyMode);
569
+ }
570
+ /**
571
+ * Checks if one of the current views on the screen is bound to a given context.
572
+ *
573
+ * @param {sap.ui.model.odata.v4.Context} oContext The context
574
+ * @returns {boolean} `true` or `false` if the current state is impacted or not
575
+ */
576
+ ;
577
+
578
+ _proto.isCurrentStateImpactedBy = function isCurrentStateImpactedBy(oContext) {
579
+ var sPath = oContext.getPath(); // First, check with the technical path. We have to try it, because for level > 1, we
580
+ // uses technical keys even if Semantic keys are enabled
581
+
582
+ if (this.oRouterProxy.isCurrentStateImpactedBy(sPath)) {
583
+ return true;
584
+ } else if (/^[^\(\)]+\([^\(\)]+\)$/.test(sPath)) {
585
+ // If the current path can be semantic (i.e. is like xxx(yyy))
586
+ // check with the semantic path if we can find it
587
+ var sSemanticPath;
588
+
589
+ if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
590
+ // We have already resolved this semantic path
591
+ sSemanticPath = this.oLastSemanticMapping.semanticPath;
646
592
  } else {
647
- return this._findPathToNavigate(sPath);
593
+ sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext);
648
594
  }
649
- }
650
- }, {
651
- key: "_checkContextForSemanticPath",
652
- value: function _checkContextForSemanticPath(oContext) {
653
- var sPath = oContext.getPath(); // First, check if this is a level-1 object (path = /aaa(bbb))
654
595
 
655
- if (!/^\/[^\(]+\([^\)]+\)$/.test(sPath)) {
656
- return false;
657
- } // Then check if the entity has semantic keys
596
+ return sSemanticPath != sPath ? this.oRouterProxy.isCurrentStateImpactedBy(sSemanticPath) : false;
597
+ } else {
598
+ return false;
599
+ }
600
+ };
658
601
 
602
+ _proto._findPathToNavigate = function _findPathToNavigate(sPath) {
603
+ var regex = new RegExp("/[^/]*$");
604
+ sPath = sPath.replace(regex, "");
659
605
 
660
- var oMetaModel = oContext.getModel().getMetaModel(),
661
- sEntitySetName = oMetaModel.getMetaContext(oContext.getPath()).getObject("@sapui.name");
606
+ if (this.oRouter.match(sPath) || sPath === "") {
607
+ return sPath;
608
+ } else {
609
+ return this._findPathToNavigate(sPath);
610
+ }
611
+ };
662
612
 
663
- if (!SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName)) {
664
- return false;
665
- } // Then check the entity is draft-enabled
613
+ _proto._checkContextForSemanticPath = function _checkContextForSemanticPath(oContext) {
614
+ var sPath = oContext.getPath(); // First, check if this is a level-1 object (path = /aaa(bbb))
666
615
 
616
+ if (!/^\/[^\(]+\([^\)]+\)$/.test(sPath)) {
617
+ return false;
618
+ } // Then check if the entity has semantic keys
667
619
 
668
- return ModelHelper.isDraftSupported(oMetaModel, sPath);
669
- }
670
- }, {
671
- key: "_getPathFromContext",
672
- value: function _getPathFromContext(oContext, mParameters) {
673
- var sPath;
674
620
 
675
- if (oContext.isA("sap.ui.model.odata.v4.ODataListBinding") && oContext.isRelative()) {
676
- sPath = oContext.getHeaderContext().getPath();
677
- } else {
678
- sPath = oContext.getPath();
679
- }
621
+ var oMetaModel = oContext.getModel().getMetaModel(),
622
+ sEntitySetName = oMetaModel.getMetaContext(oContext.getPath()).getObject("@sapui.name");
680
623
 
681
- if (mParameters.updateFCLLevel === -1) {
682
- // When navigating back from a context, we need to remove the last component of the path
683
- sPath = this._findPathToNavigate(sPath); // Check if we're navigating back to a semantic path that was previously resolved
624
+ if (!SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName)) {
625
+ return false;
626
+ } // Then check the entity is draft-enabled
684
627
 
685
- if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
686
- sPath = this.oLastSemanticMapping.semanticPath;
687
- }
688
- } else if (this._checkContextForSemanticPath(oContext)) {
689
- // We check if we have to use a semantic path
690
- var sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
691
-
692
- if (!sSemanticPath) {
693
- // We were not able to build the semantic path --> Use the technical path and
694
- // clear the previous mapping, otherwise the old mapping is used in EditFlow#updateDocument
695
- // and it leads to unwanted page reloads
696
- this.setLastSemanticMapping(undefined);
697
- } else if (sSemanticPath !== sPath) {
698
- // Store the mapping technical <-> semantic path to avoid recalculating it later
699
- // and use the semantic path instead of the technical one
700
- this.setLastSemanticMapping({
701
- technicalPath: sPath,
702
- semanticPath: sSemanticPath
703
- });
704
- sPath = sSemanticPath;
705
- }
706
- } // remove extra '/' at the beginning of path
707
628
 
629
+ return ModelHelper.isDraftSupported(oMetaModel, sPath);
630
+ };
708
631
 
709
- if (sPath[0] === "/") {
710
- sPath = sPath.substring(1);
711
- }
632
+ _proto._getPathFromContext = function _getPathFromContext(oContext, mParameters) {
633
+ var sPath;
712
634
 
713
- return sPath;
635
+ if (oContext.isA("sap.ui.model.odata.v4.ODataListBinding") && oContext.isRelative()) {
636
+ sPath = oContext.getHeaderContext().getPath();
637
+ } else {
638
+ sPath = oContext.getPath();
714
639
  }
715
- }, {
716
- key: "_calculateLayout",
717
- value: function _calculateLayout(sPath, mParameters) {
718
- var FCLLevel = mParameters.FCLLevel;
719
640
 
720
- if (mParameters.updateFCLLevel) {
721
- FCLLevel += mParameters.updateFCLLevel;
641
+ if (mParameters.updateFCLLevel === -1) {
642
+ // When navigating back from a context, we need to remove the last component of the path
643
+ sPath = this._findPathToNavigate(sPath); // Check if we're navigating back to a semantic path that was previously resolved
722
644
 
723
- if (FCLLevel < 0) {
724
- FCLLevel = 0;
725
- }
645
+ if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
646
+ sPath = this.oLastSemanticMapping.semanticPath;
726
647
  }
727
-
728
- return this.oAppComponent.getRootViewController().calculateLayout(FCLLevel, sPath, mParameters.sLayout);
729
- }
730
- /**
731
- * Event handler before a route is matched.
732
- * Displays a busy indicator.
733
- *
734
- */
735
-
736
- }, {
737
- key: "_beforeRouteMatched",
738
- value: function
739
- /*oEvent: Event*/
740
- _beforeRouteMatched() {
741
- var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
742
-
743
- if (!bPlaceholderEnabled) {
744
- var oRootView = this.oAppComponent.getRootControl();
745
- BusyLocker.lock(oRootView);
746
- }
747
- }
748
- /**
749
- * Event handler when a route is matched.
750
- * Hides the busy indicator and fires its own 'routematched' event.
751
- *
752
- * @param {object} oEvent The event
753
- */
754
-
755
- }, {
756
- key: "_onRouteMatched",
757
- value: function _onRouteMatched(oEvent) {
758
- var _this7 = this;
759
-
760
- var oAppStateHandler = this.oAppComponent.getAppStateHandler(),
761
- oRootView = this.oAppComponent.getRootControl();
762
- var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
763
-
764
- if (BusyLocker.isLocked(oRootView) && !bPlaceholderEnabled) {
765
- BusyLocker.unlock(oRootView);
648
+ } else if (this._checkContextForSemanticPath(oContext)) {
649
+ // We check if we have to use a semantic path
650
+ var sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
651
+
652
+ if (!sSemanticPath) {
653
+ // We were not able to build the semantic path --> Use the technical path and
654
+ // clear the previous mapping, otherwise the old mapping is used in EditFlow#updateDocument
655
+ // and it leads to unwanted page reloads
656
+ this.setLastSemanticMapping(undefined);
657
+ } else if (sSemanticPath !== sPath) {
658
+ // Store the mapping technical <-> semantic path to avoid recalculating it later
659
+ // and use the semantic path instead of the technical one
660
+ this.setLastSemanticMapping({
661
+ technicalPath: sPath,
662
+ semanticPath: sSemanticPath
663
+ });
664
+ sPath = sSemanticPath;
766
665
  }
666
+ } // remove extra '/' at the beginning of path
767
667
 
768
- var mParameters = oEvent.getParameters();
769
668
 
770
- if (this.navigationInfoQueue.length) {
771
- mParameters.navigationInfo = this.navigationInfoQueue[0];
772
- this.navigationInfoQueue = this.navigationInfoQueue.slice(1);
773
- } else {
774
- mParameters.navigationInfo = {};
775
- }
776
-
777
- if (oAppStateHandler.checkIfRouteChangedByIApp()) {
778
- mParameters.navigationInfo.bReasonIsIappState = true;
779
- oAppStateHandler.resetRouteChangedByIApp();
780
- }
669
+ if (sPath[0] === "/") {
670
+ sPath = sPath.substring(1);
671
+ }
781
672
 
782
- this.sCurrentRouteName = oEvent.getParameter("name");
783
- this.sCurrentRoutePattern = mParameters.config.pattern;
784
- this.aCurrentViews = oEvent.getParameter("views");
785
- mParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
786
- mParameters.routePattern = this.sCurrentRoutePattern;
673
+ return sPath;
674
+ };
787
675
 
788
- this._fireRouteMatchEvents(mParameters); // Check if current hash has been set by the routerProxy.navToHash function
789
- // If not, rebuild history properly (both in the browser and the RouterProxy)
676
+ _proto._calculateLayout = function _calculateLayout(sPath, mParameters) {
677
+ var FCLLevel = mParameters.FCLLevel;
790
678
 
679
+ if (mParameters.updateFCLLevel) {
680
+ FCLLevel += mParameters.updateFCLLevel;
791
681
 
792
- if (!history.state || history.state.feLevel === undefined) {
793
- this.oRouterProxy.restoreHistory().then(function () {
794
- _this7.oRouterProxy.resolveRouteMatch();
795
- }).catch(function (oError) {
796
- Log.error("Error while restoring history", oError);
797
- });
798
- } else {
799
- this.oRouterProxy.resolveRouteMatch();
682
+ if (FCLLevel < 0) {
683
+ FCLLevel = 0;
800
684
  }
801
685
  }
802
- }, {
803
- key: "attachRouteMatched",
804
- value: function attachRouteMatched(oData, fnFunction, oListener) {
805
- this.eventProvider.attachEvent("routeMatched", oData, fnFunction, oListener);
806
- }
807
- }, {
808
- key: "detachRouteMatched",
809
- value: function detachRouteMatched(fnFunction, oListener) {
810
- this.eventProvider.detachEvent("routeMatched", fnFunction, oListener);
686
+
687
+ return this.oAppComponent.getRootViewController().calculateLayout(FCLLevel, sPath, mParameters.sLayout);
688
+ }
689
+ /**
690
+ * Event handler before a route is matched.
691
+ * Displays a busy indicator.
692
+ *
693
+ */
694
+ ;
695
+
696
+ _proto._beforeRouteMatched = function
697
+ /*oEvent: Event*/
698
+ _beforeRouteMatched() {
699
+ var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
700
+
701
+ if (!bPlaceholderEnabled) {
702
+ var oRootView = this.oAppComponent.getRootControl();
703
+ BusyLocker.lock(oRootView);
811
704
  }
812
- }, {
813
- key: "attachAfterRouteMatched",
814
- value: function attachAfterRouteMatched(oData, fnFunction, oListener) {
815
- this.eventProvider.attachEvent("afterRouteMatched", oData, fnFunction, oListener);
705
+ }
706
+ /**
707
+ * Event handler when a route is matched.
708
+ * Hides the busy indicator and fires its own 'routematched' event.
709
+ *
710
+ * @param {object} oEvent The event
711
+ */
712
+ ;
713
+
714
+ _proto._onRouteMatched = function _onRouteMatched(oEvent) {
715
+ var _this7 = this;
716
+
717
+ var oAppStateHandler = this.oAppComponent.getAppStateHandler(),
718
+ oRootView = this.oAppComponent.getRootControl();
719
+ var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
720
+
721
+ if (BusyLocker.isLocked(oRootView) && !bPlaceholderEnabled) {
722
+ BusyLocker.unlock(oRootView);
816
723
  }
817
- }, {
818
- key: "detachAfterRouteMatched",
819
- value: function detachAfterRouteMatched(fnFunction, oListener) {
820
- this.eventProvider.detachEvent("afterRouteMatched", fnFunction, oListener);
724
+
725
+ var mParameters = oEvent.getParameters();
726
+
727
+ if (this.navigationInfoQueue.length) {
728
+ mParameters.navigationInfo = this.navigationInfoQueue[0];
729
+ this.navigationInfoQueue = this.navigationInfoQueue.slice(1);
730
+ } else {
731
+ mParameters.navigationInfo = {};
821
732
  }
822
- }, {
823
- key: "getRouteFromHash",
824
- value: function getRouteFromHash(oRouter, oAppComponent) {
825
- var sHash = oRouter.getHashChanger().hash;
826
- var oRouteInfo = oRouter.getRouteInfoByHash(sHash);
827
- return oAppComponent.getMetadata().getManifestEntry("/sap.ui5/routing/routes").filter(function (oRoute) {
828
- return oRoute.name === oRouteInfo.name;
829
- })[0];
733
+
734
+ if (oAppStateHandler.checkIfRouteChangedByIApp()) {
735
+ mParameters.navigationInfo.bReasonIsIappState = true;
736
+ oAppStateHandler.resetRouteChangedByIApp();
830
737
  }
831
- }, {
832
- key: "getTargetsFromRoute",
833
- value: function getTargetsFromRoute(oRoute) {
834
- var _this8 = this;
835
738
 
836
- var oTarget = oRoute.target;
739
+ this.sCurrentRouteName = oEvent.getParameter("name");
740
+ this.sCurrentRoutePattern = mParameters.config.pattern;
741
+ this.aCurrentViews = oEvent.getParameter("views");
742
+ mParameters.routeInformation = this._getRouteInformation(this.sCurrentRouteName);
743
+ mParameters.routePattern = this.sCurrentRoutePattern;
837
744
 
838
- if (typeof oTarget === "string") {
839
- return [this._mTargets[oTarget]];
840
- } else {
841
- var aTarget = [];
842
- oTarget.forEach(function (sTarget) {
843
- aTarget.push(_this8._mTargets[sTarget]);
844
- });
845
- return aTarget;
846
- }
847
- }
848
- }, {
849
- key: "initializeRouting",
850
- value: function initializeRouting() {
851
- var _this9 = this;
852
-
853
- // Attach router handlers
854
- this._fnOnRouteMatched = this._onRouteMatched.bind(this);
855
- this.oRouter.attachRouteMatched(this._fnOnRouteMatched, this);
856
- var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
857
-
858
- if (!bPlaceholderEnabled) {
859
- this.oRouter.attachBeforeRouteMatched(this._beforeRouteMatched.bind(this));
860
- } // Reset internal state
861
-
862
-
863
- this.navigationInfoQueue = [];
864
- EditState.resetEditState();
865
- this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
866
- var bIsIappState = this.oRouter.getHashChanger().getHash().indexOf("sap-iapp-state") !== -1;
867
- var initPromise = this.oAppComponent.getStartupParameters().then(function (oStartupParameters) {
868
- var bHasStartUpParameters = oStartupParameters !== undefined && Object.keys(oStartupParameters).length !== 0;
869
-
870
- var sHash = _this9.oRouter.getHashChanger().getHash(); // Manage startup parameters (in case of no iapp-state)
871
-
872
-
873
- if (!bIsIappState && bHasStartUpParameters && !sHash) {
874
- if (oStartupParameters.preferredMode && oStartupParameters.preferredMode[0].indexOf("create") !== -1) {
875
- // Create mode
876
- return _this9._manageCreateStartup(oStartupParameters);
877
- } else {
878
- // Deep link
879
- return _this9._manageDeepLinkStartup(oStartupParameters);
880
- }
881
- }
745
+ this._fireRouteMatchEvents(mParameters); // Check if current hash has been set by the routerProxy.navToHash function
746
+ // If not, rebuild history properly (both in the browser and the RouterProxy)
747
+
748
+
749
+ if (!history.state || history.state.feLevel === undefined) {
750
+ this.oRouterProxy.restoreHistory().then(function () {
751
+ _this7.oRouterProxy.resolveRouteMatch();
882
752
  }).catch(function (oError) {
883
- Log.error("Error during routing initialization", oError);
753
+ Log.error("Error while restoring history", oError);
884
754
  });
885
- return initPromise;
886
- }
887
- }, {
888
- key: "getDefaultCreateHash",
889
- value: function getDefaultCreateHash(oStartupParameters) {
890
- return AppStartupHelper.getDefaultCreateHash(oStartupParameters, this.getContextPath(), this.oRouter);
755
+ } else {
756
+ this.oRouterProxy.resolveRouteMatch();
757
+ }
758
+ };
759
+
760
+ _proto.attachRouteMatched = function attachRouteMatched(oData, fnFunction, oListener) {
761
+ this.eventProvider.attachEvent("routeMatched", oData, fnFunction, oListener);
762
+ };
763
+
764
+ _proto.detachRouteMatched = function detachRouteMatched(fnFunction, oListener) {
765
+ this.eventProvider.detachEvent("routeMatched", fnFunction, oListener);
766
+ };
767
+
768
+ _proto.attachAfterRouteMatched = function attachAfterRouteMatched(oData, fnFunction, oListener) {
769
+ this.eventProvider.attachEvent("afterRouteMatched", oData, fnFunction, oListener);
770
+ };
771
+
772
+ _proto.detachAfterRouteMatched = function detachAfterRouteMatched(fnFunction, oListener) {
773
+ this.eventProvider.detachEvent("afterRouteMatched", fnFunction, oListener);
774
+ };
775
+
776
+ _proto.getRouteFromHash = function getRouteFromHash(oRouter, oAppComponent) {
777
+ var sHash = oRouter.getHashChanger().hash;
778
+ var oRouteInfo = oRouter.getRouteInfoByHash(sHash);
779
+ return oAppComponent.getMetadata().getManifestEntry("/sap.ui5/routing/routes").filter(function (oRoute) {
780
+ return oRoute.name === oRouteInfo.name;
781
+ })[0];
782
+ };
783
+
784
+ _proto.getTargetsFromRoute = function getTargetsFromRoute(oRoute) {
785
+ var _this8 = this;
786
+
787
+ var oTarget = oRoute.target;
788
+
789
+ if (typeof oTarget === "string") {
790
+ return [this._mTargets[oTarget]];
791
+ } else {
792
+ var aTarget = [];
793
+ oTarget.forEach(function (sTarget) {
794
+ aTarget.push(_this8._mTargets[sTarget]);
795
+ });
796
+ return aTarget;
891
797
  }
892
- }, {
893
- key: "_manageCreateStartup",
894
- value: function _manageCreateStartup(oStartupParameters) {
895
- var _this10 = this;
798
+ };
896
799
 
897
- return AppStartupHelper.getCreateStartupHash(oStartupParameters, this.getContextPath(), this.oRouter, this.oMetaModel).then(function (sNewHash) {
898
- if (sNewHash) {
899
- _this10.oRouter.getHashChanger().replaceHash(sNewHash);
800
+ _proto.initializeRouting = function initializeRouting() {
801
+ var _this9 = this;
802
+
803
+ // Attach router handlers
804
+ this._fnOnRouteMatched = this._onRouteMatched.bind(this);
805
+ this.oRouter.attachRouteMatched(this._fnOnRouteMatched, this);
806
+ var bPlaceholderEnabled = new Placeholder().isPlaceholderEnabled();
807
+
808
+ if (!bPlaceholderEnabled) {
809
+ this.oRouter.attachBeforeRouteMatched(this._beforeRouteMatched.bind(this));
810
+ } // Reset internal state
811
+
812
+
813
+ this.navigationInfoQueue = [];
814
+ EditState.resetEditState();
815
+ this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
816
+ var bIsIappState = this.oRouter.getHashChanger().getHash().indexOf("sap-iapp-state") !== -1;
817
+ var initPromise = this.oAppComponent.getStartupParameters().then(function (oStartupParameters) {
818
+ var bHasStartUpParameters = oStartupParameters !== undefined && Object.keys(oStartupParameters).length !== 0;
819
+
820
+ var sHash = _this9.oRouter.getHashChanger().getHash(); // Manage startup parameters (in case of no iapp-state)
900
821
 
901
- _this10.bExitOnNavigateBackToRoot = true;
902
- }
903
- });
904
- }
905
- }, {
906
- key: "_manageDeepLinkStartup",
907
- value: function _manageDeepLinkStartup(oStartupParameters) {
908
- var _this11 = this;
909
-
910
- return AppStartupHelper.getDeepLinkStartupHash(this.oAppComponent.getManifest()["sap.ui5"].routing, oStartupParameters, this.oModel).then(function (oDeepLink) {
911
- var sHash;
912
-
913
- if (oDeepLink.context) {
914
- var sTechnicalPath = oDeepLink.context.getPath(),
915
- sSemanticPath = SemanticKeyHelper.getSemanticPath(oDeepLink.context);
916
-
917
- if (sSemanticPath !== sTechnicalPath) {
918
- // Store the mapping technical <-> semantic path to avoid recalculating it later
919
- // and use the semantic path instead of the technical one
920
- _this11.setLastSemanticMapping({
921
- technicalPath: sTechnicalPath,
922
- semanticPath: sSemanticPath
923
- });
924
- }
925
822
 
926
- sHash = sSemanticPath.substring(1); // To remove the leading '/'
927
- } else if (oDeepLink.hash) {
928
- sHash = oDeepLink.hash;
823
+ if (!bIsIappState && bHasStartUpParameters && !sHash) {
824
+ if (oStartupParameters.preferredMode && oStartupParameters.preferredMode[0].indexOf("create") !== -1) {
825
+ // Create mode
826
+ return _this9._manageCreateStartup(oStartupParameters);
827
+ } else {
828
+ // Deep link
829
+ return _this9._manageDeepLinkStartup(oStartupParameters);
929
830
  }
831
+ }
832
+ }).catch(function (oError) {
833
+ Log.error("Error during routing initialization", oError);
834
+ });
835
+ return initPromise;
836
+ };
837
+
838
+ _proto.getDefaultCreateHash = function getDefaultCreateHash(oStartupParameters) {
839
+ return AppStartupHelper.getDefaultCreateHash(oStartupParameters, this.getContextPath(), this.oRouter);
840
+ };
930
841
 
931
- if (sHash) {
932
- //Replace the hash with newly created hash
933
- _this11.oRouter.getHashChanger().replaceHash(sHash);
842
+ _proto._manageCreateStartup = function _manageCreateStartup(oStartupParameters) {
843
+ var _this10 = this;
844
+
845
+ return AppStartupHelper.getCreateStartupHash(oStartupParameters, this.getContextPath(), this.oRouter, this.oMetaModel).then(function (sNewHash) {
846
+ if (sNewHash) {
847
+ _this10.oRouter.getHashChanger().replaceHash(sNewHash);
848
+
849
+ _this10.bExitOnNavigateBackToRoot = true;
850
+ }
851
+ });
852
+ };
853
+
854
+ _proto._manageDeepLinkStartup = function _manageDeepLinkStartup(oStartupParameters) {
855
+ var _this11 = this;
856
+
857
+ return AppStartupHelper.getDeepLinkStartupHash(this.oAppComponent.getManifest()["sap.ui5"].routing, oStartupParameters, this.oModel).then(function (oDeepLink) {
858
+ var sHash;
859
+
860
+ if (oDeepLink.context) {
861
+ var sTechnicalPath = oDeepLink.context.getPath(),
862
+ sSemanticPath = SemanticKeyHelper.getSemanticPath(oDeepLink.context);
863
+
864
+ if (sSemanticPath !== sTechnicalPath) {
865
+ // Store the mapping technical <-> semantic path to avoid recalculating it later
866
+ // and use the semantic path instead of the technical one
867
+ _this11.setLastSemanticMapping({
868
+ technicalPath: sTechnicalPath,
869
+ semanticPath: sSemanticPath
870
+ });
934
871
  }
935
- });
936
- }
937
- }, {
938
- key: "getOutbounds",
939
- value: function getOutbounds() {
940
- return this.outbounds;
941
- }
942
- /**
943
- * Gets the name of the Draft root entity set or the sticky-enabled entity set.
944
- *
945
- * @returns {string} The name of the root EntitySet
946
- *
947
- * @ui5-restricted
948
- */
949
-
950
- }, {
951
- key: "getContextPath",
952
- value: function getContextPath() {
953
- return this.sContextPath;
954
- }
955
- }, {
956
- key: "getInterface",
957
- value: function getInterface() {
958
- return this;
959
- }
960
- }]);
872
+
873
+ sHash = sSemanticPath.substring(1); // To remove the leading '/'
874
+ } else if (oDeepLink.hash) {
875
+ sHash = oDeepLink.hash;
876
+ }
877
+
878
+ if (sHash) {
879
+ //Replace the hash with newly created hash
880
+ _this11.oRouter.getHashChanger().replaceHash(sHash);
881
+ }
882
+ });
883
+ };
884
+
885
+ _proto.getOutbounds = function getOutbounds() {
886
+ return this.outbounds;
887
+ }
888
+ /**
889
+ * Gets the name of the Draft root entity set or the sticky-enabled entity set.
890
+ *
891
+ * @returns {string} The name of the root EntitySet
892
+ *
893
+ * @ui5-restricted
894
+ */
895
+ ;
896
+
897
+ _proto.getContextPath = function getContextPath() {
898
+ return this.sContextPath;
899
+ };
900
+
901
+ _proto.getInterface = function getInterface() {
902
+ return this;
903
+ };
961
904
 
962
905
  return RoutingService;
963
906
  }(Service);
964
907
 
908
+ _exports.RoutingService = RoutingService;
909
+
965
910
  var RoutingServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
966
911
  _inherits(RoutingServiceFactory, _ServiceFactory);
967
912
 
968
- var _super2 = _createSuper(RoutingServiceFactory);
969
-
970
913
  function RoutingServiceFactory() {
971
- _classCallCheck(this, RoutingServiceFactory);
972
-
973
- return _super2.apply(this, arguments);
914
+ return _ServiceFactory.apply(this, arguments) || this;
974
915
  }
975
916
 
976
- _createClass(RoutingServiceFactory, [{
977
- key: "createInstance",
978
- value: function createInstance(oServiceContext) {
979
- var oRoutingService = new RoutingService(oServiceContext);
980
- return oRoutingService.initPromise;
981
- }
982
- }]);
917
+ var _proto2 = RoutingServiceFactory.prototype;
918
+
919
+ _proto2.createInstance = function createInstance(oServiceContext) {
920
+ var oRoutingService = new RoutingService(oServiceContext);
921
+ return oRoutingService.initPromise;
922
+ };
983
923
 
984
924
  return RoutingServiceFactory;
985
925
  }(ServiceFactory);
986
926
 
987
927
  return RoutingServiceFactory;
988
928
  }, false);
989
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiRXZlbnRQcm92aWRlciIsImV4dGVuZCIsIm1ldGFkYXRhIiwiZXZlbnRzIiwiUm91dGluZ1NlcnZpY2UiLCJvQ29udGV4dCIsImdldENvbnRleHQiLCJzY29wZVR5cGUiLCJvQXBwQ29tcG9uZW50Iiwic2NvcGVPYmplY3QiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJldmVudFByb3ZpZGVyIiwib1JvdXRpbmdDb25maWciLCJnZXRNYW5pZmVzdEVudHJ5Iiwib1Jvb3RWaWV3Q29uZmlnIiwiX3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24iLCJvQXBwQ29uZmlnIiwib3V0Ym91bmRzIiwiY3Jvc3NOYXZpZ2F0aW9uIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIl9mbk9uUm91dGVNYXRjaGVkIiwiZmlyZUV2ZW50IiwiZGVzdHJveSIsImlzRkNMIiwidmlld05hbWUiLCJfbVRhcmdldHMiLCJPYmplY3QiLCJrZXlzIiwidGFyZ2V0cyIsImZvckVhY2giLCJzVGFyZ2V0TmFtZSIsImFzc2lnbiIsInRhcmdldE5hbWUiLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInZpZXdMZXZlbCIsIl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybiIsIl9tUm91dGVzIiwic1JvdXRlS2V5Iiwicm91dGVzIiwib1JvdXRlTWFuaWZlc3RJbmZvIiwiYVJvdXRlVGFyZ2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInNSb3V0ZU5hbWUiLCJuYW1lIiwic1JvdXRlUGF0dGVybiIsInBhdHRlcm4iLCJsZW5ndGgiLCJpbmRleE9mIiwiTG9nIiwid2FybmluZyIsImlSb3V0ZUxldmVsIiwicm91dGVMZXZlbCIsImkiLCJzUGFyZW50VGFyZ2V0TmFtZSIsInBhcmVudCIsInB1c2giLCJGQ0xMZXZlbCIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImFMZXZlbDBSb3V0ZU5hbWVzIiwiYUxldmVsMVJvdXRlTmFtZXMiLCJzRGVmYXVsdFJvdXRlTmFtZSIsInNOYW1lIiwiaUxldmVsIiwic0RlZmF1bHRUYXJnZXROYW1lIiwic2xpY2UiLCJzQ29udGV4dFBhdGgiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJvU2V0dGluZ3MiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1hcCIsInNUYXJnZXRLZXkiLCJzb3J0IiwiYSIsImIiLCJmdWxsQ29udGV4dFBhdGgiLCJuYXZpZ2F0aW9uIiwic05hdk5hbWUiLCJ0YXJnZXRSb3V0ZSIsImRldGFpbCIsInJvdXRlIiwic1BhdHRlcm4iLCJyZXBsYWNlIiwicmVnZXgiLCJSZWdFeHAiLCJtYXRjaCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwib0NvbXBvbmVudEluc3RhbmNlIiwic1RhcmdldENvbXBvbmVudElkIiwiX2dldENvbXBvbmVudElkIiwiX3NPd25lcklkIiwiZ2V0SWQiLCJzQ29ycmVjdFRhcmdldE5hbWUiLCJpZCIsInZpZXdJZCIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwib01hcHBpbmciLCJtUGFyYW1ldGVyTWFwcGluZyIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJzVGFyZ2V0VVJMUHJvbWlzZSIsImJJc1N0aWNreU1vZGUiLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNQYXRoIiwicHJlcGFyZVBhcmFtZXRlcnMiLCJ0aGVuIiwibVBhcmFtZXRlcnMiLCJnZXRVUkwiLCJzVGFyZ2V0VVJMIiwibmF2VG9IYXNoIiwic1RhcmdldFJvdXRlIiwib1BhcmFtZXRlcnNQcm9taXNlIiwiZ2V0UGF0aCIsImFDb250ZXh0UGF0aFBhcnRzIiwic3BsaXQiLCJhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyIsInNQYXJhbWV0ZXJLZXkiLCJzUGFyYW1ldGVyTWFwcGluZ0V4cHJlc3Npb24iLCJvUGFyc2VkRXhwcmVzc2lvbiIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYVBhcnRzIiwicGFydHMiLCJhUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyIsIm9QYXRoUGFydCIsImFSZWxhdGl2ZVBhcnRzIiwicGF0aCIsImFMb2NhbFBhcnRzIiwic1Byb3BlcnR5UGF0aCIsImpvaW4iLCJvTWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInJlcXVlc3RQcm9wZXJ0eSIsIm9WYWx1ZSIsIm9Qcm9wZXJ0eUluZm8iLCJnZXRPYmplY3QiLCJzRWRtVHlwZSIsIiRUeXBlIiwiT0RhdGFVdGlscyIsImZvcm1hdExpdGVyYWwiLCJhbGwiLCJhUmVzb2x2ZWRQYXJhbWV0ZXJzIiwidmFsdWUiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImtleSIsImFBbGxSZXNvbHZlZFBhcmFtZXRlcnMiLCJvUGFyYW1ldGVycyIsIm9SZXNvbHZlZFBhcmFtZXRlciIsIm9FcnJvciIsImVycm9yIiwiRWRpdFN0YXRlIiwiY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUiLCJvVmlld0RhdGEiLCJvQ3VycmVudFRhcmdldEluZm8iLCJvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSIsInRhcmdldFBhdGgiLCJvUm91dGVEZXRhaWwiLCJwYXJhbWV0ZXJzIiwic1RhcmdldFBhdGgiLCJfZ2V0UGF0aEZyb21Db250ZXh0IiwiYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCIsImV4aXRGcm9tQXBwIiwiYXN5bmNDb250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsInNMYXlvdXQiLCJfY2FsY3VsYXRlTGF5b3V0Iiwib05hdmlnYXRpb25JbmZvIiwib0FzeW5jQ29udGV4dCIsImJUYXJnZXRFZGl0YWJsZSIsImVkaXRhYmxlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInVzZUNvbnRleHQiLCJ1cGRhdGVGQ0xMZXZlbCIsImJSZWNyZWF0ZUNvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwiYlNob3dQbGFjZWhvbGRlciIsInNob3dQbGFjZWhvbGRlciIsImNoZWNrTm9IYXNoQ2hhbmdlIiwic0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSIsImdldEhhc2giLCJtRXZlbnRQYXJhbWV0ZXJzIiwiZ2V0Um91dGVJbmZvQnlIYXNoIiwibmF2aWdhdGlvbkluZm8iLCJyb3V0ZUluZm9ybWF0aW9uIiwiX2dldFJvdXRlSW5mb3JtYXRpb24iLCJzQ3VycmVudFJvdXRlTmFtZSIsInJvdXRlUGF0dGVybiIsInNDdXJyZW50Um91dGVQYXR0ZXJuIiwidmlld3MiLCJhQ3VycmVudFZpZXdzIiwic2V0Rm9jdXNGb3JjZWQiLCJiRm9yY2VGb2N1cyIsIl9maXJlUm91dGVNYXRjaEV2ZW50cyIsInRyYW5zaWVudCIsIm9Sb3V0ZUluZm8iLCJvUm91dGUiLCJzTGFzdFRhcmdldE5hbWUiLCJvVGFyZ2V0IiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsIm5hdmlnYXRpb25JbmZvUXVldWUiLCJvUm91dGVQYXJhbWV0ZXJzIiwibmF2VG8iLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYk5hdmlnYXRlZCIsInBvcCIsInNUYXJnZXRSb3V0ZU5hbWUiLCJzUGF0aCIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsInRlc3QiLCJzU2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNlbWFudGljUGF0aCIsIl9maW5kUGF0aFRvTmF2aWdhdGUiLCJzRW50aXR5U2V0TmFtZSIsImdldFNlbWFudGljS2V5cyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0EiLCJpc1JlbGF0aXZlIiwiZ2V0SGVhZGVyQ29udGV4dCIsIl9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgiLCJzZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic3Vic3RyaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY2FsY3VsYXRlTGF5b3V0IiwiYlBsYWNlaG9sZGVyRW5hYmxlZCIsIlBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib0V2ZW50Iiwib0FwcFN0YXRlSGFuZGxlciIsImdldEFwcFN0YXRlSGFuZGxlciIsImlzTG9ja2VkIiwidW5sb2NrIiwiZ2V0UGFyYW1ldGVycyIsImNoZWNrSWZSb3V0ZUNoYW5nZWRCeUlBcHAiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJyZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCIsImdldFBhcmFtZXRlciIsImNvbmZpZyIsImhpc3RvcnkiLCJzdGF0ZSIsImZlTGV2ZWwiLCJyZXN0b3JlSGlzdG9yeSIsInJlc29sdmVSb3V0ZU1hdGNoIiwiY2F0Y2giLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImRldGFjaEV2ZW50Iiwic0hhc2giLCJnZXRIYXNoQ2hhbmdlciIsImhhc2giLCJnZXRNZXRhZGF0YSIsImZpbHRlciIsImFUYXJnZXQiLCJzVGFyZ2V0IiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsIl9iZWZvcmVSb3V0ZU1hdGNoZWQiLCJyZXNldEVkaXRTdGF0ZSIsImJJc0lhcHBTdGF0ZSIsImdldFN0YXJ0dXBQYXJhbWV0ZXJzIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzIiwicHJlZmVycmVkTW9kZSIsIl9tYW5hZ2VDcmVhdGVTdGFydHVwIiwiX21hbmFnZURlZXBMaW5rU3RhcnR1cCIsIkFwcFN0YXJ0dXBIZWxwZXIiLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImdldENvbnRleHRQYXRoIiwiZ2V0Q3JlYXRlU3RhcnR1cEhhc2giLCJzTmV3SGFzaCIsInJlcGxhY2VIYXNoIiwiZ2V0RGVlcExpbmtTdGFydHVwSGFzaCIsImdldE1hbmlmZXN0Iiwicm91dGluZyIsIm9EZWVwTGluayIsImNvbnRleHQiLCJzVGVjaG5pY2FsUGF0aCIsIlNlcnZpY2UiLCJSb3V0aW5nU2VydmljZUZhY3RvcnkiLCJvU2VydmljZUNvbnRleHQiLCJvUm91dGluZ1NlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsTUFBTUEsc0JBQXNCLEdBQUdDLGFBQWEsQ0FBQ0MsTUFBZCxDQUFxQiw2Q0FBckIsRUFBb0U7QUFDbEdDLElBQUFBLFFBQVEsRUFBRTtBQUNUQyxNQUFBQSxNQUFNLEVBQUU7QUFDUCx3QkFBZ0IsRUFEVDtBQUVQLDZCQUFxQjtBQUZkO0FBREM7QUFEd0YsR0FBcEUsQ0FBL0I7O01BUU1DLGM7Ozs7Ozs7Ozs7Ozs7Ozs7NEVBZ0J3QixFOzs7Ozs7O2FBRzdCLGdCQUFPO0FBQ04sWUFBTUMsUUFBUSxHQUFHLEtBQUtDLFVBQUwsRUFBakI7O0FBQ0EsWUFBSUQsUUFBUSxDQUFDRSxTQUFULEtBQXVCLFdBQTNCLEVBQXdDO0FBQ3ZDLGVBQUtDLGFBQUwsR0FBcUJILFFBQVEsQ0FBQ0ksV0FBOUI7QUFDQSxlQUFLQyxNQUFMLEdBQWMsS0FBS0YsYUFBTCxDQUFtQkcsUUFBbkIsRUFBZDtBQUNBLGVBQUtDLFVBQUwsR0FBa0IsS0FBS0YsTUFBTCxDQUFZRyxZQUFaLEVBQWxCO0FBQ0EsZUFBS0MsT0FBTCxHQUFlLEtBQUtOLGFBQUwsQ0FBbUJPLFNBQW5CLEVBQWY7QUFDQSxlQUFLQyxZQUFMLEdBQW9CLEtBQUtSLGFBQUwsQ0FBbUJTLGNBQW5CLEVBQXBCO0FBQ0EsZUFBS0MsYUFBTCxHQUFxQixJQUFLbkIsc0JBQUwsRUFBckI7QUFFQSxjQUFNb0IsY0FBYyxHQUFHLEtBQUtYLGFBQUwsQ0FBbUJZLGdCQUFuQixDQUFvQyxrQkFBcEMs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Q0E7O0FBRUQ0QyxZQUFBQSxLQUFLLEdBQUc1QyxhQUFhLENBQUNZLFNBQWQsQ0FBd0IsQ0FBeEIsQ0FBUixDQVZzQixDQVVjO0FBQ3BDLFdBWEQsTUFXTyxJQUFJNkQsU0FBUyxDQUFDM0IsSUFBZCxFQUFvQjtBQUMxQkYsWUFBQUEsS0FBSyxHQUFHNkIsU0FBUyxDQUFDM0IsSUFBbEI7QUFDQTs7QUFFRCxjQUFJRixLQUFKLEVBQVc7QUFDVjtBQUNDLFlBQUEsT0FBSSxDQUFDblEsT0FBTCxDQUFhb1EsY0FBYixHQUE4QndCLFdBQS9CLENBQW1EekIsS0FBbkQ7QUFDQTtBQUNELFNBekJNLENBQVA7QUEwQkE7OzthQUVELHdCQUFlO0FBQ2QsZUFBTyxLQUFLelAsU0FBWjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQywwQkFBaUI7QUFDaEIsZUFBTyxLQUFLc0QsWUFBWjtBQUNBOzs7YUFDRCx3QkFBb0I7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUF6MUIyQm1PLE87O01BNDFCdkJDLHFCOzs7Ozs7Ozs7Ozs7O2FBQ0wsd0JBQWVDLGVBQWYsRUFBd0U7QUFDdkUsWUFBTUMsZUFBZSxHQUFHLElBQUloVCxjQUFKLENBQW1CK1MsZUFBbkIsQ0FBeEI7QUFDQSxlQUFPQyxlQUFlLENBQUMxUixXQUF2QjtBQUNBOzs7O0lBSmtDMlIsYzs7U0FPckJILHFCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEV2ZW50UHJvdmlkZXIgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50UHJvdmlkZXJcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgUGxhY2Vob2xkZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCBBcHBTdGFydHVwSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0FwcFN0YXJ0dXBIZWxwZXJcIjtcbmltcG9ydCBPRGF0YVV0aWxzIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFVdGlsc1wiO1xuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG50eXBlIFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcbmNvbnN0IFJvdXRpbmdTZXJ2aWNlRXZlbnRpbmcgPSBFdmVudFByb3ZpZGVyLmV4dGVuZChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJvdXRpbmdTZXJ2aWNlRXZlbnRpbmdcIiwge1xuXHRtZXRhZGF0YToge1xuXHRcdGV2ZW50czoge1xuXHRcdFx0XCJyb3V0ZU1hdGNoZWRcIjoge30sXG5cdFx0XHRcImFmdGVyUm91dGVNYXRjaGVkXCI6IHt9XG5cdFx0fVxuXHR9XG59KTtcbmNsYXNzIFJvdXRpbmdTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdG9BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdG9Nb2RlbCE6IE9EYXRhTW9kZWw7XG5cdG9NZXRhTW9kZWwhOiBPRGF0YU1ldGFNb2RlbDtcblx0b1JvdXRlciE6IFJvdXRlcjtcblx0b1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdGV2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0b3V0Ym91bmRzOiBhbnk7XG5cdF9tVGFyZ2V0czogYW55O1xuXHRfbVJvdXRlczogYW55O1xuXHRvTGFzdFNlbWFudGljTWFwcGluZzogYW55O1xuXHRiRXhpdE9uTmF2aWdhdGVCYWNrVG9Sb290PzogYm9vbGVhbjtcblx0c0N1cnJlbnRSb3V0ZU5hbWU/OiBzdHJpbmc7XG5cdHNDdXJyZW50Um91dGVQYXR0ZXJuPzogc3RyaW5nO1xuXHRhQ3VycmVudFZpZXdzPzogYW55W107XG5cdG5hdmlnYXRpb25JbmZvUXVldWU6IGFueVtdID0gW107XG5cdHNDb250ZXh0UGF0aCE6IHN0cmluZztcblx0X2ZuT25Sb3V0ZU1hdGNoZWQhOiBGdW5jdGlvbjtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dC5zY29wZVR5cGUgPT09IFwiY29tcG9uZW50XCIpIHtcblx0XHRcdHRoaXMub0FwcENvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdFx0dGhpcy5vTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRcdHRoaXMub01ldGFNb2RlbCA9IHRoaXMub01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdHRoaXMuZXZlbnRQcm92aWRlciA9IG5ldyAoUm91dGluZ1NlcnZpY2VFdmVudGluZyBhcyBhbnkpKCk7XG5cblx0XHRcdGNvbnN0IG9Sb3V0aW5nQ29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb3V0aW5nXCIpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb290Vmlld1wiKTtcblx0XHRcdHRoaXMuX3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWcsIG9Sb290Vmlld0NvbmZpZyk7XG5cblx0XHRcdGNvbnN0IG9BcHBDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAuYXBwXCIpO1xuXHRcdFx0dGhpcy5vdXRib3VuZHMgPSBvQXBwQ29uZmlnICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uICYmIG9BcHBDb25maWcuY3Jvc3NOYXZpZ2F0aW9uLm91dGJvdW5kcztcblx0XHR9XG5cblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cdGJlZm9yZUV4aXQoKSB7XG5cdFx0dGhpcy5vUm91dGVyLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicm91dGVNYXRjaGVkXCIsIHt9KTtcblx0fVxuXHRleGl0KCkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXN0cm95KCk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgYSBtYW5pZmVzdCByb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIHVzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1JvdXRpbmdDb25maWcgVGhlIHJvdXRpbmcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Jvb3RWaWV3Q29uZmlnIFRoZSByb290IHZpZXcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYW5pZmVzdFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3BhcnNlUm91dGluZ0NvbmZpZ3VyYXRpb24ob1JvdXRpbmdDb25maWc6IGFueSwgb1Jvb3RWaWV3Q29uZmlnOiBhbnkpIHtcblx0XHRjb25zdCBpc0ZDTCA9IG9Sb290Vmlld0NvbmZpZyAmJiBvUm9vdFZpZXdDb25maWcudmlld05hbWUgPT09IFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLnZpZXcuRmNsXCI7XG5cblx0XHQvLyBJbmZvcm1hdGlvbiBvZiB0YXJnZXRzXG5cdFx0dGhpcy5fbVRhcmdldHMgPSB7fTtcblx0XHRPYmplY3Qua2V5cyhvUm91dGluZ0NvbmZpZy50YXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0gPSBPYmplY3QuYXNzaWduKHsgdGFyZ2V0TmFtZTogc1RhcmdldE5hbWUgfSwgb1JvdXRpbmdDb25maWcudGFyZ2V0c1tzVGFyZ2V0TmFtZV0pO1xuXG5cdFx0XHQvLyBWaWV3IGxldmVsIGZvciBGQ0wgY2FzZXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSB0YXJnZXQgcGF0dGVyblxuXHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybih0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4sIDApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5mb3JtYXRpb24gb2Ygcm91dGVzXG5cdFx0dGhpcy5fbVJvdXRlcyA9IHt9O1xuXHRcdGZvciAoY29uc3Qgc1JvdXRlS2V5IGluIG9Sb3V0aW5nQ29uZmlnLnJvdXRlcykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlTWFuaWZlc3RJbmZvID0gb1JvdXRpbmdDb25maWcucm91dGVzW3NSb3V0ZUtleV0sXG5cdFx0XHRcdGFSb3V0ZVRhcmdldHMgPSBBcnJheS5pc0FycmF5KG9Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXQpID8gb1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldCA6IFtvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0XSxcblx0XHRcdFx0c1JvdXRlTmFtZSA9IEFycmF5LmlzQXJyYXkob1JvdXRpbmdDb25maWcucm91dGVzKSA/IG9Sb3V0ZU1hbmlmZXN0SW5mby5uYW1lIDogc1JvdXRlS2V5LFxuXHRcdFx0XHRzUm91dGVQYXR0ZXJuID0gb1JvdXRlTWFuaWZlc3RJbmZvLnBhdHRlcm47XG5cblx0XHRcdC8vIENoZWNrIHJvdXRlIHBhdHRlcm46IGFsbCBwYXR0ZXJucyBuZWVkIHRvIGVuZCB3aXRoICc6P3F1ZXJ5OicsIHRoYXQgd2UgdXNlIGZvciBwYXJhbWV0ZXJzXG5cdFx0XHRpZiAoc1JvdXRlUGF0dGVybi5sZW5ndGggPCA4IHx8IHNSb3V0ZVBhdHRlcm4uaW5kZXhPZihcIjo/cXVlcnk6XCIpICE9PSBzUm91dGVQYXR0ZXJuLmxlbmd0aCAtIDgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJQYXR0ZXJuIGZvciByb3V0ZSBcIiArIHNSb3V0ZU5hbWUgKyBcIiBkb2Vzbid0IGVuZCB3aXRoICc6P3F1ZXJ5OicgOiBcIiArIHNSb3V0ZVBhdHRlcm4pO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaVJvdXRlTGV2ZWwgPSB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUm91dGVQYXR0ZXJuLCAwKTtcblx0XHRcdHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV0gPSB7XG5cdFx0XHRcdG5hbWU6IHNSb3V0ZU5hbWUsXG5cdFx0XHRcdHBhdHRlcm46IHNSb3V0ZVBhdHRlcm4sXG5cdFx0XHRcdHRhcmdldHM6IGFSb3V0ZVRhcmdldHMsXG5cdFx0XHRcdHJvdXRlTGV2ZWw6IGlSb3V0ZUxldmVsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBBZGQgdGhlIHBhcmVudCB0YXJnZXRzIGluIHRoZSBsaXN0IG9mIHRhcmdldHMgZm9yIHRoZSByb3V0ZVxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUm91dGVUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJlbnRUYXJnZXROYW1lID0gdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1tpXV0ucGFyZW50O1xuXHRcdFx0XHRpZiAoc1BhcmVudFRhcmdldE5hbWUpIHtcblx0XHRcdFx0XHRhUm91dGVUYXJnZXRzLnB1c2goc1BhcmVudFRhcmdldE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNGQ0wpIHtcblx0XHRcdFx0Ly8gVmlldyBsZXZlbCBmb3Igbm9uLUZDTCBjYXNlcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHJvdXRlIHBhdHRlcm5cblx0XHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA8IGlSb3V0ZUxldmVsKSB7XG5cdFx0XHRcdFx0Ly8gVGhlcmUgYXJlIGNhc2VzIHdoZW4gZGlmZmVyZW50IHJvdXRlcyBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuIFdlIHRha2UgdGhlXG5cdFx0XHRcdFx0Ly8gbGFyZ2VzdCB2aWV3TGV2ZWwgaW4gdGhhdCBjYXNlLlxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLnZpZXdMZXZlbCA9IGlSb3V0ZUxldmVsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRkNMIGxldmVsIGZvciBub24tRkNMIGNhc2VzIGlzIGVxdWFsIHRvIC0xXG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLkZDTExldmVsID0gLTE7XG5cdFx0XHR9IGVsc2UgaWYgKGFSb3V0ZVRhcmdldHMubGVuZ3RoID09PSAxICYmIHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLmNvbnRyb2xBZ2dyZWdhdGlvbiAhPT0gXCJiZWdpbkNvbHVtblBhZ2VzXCIpIHtcblx0XHRcdFx0Ly8gV2UncmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUncyBvbmx5IDEgdGFyZ2V0IGZvciB0aGUgcm91dGUsIGFuZCBpdCdzIG5vdCBpbiB0aGUgZmlyc3QgY29sdW1uXG5cdFx0XHRcdC8vIC0tPiB0aGlzIGlzIGEgZnVsbHNjcmVlbiBjb2x1bW4gYWZ0ZXIgYWxsIGNvbHVtbnMgaW4gdGhlIEZDTCBoYXZlIGJlZW4gdXNlZFxuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS5GQ0xMZXZlbCA9IDM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlciBGQ0wgY2FzZXNcblx0XHRcdFx0YVJvdXRlVGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0c3dpdGNoICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYmVnaW5Db2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBcIm1pZENvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDE7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGFnYXRlIHZpZXdMZXZlbCwgY29udGV4dFBhdHRlcm4sIEZDTExldmVsIGFuZCBjb250cm9sQWdncmVnYXRpb24gdG8gcGFyZW50IHRhcmdldHNcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9tVGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0d2hpbGUgKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5wYXJlbnQpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudFRhcmdldE5hbWUgPSB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ucGFyZW50O1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0udmlld0xldmVsIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS52aWV3TGV2ZWw7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybjtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLkZDTExldmVsID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uRkNMTGV2ZWwgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb247XG5cdFx0XHRcdHNUYXJnZXROYW1lID0gc1BhcmVudFRhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIHJvb3QgZW50aXR5IGZvciB0aGUgYXBwXG5cdFx0Y29uc3QgYUxldmVsMFJvdXRlTmFtZXMgPSBbXTtcblx0XHRjb25zdCBhTGV2ZWwxUm91dGVOYW1lcyA9IFtdO1xuXHRcdGxldCBzRGVmYXVsdFJvdXRlTmFtZTtcblxuXHRcdGZvciAoY29uc3Qgc05hbWUgaW4gdGhpcy5fbVJvdXRlcykge1xuXHRcdFx0Y29uc3QgaUxldmVsID0gdGhpcy5fbVJvdXRlc1tzTmFtZV0ucm91dGVMZXZlbDtcblx0XHRcdGlmIChpTGV2ZWwgPT09IDApIHtcblx0XHRcdFx0YUxldmVsMFJvdXRlTmFtZXMucHVzaChzTmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlMZXZlbCA9PT0gMSkge1xuXHRcdFx0XHRhTGV2ZWwxUm91dGVOYW1lcy5wdXNoKHNOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYUxldmVsMFJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDBSb3V0ZU5hbWVzWzBdO1xuXHRcdH0gZWxzZSBpZiAoYUxldmVsMVJvdXRlTmFtZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRzRGVmYXVsdFJvdXRlTmFtZSA9IGFMZXZlbDFSb3V0ZU5hbWVzWzBdO1xuXHRcdH1cblxuXHRcdGlmIChzRGVmYXVsdFJvdXRlTmFtZSkge1xuXHRcdFx0Y29uc3Qgc0RlZmF1bHRUYXJnZXROYW1lID0gdGhpcy5fbVJvdXRlc1tzRGVmYXVsdFJvdXRlTmFtZV0udGFyZ2V0cy5zbGljZSgtMSlbMF07XG5cdFx0XHR0aGlzLnNDb250ZXh0UGF0aCA9IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zICYmIHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncykge1xuXHRcdFx0XHRjb25zdCBvU2V0dGluZ3MgPSB0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdHRoaXMuc0NvbnRleHRQYXRoID0gb1NldHRpbmdzLmNvbnRleHRQYXRoIHx8IFwiL1wiICsgb1NldHRpbmdzLmVudGl0eVNldDtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5zQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XCJDYW5ub3QgZGV0ZXJtaW5lIGRlZmF1bHQgY29udGV4dFBhdGg6IGNvbnRleHRQYXRoIG9yIGVudGl0eVNldCBtaXNzaW5nIGluIGRlZmF1bHQgdGFyZ2V0OiBcIiArIHNEZWZhdWx0VGFyZ2V0TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkNhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBjb250ZXh0UGF0aDogbm8gZGVmYXVsdCByb3V0ZSBmb3VuZC5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgbmVlZCB0byBlc3RhYmxpc2ggdGhlIGNvcnJlY3QgcGF0aCB0byB0aGUgZGlmZmVyZW50IHBhZ2VzLCBpbmNsdWRpbmcgdGhlIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKVxuXHRcdFx0Lm1hcCgoc1RhcmdldEtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0S2V5XTtcblx0XHRcdH0pXG5cdFx0XHQuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGEudmlld0xldmVsIDwgYi52aWV3TGV2ZWwgPyAtMSA6IDE7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goKHRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEFmdGVyIHNvcnRpbmcgdGhlIHRhcmdldHMgcGVyIGxldmVsIHdlIGNhbiB0aGVuIGdvIHRocm91Z2ggdGhlaXIgbmF2aWdhdGlvbiBvYmplY3QgYW5kIHVwZGF0ZSB0aGUgcGF0aHMgYWNjb3JkaW5nbHkuXG5cdFx0XHRcdGlmICh0YXJnZXQub3B0aW9ucykge1xuXHRcdFx0XHRcdGNvbnN0IHNldHRpbmdzID0gdGFyZ2V0Lm9wdGlvbnMuc2V0dGluZ3M7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gc2V0dGluZ3MuY29udGV4dFBhdGggfHwgKHNldHRpbmdzLmVudGl0eVNldCA/IFwiL1wiICsgc2V0dGluZ3MuZW50aXR5U2V0IDogXCJcIik7XG5cdFx0XHRcdFx0aWYgKCFzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggJiYgc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0XHRzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGggKyBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc2V0dGluZ3MubmF2aWdhdGlvbiB8fCB7fSkuZm9yRWFjaCgoc05hdk5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFJvdXRlID0gdGhpcy5fbVJvdXRlc1tzZXR0aW5ncy5uYXZpZ2F0aW9uW3NOYXZOYW1lXS5kZXRhaWwucm91dGVdO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFJvdXRlICYmIHRhcmdldFJvdXRlLnRhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Um91dGUudGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnZpZXdMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBcIi9cIiArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyBhIHZpZXcgbGV2ZWwgZnJvbSBhIHBhdHRlcm4gYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBzZWdtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXR0ZXJuIFRoZSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3TGV2ZWwgVGhlIGN1cnJlbnQgbGV2ZWwgb2Ygdmlld1xuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICovXG5cdF9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybjogc3RyaW5nLCB2aWV3TGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG5cdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRpZiAoc1BhdHRlcm4gJiYgc1BhdHRlcm5bMF0gIT09IFwiL1wiICYmIHNQYXR0ZXJuWzBdICE9PSBcIj9cIikge1xuXHRcdFx0c1BhdHRlcm4gPSBcIi9cIiArIHNQYXR0ZXJuO1xuXHRcdH1cblx0XHRpZiAoc1BhdHRlcm4ubGVuZ3RoKSB7XG5cdFx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdFx0aWYgKHRoaXMub1JvdXRlci5tYXRjaChzUGF0dGVybikgfHwgc1BhdHRlcm4gPT09IFwiXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNQYXR0ZXJuLCArK3ZpZXdMZXZlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm4sIHZpZXdMZXZlbCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB2aWV3TGV2ZWw7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvdXRlSW5mb3JtYXRpb24oc1JvdXRlTmFtZTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV07XG5cdH1cblxuXHRfZ2V0VGFyZ2V0SW5mb3JtYXRpb24oc1RhcmdldE5hbWU6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV07XG5cdH1cblxuXHRfZ2V0Q29tcG9uZW50SWQoc093bmVySWQ6IGFueSwgc0NvbXBvbmVudElkOiBhbnkpIHtcblx0XHRpZiAoc0NvbXBvbmVudElkLmluZGV4T2Yoc093bmVySWQgKyBcIi0tLVwiKSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHNDb21wb25lbnRJZC5zdWJzdHIoc093bmVySWQubGVuZ3RoICsgMyk7XG5cdFx0fVxuXHRcdHJldHVybiBzQ29tcG9uZW50SWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50SW5zdGFuY2UgSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldFxuXHQgKi9cblx0Z2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudEluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0Q29tcG9uZW50SWQgPSB0aGlzLl9nZXRDb21wb25lbnRJZChvQ29tcG9uZW50SW5zdGFuY2UuX3NPd25lcklkLCBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0SWQoKSk7XG5cdFx0bGV0IHNDb3JyZWN0VGFyZ2V0TmFtZSA9IG51bGw7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uaWQgPT09IHNUYXJnZXRDb21wb25lbnRJZCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0lkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQpIHtcblx0XHRcdFx0c0NvcnJlY3RUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhcmdldEluZm9ybWF0aW9uKHNDb3JyZWN0VGFyZ2V0TmFtZSk7XG5cdH1cblxuXHRnZXRMYXN0U2VtYW50aWNNYXBwaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nO1xuXHR9XG5cblx0c2V0TGFzdFNlbWFudGljTWFwcGluZyhvTWFwcGluZzogYW55KSB7XG5cdFx0dGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyA9IG9NYXBwaW5nO1xuXHR9XG5cblx0bmF2aWdhdGVUbyhvQ29udGV4dDogYW55LCBzUm91dGVOYW1lOiBhbnksIG1QYXJhbWV0ZXJNYXBwaW5nOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSkge1xuXHRcdGxldCBzVGFyZ2V0VVJMUHJvbWlzZSwgYklzU3RpY2t5TW9kZTogYm9vbGVhbjtcblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCkge1xuXHRcdFx0YklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdFx0aWYgKCFtUGFyYW1ldGVyTWFwcGluZykge1xuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIG1hcHBpbmcgZGVmaW5lIHRoaXMgbWVhbiB3ZSByZWx5IGVudGlyZWx5IG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0aFxuXHRcdFx0c1RhcmdldFVSTFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNUYXJnZXRVUkxQcm9taXNlID0gdGhpcy5wcmVwYXJlUGFyYW1ldGVycyhtUGFyYW1ldGVyTWFwcGluZywgc1JvdXRlTmFtZSwgb0NvbnRleHQpLnRoZW4oKG1QYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMub1JvdXRlci5nZXRVUkwoc1JvdXRlTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBzVGFyZ2V0VVJMUHJvbWlzZS50aGVuKChzVGFyZ2V0VVJMOiBhbnkpID0+IHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5Lm5hdlRvSGFzaChzVGFyZ2V0VVJMLCBiUHJlc2VydmVIaXN0b3J5LCBmYWxzZSwgZmFsc2UsICFiSXNTdGlja3lNb2RlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmV0dXJuIGEgbWFwIG9mIHJvdXRpbmcgdGFyZ2V0IHBhcmFtZXRlcnMgd2hlcmUgdGhlIGJpbmRpbmcgc3ludGF4IGlzIHJlc29sdmVkIHRvIHRoZSBjdXJyZW50IG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyBtYXAgaW4gdGhlIGZvcm1hdCBbazogc3RyaW5nXSA6IENvbXBsZXhCaW5kaW5nU3ludGF4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVGFyZ2V0Um91dGUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByb3V0aW5nIHRhcmdldCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRwcmVwYXJlUGFyYW1ldGVycyhtUGFyYW1ldGVyczogYW55LCBzVGFyZ2V0Um91dGU6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRsZXQgb1BhcmFtZXRlcnNQcm9taXNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRjb25zdCBhQ29udGV4dFBhdGhQYXJ0cyA9IHNDb250ZXh0UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRjb25zdCBhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyA9IE9iamVjdC5rZXlzKG1QYXJhbWV0ZXJzKS5tYXAoKHNQYXJhbWV0ZXJLZXk6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzUGFyYW1ldGVyTWFwcGluZ0V4cHJlc3Npb24gPSBtUGFyYW1ldGVyc1tzUGFyYW1ldGVyS2V5XTtcblx0XHRcdFx0Ly8gV2UgYXNzdW1lIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgd2lsbCBiZSBjb21wYXRpYmxlIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb25cblx0XHRcdFx0Y29uc3Qgb1BhcnNlZEV4cHJlc3Npb24gPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc1BhcmFtZXRlck1hcHBpbmdFeHByZXNzaW9uKTtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gb1BhcnNlZEV4cHJlc3Npb24ucGFydHMgfHwgW29QYXJzZWRFeHByZXNzaW9uXTtcblx0XHRcdFx0Y29uc3QgYVJlc29sdmVkUGFyYW1ldGVyUHJvbWlzZXMgPSBhUGFydHMubWFwKGZ1bmN0aW9uKG9QYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgYVJlbGF0aXZlUGFydHMgPSBvUGF0aFBhcnQucGF0aC5zcGxpdChcIi4uL1wiKTtcblx0XHRcdFx0XHQvLyBXZSBnbyB1cCB0aGUgY3VycmVudCBjb250ZXh0IHBhdGggYXMgbWFueSB0aW1lcyBhcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRjb25zdCBhTG9jYWxQYXJ0cyA9IGFDb250ZXh0UGF0aFBhcnRzLnNsaWNlKDAsIGFDb250ZXh0UGF0aFBhcnRzLmxlbmd0aCAtIGFSZWxhdGl2ZVBhcnRzLmxlbmd0aCArIDEpO1xuXHRcdFx0XHRcdGFMb2NhbFBhcnRzLnB1c2goYVJlbGF0aXZlUGFydHNbYVJlbGF0aXZlUGFydHMubGVuZ3RoIC0gMV0pO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGFMb2NhbFBhcnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQoc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShzUHJvcGVydHlQYXRoKS50aGVuKGZ1bmN0aW9uKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHlJbmZvID0gb01ldGFDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VkbVR5cGUgPSBvUHJvcGVydHlJbmZvLiRUeXBlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIE9EYXRhVXRpbHMuZm9ybWF0TGl0ZXJhbChvVmFsdWUsIHNFZG1UeXBlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKChhUmVzb2x2ZWRQYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG9QYXJzZWRFeHByZXNzaW9uLmZvcm1hdHRlclxuXHRcdFx0XHRcdFx0PyBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXIuYXBwbHkodGhpcywgYVJlc29sdmVkUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogYVJlc29sdmVkUGFyYW1ldGVycy5qb2luKFwiXCIpO1xuXHRcdFx0XHRcdHJldHVybiB7IGtleTogc1BhcmFtZXRlcktleSwgdmFsdWU6IHZhbHVlIH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9QYXJhbWV0ZXJzUHJvbWlzZSA9IFByb21pc2UuYWxsKGFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKFxuXHRcdFx0XHRhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJzOiB7IGtleTogYW55OyB2YWx1ZTogYW55IH1bXVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbWV0ZXJzOiBhbnkgPSB7fTtcblx0XHRcdFx0YUFsbFJlc29sdmVkUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uKG9SZXNvbHZlZFBhcmFtZXRlcjogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9KSB7XG5cdFx0XHRcdFx0b1BhcmFtZXRlcnNbb1Jlc29sdmVkUGFyYW1ldGVyLmtleV0gPSBvUmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlcnM7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIG5hdmlnYXRpb24gdG8gcm91dGUgXCIgKyBzVGFyZ2V0Um91dGUpO1xuXHRcdFx0b1BhcmFtZXRlcnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyYW1ldGVyc1Byb21pc2U7XG5cdH1cblxuXHRfZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgbVBhcmFtZXRlcnMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBtUGFyYW1ldGVycyk7XG5cblx0XHRFZGl0U3RhdGUuY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUoKTsgLy8gUmVzZXQgVUkgc3RhdGUgd2hlbiBhbGwgYmluZGluZ3MgaGF2ZSBiZWVuIHJlZnJlc2hlZFxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgbWFwIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZV0gTmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgd2l0aG91dCBjaGFuZ2luZyB0aGUgVVJMXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gW21QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dF0gVGhlIGNvbnRleHQgaXMgY3JlYXRlZCBhc3luYywgbmF2aWdhdGUgdG8gKC4uLikgYW5kXG5cdCAqICAgICAgICAgICAgICAgICAgICB3YWl0IGZvciBQcm9taXNlIHRvIGJlIHJlc29sdmVkIGFuZCB0aGVuIG5hdmlnYXRlIGludG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dF0gVGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBkZWZlcnJlZCBhdCB0aGUgdGFyZ2V0IHBhZ2Vcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuZWRpdGFibGVdIFRoZSB0YXJnZXQgcGFnZSBzaGFsbCBiZSBpbW1lZGlhdGVseSBpbiB0aGUgZWRpdCBtb2RlIHRvIGF2b2lkIGZsaWNrZXJpbmdcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbF0gVGhlIGJQZXJzaXN0T1BTY3JvbGwgd2lsbCBiZSB1c2VkIGZvciBzY3JvbGxpbmcgdG8gZmlyc3QgdGFiXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWxdIGArMWAgaWYgd2UgYWRkIGEgY29sdW1uIGluIEZDTCwgYC0xYCB0byByZW1vdmUgYSBjb2x1bW4sIDAgdG8gc3RheSBvbiB0aGUgc2FtZSBjb2x1bW5cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZV0gRG8gbmF2aWdhdGlvbiB3aXRob3V0IHRha2luZyBpbnRvIGFjY291bnQgdGhlIHByZXNlcnZlZCBjYWNoZSBtZWNoYW5pc21cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlJlY3JlYXRlQ29udGV4dF0gRm9yY2UgcmUtY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXNdIEZvcmNlcyBmb2N1cyBzZWxlY3Rpb24gYWZ0ZXIgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29WaWV3RGF0YV0gVmlldyBkYXRhXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0N1cnJlbnRUYXJnZXRJbmZvXSBUaGUgdGFyZ2V0IGluZm9ybWF0aW9uIGZyb20gd2hpY2ggdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Db250ZXh0KFxuXHRcdG9Db250ZXh0OiBhbnksXG5cdFx0bVBhcmFtZXRlcnM6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0YXN5bmNDb250ZXh0PzogUHJvbWlzZTxhbnk+O1xuXHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGVkaXRhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0cmFuc2llbnQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsPzogbnVtYmVyO1xuXHRcdFx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJSZWNyZWF0ZUNvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0YXJnZXRQYXRoPzogc3RyaW5nO1xuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cdFx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YTogYW55IHwgdW5kZWZpbmVkLFxuXHRcdG9DdXJyZW50VGFyZ2V0SW5mbzogYW55IHwgdW5kZWZpbmVkXG5cdCkge1xuXHRcdGxldCBzVGFyZ2V0Um91dGU6IHN0cmluZyA9IFwiXCIsXG5cdFx0XHRvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSxcblx0XHRcdGJJc1N0aWNreU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpICYmIG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKSB7XG5cdFx0XHRiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0XHQvLyBNYW5hZ2UgcGFyYW1ldGVyIG1hcHBpbmdcblx0XHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMudGFyZ2V0UGF0aCAmJiBvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLm5hdmlnYXRpb24pIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZURldGFpbCA9IG9WaWV3RGF0YS5uYXZpZ2F0aW9uW21QYXJhbWV0ZXJzLnRhcmdldFBhdGhdLmRldGFpbDtcblx0XHRcdHNUYXJnZXRSb3V0ZSA9IG9Sb3V0ZURldGFpbC5yb3V0ZTtcblxuXHRcdFx0aWYgKG9Sb3V0ZURldGFpbC5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlID0gdGhpcy5wcmVwYXJlUGFyYW1ldGVycyhvUm91dGVEZXRhaWwucGFyYW1ldGVycywgc1RhcmdldFJvdXRlLCBvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNUYXJnZXRQYXRoID0gdGhpcy5fZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gSWYgdGhlIHBhdGggaXMgZW1wdHksIHdlJ3JlIHN1cHBvc2VkIHRvIG5hdmlnYXRlIHRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBhcHBcblx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGV4aXQgZnJvbSB0aGUgYXBwIGluc3RlYWRcblx0XHRpZiAoc1RhcmdldFBhdGgubGVuZ3RoID09PSAwICYmIHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5LmV4aXRGcm9tQXBwKCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgZGVmZXJyZWQgb3IgYXN5bmMsIHdlIGFkZCAoLi4uKSB0byB0aGUgcGF0aFxuXHRcdGlmIChtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0IHx8IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiguLi4pXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGxheW91dCBwYXJhbWV0ZXIgaWYgbmVlZGVkXG5cdFx0Y29uc3Qgc0xheW91dCA9IHRoaXMuX2NhbGN1bGF0ZUxheW91dChzVGFyZ2V0UGF0aCwgbVBhcmFtZXRlcnMpO1xuXHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIj9sYXlvdXQ9XCIgKyBzTGF5b3V0O1xuXHRcdH1cblxuXHRcdC8vIE5hdmlnYXRpb24gcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2Vcblx0XHRjb25zdCBvTmF2aWdhdGlvbkluZm8gPSB7XG5cdFx0XHRvQXN5bmNDb250ZXh0OiBtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0LFxuXHRcdFx0YkRlZmVycmVkQ29udGV4dDogbVBhcmFtZXRlcnM/LmJEZWZlcnJlZENvbnRleHQsXG5cdFx0XHRiVGFyZ2V0RWRpdGFibGU6IG1QYXJhbWV0ZXJzPy5lZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzPy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0dXNlQ29udGV4dDogbVBhcmFtZXRlcnM/LnVwZGF0ZUZDTExldmVsID09PSAtMSB8fCBtUGFyYW1ldGVycz8uYlJlY3JlYXRlQ29udGV4dCA/IHVuZGVmaW5lZCA6IG9Db250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogbVBhcmFtZXRlcnM/LmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRiU2hvd1BsYWNlaG9sZGVyOiBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyIDogdHJ1ZVxuXHRcdH07XG5cblx0XHRpZiAobVBhcmFtZXRlcnM/LmNoZWNrTm9IYXNoQ2hhbmdlKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbmV3IGhhc2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2hOb0FwcFN0YXRlID0gdGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpLnJlcGxhY2UoL1smP117MX1zYXAtaWFwcC1zdGF0ZT1bQS1aMC05XSsvLCBcIlwiKTtcblx0XHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gc0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSkge1xuXHRcdFx0XHQvLyBUaGUgaGFzaCBkb2Vzbid0IGNoYW5nZSwgYnV0IHdlIGZpcmUgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgdG8gdHJpZ2dlciBwYWdlIHJlZnJlc2ggLyBiaW5kaW5nXG5cdFx0XHRcdGNvbnN0IG1FdmVudFBhcmFtZXRlcnM6IGFueSA9IHRoaXMub1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2godGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpKTtcblx0XHRcdFx0aWYgKG1FdmVudFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gb05hdmlnYXRpb25JbmZvO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMudmlld3MgPSB0aGlzLmFDdXJyZW50Vmlld3M7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5zZXRGb2N1c0ZvcmNlZCghIW1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzKTtcblxuXHRcdFx0XHR0aGlzLl9maXJlUm91dGVNYXRjaEV2ZW50cyhtRXZlbnRQYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy50cmFuc2llbnQgJiYgbVBhcmFtZXRlcnMuZWRpdGFibGUgPT0gdHJ1ZSAmJiBzVGFyZ2V0UGF0aC5pbmRleE9mKFwiKC4uLilcIikgPT09IC0xKSB7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGguaW5kZXhPZihcIj9cIikgPiAtMSkge1xuXHRcdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiZpLWFjdGlvbj1jcmVhdGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2ktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsZWFyIHVuYm91bmQgbWVzc2FnZXMgdXBvbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1Bcblx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSBzdGFsZSBlcnJvciBtZXNzYWdlcyBmcm9tIExSIGFyZSBub3Qgc2hvd24gdG8gdGhlIHVzZXIgYWZ0ZXIgbmF2aWdhdGlvbiB0byBPUC5cblx0XHRpZiAob0N1cnJlbnRUYXJnZXRJbmZvICYmIG9DdXJyZW50VGFyZ2V0SW5mby5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRjb25zdCBvUm91dGVJbmZvID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzVGFyZ2V0UGF0aCk7XG5cdFx0XHRpZiAob1JvdXRlSW5mbykge1xuXHRcdFx0XHRjb25zdCBvUm91dGUgPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKG9Sb3V0ZUluZm8ubmFtZSk7XG5cdFx0XHRcdGlmIChvUm91dGUgJiYgb1JvdXRlLnRhcmdldHMgJiYgb1JvdXRlLnRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IHNMYXN0VGFyZ2V0TmFtZSA9IG9Sb3V0ZS50YXJnZXRzW29Sb3V0ZS50YXJnZXRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzTGFzdFRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQubmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2VcIikge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgcXVldWVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucHVzaChvTmF2aWdhdGlvbkluZm8pO1xuXG5cdFx0aWYgKHNUYXJnZXRSb3V0ZSAmJiBvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLnRoZW4oKG9Sb3V0ZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUgPSBiSXNTdGlja3lNb2RlO1xuXHRcdFx0XHR0aGlzLm9Sb3V0ZXIubmF2VG8oc1RhcmdldFJvdXRlLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHQubmF2VG9IYXNoKHNUYXJnZXRQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnM/Lm5vUHJlc2VydmF0aW9uQ2FjaGUsIG1QYXJhbWV0ZXJzPy5iRm9yY2VGb2N1cywgIWJJc1N0aWNreU1vZGUpXG5cdFx0XHQudGhlbigoYk5hdmlnYXRlZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICghYk5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdC8vIFRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuIC0tPiByZW1vdmUgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBxdWV1ZSBhcyB0aGV5IHNob3VsZG4ndCBiZSB1c2VkXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmcjbmF2aWdhdGVUb1JvdXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Sb3V0aW5nXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzVGFyZ2V0Um91dGVOYW1lXSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvUm91dGVQYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0bmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWU6IHN0cmluZywgb1JvdXRlUGFyYW1ldGVyczogYW55IHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3Qgc1RhcmdldFVSTCA9IHRoaXMub1JvdXRlci5nZXRVUkwoc1RhcmdldFJvdXRlTmFtZSwgb1JvdXRlUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5Lm5hdlRvSGFzaChzVGFyZ2V0VVJMLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAhb1JvdXRlUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIG9yIGBmYWxzZWAgaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW1wYWN0ZWQgb3Igbm90XG5cdCAqL1xuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIHdpdGggdGhlIHRlY2huaWNhbCBwYXRoLiBXZSBoYXZlIHRvIHRyeSBpdCwgYmVjYXVzZSBmb3IgbGV2ZWwgPiAxLCB3ZVxuXHRcdC8vIHVzZXMgdGVjaG5pY2FsIGtleXMgZXZlbiBpZiBTZW1hbnRpYyBrZXlzIGFyZSBlbmFibGVkXG5cdFx0aWYgKHRoaXMub1JvdXRlclByb3h5LmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzUGF0aCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoL15bXlxcKFxcKV0rXFwoW15cXChcXCldK1xcKSQvLnRlc3Qoc1BhdGgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCBwYXRoIGNhbiBiZSBzZW1hbnRpYyAoaS5lLiBpcyBsaWtlIHh4eCh5eXkpKVxuXHRcdFx0Ly8gY2hlY2sgd2l0aCB0aGUgc2VtYW50aWMgcGF0aCBpZiB3ZSBjYW4gZmluZCBpdFxuXHRcdFx0bGV0IHNTZW1hbnRpY1BhdGg7XG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGhhdmUgYWxyZWFkeSByZXNvbHZlZCB0aGlzIHNlbWFudGljIHBhdGhcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzU2VtYW50aWNQYXRoICE9IHNQYXRoID8gdGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNTZW1hbnRpY1BhdGgpIDogZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoOiBhbnkpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0c1BhdGggPSBzUGF0aC5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcblx0XHRpZiAodGhpcy5vUm91dGVyLm1hdGNoKHNQYXRoKSB8fCBzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblx0XHR9XG5cdH1cblxuXHRfY2hlY2tDb250ZXh0Rm9yU2VtYW50aWNQYXRoKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblxuXHRcdC8vIEZpcnN0LCBjaGVjayBpZiB0aGlzIGlzIGEgbGV2ZWwtMSBvYmplY3QgKHBhdGggPSAvYWFhKGJiYikpXG5cdFx0aWYgKCEvXlxcL1teXFwoXStcXChbXlxcKV0rXFwpJC8udGVzdChzUGF0aCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBUaGVuIGNoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIHNlbWFudGljIGtleXNcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdGlmICghU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgdGhlIGVudGl0eSBpcyBkcmFmdC1lbmFibGVkXG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgc1BhdGgpO1xuXHR9XG5cblx0X2dldFBhdGhGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IHNQYXRoO1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpICYmIG9Db250ZXh0LmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPT09IC0xKSB7XG5cdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgYmFjayBmcm9tIGEgY29udGV4dCwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoXG5cdFx0XHRzUGF0aCA9IHRoaXMuX2ZpbmRQYXRoVG9OYXZpZ2F0ZShzUGF0aCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHdlJ3JlIG5hdmlnYXRpbmcgYmFjayB0byBhIHNlbWFudGljIHBhdGggdGhhdCB3YXMgcHJldmlvdXNseSByZXNvbHZlZFxuXHRcdFx0aWYgKHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcgJiYgdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID09PSBzUGF0aCkge1xuXHRcdFx0XHRzUGF0aCA9IHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcy5fY2hlY2tDb250ZXh0Rm9yU2VtYW50aWNQYXRoKG9Db250ZXh0KSkge1xuXHRcdFx0Ly8gV2UgY2hlY2sgaWYgd2UgaGF2ZSB0byB1c2UgYSBzZW1hbnRpYyBwYXRoXG5cdFx0XHRjb25zdCBzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblxuXHRcdFx0aWYgKCFzU2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIHdlcmUgbm90IGFibGUgdG8gYnVpbGQgdGhlIHNlbWFudGljIHBhdGggLS0+IFVzZSB0aGUgdGVjaG5pY2FsIHBhdGggYW5kXG5cdFx0XHRcdC8vIGNsZWFyIHRoZSBwcmV2aW91cyBtYXBwaW5nLCBvdGhlcndpc2UgdGhlIG9sZCBtYXBwaW5nIGlzIHVzZWQgaW4gRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0XHRcdFx0Ly8gYW5kIGl0IGxlYWRzIHRvIHVud2FudGVkIHBhZ2UgcmVsb2Fkc1xuXHRcdFx0XHR0aGlzLnNldExhc3RTZW1hbnRpY01hcHBpbmcodW5kZWZpbmVkKTtcblx0XHRcdH0gZWxzZSBpZiAoc1NlbWFudGljUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gU3RvcmUgdGhlIG1hcHBpbmcgdGVjaG5pY2FsIDwtPiBzZW1hbnRpYyBwYXRoIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgaXQgbGF0ZXJcblx0XHRcdFx0Ly8gYW5kIHVzZSB0aGUgc2VtYW50aWMgcGF0aCBpbnN0ZWFkIG9mIHRoZSB0ZWNobmljYWwgb25lXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdHNQYXRoID0gc1NlbWFudGljUGF0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgZXh0cmEgJy8nIGF0IHRoZSBiZWdpbm5pbmcgb2YgcGF0aFxuXHRcdGlmIChzUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzUGF0aDtcblx0fVxuXG5cdF9jYWxjdWxhdGVMYXlvdXQoc1BhdGg6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBGQ0xMZXZlbCA9IG1QYXJhbWV0ZXJzLkZDTExldmVsO1xuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCkge1xuXHRcdFx0RkNMTGV2ZWwgKz0gbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWw7XG5cdFx0XHRpZiAoRkNMTGV2ZWwgPCAwKSB7XG5cdFx0XHRcdEZDTExldmVsID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmNhbGN1bGF0ZUxheW91dChGQ0xMZXZlbCwgc1BhdGgsIG1QYXJhbWV0ZXJzLnNMYXlvdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgYmVmb3JlIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogRGlzcGxheXMgYSBidXN5IGluZGljYXRvci5cblx0ICpcblx0ICovXG5cdF9iZWZvcmVSb3V0ZU1hdGNoZWQoLypvRXZlbnQ6IEV2ZW50Ki8pIHtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdGNvbnN0IG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEhpZGVzIHRoZSBidXN5IGluZGljYXRvciBhbmQgZmlyZXMgaXRzIG93biAncm91dGVtYXRjaGVkJyBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBUaGUgZXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlSGFuZGxlciA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRBcHBTdGF0ZUhhbmRsZXIoKSxcblx0XHRcdG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Sb290VmlldykgJiYgIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpO1xuXHRcdGlmICh0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUubGVuZ3RoKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZVswXTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5zbGljZSgxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMubmF2aWdhdGlvbkluZm8gPSB7fTtcblx0XHR9XG5cdFx0aWYgKG9BcHBTdGF0ZUhhbmRsZXIuY2hlY2tJZlJvdXRlQ2hhbmdlZEJ5SUFwcCgpKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mby5iUmVhc29uSXNJYXBwU3RhdGUgPSB0cnVlO1xuXHRcdFx0b0FwcFN0YXRlSGFuZGxlci5yZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmFtZVwiKTtcblx0XHR0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuID0gbVBhcmFtZXRlcnMuY29uZmlnLnBhdHRlcm47XG5cdFx0dGhpcy5hQ3VycmVudFZpZXdzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpO1xuXG5cdFx0bVBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0bVBhcmFtZXRlcnMucm91dGVQYXR0ZXJuID0gdGhpcy5zQ3VycmVudFJvdXRlUGF0dGVybjtcblxuXHRcdHRoaXMuX2ZpcmVSb3V0ZU1hdGNoRXZlbnRzKG1QYXJhbWV0ZXJzKTtcblxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgaGFzaCBoYXMgYmVlbiBzZXQgYnkgdGhlIHJvdXRlclByb3h5Lm5hdlRvSGFzaCBmdW5jdGlvblxuXHRcdC8vIElmIG5vdCwgcmVidWlsZCBoaXN0b3J5IHByb3Blcmx5IChib3RoIGluIHRoZSBicm93c2VyIGFuZCB0aGUgUm91dGVyUHJveHkpXG5cdFx0aWYgKCFoaXN0b3J5LnN0YXRlIHx8IGhpc3Rvcnkuc3RhdGUuZmVMZXZlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eVxuXHRcdFx0XHQucmVzdG9yZUhpc3RvcnkoKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUm91dGVyUHJveHkucmVzb2x2ZVJvdXRlTWF0Y2goKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzdG9yaW5nIGhpc3RvcnlcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5LnJlc29sdmVSb3V0ZU1hdGNoKCk7XG5cdFx0fVxuXHR9XG5cblx0YXR0YWNoUm91dGVNYXRjaGVkKG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0ZGV0YWNoUm91dGVNYXRjaGVkKGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZChvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KFwiYWZ0ZXJSb3V0ZU1hdGNoZWRcIiwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0ZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoZm5GdW5jdGlvbjogYW55LCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChcImFmdGVyUm91dGVNYXRjaGVkXCIsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblxuXHRnZXRSb3V0ZUZyb21IYXNoKG9Sb3V0ZXI6IGFueSwgb0FwcENvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSBvUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuaGFzaDtcblx0XHRjb25zdCBvUm91dGVJbmZvID0gb1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2goc0hhc2gpO1xuXHRcdHJldHVybiBvQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0TWV0YWRhdGEoKVxuXHRcdFx0LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLnVpNS9yb3V0aW5nL3JvdXRlc1wiKVxuXHRcdFx0LmZpbHRlcihmdW5jdGlvbihvUm91dGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1JvdXRlLm5hbWUgPT09IG9Sb3V0ZUluZm8ubmFtZTtcblx0XHRcdH0pWzBdO1xuXHR9XG5cdGdldFRhcmdldHNGcm9tUm91dGUob1JvdXRlOiBhbnkpIHtcblx0XHRjb25zdCBvVGFyZ2V0ID0gb1JvdXRlLnRhcmdldDtcblx0XHRpZiAodHlwZW9mIG9UYXJnZXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBbdGhpcy5fbVRhcmdldHNbb1RhcmdldF1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0OiBhbnlbXSA9IFtdO1xuXHRcdFx0b1RhcmdldC5mb3JFYWNoKChzVGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0YVRhcmdldC5wdXNoKHRoaXMuX21UYXJnZXRzW3NUYXJnZXRdKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFUYXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0aW5pdGlhbGl6ZVJvdXRpbmcoKSB7XG5cdFx0Ly8gQXR0YWNoIHJvdXRlciBoYW5kbGVyc1xuXHRcdHRoaXMuX2ZuT25Sb3V0ZU1hdGNoZWQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMub1JvdXRlci5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5PblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKCFiUGxhY2Vob2xkZXJFbmFibGVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIuYXR0YWNoQmVmb3JlUm91dGVNYXRjaGVkKHRoaXMuX2JlZm9yZVJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0Ly8gUmVzZXQgaW50ZXJuYWwgc3RhdGVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUgPSBbXTtcblx0XHRFZGl0U3RhdGUucmVzZXRFZGl0U3RhdGUoKTtcblx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSAhdGhpcy5vUm91dGVyLm1hdGNoKFwiXCIpO1xuXG5cdFx0Y29uc3QgYklzSWFwcFN0YXRlID1cblx0XHRcdHRoaXMub1JvdXRlclxuXHRcdFx0XHQuZ2V0SGFzaENoYW5nZXIoKVxuXHRcdFx0XHQuZ2V0SGFzaCgpXG5cdFx0XHRcdC5pbmRleE9mKFwic2FwLWlhcHAtc3RhdGVcIikgIT09IC0xO1xuXHRcdGNvbnN0IGluaXRQcm9taXNlID0gdGhpcy5vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U3RhcnR1cFBhcmFtZXRlcnMoKVxuXHRcdFx0LnRoZW4oKG9TdGFydHVwUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGJIYXNTdGFydFVwUGFyYW1ldGVycyA9IG9TdGFydHVwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKG9TdGFydHVwUGFyYW1ldGVycykubGVuZ3RoICE9PSAwO1xuXHRcdFx0XHRjb25zdCBzSGFzaCA9IHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKTtcblx0XHRcdFx0Ly8gTWFuYWdlIHN0YXJ0dXAgcGFyYW1ldGVycyAoaW4gY2FzZSBvZiBubyBpYXBwLXN0YXRlKVxuXHRcdFx0XHRpZiAoIWJJc0lhcHBTdGF0ZSAmJiBiSGFzU3RhcnRVcFBhcmFtZXRlcnMgJiYgIXNIYXNoKSB7XG5cdFx0XHRcdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdLmluZGV4T2YoXCJjcmVhdGVcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgbW9kZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX21hbmFnZUNyZWF0ZVN0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRGVlcCBsaW5rXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fbWFuYWdlRGVlcExpbmtTdGFydHVwKG9TdGFydHVwUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyByb3V0aW5nIGluaXRpYWxpemF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBpbml0UHJvbWlzZTtcblx0fVxuXG5cdGdldERlZmF1bHRDcmVhdGVIYXNoKG9TdGFydHVwUGFyYW1ldGVyczogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0dGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KClbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9EZWVwTGluay5jb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRpbmdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
929
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiRXZlbnRQcm92aWRlciIsImV4dGVuZCIsIm1ldGFkYXRhIiwiZXZlbnRzIiwiUm91dGluZ1NlcnZpY2UiLCJuYXZpZ2F0aW9uSW5mb1F1ZXVlIiwiaW5pdCIsIm9Db250ZXh0IiwiZ2V0Q29udGV4dCIsInNjb3BlVHlwZSIsIm9BcHBDb21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJvUm91dGVyUHJveHkiLCJnZXRSb3V0ZXJQcm94eSIsImV2ZW50UHJvdmlkZXIiLCJvUm91dGluZ0NvbmZpZyIsImdldE1hbmlmZXN0RW50cnkiLCJvUm9vdFZpZXdDb25maWciLCJfcGFyc2VSb3V0aW5nQ29uZmlndXJhdGlvbiIsIm9BcHBDb25maWciLCJvdXRib3VuZHMiLCJjcm9zc05hdmlnYXRpb24iLCJpbml0UHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiYmVmb3JlRXhpdCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIl9mbk9uUm91dGVNYXRjaGVkIiwiZmlyZUV2ZW50IiwiZXhpdCIsImRlc3Ryb3kiLCJpc0ZDTCIsInZpZXdOYW1lIiwiX21UYXJnZXRzIiwiT2JqZWN0Iiwia2V5cyIsInRhcmdldHMiLCJmb3JFYWNoIiwic1RhcmdldE5hbWUiLCJhc3NpZ24iLCJ0YXJnZXROYW1lIiwiY29udGV4dFBhdHRlcm4iLCJ1bmRlZmluZWQiLCJ2aWV3TGV2ZWwiLCJfZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4iLCJfbVJvdXRlcyIsInNSb3V0ZUtleSIsInJvdXRlcyIsIm9Sb3V0ZU1hbmlmZXN0SW5mbyIsImFSb3V0ZVRhcmdldHMiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXQiLCJzUm91dGVOYW1lIiwibmFtZSIsInNSb3V0ZVBhdHRlcm4iLCJwYXR0ZXJuIiwibGVuZ3RoIiwiaW5kZXhPZiIsIkxvZyIsIndhcm5pbmciLCJpUm91dGVMZXZlbCIsInJvdXRlTGV2ZWwiLCJpIiwic1BhcmVudFRhcmdldE5hbWUiLCJwYXJlbnQiLCJwdXNoIiwiRkNMTGV2ZWwiLCJjb250cm9sQWdncmVnYXRpb24iLCJhTGV2ZWwwUm91dGVOYW1lcyIsImFMZXZlbDFSb3V0ZU5hbWVzIiwic0RlZmF1bHRSb3V0ZU5hbWUiLCJzTmFtZSIsImlMZXZlbCIsInNEZWZhdWx0VGFyZ2V0TmFtZSIsInNsaWNlIiwic0NvbnRleHRQYXRoIiwib3B0aW9ucyIsInNldHRpbmdzIiwib1NldHRpbmdzIiwiY29udGV4dFBhdGgiLCJlbnRpdHlTZXQiLCJtYXAiLCJzVGFyZ2V0S2V5Iiwic29ydCIsImEiLCJiIiwiZnVsbENvbnRleHRQYXRoIiwibmF2aWdhdGlvbiIsInNOYXZOYW1lIiwidGFyZ2V0Um91dGUiLCJkZXRhaWwiLCJyb3V0ZSIsInNQYXR0ZXJuIiwicmVwbGFjZSIsInJlZ2V4IiwiUmVnRXhwIiwibWF0Y2giLCJfZ2V0Um91dGVJbmZvcm1hdGlvbiIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIl9nZXRDb21wb25lbnRJZCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvQ29tcG9uZW50SW5zdGFuY2UiLCJzVGFyZ2V0Q29tcG9uZW50SWQiLCJfc093bmVySWQiLCJnZXRJZCIsInNDb3JyZWN0VGFyZ2V0TmFtZSIsImlkIiwidmlld0lkIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9NYXBwaW5nIiwibmF2aWdhdGVUbyIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwiYlByZXNlcnZlSGlzdG9yeSIsInNUYXJnZXRVUkxQcm9taXNlIiwiYklzU3RpY2t5TW9kZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY1BhdGgiLCJwcmVwYXJlUGFyYW1ldGVycyIsInRoZW4iLCJtUGFyYW1ldGVycyIsImdldFVSTCIsInNUYXJnZXRVUkwiLCJuYXZUb0hhc2giLCJzVGFyZ2V0Um91dGUiLCJvUGFyYW1ldGVyc1Byb21pc2UiLCJnZXRQYXRoIiwiYUNvbnRleHRQYXRoUGFydHMiLCJzcGxpdCIsImFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwic1BhcmFtZXRlcktleSIsInNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbiIsIm9QYXJzZWRFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhUGFydHMiLCJwYXJ0cyIsImFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwib1BhdGhQYXJ0IiwiYVJlbGF0aXZlUGFydHMiLCJwYXRoIiwiYUxvY2FsUGFydHMiLCJzUHJvcGVydHlQYXRoIiwiam9pbiIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5Iiwib1ZhbHVlIiwib1Byb3BlcnR5SW5mbyIsImdldE9iamVjdCIsInNFZG1UeXBlIiwiJFR5cGUiLCJPRGF0YVV0aWxzIiwiZm9ybWF0TGl0ZXJhbCIsImFsbCIsImFSZXNvbHZlZFBhcmFtZXRlcnMiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImFwcGx5Iiwia2V5IiwiYUFsbFJlc29sdmVkUGFyYW1ldGVycyIsIm9QYXJhbWV0ZXJzIiwib1Jlc29sdmVkUGFyYW1ldGVyIiwib0Vycm9yIiwiZXJyb3IiLCJfZmlyZVJvdXRlTWF0Y2hFdmVudHMiLCJFZGl0U3RhdGUiLCJjbGVhblByb2Nlc3NlZEVkaXRTdGF0ZSIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib1ZpZXdEYXRhIiwib0N1cnJlbnRUYXJnZXRJbmZvIiwib1JvdXRlUGFyYW1ldGVyc1Byb21pc2UiLCJ0YXJnZXRQYXRoIiwib1JvdXRlRGV0YWlsIiwicGFyYW1ldGVycyIsInNUYXJnZXRQYXRoIiwiX2dldFBhdGhGcm9tQ29udGV4dCIsImJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QiLCJleGl0RnJvbUFwcCIsImFzeW5jQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJzTGF5b3V0IiwiX2NhbGN1bGF0ZUxheW91dCIsIm9OYXZpZ2F0aW9uSW5mbyIsIm9Bc3luY0NvbnRleHQiLCJiVGFyZ2V0RWRpdGFibGUiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1c2VDb250ZXh0IiwidXBkYXRlRkNMTGV2ZWwiLCJiUmVjcmVhdGVDb250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsImJTaG93UGxhY2Vob2xkZXIiLCJzaG93UGxhY2Vob2xkZXIiLCJjaGVja05vSGFzaENoYW5nZSIsInNDdXJyZW50SGFzaE5vQXBwU3RhdGUiLCJnZXRIYXNoIiwibUV2ZW50UGFyYW1ldGVycyIsImdldFJvdXRlSW5mb0J5SGFzaCIsIm5hdmlnYXRpb25JbmZvIiwicm91dGVJbmZvcm1hdGlvbiIsInNDdXJyZW50Um91dGVOYW1lIiwicm91dGVQYXR0ZXJuIiwic0N1cnJlbnRSb3V0ZVBhdHRlcm4iLCJ2aWV3cyIsImFDdXJyZW50Vmlld3MiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZUZvY3VzIiwidHJhbnNpZW50Iiwib1JvdXRlSW5mbyIsIm9Sb3V0ZSIsInNMYXN0VGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwib1JvdXRlUGFyYW1ldGVycyIsIm5hdlRvIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJOYXZpZ2F0ZWQiLCJwb3AiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic1BhdGgiLCJ0ZXN0Iiwic1NlbWFudGljUGF0aCIsInRlY2huaWNhbFBhdGgiLCJzZW1hbnRpY1BhdGgiLCJfZmluZFBhdGhUb05hdmlnYXRlIiwiX2NoZWNrQ29udGV4dEZvclNlbWFudGljUGF0aCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNEcmFmdFN1cHBvcnRlZCIsImlzQSIsImlzUmVsYXRpdmUiLCJnZXRIZWFkZXJDb250ZXh0Iiwic3Vic3RyaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY2FsY3VsYXRlTGF5b3V0IiwiX2JlZm9yZVJvdXRlTWF0Y2hlZCIsImJQbGFjZWhvbGRlckVuYWJsZWQiLCJQbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJFbmFibGVkIiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJCdXN5TG9ja2VyIiwibG9jayIsIl9vblJvdXRlTWF0Y2hlZCIsIm9FdmVudCIsIm9BcHBTdGF0ZUhhbmRsZXIiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJpc0xvY2tlZCIsInVubG9jayIsImdldFBhcmFtZXRlcnMiLCJjaGVja0lmUm91dGVDaGFuZ2VkQnlJQXBwIiwiYlJlYXNvbklzSWFwcFN0YXRlIiwicmVzZXRSb3V0ZUNoYW5nZWRCeUlBcHAiLCJnZXRQYXJhbWV0ZXIiLCJjb25maWciLCJoaXN0b3J5Iiwic3RhdGUiLCJmZUxldmVsIiwicmVzdG9yZUhpc3RvcnkiLCJyZXNvbHZlUm91dGVNYXRjaCIsImNhdGNoIiwiYXR0YWNoUm91dGVNYXRjaGVkIiwib0RhdGEiLCJmbkZ1bmN0aW9uIiwib0xpc3RlbmVyIiwiYXR0YWNoRXZlbnQiLCJkZXRhY2hFdmVudCIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0ZUZyb21IYXNoIiwic0hhc2giLCJnZXRIYXNoQ2hhbmdlciIsImhhc2giLCJnZXRNZXRhZGF0YSIsImZpbHRlciIsImdldFRhcmdldHNGcm9tUm91dGUiLCJhVGFyZ2V0Iiwic1RhcmdldCIsImluaXRpYWxpemVSb3V0aW5nIiwiYmluZCIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsInJlc2V0RWRpdFN0YXRlIiwiYklzSWFwcFN0YXRlIiwiZ2V0U3RhcnR1cFBhcmFtZXRlcnMiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJiSGFzU3RhcnRVcFBhcmFtZXRlcnMiLCJwcmVmZXJyZWRNb2RlIiwiX21hbmFnZUNyZWF0ZVN0YXJ0dXAiLCJfbWFuYWdlRGVlcExpbmtTdGFydHVwIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJBcHBTdGFydHVwSGVscGVyIiwiZ2V0Q29udGV4dFBhdGgiLCJnZXRDcmVhdGVTdGFydHVwSGFzaCIsInNOZXdIYXNoIiwicmVwbGFjZUhhc2giLCJnZXREZWVwTGlua1N0YXJ0dXBIYXNoIiwiZ2V0TWFuaWZlc3QiLCJyb3V0aW5nIiwib0RlZXBMaW5rIiwiY29udGV4dCIsInNUZWNobmljYWxQYXRoIiwiZ2V0T3V0Ym91bmRzIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0Iiwib1JvdXRpbmdTZXJ2aWNlIiwiU2VydmljZUZhY3RvcnkiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFvQkEsTUFBTUEsc0JBQXNCLEdBQUdDLGFBQWEsQ0FBQ0MsTUFBZCxDQUFxQiw2Q0FBckIsRUFBb0U7QUFDbEdDLElBQUFBLFFBQVEsRUFBRTtBQUNUQyxNQUFBQSxNQUFNLEVBQUU7QUFDUCx3QkFBZ0IsRUFEVDtBQUVQLDZCQUFxQjtBQUZkO0FBREM7QUFEd0YsR0FBcEUsQ0FBL0I7O01BUWFDLGM7Ozs7Ozs7Ozs7O1lBZ0JaQyxtQixHQUE2QixFOzs7Ozs7O1dBRzdCQyxJLEdBQUEsZ0JBQU87QUFDTixVQUFNQyxRQUFRLEdBQUcsS0FBS0MsVUFBTCxFQUFqQjs7QUFDQSxVQUFJRCxRQUFRLENBQUNFLFNBQVQsS0FBdUIsV0FBM0IsRUFBd0M7QUFDdkMsYUFBS0MsYUFBTCxHQUFxQkgsUUFBUSxDQUFDSSxXQUE5QjtBQUNBLGFBQUtDLE1BQUwsR0FB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Szs7V0FFRCtCLFksR0FBQSx3QkFBZTtBQUNkLGFBQU8sS0FBS3BTLFNBQVo7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQzBSLGMsR0FBQSwwQkFBaUI7QUFDaEIsYUFBTyxLQUFLbE8sWUFBWjtBQUNBLEs7O1dBQ0Q2TyxZLEdBQUEsd0JBQW9CO0FBQ25CLGFBQU8sSUFBUDtBQUNBLEs7OztJQXoxQmtDQyxPOzs7O01BNDFCOUJDLHFCOzs7Ozs7Ozs7WUFDTEMsYyxHQUFBLHdCQUFlQyxlQUFmLEVBQXdFO0FBQ3ZFLFVBQU1DLGVBQWUsR0FBRyxJQUFJaFUsY0FBSixDQUFtQitULGVBQW5CLENBQXhCO0FBQ0EsYUFBT0MsZUFBZSxDQUFDeFMsV0FBdkI7QUFDQSxLOzs7SUFKa0N5UyxjOztTQU9yQkoscUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgRXZlbnRQcm92aWRlciBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgQXBwU3RhcnR1cEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9BcHBTdGFydHVwSGVscGVyXCI7XG5pbXBvcnQgT0RhdGFVdGlscyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhVXRpbHNcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvUm91dGVyUHJveHlcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xudHlwZSBSb3V0aW5nU2VydmljZVNldHRpbmdzID0ge307XG5jb25zdCBSb3V0aW5nU2VydmljZUV2ZW50aW5nID0gRXZlbnRQcm92aWRlci5leHRlbmQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5Sb3V0aW5nU2VydmljZUV2ZW50aW5nXCIsIHtcblx0bWV0YWRhdGE6IHtcblx0XHRldmVudHM6IHtcblx0XHRcdFwicm91dGVNYXRjaGVkXCI6IHt9LFxuXHRcdFx0XCJhZnRlclJvdXRlTWF0Y2hlZFwiOiB7fVxuXHRcdH1cblx0fVxufSk7XG5leHBvcnQgY2xhc3MgUm91dGluZ1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0b0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0b01vZGVsITogT0RhdGFNb2RlbDtcblx0b01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRvUm91dGVyITogUm91dGVyO1xuXHRvUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0ZXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRvdXRib3VuZHM6IGFueTtcblx0X21UYXJnZXRzOiBhbnk7XG5cdF9tUm91dGVzOiBhbnk7XG5cdG9MYXN0U2VtYW50aWNNYXBwaW5nOiBhbnk7XG5cdGJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3Q/OiBib29sZWFuO1xuXHRzQ3VycmVudFJvdXRlTmFtZT86IHN0cmluZztcblx0c0N1cnJlbnRSb3V0ZVBhdHRlcm4/OiBzdHJpbmc7XG5cdGFDdXJyZW50Vmlld3M/OiBhbnlbXTtcblx0bmF2aWdhdGlvbkluZm9RdWV1ZTogYW55W10gPSBbXTtcblx0c0NvbnRleHRQYXRoITogc3RyaW5nO1xuXHRfZm5PblJvdXRlTWF0Y2hlZCE6IEZ1bmN0aW9uO1xuXHRpbml0KCkge1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0aWYgKG9Db250ZXh0LnNjb3BlVHlwZSA9PT0gXCJjb21wb25lbnRcIikge1xuXHRcdFx0dGhpcy5vQXBwQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0XHR0aGlzLm9Nb2RlbCA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0XHR0aGlzLm9NZXRhTW9kZWwgPSB0aGlzLm9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHR0aGlzLmV2ZW50UHJvdmlkZXIgPSBuZXcgKFJvdXRpbmdTZXJ2aWNlRXZlbnRpbmcgYXMgYW55KSgpO1xuXG5cdFx0XHRjb25zdCBvUm91dGluZ0NvbmZpZyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC51aTUvcm91dGluZ1wiKTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbmZpZyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC51aTUvcm9vdFZpZXdcIik7XG5cdFx0XHR0aGlzLl9wYXJzZVJvdXRpbmdDb25maWd1cmF0aW9uKG9Sb3V0aW5nQ29uZmlnLCBvUm9vdFZpZXdDb25maWcpO1xuXG5cdFx0XHRjb25zdCBvQXBwQ29uZmlnID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCIvc2FwLmFwcFwiKTtcblx0XHRcdHRoaXMub3V0Ym91bmRzID0gb0FwcENvbmZpZyAmJiBvQXBwQ29uZmlnLmNyb3NzTmF2aWdhdGlvbiAmJiBvQXBwQ29uZmlnLmNyb3NzTmF2aWdhdGlvbi5vdXRib3VuZHM7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcblx0fVxuXHRiZWZvcmVFeGl0KCkge1xuXHRcdHRoaXMub1JvdXRlci5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5PblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmZpcmVFdmVudChcInJvdXRlTWF0Y2hlZFwiLCB7fSk7XG5cdH1cblx0ZXhpdCgpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgbWFuaWZlc3Qgcm91dGluZyBjb25maWd1cmF0aW9uIGZvciBpbnRlcm5hbCB1c2FnZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Sb3V0aW5nQ29uZmlnIFRoZSByb3V0aW5nIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbWFuaWZlc3Rcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Sb290Vmlld0NvbmZpZyBUaGUgcm9vdCB2aWV3IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbWFuaWZlc3Rcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9wYXJzZVJvdXRpbmdDb25maWd1cmF0aW9uKG9Sb3V0aW5nQ29uZmlnOiBhbnksIG9Sb290Vmlld0NvbmZpZzogYW55KSB7XG5cdFx0Y29uc3QgaXNGQ0wgPSBvUm9vdFZpZXdDb25maWcgJiYgb1Jvb3RWaWV3Q29uZmlnLnZpZXdOYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci52aWV3LkZjbFwiO1xuXG5cdFx0Ly8gSW5mb3JtYXRpb24gb2YgdGFyZ2V0c1xuXHRcdHRoaXMuX21UYXJnZXRzID0ge307XG5cdFx0T2JqZWN0LmtleXMob1JvdXRpbmdDb25maWcudGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdID0gT2JqZWN0LmFzc2lnbih7IHRhcmdldE5hbWU6IHNUYXJnZXROYW1lIH0sIG9Sb3V0aW5nQ29uZmlnLnRhcmdldHNbc1RhcmdldE5hbWVdKTtcblxuXHRcdFx0Ly8gVmlldyBsZXZlbCBmb3IgRkNMIGNhc2VzIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0xldmVsID0gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4odGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuLCAwKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEluZm9ybWF0aW9uIG9mIHJvdXRlc1xuXHRcdHRoaXMuX21Sb3V0ZXMgPSB7fTtcblx0XHRmb3IgKGNvbnN0IHNSb3V0ZUtleSBpbiBvUm91dGluZ0NvbmZpZy5yb3V0ZXMpIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZU1hbmlmZXN0SW5mbyA9IG9Sb3V0aW5nQ29uZmlnLnJvdXRlc1tzUm91dGVLZXldLFxuXHRcdFx0XHRhUm91dGVUYXJnZXRzID0gQXJyYXkuaXNBcnJheShvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0KSA/IG9Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXQgOiBbb1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldF0sXG5cdFx0XHRcdHNSb3V0ZU5hbWUgPSBBcnJheS5pc0FycmF5KG9Sb3V0aW5nQ29uZmlnLnJvdXRlcykgPyBvUm91dGVNYW5pZmVzdEluZm8ubmFtZSA6IHNSb3V0ZUtleSxcblx0XHRcdFx0c1JvdXRlUGF0dGVybiA9IG9Sb3V0ZU1hbmlmZXN0SW5mby5wYXR0ZXJuO1xuXG5cdFx0XHQvLyBDaGVjayByb3V0ZSBwYXR0ZXJuOiBhbGwgcGF0dGVybnMgbmVlZCB0byBlbmQgd2l0aCAnOj9xdWVyeTonLCB0aGF0IHdlIHVzZSBmb3IgcGFyYW1ldGVyc1xuXHRcdFx0aWYgKHNSb3V0ZVBhdHRlcm4ubGVuZ3RoIDwgOCB8fCBzUm91dGVQYXR0ZXJuLmluZGV4T2YoXCI6P3F1ZXJ5OlwiKSAhPT0gc1JvdXRlUGF0dGVybi5sZW5ndGggLSA4KSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiUGF0dGVybiBmb3Igcm91dGUgXCIgKyBzUm91dGVOYW1lICsgXCIgZG9lc24ndCBlbmQgd2l0aCAnOj9xdWVyeTonIDogXCIgKyBzUm91dGVQYXR0ZXJuKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlSb3V0ZUxldmVsID0gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1JvdXRlUGF0dGVybiwgMCk7XG5cdFx0XHR0aGlzLl9tUm91dGVzW3NSb3V0ZU5hbWVdID0ge1xuXHRcdFx0XHRuYW1lOiBzUm91dGVOYW1lLFxuXHRcdFx0XHRwYXR0ZXJuOiBzUm91dGVQYXR0ZXJuLFxuXHRcdFx0XHR0YXJnZXRzOiBhUm91dGVUYXJnZXRzLFxuXHRcdFx0XHRyb3V0ZUxldmVsOiBpUm91dGVMZXZlbFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgdGFyZ2V0cyBpbiB0aGUgbGlzdCBvZiB0YXJnZXRzIGZvciB0aGUgcm91dGVcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVJvdXRlVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBzUGFyZW50VGFyZ2V0TmFtZSA9IHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbaV1dLnBhcmVudDtcblx0XHRcdFx0aWYgKHNQYXJlbnRUYXJnZXROYW1lKSB7XG5cdFx0XHRcdFx0YVJvdXRlVGFyZ2V0cy5wdXNoKHNQYXJlbnRUYXJnZXROYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWlzRkNMKSB7XG5cdFx0XHRcdC8vIFZpZXcgbGV2ZWwgZm9yIG5vbi1GQ0wgY2FzZXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSByb3V0ZSBwYXR0ZXJuXG5cdFx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS52aWV3TGV2ZWwgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS52aWV3TGV2ZWwgPCBpUm91dGVMZXZlbCkge1xuXHRcdFx0XHRcdC8vIFRoZXJlIGFyZSBjYXNlcyB3aGVuIGRpZmZlcmVudCByb3V0ZXMgcG9pbnQgdG8gdGhlIHNhbWUgdGFyZ2V0LiBXZSB0YWtlIHRoZVxuXHRcdFx0XHRcdC8vIGxhcmdlc3Qgdmlld0xldmVsIGluIHRoYXQgY2FzZS5cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS52aWV3TGV2ZWwgPSBpUm91dGVMZXZlbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZDTCBsZXZlbCBmb3Igbm9uLUZDTCBjYXNlcyBpcyBlcXVhbCB0byAtMVxuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS5GQ0xMZXZlbCA9IC0xO1xuXHRcdFx0fSBlbHNlIGlmIChhUm91dGVUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzWzBdXS5jb250cm9sQWdncmVnYXRpb24gIT09IFwiYmVnaW5Db2x1bW5QYWdlc1wiKSB7XG5cdFx0XHRcdC8vIFdlJ3JlIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3Mgb25seSAxIHRhcmdldCBmb3IgdGhlIHJvdXRlLCBhbmQgaXQncyBub3QgaW4gdGhlIGZpcnN0IGNvbHVtblxuXHRcdFx0XHQvLyAtLT4gdGhpcyBpcyBhIGZ1bGxzY3JlZW4gY29sdW1uIGFmdGVyIGFsbCBjb2x1bW5zIGluIHRoZSBGQ0wgaGF2ZSBiZWVuIHVzZWRcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0uRkNMTGV2ZWwgPSAzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gT3RoZXIgRkNMIGNhc2VzXG5cdFx0XHRcdGFSb3V0ZVRhcmdldHMuZm9yRWFjaCgoc1RhcmdldE5hbWU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHN3aXRjaCAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRyb2xBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJlZ2luQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsID0gMDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgXCJtaWRDb2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPSAxO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsID0gMjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByb3BhZ2F0ZSB2aWV3TGV2ZWwsIGNvbnRleHRQYXR0ZXJuLCBGQ0xMZXZlbCBhbmQgY29udHJvbEFnZ3JlZ2F0aW9uIHRvIHBhcmVudCB0YXJnZXRzXG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHdoaWxlICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ucGFyZW50KSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJlbnRUYXJnZXROYW1lID0gdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnBhcmVudDtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLnZpZXdMZXZlbCA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLnZpZXdMZXZlbCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0xldmVsO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4gPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm47XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5GQ0xMZXZlbCA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLkZDTExldmVsIHx8IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbDtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRyb2xBZ2dyZWdhdGlvbiA9XG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRyb2xBZ2dyZWdhdGlvbiB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uY29udHJvbEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRzVGFyZ2V0TmFtZSA9IHNQYXJlbnRUYXJnZXROYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSByb290IGVudGl0eSBmb3IgdGhlIGFwcFxuXHRcdGNvbnN0IGFMZXZlbDBSb3V0ZU5hbWVzID0gW107XG5cdFx0Y29uc3QgYUxldmVsMVJvdXRlTmFtZXMgPSBbXTtcblx0XHRsZXQgc0RlZmF1bHRSb3V0ZU5hbWU7XG5cblx0XHRmb3IgKGNvbnN0IHNOYW1lIGluIHRoaXMuX21Sb3V0ZXMpIHtcblx0XHRcdGNvbnN0IGlMZXZlbCA9IHRoaXMuX21Sb3V0ZXNbc05hbWVdLnJvdXRlTGV2ZWw7XG5cdFx0XHRpZiAoaUxldmVsID09PSAwKSB7XG5cdFx0XHRcdGFMZXZlbDBSb3V0ZU5hbWVzLnB1c2goc05hbWUpO1xuXHRcdFx0fSBlbHNlIGlmIChpTGV2ZWwgPT09IDEpIHtcblx0XHRcdFx0YUxldmVsMVJvdXRlTmFtZXMucHVzaChzTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFMZXZlbDBSb3V0ZU5hbWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0c0RlZmF1bHRSb3V0ZU5hbWUgPSBhTGV2ZWwwUm91dGVOYW1lc1swXTtcblx0XHR9IGVsc2UgaWYgKGFMZXZlbDFSb3V0ZU5hbWVzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0c0RlZmF1bHRSb3V0ZU5hbWUgPSBhTGV2ZWwxUm91dGVOYW1lc1swXTtcblx0XHR9XG5cblx0XHRpZiAoc0RlZmF1bHRSb3V0ZU5hbWUpIHtcblx0XHRcdGNvbnN0IHNEZWZhdWx0VGFyZ2V0TmFtZSA9IHRoaXMuX21Sb3V0ZXNbc0RlZmF1bHRSb3V0ZU5hbWVdLnRhcmdldHMuc2xpY2UoLTEpWzBdO1xuXHRcdFx0dGhpcy5zQ29udGV4dFBhdGggPSBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucyAmJiB0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MpIHtcblx0XHRcdFx0Y29uc3Qgb1NldHRpbmdzID0gdGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzO1xuXHRcdFx0XHR0aGlzLnNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jb250ZXh0UGF0aCB8fCBcIi9cIiArIG9TZXR0aW5ncy5lbnRpdHlTZXQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFwiQ2Fubm90IGRldGVybWluZSBkZWZhdWx0IGNvbnRleHRQYXRoOiBjb250ZXh0UGF0aCBvciBlbnRpdHlTZXQgbWlzc2luZyBpbiBkZWZhdWx0IHRhcmdldDogXCIgKyBzRGVmYXVsdFRhcmdldE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJDYW5ub3QgZGV0ZXJtaW5lIGRlZmF1bHQgY29udGV4dFBhdGg6IG5vIGRlZmF1bHQgcm91dGUgZm91bmQuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFdlIG5lZWQgdG8gZXN0YWJsaXNoIHRoZSBjb3JyZWN0IHBhdGggdG8gdGhlIGRpZmZlcmVudCBwYWdlcywgaW5jbHVkaW5nIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9tVGFyZ2V0cylcblx0XHRcdC5tYXAoKHNUYXJnZXRLZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fbVRhcmdldHNbc1RhcmdldEtleV07XG5cdFx0XHR9KVxuXHRcdFx0LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBhLnZpZXdMZXZlbCA8IGIudmlld0xldmVsID8gLTEgOiAxO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKCh0YXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBBZnRlciBzb3J0aW5nIHRoZSB0YXJnZXRzIHBlciBsZXZlbCB3ZSBjYW4gdGhlbiBnbyB0aHJvdWdoIHRoZWlyIG5hdmlnYXRpb24gb2JqZWN0IGFuZCB1cGRhdGUgdGhlIHBhdGhzIGFjY29yZGluZ2x5LlxuXHRcdFx0XHRpZiAodGFyZ2V0Lm9wdGlvbnMpIHtcblx0XHRcdFx0XHRjb25zdCBzZXR0aW5ncyA9IHRhcmdldC5vcHRpb25zLnNldHRpbmdzO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IHNldHRpbmdzLmNvbnRleHRQYXRoIHx8IChzZXR0aW5ncy5lbnRpdHlTZXQgPyBcIi9cIiArIHNldHRpbmdzLmVudGl0eVNldCA6IFwiXCIpO1xuXHRcdFx0XHRcdGlmICghc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoICYmIHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRcdFx0c2V0dGluZ3MuZnVsbENvbnRleHRQYXRoID0gc0NvbnRleHRQYXRoICsgXCIvXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKHNldHRpbmdzLm5hdmlnYXRpb24gfHwge30pLmZvckVhY2goKHNOYXZOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIGl0J3MgYSBuYXZpZ2F0aW9uIHByb3BlcnR5XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRSb3V0ZSA9IHRoaXMuX21Sb3V0ZXNbc2V0dGluZ3MubmF2aWdhdGlvbltzTmF2TmFtZV0uZGV0YWlsLnJvdXRlXTtcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRSb3V0ZSAmJiB0YXJnZXRSb3V0ZS50YXJnZXRzKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldFJvdXRlLnRhcmdldHMuZm9yRWFjaCgoc1RhcmdldE5hbWU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zICYmXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncyAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IXRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aFxuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRhcmdldC52aWV3TGV2ZWwgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoID0gXCIvXCIgKyBzTmF2TmFtZSArIFwiL1wiO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggKyBzTmF2TmFtZSArIFwiL1wiO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgYSB2aWV3IGxldmVsIGZyb20gYSBwYXR0ZXJuIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0dGVybiBUaGUgcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmlld0xldmVsIFRoZSBjdXJyZW50IGxldmVsIG9mIHZpZXdcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIGxldmVsXG5cdCAqL1xuXHRfZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm46IHN0cmluZywgdmlld0xldmVsOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHNQYXR0ZXJuID0gc1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0aWYgKHNQYXR0ZXJuICYmIHNQYXR0ZXJuWzBdICE9PSBcIi9cIiAmJiBzUGF0dGVyblswXSAhPT0gXCI/XCIpIHtcblx0XHRcdHNQYXR0ZXJuID0gXCIvXCIgKyBzUGF0dGVybjtcblx0XHR9XG5cdFx0aWYgKHNQYXR0ZXJuLmxlbmd0aCkge1xuXHRcdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcblx0XHRcdGlmICh0aGlzLm9Sb3V0ZXIubWF0Y2goc1BhdHRlcm4pIHx8IHNQYXR0ZXJuID09PSBcIlwiKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybiwgKyt2aWV3TGV2ZWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNQYXR0ZXJuLCB2aWV3TGV2ZWwpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdmlld0xldmVsO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb3V0ZUluZm9ybWF0aW9uKHNSb3V0ZU5hbWU6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9tUm91dGVzW3NSb3V0ZU5hbWVdO1xuXHR9XG5cblx0X2dldFRhcmdldEluZm9ybWF0aW9uKHNUYXJnZXROYW1lOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdO1xuXHR9XG5cblx0X2dldENvbXBvbmVudElkKHNPd25lcklkOiBhbnksIHNDb21wb25lbnRJZDogYW55KSB7XG5cdFx0aWYgKHNDb21wb25lbnRJZC5pbmRleE9mKHNPd25lcklkICsgXCItLS1cIikgPT09IDApIHtcblx0XHRcdHJldHVybiBzQ29tcG9uZW50SWQuc3Vic3RyKHNPd25lcklkLmxlbmd0aCArIDMpO1xuXHRcdH1cblx0XHRyZXR1cm4gc0NvbXBvbmVudElkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0YXJnZXQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbXBvbmVudEluc3RhbmNlIEluc3RhbmNlIG9mIHRoZSBjb21wb25lbnRcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXRcblx0ICovXG5cdGdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnRJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgc1RhcmdldENvbXBvbmVudElkID0gdGhpcy5fZ2V0Q29tcG9uZW50SWQob0NvbXBvbmVudEluc3RhbmNlLl9zT3duZXJJZCwgb0NvbXBvbmVudEluc3RhbmNlLmdldElkKCkpO1xuXHRcdGxldCBzQ29ycmVjdFRhcmdldE5hbWUgPSBudWxsO1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmlkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdJZCA9PT0gc1RhcmdldENvbXBvbmVudElkKSB7XG5cdFx0XHRcdHNDb3JyZWN0VGFyZ2V0TmFtZSA9IHNUYXJnZXROYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzQ29ycmVjdFRhcmdldE5hbWUpO1xuXHR9XG5cblx0Z2V0TGFzdFNlbWFudGljTWFwcGluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZztcblx0fVxuXG5cdHNldExhc3RTZW1hbnRpY01hcHBpbmcob01hcHBpbmc6IGFueSkge1xuXHRcdHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcgPSBvTWFwcGluZztcblx0fVxuXG5cdG5hdmlnYXRlVG8ob0NvbnRleHQ6IGFueSwgc1JvdXRlTmFtZTogYW55LCBtUGFyYW1ldGVyTWFwcGluZzogYW55LCBiUHJlc2VydmVIaXN0b3J5OiBhbnkpIHtcblx0XHRsZXQgc1RhcmdldFVSTFByb21pc2UsIGJJc1N0aWNreU1vZGU6IGJvb2xlYW47XG5cdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkgJiYgb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwpIHtcblx0XHRcdGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHRcdGlmICghbVBhcmFtZXRlck1hcHBpbmcpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciBtYXBwaW5nIGRlZmluZSB0aGlzIG1lYW4gd2UgcmVseSBlbnRpcmVseSBvbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdGhcblx0XHRcdHNUYXJnZXRVUkxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFyZ2V0VVJMUHJvbWlzZSA9IHRoaXMucHJlcGFyZVBhcmFtZXRlcnMobVBhcmFtZXRlck1hcHBpbmcsIHNSb3V0ZU5hbWUsIG9Db250ZXh0KS50aGVuKChtUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLm9Sb3V0ZXIuZ2V0VVJMKHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gc1RhcmdldFVSTFByb21pc2UudGhlbigoc1RhcmdldFVSTDogYW55KSA9PiB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5uYXZUb0hhc2goc1RhcmdldFVSTCwgYlByZXNlcnZlSGlzdG9yeSwgZmFsc2UsIGZhbHNlLCAhYklzU3RpY2t5TW9kZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHJldHVybiBhIG1hcCBvZiByb3V0aW5nIHRhcmdldCBwYXJhbWV0ZXJzIHdoZXJlIHRoZSBiaW5kaW5nIHN5bnRheCBpcyByZXNvbHZlZCB0byB0aGUgY3VycmVudCBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgbWFwIGluIHRoZSBmb3JtYXQgW2s6IHN0cmluZ10gOiBDb21wbGV4QmluZGluZ1N5bnRheFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFJvdXRlIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgcm91dGluZyB0YXJnZXQgcGFyYW1ldGVyc1xuXHQgKi9cblx0cHJlcGFyZVBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSwgc1RhcmdldFJvdXRlOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0bGV0IG9QYXJhbWV0ZXJzUHJvbWlzZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Y29uc3QgYUNvbnRleHRQYXRoUGFydHMgPSBzQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgYUFsbFJlc29sdmVkUGFyYW1ldGVyUHJvbWlzZXMgPSBPYmplY3Qua2V5cyhtUGFyYW1ldGVycykubWFwKChzUGFyYW1ldGVyS2V5OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck1hcHBpbmdFeHByZXNzaW9uID0gbVBhcmFtZXRlcnNbc1BhcmFtZXRlcktleV07XG5cdFx0XHRcdC8vIFdlIGFzc3VtZSB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uXG5cdFx0XHRcdGNvbnN0IG9QYXJzZWRFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IG9QYXJzZWRFeHByZXNzaW9uLnBhcnRzIHx8IFtvUGFyc2VkRXhwcmVzc2lvbl07XG5cdFx0XHRcdGNvbnN0IGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzID0gYVBhcnRzLm1hcChmdW5jdGlvbihvUGF0aFBhcnQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGFSZWxhdGl2ZVBhcnRzID0gb1BhdGhQYXJ0LnBhdGguc3BsaXQoXCIuLi9cIik7XG5cdFx0XHRcdFx0Ly8gV2UgZ28gdXAgdGhlIGN1cnJlbnQgY29udGV4dCBwYXRoIGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0Y29uc3QgYUxvY2FsUGFydHMgPSBhQ29udGV4dFBhdGhQYXJ0cy5zbGljZSgwLCBhQ29udGV4dFBhdGhQYXJ0cy5sZW5ndGggLSBhUmVsYXRpdmVQYXJ0cy5sZW5ndGggKyAxKTtcblx0XHRcdFx0XHRhTG9jYWxQYXJ0cy5wdXNoKGFSZWxhdGl2ZVBhcnRzW2FSZWxhdGl2ZVBhcnRzLmxlbmd0aCAtIDFdKTtcblxuXHRcdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBhTG9jYWxQYXJ0cy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBvTWV0YUNvbnRleHQgPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFDb250ZXh0KHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoc1Byb3BlcnR5UGF0aCkudGhlbihmdW5jdGlvbihvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5SW5mbyA9IG9NZXRhQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNFZG1UeXBlID0gb1Byb3BlcnR5SW5mby4kVHlwZTtcblx0XHRcdFx0XHRcdHJldHVybiBPRGF0YVV0aWxzLmZvcm1hdExpdGVyYWwob1ZhbHVlLCBzRWRtVHlwZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcykudGhlbigoYVJlc29sdmVkUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXJcblx0XHRcdFx0XHRcdD8gb1BhcnNlZEV4cHJlc3Npb24uZm9ybWF0dGVyLmFwcGx5KHRoaXMsIGFSZXNvbHZlZFBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IGFSZXNvbHZlZFBhcmFtZXRlcnMuam9pbihcIlwiKTtcblx0XHRcdFx0XHRyZXR1cm4geyBrZXk6IHNQYXJhbWV0ZXJLZXksIHZhbHVlOiB2YWx1ZSB9O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvUGFyYW1ldGVyc1Byb21pc2UgPSBQcm9taXNlLmFsbChhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcykudGhlbihmdW5jdGlvbihcblx0XHRcdFx0YUFsbFJlc29sdmVkUGFyYW1ldGVyczogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9W11cblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0XHRcdGFBbGxSZXNvbHZlZFBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbihvUmVzb2x2ZWRQYXJhbWV0ZXI6IHsga2V5OiBhbnk7IHZhbHVlOiBhbnkgfSkge1xuXHRcdFx0XHRcdG9QYXJhbWV0ZXJzW29SZXNvbHZlZFBhcmFtZXRlci5rZXldID0gb1Jlc29sdmVkUGFyYW1ldGVyLnZhbHVlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG9QYXJhbWV0ZXJzO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJDb3VsZCBub3QgcGFyc2UgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBuYXZpZ2F0aW9uIHRvIHJvdXRlIFwiICsgc1RhcmdldFJvdXRlKTtcblx0XHRcdG9QYXJhbWV0ZXJzUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1BhcmFtZXRlcnNQcm9taXNlO1xuXHR9XG5cblx0X2ZpcmVSb3V0ZU1hdGNoRXZlbnRzKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicm91dGVNYXRjaGVkXCIsIG1QYXJhbWV0ZXJzKTtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwiYWZ0ZXJSb3V0ZU1hdGNoZWRcIiwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0RWRpdFN0YXRlLmNsZWFuUHJvY2Vzc2VkRWRpdFN0YXRlKCk7IC8vIFJlc2V0IFVJIHN0YXRlIHdoZW4gYWxsIGJpbmRpbmdzIGhhdmUgYmVlbiByZWZyZXNoZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIG1hcCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2VdIE5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIFVSTFxuXHQgKiBAcGFyYW0ge1Byb21pc2V9IFttUGFyYW1ldGVycy5hc3luY0NvbnRleHRdIFRoZSBjb250ZXh0IGlzIGNyZWF0ZWQgYXN5bmMsIG5hdmlnYXRlIHRvICguLi4pIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgUHJvbWlzZSB0byBiZSByZXNvbHZlZCBhbmQgdGhlbiBuYXZpZ2F0ZSBpbnRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHRdIFRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgZGVmZXJyZWQgYXQgdGhlIHRhcmdldCBwYWdlXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmVkaXRhYmxlXSBUaGUgdGFyZ2V0IHBhZ2Ugc2hhbGwgYmUgaW1tZWRpYXRlbHkgaW4gdGhlIGVkaXQgbW9kZSB0byBhdm9pZCBmbGlja2VyaW5nXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGxdIFRoZSBiUGVyc2lzdE9QU2Nyb2xsIHdpbGwgYmUgdXNlZCBmb3Igc2Nyb2xsaW5nIHRvIGZpcnN0IHRhYlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsXSBgKzFgIGlmIHdlIGFkZCBhIGNvbHVtbiBpbiBGQ0wsIGAtMWAgdG8gcmVtb3ZlIGEgY29sdW1uLCAwIHRvIHN0YXkgb24gdGhlIHNhbWUgY29sdW1uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLm5vUHJlc2VydmF0aW9uQ2FjaGVdIERvIG5hdmlnYXRpb24gd2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwcmVzZXJ2ZWQgY2FjaGUgbWVjaGFuaXNtXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJSZWNyZWF0ZUNvbnRleHRdIEZvcmNlIHJlLWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0IGluc3RlYWQgb2YgdXNpbmcgdGhlIG9uZSBwYXNzZWQgYXMgcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXSBGb3JjZXMgZm9jdXMgc2VsZWN0aW9uIGFmdGVyIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvVmlld0RhdGFdIFZpZXcgZGF0YVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29DdXJyZW50VGFyZ2V0SW5mb10gVGhlIHRhcmdldCBpbmZvcm1hdGlvbiBmcm9tIHdoaWNoIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRuYXZpZ2F0ZVRvQ29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdG1QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U/OiBib29sZWFuO1xuXHRcdFx0XHRcdGFzeW5jQ29udGV4dD86IFByb21pc2U8YW55Pjtcblx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdFx0XHRlZGl0YWJsZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0dHJhbnNpZW50PzogYm9vbGVhbjtcblx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbD86IG51bWJlcjtcblx0XHRcdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbjtcblx0XHRcdFx0XHRiUmVjcmVhdGVDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdFx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW47XG5cdFx0XHRcdFx0dGFyZ2V0UGF0aD86IHN0cmluZztcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJEcmFmdE5hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZCxcblx0XHRvVmlld0RhdGE6IGFueSB8IHVuZGVmaW5lZCxcblx0XHRvQ3VycmVudFRhcmdldEluZm86IGFueSB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgc1RhcmdldFJvdXRlOiBzdHJpbmcgPSBcIlwiLFxuXHRcdFx0b1JvdXRlUGFyYW1ldGVyc1Byb21pc2UsXG5cdFx0XHRiSXNTdGlja3lNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCkge1xuXHRcdFx0YklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdFx0Ly8gTWFuYWdlIHBhcmFtZXRlciBtYXBwaW5nXG5cdFx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLnRhcmdldFBhdGggJiYgb1ZpZXdEYXRhICYmIG9WaWV3RGF0YS5uYXZpZ2F0aW9uKSB7XG5cdFx0XHRjb25zdCBvUm91dGVEZXRhaWwgPSBvVmlld0RhdGEubmF2aWdhdGlvblttUGFyYW1ldGVycy50YXJnZXRQYXRoXS5kZXRhaWw7XG5cdFx0XHRzVGFyZ2V0Um91dGUgPSBvUm91dGVEZXRhaWwucm91dGU7XG5cblx0XHRcdGlmIChvUm91dGVEZXRhaWwucGFyYW1ldGVycykge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSA9IHRoaXMucHJlcGFyZVBhcmFtZXRlcnMob1JvdXRlRGV0YWlsLnBhcmFtZXRlcnMsIHNUYXJnZXRSb3V0ZSwgb0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzVGFyZ2V0UGF0aCA9IHRoaXMuX2dldFBhdGhGcm9tQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIElmIHRoZSBwYXRoIGlzIGVtcHR5LCB3ZSdyZSBzdXBwb3NlZCB0byBuYXZpZ2F0ZSB0byB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgbmVlZCB0byBleGl0IGZyb20gdGhlIGFwcCBpbnN0ZWFkXG5cdFx0aWYgKHNUYXJnZXRQYXRoLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vUm91dGVyUHJveHkuZXhpdEZyb21BcHAoKSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgZGVmZXJyZWQgb3IgYXN5bmMsIHdlIGFkZCAoLi4uKSB0byB0aGUgcGF0aFxuXHRcdGlmIChtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0IHx8IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiguLi4pXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGxheW91dCBwYXJhbWV0ZXIgaWYgbmVlZGVkXG5cdFx0Y29uc3Qgc0xheW91dCA9IHRoaXMuX2NhbGN1bGF0ZUxheW91dChzVGFyZ2V0UGF0aCwgbVBhcmFtZXRlcnMpO1xuXHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIj9sYXlvdXQ9XCIgKyBzTGF5b3V0O1xuXHRcdH1cblxuXHRcdC8vIE5hdmlnYXRpb24gcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2Vcblx0XHRjb25zdCBvTmF2aWdhdGlvbkluZm8gPSB7XG5cdFx0XHRvQXN5bmNDb250ZXh0OiBtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0LFxuXHRcdFx0YkRlZmVycmVkQ29udGV4dDogbVBhcmFtZXRlcnM/LmJEZWZlcnJlZENvbnRleHQsXG5cdFx0XHRiVGFyZ2V0RWRpdGFibGU6IG1QYXJhbWV0ZXJzPy5lZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzPy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0dXNlQ29udGV4dDogbVBhcmFtZXRlcnM/LnVwZGF0ZUZDTExldmVsID09PSAtMSB8fCBtUGFyYW1ldGVycz8uYlJlY3JlYXRlQ29udGV4dCA/IHVuZGVmaW5lZCA6IG9Db250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogbVBhcmFtZXRlcnM/LmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRiU2hvd1BsYWNlaG9sZGVyOiBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycz8uc2hvd1BsYWNlaG9sZGVyIDogdHJ1ZVxuXHRcdH07XG5cblx0XHRpZiAobVBhcmFtZXRlcnM/LmNoZWNrTm9IYXNoQ2hhbmdlKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbmV3IGhhc2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2hOb0FwcFN0YXRlID0gdGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpLnJlcGxhY2UoL1smP117MX1zYXAtaWFwcC1zdGF0ZT1bQS1aMC05XSsvLCBcIlwiKTtcblx0XHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gc0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSkge1xuXHRcdFx0XHQvLyBUaGUgaGFzaCBkb2Vzbid0IGNoYW5nZSwgYnV0IHdlIGZpcmUgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgdG8gdHJpZ2dlciBwYWdlIHJlZnJlc2ggLyBiaW5kaW5nXG5cdFx0XHRcdGNvbnN0IG1FdmVudFBhcmFtZXRlcnM6IGFueSA9IHRoaXMub1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2godGhpcy5vUm91dGVyUHJveHkuZ2V0SGFzaCgpKTtcblx0XHRcdFx0aWYgKG1FdmVudFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gb05hdmlnYXRpb25JbmZvO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMudmlld3MgPSB0aGlzLmFDdXJyZW50Vmlld3M7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5zZXRGb2N1c0ZvcmNlZCghIW1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzKTtcblxuXHRcdFx0XHR0aGlzLl9maXJlUm91dGVNYXRjaEV2ZW50cyhtRXZlbnRQYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy50cmFuc2llbnQgJiYgbVBhcmFtZXRlcnMuZWRpdGFibGUgPT0gdHJ1ZSAmJiBzVGFyZ2V0UGF0aC5pbmRleE9mKFwiKC4uLilcIikgPT09IC0xKSB7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGguaW5kZXhPZihcIj9cIikgPiAtMSkge1xuXHRcdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiZpLWFjdGlvbj1jcmVhdGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2ktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsZWFyIHVuYm91bmQgbWVzc2FnZXMgdXBvbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1Bcblx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSBzdGFsZSBlcnJvciBtZXNzYWdlcyBmcm9tIExSIGFyZSBub3Qgc2hvd24gdG8gdGhlIHVzZXIgYWZ0ZXIgbmF2aWdhdGlvbiB0byBPUC5cblx0XHRpZiAob0N1cnJlbnRUYXJnZXRJbmZvICYmIG9DdXJyZW50VGFyZ2V0SW5mby5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRjb25zdCBvUm91dGVJbmZvID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzVGFyZ2V0UGF0aCk7XG5cdFx0XHRpZiAob1JvdXRlSW5mbykge1xuXHRcdFx0XHRjb25zdCBvUm91dGUgPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKG9Sb3V0ZUluZm8ubmFtZSk7XG5cdFx0XHRcdGlmIChvUm91dGUgJiYgb1JvdXRlLnRhcmdldHMgJiYgb1JvdXRlLnRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IHNMYXN0VGFyZ2V0TmFtZSA9IG9Sb3V0ZS50YXJnZXRzW29Sb3V0ZS50YXJnZXRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzTGFzdFRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQubmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2VcIikge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgcXVldWVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucHVzaChvTmF2aWdhdGlvbkluZm8pO1xuXG5cdFx0aWYgKHNUYXJnZXRSb3V0ZSAmJiBvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLnRoZW4oKG9Sb3V0ZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUgPSBiSXNTdGlja3lNb2RlO1xuXHRcdFx0XHR0aGlzLm9Sb3V0ZXIubmF2VG8oc1RhcmdldFJvdXRlLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHQubmF2VG9IYXNoKHNUYXJnZXRQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnM/Lm5vUHJlc2VydmF0aW9uQ2FjaGUsIG1QYXJhbWV0ZXJzPy5iRm9yY2VGb2N1cywgIWJJc1N0aWNreU1vZGUpXG5cdFx0XHQudGhlbigoYk5hdmlnYXRlZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICghYk5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdC8vIFRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuIC0tPiByZW1vdmUgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBxdWV1ZSBhcyB0aGV5IHNob3VsZG4ndCBiZSB1c2VkXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmcjbmF2aWdhdGVUb1JvdXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Sb3V0aW5nXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1JvdXRlUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9Sb3V0ZVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0VVJMID0gdGhpcy5vUm91dGVyLmdldFVSTChzVGFyZ2V0Um91dGVOYW1lLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyUHJveHkubmF2VG9IYXNoKHNUYXJnZXRVUkwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICFvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgb3IgYGZhbHNlYCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBpbXBhY3RlZCBvciBub3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHQvLyBGaXJzdCwgY2hlY2sgd2l0aCB0aGUgdGVjaG5pY2FsIHBhdGguIFdlIGhhdmUgdG8gdHJ5IGl0LCBiZWNhdXNlIGZvciBsZXZlbCA+IDEsIHdlXG5cdFx0Ly8gdXNlcyB0ZWNobmljYWwga2V5cyBldmVuIGlmIFNlbWFudGljIGtleXMgYXJlIGVuYWJsZWRcblx0XHRpZiAodGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmICgvXlteXFwoXFwpXStcXChbXlxcKFxcKV0rXFwpJC8udGVzdChzUGF0aCkpIHtcblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHBhdGggY2FuIGJlIHNlbWFudGljIChpLmUuIGlzIGxpa2UgeHh4KHl5eSkpXG5cdFx0XHQvLyBjaGVjayB3aXRoIHRoZSBzZW1hbnRpYyBwYXRoIGlmIHdlIGNhbiBmaW5kIGl0XG5cdFx0XHRsZXQgc1NlbWFudGljUGF0aDtcblx0XHRcdGlmICh0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nICYmIHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9PT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSBhbHJlYWR5IHJlc29sdmVkIHRoaXMgc2VtYW50aWMgcGF0aFxuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNTZW1hbnRpY1BhdGggIT0gc1BhdGggPyB0aGlzLm9Sb3V0ZXJQcm94eS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoc1NlbWFudGljUGF0aCkgOiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdF9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGg6IGFueSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRzUGF0aCA9IHNQYXRoLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdGlmICh0aGlzLm9Sb3V0ZXIubWF0Y2goc1BhdGgpIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGgpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIGlmIHRoaXMgaXMgYSBsZXZlbC0xIG9iamVjdCAocGF0aCA9IC9hYWEoYmJiKSlcblx0XHRpZiAoIS9eXFwvW15cXChdK1xcKFteXFwpXStcXCkkLy50ZXN0KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgc2VtYW50aWMga2V5c1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0aWYgKCFTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGVjayB0aGUgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWRcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBzUGF0aCk7XG5cdH1cblxuXHRfZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRsZXQgc1BhdGg7XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgb0NvbnRleHQuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBiYWNrIGZyb20gYSBjb250ZXh0LCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhcblx0XHRcdHNQYXRoID0gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UncmUgbmF2aWdhdGluZyBiYWNrIHRvIGEgc2VtYW50aWMgcGF0aCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlc29sdmVkXG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdHNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQpKSB7XG5cdFx0XHQvLyBXZSBjaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSBhIHNlbWFudGljIHBhdGhcblx0XHRcdGNvbnN0IHNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXG5cdFx0XHRpZiAoIXNTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0Ly8gV2Ugd2VyZSBub3QgYWJsZSB0byBidWlsZCB0aGUgc2VtYW50aWMgcGF0aCAtLT4gVXNlIHRoZSB0ZWNobmljYWwgcGF0aCBhbmRcblx0XHRcdFx0Ly8gY2xlYXIgdGhlIHByZXZpb3VzIG1hcHBpbmcsIG90aGVyd2lzZSB0aGUgb2xkIG1hcHBpbmcgaXMgdXNlZCBpbiBFZGl0RmxvdyN1cGRhdGVEb2N1bWVudFxuXHRcdFx0XHQvLyBhbmQgaXQgbGVhZHMgdG8gdW53YW50ZWQgcGFnZSByZWxvYWRzXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU2VtYW50aWNQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHQvLyBhbmQgdXNlIHRoZSBzZW1hbnRpYyBwYXRoIGluc3RlYWQgb2YgdGhlIHRlY2huaWNhbCBvbmVcblx0XHRcdFx0dGhpcy5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHsgdGVjaG5pY2FsUGF0aDogc1BhdGgsIHNlbWFudGljUGF0aDogc1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0c1BhdGggPSBzU2VtYW50aWNQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBleHRyYSAnLycgYXQgdGhlIGJlZ2lubmluZyBvZiBwYXRoXG5cdFx0aWYgKHNQYXRoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c1BhdGggPSBzUGF0aC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNQYXRoO1xuXHR9XG5cblx0X2NhbGN1bGF0ZUxheW91dChzUGF0aDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IEZDTExldmVsID0gbVBhcmFtZXRlcnMuRkNMTGV2ZWw7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsKSB7XG5cdFx0XHRGQ0xMZXZlbCArPSBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbDtcblx0XHRcdGlmIChGQ0xMZXZlbCA8IDApIHtcblx0XHRcdFx0RkNMTGV2ZWwgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAodGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueSkuY2FsY3VsYXRlTGF5b3V0KEZDTExldmVsLCBzUGF0aCwgbVBhcmFtZXRlcnMuc0xheW91dCk7XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciBiZWZvcmUgYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBEaXNwbGF5cyBhIGJ1c3kgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKi9cblx0X2JlZm9yZVJvdXRlTWF0Y2hlZCgvKm9FdmVudDogRXZlbnQqLykge1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmICghYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogSGlkZXMgdGhlIGJ1c3kgaW5kaWNhdG9yIGFuZCBmaXJlcyBpdHMgb3duICdyb3V0ZW1hdGNoZWQnIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IFRoZSBldmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBvQXBwU3RhdGVIYW5kbGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldEFwcFN0YXRlSGFuZGxlcigpLFxuXHRcdFx0b1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob1Jvb3RWaWV3KSAmJiAhYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdFx0aWYgKHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5sZW5ndGgpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlWzBdO1xuXHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnNsaWNlKDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRpZiAob0FwcFN0YXRlSGFuZGxlci5jaGVja0lmUm91dGVDaGFuZ2VkQnlJQXBwKCkpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvLmJSZWFzb25Jc0lhcHBTdGF0ZSA9IHRydWU7XG5cdFx0XHRvQXBwU3RhdGVIYW5kbGVyLnJlc2V0Um91dGVDaGFuZ2VkQnlJQXBwKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zQ3VycmVudFJvdXRlTmFtZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYW1lXCIpO1xuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZVBhdHRlcm4gPSBtUGFyYW1ldGVycy5jb25maWcucGF0dGVybjtcblx0XHR0aGlzLmFDdXJyZW50Vmlld3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIik7XG5cblx0XHRtUGFyYW1ldGVycy5yb3V0ZUluZm9ybWF0aW9uID0gdGhpcy5fZ2V0Um91dGVJbmZvcm1hdGlvbih0aGlzLnNDdXJyZW50Um91dGVOYW1lKTtcblx0XHRtUGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXG5cdFx0dGhpcy5fZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnMpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY3VycmVudCBoYXNoIGhhcyBiZWVuIHNldCBieSB0aGUgcm91dGVyUHJveHkubmF2VG9IYXNoIGZ1bmN0aW9uXG5cdFx0Ly8gSWYgbm90LCByZWJ1aWxkIGhpc3RvcnkgcHJvcGVybHkgKGJvdGggaW4gdGhlIGJyb3dzZXIgYW5kIHRoZSBSb3V0ZXJQcm94eSlcblx0XHRpZiAoIWhpc3Rvcnkuc3RhdGUgfHwgaGlzdG9yeS5zdGF0ZS5mZUxldmVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHRcdC5yZXN0b3JlSGlzdG9yeSgpXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5yZXNvbHZlUm91dGVNYXRjaCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXN0b3JpbmcgaGlzdG9yeVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkucmVzb2x2ZVJvdXRlTWF0Y2goKTtcblx0XHR9XG5cdH1cblxuXHRhdHRhY2hSb3V0ZU1hdGNoZWQob0RhdGE6IGFueSwgZm5GdW5jdGlvbj86IGFueSwgb0xpc3RlbmVyPzogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KFwicm91dGVNYXRjaGVkXCIsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdGRldGFjaFJvdXRlTWF0Y2hlZChmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChcInJvdXRlTWF0Y2hlZFwiLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdGF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZChmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KFwiYWZ0ZXJSb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXG5cdGdldFJvdXRlRnJvbUhhc2gob1JvdXRlcjogYW55LCBvQXBwQ29tcG9uZW50OiBhbnkpIHtcblx0XHRjb25zdCBzSGFzaCA9IG9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5oYXNoO1xuXHRcdGNvbnN0IG9Sb3V0ZUluZm8gPSBvUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpXG5cdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKG9Sb3V0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUm91dGUubmFtZSA9PT0gb1JvdXRlSW5mby5uYW1lO1xuXHRcdFx0fSlbMF07XG5cdH1cblx0Z2V0VGFyZ2V0c0Zyb21Sb3V0ZShvUm91dGU6IGFueSkge1xuXHRcdGNvbnN0IG9UYXJnZXQgPSBvUm91dGUudGFyZ2V0O1xuXHRcdGlmICh0eXBlb2Ygb1RhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmV0dXJuIFt0aGlzLl9tVGFyZ2V0c1tvVGFyZ2V0XV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFUYXJnZXQ6IGFueVtdID0gW107XG5cdFx0XHRvVGFyZ2V0LmZvckVhY2goKHNUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRhVGFyZ2V0LnB1c2godGhpcy5fbVRhcmdldHNbc1RhcmdldF0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYVRhcmdldDtcblx0XHR9XG5cdH1cblxuXHRpbml0aWFsaXplUm91dGluZygpIHtcblx0XHQvLyBBdHRhY2ggcm91dGVyIGhhbmRsZXJzXG5cdFx0dGhpcy5fZm5PblJvdXRlTWF0Y2hlZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlci5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fYmVmb3JlUm91dGVNYXRjaGVkLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHQvLyBSZXNldCBpbnRlcm5hbCBzdGF0ZVxuXHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IFtdO1xuXHRcdEVkaXRTdGF0ZS5yZXNldEVkaXRTdGF0ZSgpO1xuXHRcdHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCA9ICF0aGlzLm9Sb3V0ZXIubWF0Y2goXCJcIik7XG5cblx0XHRjb25zdCBiSXNJYXBwU3RhdGUgPVxuXHRcdFx0dGhpcy5vUm91dGVyXG5cdFx0XHRcdC5nZXRIYXNoQ2hhbmdlcigpXG5cdFx0XHRcdC5nZXRIYXNoKClcblx0XHRcdFx0LmluZGV4T2YoXCJzYXAtaWFwcC1zdGF0ZVwiKSAhPT0gLTE7XG5cdFx0Y29uc3QgaW5pdFByb21pc2UgPSB0aGlzLm9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTdGFydHVwUGFyYW1ldGVycygpXG5cdFx0XHQudGhlbigob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzID0gb1N0YXJ0dXBQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMob1N0YXJ0dXBQYXJhbWV0ZXJzKS5sZW5ndGggIT09IDA7XG5cdFx0XHRcdGNvbnN0IHNIYXNoID0gdGhpcy5vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHQvLyBNYW5hZ2Ugc3RhcnR1cCBwYXJhbWV0ZXJzIChpbiBjYXNlIG9mIG5vIGlhcHAtc3RhdGUpXG5cdFx0XHRcdGlmICghYklzSWFwcFN0YXRlICYmIGJIYXNTdGFydFVwUGFyYW1ldGVycyAmJiAhc0hhc2gpIHtcblx0XHRcdFx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF0uaW5kZXhPZihcImNyZWF0ZVwiKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBtb2RlXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBEZWVwIGxpbmtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHJvdXRpbmcgaW5pdGlhbGl6YXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIGluaXRQcm9taXNlO1xuXHR9XG5cblx0Z2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0KHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9EZWVwTGluay5jb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRpbmdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==