@sapui5/sap.fe.core 1.135.0 → 1.136.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 (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -1
  5. package/src/sap/fe/core/AppComponent.js +6 -4
  6. package/src/sap/fe/core/AppComponent.ts +3 -1
  7. package/src/sap/fe/core/AppStateHandler.js +8 -6
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/CommonUtils.js +4 -1
  10. package/src/sap/fe/core/CommonUtils.ts +12 -2
  11. package/src/sap/fe/core/ExtensionAPI.js +5 -3
  12. package/src/sap/fe/core/ExtensionAPI.ts +4 -2
  13. package/src/sap/fe/core/PageController.js +13 -1
  14. package/src/sap/fe/core/PageController.ts +13 -0
  15. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
  16. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
  17. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
  18. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  19. package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
  20. package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
  21. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
  22. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  27. package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
  29. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
  34. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
  35. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
  36. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
  37. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
  47. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
  49. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
  50. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  51. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
  52. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
  53. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  54. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  55. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  56. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  57. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  58. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  59. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  60. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
  61. package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
  62. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  63. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
  64. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
  65. package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
  66. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
  67. package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
  68. package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
  69. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
  70. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
  71. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
  72. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
  73. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
  74. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
  75. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  76. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  77. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
  78. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  79. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
  80. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
  81. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  83. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
  84. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
  85. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  86. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  87. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  88. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  89. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  90. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  91. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  92. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  93. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  94. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  95. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  96. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  97. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  98. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  99. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  100. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  101. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  102. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  103. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  104. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  105. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  106. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  107. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  108. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  109. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  110. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  111. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  112. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  113. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  114. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  115. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  116. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  117. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  118. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  119. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  120. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  121. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  122. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  123. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  124. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  125. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  126. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  127. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  128. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  129. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  130. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  131. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  132. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  133. package/src/sap/fe/core/fpm/manifest.json +1 -1
  134. package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
  135. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  136. package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
  137. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  138. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
  139. package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
  140. package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
  141. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  142. package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
  143. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  144. package/src/sap/fe/core/helpers/WebSocket.js +10 -1
  145. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  146. package/src/sap/fe/core/library.js +1 -1
  147. package/src/sap/fe/core/messagebundle.properties +41 -2
  148. package/src/sap/fe/core/messagebundle_ar.properties +23 -2
  149. package/src/sap/fe/core/messagebundle_bg.properties +23 -2
  150. package/src/sap/fe/core/messagebundle_ca.properties +21 -0
  151. package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
  152. package/src/sap/fe/core/messagebundle_cs.properties +21 -0
  153. package/src/sap/fe/core/messagebundle_cy.properties +21 -0
  154. package/src/sap/fe/core/messagebundle_da.properties +23 -2
  155. package/src/sap/fe/core/messagebundle_de.properties +23 -2
  156. package/src/sap/fe/core/messagebundle_el.properties +21 -0
  157. package/src/sap/fe/core/messagebundle_en.properties +23 -2
  158. package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
  159. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
  160. package/src/sap/fe/core/messagebundle_es.properties +21 -0
  161. package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
  162. package/src/sap/fe/core/messagebundle_et.properties +21 -0
  163. package/src/sap/fe/core/messagebundle_fi.properties +21 -0
  164. package/src/sap/fe/core/messagebundle_fr.properties +22 -1
  165. package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
  166. package/src/sap/fe/core/messagebundle_hi.properties +22 -1
  167. package/src/sap/fe/core/messagebundle_hr.properties +24 -3
  168. package/src/sap/fe/core/messagebundle_hu.properties +21 -0
  169. package/src/sap/fe/core/messagebundle_id.properties +21 -0
  170. package/src/sap/fe/core/messagebundle_it.properties +23 -2
  171. package/src/sap/fe/core/messagebundle_iw.properties +21 -0
  172. package/src/sap/fe/core/messagebundle_ja.properties +21 -0
  173. package/src/sap/fe/core/messagebundle_kk.properties +21 -0
  174. package/src/sap/fe/core/messagebundle_ko.properties +21 -0
  175. package/src/sap/fe/core/messagebundle_lt.properties +21 -0
  176. package/src/sap/fe/core/messagebundle_lv.properties +23 -2
  177. package/src/sap/fe/core/messagebundle_mk.properties +21 -0
  178. package/src/sap/fe/core/messagebundle_ms.properties +22 -1
  179. package/src/sap/fe/core/messagebundle_nl.properties +21 -0
  180. package/src/sap/fe/core/messagebundle_no.properties +21 -0
  181. package/src/sap/fe/core/messagebundle_pl.properties +23 -2
  182. package/src/sap/fe/core/messagebundle_pt.properties +23 -2
  183. package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
  184. package/src/sap/fe/core/messagebundle_ro.properties +23 -2
  185. package/src/sap/fe/core/messagebundle_ru.properties +22 -1
  186. package/src/sap/fe/core/messagebundle_sh.properties +23 -2
  187. package/src/sap/fe/core/messagebundle_sk.properties +21 -0
  188. package/src/sap/fe/core/messagebundle_sl.properties +23 -2
  189. package/src/sap/fe/core/messagebundle_sr.properties +23 -2
  190. package/src/sap/fe/core/messagebundle_sv.properties +21 -0
  191. package/src/sap/fe/core/messagebundle_th.properties +21 -0
  192. package/src/sap/fe/core/messagebundle_tr.properties +21 -0
  193. package/src/sap/fe/core/messagebundle_uk.properties +23 -2
  194. package/src/sap/fe/core/messagebundle_vi.properties +23 -2
  195. package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
  196. package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
  197. package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
  198. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
  199. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  200. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  201. package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
  202. package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
  203. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
  204. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  205. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
  206. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  207. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
  208. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
  209. package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
  210. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  211. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
  212. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  213. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  214. package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
  215. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  216. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
  217. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
@@ -21,6 +21,7 @@ import type {
21
21
  } from "sap/fe/core/converters/ManifestSettings";
22
22
  import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
23
23
  import { convertTypes, getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
24
+ import { getResourceModel } from "sap/fe/core/helpers/ResourceModelHelper";
24
25
  import {
25
26
  isComplexType,
26
27
  isEntitySet,
@@ -29,14 +30,15 @@ import {
29
30
  isProperty,
30
31
  isPropertyPathExpression
31
32
  } from "sap/fe/core/helpers/TypeGuards";
32
- import { ChannelType, createWebSocket, getWebSocketBaseUrl, getWebSocketChannelUrl } from "sap/fe/core/helpers/WebSocket";
33
+ import { ChannelType, WEBSOCKET_STATUS, createWebSocket, getWebSocketBaseUrl, getWebSocketChannelUrl } from "sap/fe/core/helpers/WebSocket";
33
34
  import { getAssociatedTextPropertyPath } from "sap/fe/core/templating/PropertyHelper";
35
+ import MessageBox from "sap/m/MessageBox";
34
36
  import type Event from "sap/ui/base/Event";
35
37
  import type Control from "sap/ui/core/Control";
36
38
  import Service from "sap/ui/core/service/Service";
37
39
  import ServiceFactory from "sap/ui/core/service/ServiceFactory";
38
40
  import type SapPcpWebSocket from "sap/ui/core/ws/SapPcpWebSocket";
39
- import type { WebSocket$MessageEvent } from "sap/ui/core/ws/WebSocket";
41
+ import type { WebSocket$CloseEvent, WebSocket$MessageEvent } from "sap/ui/core/ws/WebSocket";
40
42
  import type { default as Context } from "sap/ui/model/odata/v4/Context";
41
43
  import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
42
44
  import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
@@ -154,6 +156,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
154
156
 
155
157
  private entityTypeRegexPattern!: RegExp;
156
158
 
159
+ private webSocketStatus!: WEBSOCKET_STATUS;
157
160
  // Interaction type for SideEffects events
158
161
  private interactionTypeDefinition?: SideEffectsEventsInteractionManifestSetting;
159
162
 
@@ -190,8 +193,34 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
190
193
  if (url && channel) {
191
194
  this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, model);
192
195
  this.webSocket.attachMessage(this.onSideEffectsEventReceived.bind(this));
196
+ this.webSocketStatus = WEBSOCKET_STATUS.CONNECTED;
197
+
198
+ const showConnectionLostDialog = (): void => {
199
+ if ([WEBSOCKET_STATUS.CLOSED, WEBSOCKET_STATUS.ERROR].includes(this.webSocketStatus)) {
200
+ const resourceModel = getResourceModel(this.appComponent);
201
+ const lostOfConnectionText = resourceModel.getText("C_SIDEEFFECT_CONNECTION_LOST");
202
+
203
+ MessageBox.warning(lostOfConnectionText, {
204
+ actions: [MessageBox.Action.OK],
205
+ emphasizedAction: MessageBox.Action.OK
206
+ });
207
+ }
208
+ };
209
+
210
+ this.webSocket.attachError(() => {
211
+ this.webSocketStatus = WEBSOCKET_STATUS.ERROR;
212
+ showConnectionLostDialog();
213
+ });
214
+
215
+ this.webSocket.attachClose((evt: WebSocket$CloseEvent) => {
216
+ this.webSocketStatus = WEBSOCKET_STATUS.CLOSED;
217
+ // RFC 6455 defines the status codes when closing an established connection : https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
218
+ // status code 1000 means normal closure
219
+ if ((evt.getParameter("code") as number | undefined) !== 1000) {
220
+ showConnectionLostDialog();
221
+ }
222
+ });
193
223
  }
194
- return;
195
224
  }
196
225
 
197
226
  /**
@@ -1,7 +1,7 @@
1
1
  <mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" controllerName="sap.fe.core.services.view.TemplatingErrorPage">
2
2
  <Page showHeader="false">
3
3
  <IllustratedMessage
4
- illustrationType="sapIllus-ErrorScreen"
4
+ illustrationType="sapIllus-UnableToLoad"
5
5
  title="{sap.fe.i18n>T_TEMPLATING_ERROR_PAGE_SAPFE_APPSTART_TEMPLATING_FAILED}"
6
6
  description="{= ${error>/message} ? ${error>/message} : ''}"
7
7
  />
@@ -2,96 +2,236 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
5
+ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], function (TypeGuards, DataModelPathHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
+ var getTargetEntitySetInfo = DataModelPathHelper.getTargetEntitySetInfo;
9
10
  var isEntitySet = TypeGuards.isEntitySet;
10
11
  /**
11
- * Gets NonFilterableProperties on FilterRestrictions of the main entity.
12
+ * Reads all FilterRestrictions of the main entity and the navigation restrictions.
13
+ * We get the restrictions first on the navigation property (most precise definition), and if not available, then we get the restrictions on the entitySet.
14
+ * In case of containment, we only get the restrictions on the navigation property of the parent entitySet.
12
15
  * @param entitySet Entity set to be analyzed
16
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
17
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
13
18
  * @returns Array containing the property names of all non-filterable properties
14
19
  */
15
- const getNonFilterablePropertiesRestrictions = function (entitySet) {
16
- let nonFilterableProperties = [];
17
- if (entitySet.annotations.Capabilities?.FilterRestrictions?.Filterable === false) {
18
- // add all properties of the entity to the nonFilterableProperties
19
- nonFilterableProperties.push(...entitySet.entityType.entityProperties.map(property => property.name));
20
- } else {
21
- nonFilterableProperties = entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.map(property => property.value) || [];
20
+ const getNonFilterablePropertiesRestrictions = function (entitySet, targetEntitySet, parentNavigationPath) {
21
+ const filterRestrictionsFromNavigationRestrictions = getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath);
22
+ const directFilterRestrictions = getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath);
23
+ // Merge two filter restrictions found on the navigation property and directly from the entity set
24
+ return Array.from(new Set([...filterRestrictionsFromNavigationRestrictions, ...directFilterRestrictions]));
25
+ };
26
+
27
+ /**
28
+ * Reads all SortRestrictions of the main entity and the navigation restrictions.
29
+ * We retrieve the restrictions first on the navigation property (most precise definition), and if not available, then we get the restrictions on the entitySet
30
+ * In case of containment, we only get the restrictions on the navigation property of the parent entitySet.
31
+ * @param entitySet Entity set to be analyzed
32
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
33
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
34
+ * @returns Array containing the property names of all non-sortable properties
35
+ */
36
+ _exports.getNonFilterablePropertiesRestrictions = getNonFilterablePropertiesRestrictions;
37
+ const getNonSortablePropertiesRestrictions = function (entitySet, targetEntitySet, parentNavigationPath) {
38
+ const sortRestrictionsFromNavigationRestrictions = getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath);
39
+ const directSortRestrictions = getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath);
40
+ // Merge two sort restrictions found on the navigation property and directly from the entity set
41
+ return Array.from(new Set([...sortRestrictionsFromNavigationRestrictions, ...directSortRestrictions]));
42
+ };
43
+
44
+ /**
45
+ * Gets all SortRestrictions and FilterRestrictions for a given context.
46
+ * @param converterContext The converter context.
47
+ * @returns Object containing all property names of restrictions separated by sortable and filterable capabilities.
48
+ */
49
+ _exports.getNonSortablePropertiesRestrictions = getNonSortablePropertiesRestrictions;
50
+ const getRestrictionsOnProperties = function (converterContext) {
51
+ let propertiesRestrictions = {
52
+ nonSortableProperties: [],
53
+ nonFilterableProperties: []
54
+ };
55
+ const dataModelObjectPath = converterContext.getDataModelObjectPath();
56
+ const {
57
+ parentEntitySet,
58
+ targetEntitySet,
59
+ parentNavigationPath
60
+ } = getTargetEntitySetInfo(dataModelObjectPath);
61
+ if (isEntitySet(targetEntitySet)) {
62
+ if (parentEntitySet && isEntitySet(parentEntitySet)) {
63
+ propertiesRestrictions = {
64
+ nonSortableProperties: getNonSortablePropertiesRestrictions(parentEntitySet, targetEntitySet),
65
+ nonFilterableProperties: getNonFilterablePropertiesRestrictions(parentEntitySet, targetEntitySet)
66
+ };
67
+ if (propertiesRestrictions.nonSortableProperties.length || propertiesRestrictions.nonFilterableProperties.length) {
68
+ return propertiesRestrictions;
69
+ }
70
+ }
71
+ return {
72
+ nonSortableProperties: getNonSortablePropertiesRestrictions(targetEntitySet),
73
+ nonFilterableProperties: getNonFilterablePropertiesRestrictions(targetEntitySet)
74
+ };
75
+ } else if (parentEntitySet && isEntitySet(parentEntitySet)) {
76
+ // Find the restrictions on the parent entity set, this applies also for containment as there isn't an entity set on the OP
77
+ return {
78
+ nonSortableProperties: getNonSortablePropertiesRestrictions(parentEntitySet, undefined, parentNavigationPath),
79
+ nonFilterableProperties: getNonFilterablePropertiesRestrictions(parentEntitySet, undefined, parentNavigationPath)
80
+ };
22
81
  }
82
+ return propertiesRestrictions;
83
+ };
23
84
 
24
- // Check for every navigationRestriction if it has FilterRestrictions
85
+ /**
86
+ * Gets the sort restrictions from the navigation restrictions.
87
+ * @param entitySet Entity set to be analyzed.
88
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
89
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
90
+ * @returns Array containing the property names of all non-sortable properties from navigation restrictions.
91
+ */
92
+ _exports.getRestrictionsOnProperties = getRestrictionsOnProperties;
93
+ function getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
94
+ const sortRestrictionsFromNavigationRestrictions = [];
25
95
  entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
26
- // leave the property path unchanged (it is relative to the annotation target!)
27
- const nonFilterableNavigationProperties = navigationRestriction?.FilterRestrictions?.NonFilterableProperties?.map(property => property.value);
28
- if (nonFilterableNavigationProperties) {
29
- nonFilterableProperties.push(...nonFilterableNavigationProperties);
96
+ // if containment enabled get only the sort restrictions of the related navigation path
97
+ if (parentNavigationPath && parentNavigationPath !== navigationRestriction?.NavigationProperty?.value) {
98
+ return;
99
+ }
100
+ if (navigationRestriction?.SortRestrictions?.Sortable === false) {
101
+ // find correct navigation property
102
+ const navigationProperty = entitySet.entityType.navigationProperties.by_name(navigationRestriction?.NavigationProperty?.value);
103
+ if (navigationProperty) {
104
+ // add all properties of the navigation property to the nonSortableProperties
105
+ if (parentNavigationPath) {
106
+ sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
107
+ } else {
108
+ sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
109
+ }
110
+ }
111
+ } else {
112
+ const nonSortableNavigationProperties = navigationRestriction?.SortRestrictions?.NonSortableProperties?.map(property => {
113
+ // We need the property name from the navigation restriction definition when the targetEntitySet is available
114
+ if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
115
+ return property.$target?.name;
116
+ } else {
117
+ // leave the property path unchanged (it is relative to the annotation target!)
118
+ return property.value;
119
+ }
120
+ });
121
+ if (nonSortableNavigationProperties?.length) {
122
+ sortRestrictionsFromNavigationRestrictions.push(...nonSortableNavigationProperties);
123
+ }
30
124
  }
31
125
  });
32
- return nonFilterableProperties;
33
- };
126
+ return sortRestrictionsFromNavigationRestrictions;
127
+ }
34
128
 
35
129
  /**
36
- * Reads all SortRestrictions of the main entity and the (first level) navigation restrictions.
37
- * This does not work for more than one level of navigation.
38
- * @param entitySet Entity set to be analyzed
39
- * @returns Array containing the property names of all non-sortable properties
130
+ * Gets the sort restrictions directly from the entity set.
131
+ * @param entitySet Entity set to be analyzed.
132
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
133
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
134
+ * @returns Array containing the property names of all non-sortable properties.
40
135
  */
41
- _exports.getNonFilterablePropertiesRestrictions = getNonFilterablePropertiesRestrictions;
42
- const getNonSortablePropertiesRestrictions = function (entitySet) {
43
- let nonSortableProperties = [];
44
- // Check annotations for main entity
136
+ function getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
137
+ const sortRestrictionsOnEntitySet = [];
45
138
  if (entitySet.annotations.Capabilities?.SortRestrictions?.Sortable === false) {
46
- // add all properties of the entity to the nonSortableProperties
47
- nonSortableProperties.push(...entitySet.entityType.entityProperties.map(property => property.name));
139
+ // add all properties of the entity set to the nonSortableProperties
140
+ sortRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
48
141
  } else {
49
- nonSortableProperties = entitySet.annotations.Capabilities?.SortRestrictions?.NonSortableProperties?.map(property => property.value) || [];
142
+ const nonSortableProperties = [];
143
+ entitySet.annotations.Capabilities?.SortRestrictions?.NonSortableProperties?.forEach(property => {
144
+ if (parentNavigationPath && !property.value.includes(parentNavigationPath)) {
145
+ // skip the non sortable property if it doesn't belong to the parent navigation path in case of containment
146
+ return;
147
+ }
148
+ if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
149
+ nonSortableProperties.push(property.$target?.name);
150
+ } else {
151
+ nonSortableProperties.push(property.value);
152
+ }
153
+ });
154
+ if (nonSortableProperties?.length) {
155
+ sortRestrictionsOnEntitySet.push(...nonSortableProperties);
156
+ }
50
157
  }
51
- // Check for every navigationRestriction if it has sortRestrictions
158
+ return sortRestrictionsOnEntitySet;
159
+ }
160
+
161
+ /**
162
+ * Gets the filter restrictions from the navigation restrictions.
163
+ * @param entitySet Entity set to be analyzed.
164
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
165
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
166
+ * @returns Array containing the property names of all non-filterable properties from navigation restrictions.
167
+ */
168
+ function getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
169
+ const filterRestrictionsFromNavigationRestrictions = [];
52
170
  entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
53
- if (navigationRestriction?.SortRestrictions?.Sortable === false) {
171
+ // if containment enabled get only the filter restrictions of the related navigation path
172
+ if (parentNavigationPath && parentNavigationPath !== navigationRestriction?.NavigationProperty?.value) {
173
+ return;
174
+ }
175
+ if (navigationRestriction?.FilterRestrictions?.Filterable === false) {
54
176
  // find correct navigation property
55
177
  const navigationProperty = entitySet.entityType.navigationProperties.by_name(navigationRestriction?.NavigationProperty?.value);
56
178
  if (navigationProperty) {
57
- // add all properties of the navigation property to the nonSortableProperties
58
- nonSortableProperties.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
179
+ // add all properties of the navigation property to the nonFilterableProperties
180
+ if (parentNavigationPath) {
181
+ filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
182
+ } else {
183
+ filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
184
+ }
59
185
  }
60
186
  } else {
61
- // leave the property path unchanged (it is relative to the annotation target!)
62
- const nonSortableNavigationProperties = navigationRestriction?.SortRestrictions?.NonSortableProperties?.map(property => property.value);
63
- if (nonSortableNavigationProperties) {
64
- nonSortableProperties.push(...nonSortableNavigationProperties);
187
+ const nonFilterableNavigationProperties = navigationRestriction?.FilterRestrictions?.NonFilterableProperties?.map(property => {
188
+ // we need the property name from the navigation restriction definition when the targetEntitySet is available and it's not a containment scenario
189
+ if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
190
+ return property.$target?.name;
191
+ } else {
192
+ // leave the property path unchanged (it is relative to the annotation target!)
193
+ return property.value;
194
+ }
195
+ });
196
+ if (nonFilterableNavigationProperties?.length) {
197
+ filterRestrictionsFromNavigationRestrictions.push(...nonFilterableNavigationProperties);
65
198
  }
66
199
  }
67
200
  });
68
- return nonSortableProperties;
69
- };
201
+ return filterRestrictionsFromNavigationRestrictions;
202
+ }
70
203
 
71
204
  /**
72
- * Gets all SortRestrictions and FilterRestriction of the main entity and the (first level) navigation restrictions.
73
- * This does not work for more than one level of navigation.
74
- * @param entitySet Entity set to be analyzed
75
- * @returns Object containing all property names with restrictions separated by sortable and filterable capabilities
205
+ * Gets the filter restrictions directly from the entity set.
206
+ * @param entitySet Entity set to be analyzed.
207
+ * @param targetEntitySet The target entity set, if available. Not used in the case of containment.
208
+ * @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
209
+ * @returns Array containing the property names of all non-filterable properties.
76
210
  */
77
- _exports.getNonSortablePropertiesRestrictions = getNonSortablePropertiesRestrictions;
78
- const getRestrictionsOnProperties = function (entitySet) {
79
- let propertiesRestrictions = {
80
- nonSortableProperties: [],
81
- nonFilterableProperties: []
82
- };
83
- // Check annotations for main entity
84
- if (!isEntitySet(entitySet)) {
85
- return propertiesRestrictions;
211
+ function getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
212
+ const filterRestrictionsOnEntitySet = [];
213
+ if (entitySet.annotations.Capabilities?.FilterRestrictions?.Filterable === false) {
214
+ // add all properties of the entity set to the nonFilterableProperties
215
+ filterRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
86
216
  } else {
87
- propertiesRestrictions = {
88
- nonSortableProperties: getNonSortablePropertiesRestrictions(entitySet),
89
- nonFilterableProperties: getNonFilterablePropertiesRestrictions(entitySet)
90
- };
91
- return propertiesRestrictions;
217
+ const nonFilterableProperties = [];
218
+ entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(property => {
219
+ if (parentNavigationPath && !property.value.includes(parentNavigationPath)) {
220
+ // skip the non filterable property if it doesn't belong to the parent navigation path in case of containment
221
+ return;
222
+ }
223
+ if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
224
+ nonFilterableProperties.push(property.$target?.name);
225
+ } else {
226
+ nonFilterableProperties.push(property.value);
227
+ }
228
+ });
229
+ if (nonFilterableProperties?.length) {
230
+ filterRestrictionsOnEntitySet.push(...nonFilterableProperties);
231
+ }
92
232
  }
93
- };
94
- _exports.getRestrictionsOnProperties = getRestrictionsOnProperties;
233
+ return filterRestrictionsOnEntitySet;
234
+ }
95
235
  return _exports;
96
236
  }, false);
97
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJhYmxlIiwicHVzaCIsImVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibWFwIiwicHJvcGVydHkiLCJuYW1lIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJ2YWx1ZSIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZvckVhY2giLCJuYXZpZ2F0aW9uUmVzdHJpY3Rpb24iLCJub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJfZXhwb3J0cyIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsIlNvcnRSZXN0cmljdGlvbnMiLCJTb3J0YWJsZSIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiYnlfbmFtZSIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInRhcmdldFR5cGUiLCJub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImlzRW50aXR5U2V0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFbnRpdHlTZXRIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIFNpbmdsZXRvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxudHlwZSBjdXJyZW50RW50aXR5U2V0ID0gRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEdldHMgTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgb24gRmlsdGVyUmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGVudGl0eS5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10ge1xuXHRsZXQgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID1cblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnZhbHVlKSB8fCBbXTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciBldmVyeSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gaWYgaXQgaGFzIEZpbHRlclJlc3RyaWN0aW9uc1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gbGVhdmUgdGhlIHByb3BlcnR5IHBhdGggdW5jaGFuZ2VkIChpdCBpcyByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQhKVxuXHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZVxuXHRcdCk7XG5cdFx0aWYgKG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcykge1xuXHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXMucHVzaCguLi5ub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBub25GaWx0ZXJhYmxlUHJvcGVydGllcztcbn07XG5cbi8qKlxuICogUmVhZHMgYWxsIFNvcnRSZXN0cmljdGlvbnMgb2YgdGhlIG1haW4gZW50aXR5IGFuZCB0aGUgKGZpcnN0IGxldmVsKSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBuYXZpZ2F0aW9uLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCk6IHN0cmluZ1tdIHtcblx0bGV0IG5vblNvcnRhYmxlUHJvcGVydGllcyA9IFtdO1xuXHQvLyBDaGVjayBhbm5vdGF0aW9ucyBmb3IgbWFpbiBlbnRpdHlcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMgPVxuXHRcdFx0ZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSkgfHwgW107XG5cdH1cblx0Ly8gQ2hlY2sgZm9yIGV2ZXJ5IG5hdmlnYXRpb25SZXN0cmljdGlvbiBpZiBpdCBoYXMgc29ydFJlc3RyaWN0aW9uc1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIGNvcnJlY3QgbmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5U2V0LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuYnlfbmFtZShuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChcblx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IGAke25hdmlnYXRpb25Qcm9wZXJ0eS5uYW1lfS8ke3Byb3BlcnR5Lm5hbWV9YClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbGVhdmUgdGhlIHByb3BlcnR5IHBhdGggdW5jaGFuZ2VkIChpdCBpcyByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQhKVxuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudmFsdWVcblx0XHRcdCk7XG5cdFx0XHRpZiAobm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcykge1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaCguLi5ub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbm9uU29ydGFibGVQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBHZXRzIGFsbCBTb3J0UmVzdHJpY3Rpb25zIGFuZCBGaWx0ZXJSZXN0cmljdGlvbiBvZiB0aGUgbWFpbiBlbnRpdHkgYW5kIHRoZSAoZmlyc3QgbGV2ZWwpIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogVGhpcyBkb2VzIG5vdCB3b3JrIGZvciBtb3JlIHRoYW4gb25lIGxldmVsIG9mIG5hdmlnYXRpb24uXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWRcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFsbCBwcm9wZXJ0eSBuYW1lcyB3aXRoIHJlc3RyaWN0aW9ucyBzZXBhcmF0ZWQgYnkgc29ydGFibGUgYW5kIGZpbHRlcmFibGUgY2FwYWJpbGl0aWVzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQpOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMge1xuXHRsZXQgcHJvcGVydGllc1Jlc3RyaWN0aW9uczogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0geyBub25Tb3J0YWJsZVByb3BlcnRpZXM6IFtdLCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogW10gfTtcblx0Ly8gQ2hlY2sgYW5ub3RhdGlvbnMgZm9yIG1haW4gZW50aXR5XG5cdGlmICghaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xuXHR9IGVsc2Uge1xuXHRcdHByb3BlcnRpZXNSZXN0cmljdGlvbnMgPSB7XG5cdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXM6IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyhlbnRpdHlTZXQpLFxuXHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IGdldE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGVudGl0eVNldClcblx0XHR9O1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xuXHR9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sTUFBTUEsc0NBQXNDLEdBQUcsU0FBQUEsQ0FBVUMsU0FBb0IsRUFBWTtJQUMvRixJQUFJQyx1QkFBdUIsR0FBRyxFQUFFO0lBQ2hDLElBQUlELFNBQVMsQ0FBQ0UsV0FBVyxDQUFDQyxZQUFZLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEtBQUssS0FBSyxFQUFFO01BQ2pGO01BQ0FKLHVCQUF1QixDQUFDSyxJQUFJLENBQUMsR0FBR04sU0FBUyxDQUFDTyxVQUFVLENBQUNDLGdCQUFnQixDQUFDQyxHQUFHLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUN4RyxDQUFDLE1BQU07TUFDTlYsdUJBQXVCLEdBQ3RCRCxTQUFTLENBQUNFLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFQyxrQkFBa0IsRUFBRVEsdUJBQXVCLEVBQUVILEdBQUcsQ0FBRUMsUUFBUSxJQUFLQSxRQUFRLENBQUNHLEtBQUssQ0FBQyxJQUFJLEVBQUU7SUFDMUg7O0lBRUE7SUFDQWIsU0FBUyxDQUFDRSxXQUFXLENBQUNDLFlBQVksRUFBRVcsc0JBQXNCLEVBQUVDLG9CQUFvQixFQUFFQyxPQUFPLENBQUVDLHFCQUFxQixJQUFLO01BQ3BIO01BQ0EsTUFBTUMsaUNBQWlDLEdBQUdELHFCQUFxQixFQUFFYixrQkFBa0IsRUFBRVEsdUJBQXVCLEVBQUVILEdBQUcsQ0FDL0dDLFFBQVEsSUFBS0EsUUFBUSxDQUFDRyxLQUN4QixDQUFDO01BQ0QsSUFBSUssaUNBQWlDLEVBQUU7UUFDdENqQix1QkFBdUIsQ0FBQ0ssSUFBSSxDQUFD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
237
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsInBhcmVudE5hdmlnYXRpb25QYXRoIiwiZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsImRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyIsImdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyIsIkFycmF5IiwiZnJvbSIsIlNldCIsIl9leHBvcnRzIiwiZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiZ2V0U29ydFJlc3RyaWN0aW9uc2Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiZGlyZWN0U29ydFJlc3RyaWN0aW9ucyIsImdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJjb252ZXJ0ZXJDb250ZXh0IiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwYXJlbnRFbnRpdHlTZXQiLCJnZXRUYXJnZXRFbnRpdHlTZXRJbmZvIiwiaXNFbnRpdHlTZXQiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJhbm5vdGF0aW9ucyIsIkNhcGFiaWxpdGllcyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZvckVhY2giLCJuYXZpZ2F0aW9uUmVzdHJpY3Rpb24iLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCJ2YWx1ZSIsIlNvcnRSZXN0cmljdGlvbnMiLCJTb3J0YWJsZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImVudGl0eVR5cGUiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImJ5X25hbWUiLCJwdXNoIiwidGFyZ2V0VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJtYXAiLCJwcm9wZXJ0eSIsIm5hbWUiLCJub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiTm9uU29ydGFibGVQcm9wZXJ0aWVzIiwiJHRhcmdldCIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImluY2x1ZGVzIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVudGl0eVNldEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldFRhcmdldEVudGl0eVNldEluZm8gfSBmcm9tIFwiLi9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgRmlsdGVyUmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGVudGl0eSBhbmQgdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogV2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgZmlyc3Qgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgKG1vc3QgcHJlY2lzZSBkZWZpbml0aW9uKSwgYW5kIGlmIG5vdCBhdmFpbGFibGUsIHRoZW4gd2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIGVudGl0eVNldC5cbiAqIEluIGNhc2Ugb2YgY29udGFpbm1lbnQsIHdlIG9ubHkgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgb2YgdGhlIHBhcmVudCBlbnRpdHlTZXQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWRcbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuICBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tZmlsdGVyYWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0XHRlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdHBhcmVudE5hdmlnYXRpb25QYXRoXG5cdCk7XG5cdGNvbnN0IGRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyhlbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHQvLyBNZXJnZSB0d28gZmlsdGVyIHJlc3RyaWN0aW9ucyBmb3VuZCBvbiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgZGlyZWN0bHkgZnJvbSB0aGUgZW50aXR5IHNldFxuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5maWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucywgLi4uZGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zXSkpO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgU29ydFJlc3RyaWN0aW9ucyBvZiB0aGUgbWFpbiBlbnRpdHkgYW5kIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIFdlIHJldHJpZXZlIHRoZSByZXN0cmljdGlvbnMgZmlyc3Qgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgKG1vc3QgcHJlY2lzZSBkZWZpbml0aW9uKSwgYW5kIGlmIG5vdCBhdmFpbGFibGUsIHRoZW4gd2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIGVudGl0eVNldFxuICogSW4gY2FzZSBvZiBjb250YWlubWVudCwgd2Ugb25seSBnZXQgdGhlIHJlc3RyaWN0aW9ucyBvbiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50IGVudGl0eVNldC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0U29ydFJlc3RyaWN0aW9uc2Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKFxuXHRcdGVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlTZXQsXG5cdFx0cGFyZW50TmF2aWdhdGlvblBhdGhcblx0KTtcblx0Y29uc3QgZGlyZWN0U29ydFJlc3RyaWN0aW9ucyA9IGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0Ly8gTWVyZ2UgdHdvIHNvcnQgcmVzdHJpY3Rpb25zIGZvdW5kIG9uIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGFuZCBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0XG5cdHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucywgLi4uZGlyZWN0U29ydFJlc3RyaWN0aW9uc10pKTtcbn07XG5cbi8qKlxuICogR2V0cyBhbGwgU29ydFJlc3RyaWN0aW9ucyBhbmQgRmlsdGVyUmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgcHJvcGVydHkgbmFtZXMgb2YgcmVzdHJpY3Rpb25zIHNlcGFyYXRlZCBieSBzb3J0YWJsZSBhbmQgZmlsdGVyYWJsZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB7XG5cdGxldCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7IG5vblNvcnRhYmxlUHJvcGVydGllczogW10sIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSB9O1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHsgcGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoIH0gPSBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RW50aXR5U2V0KSkge1xuXHRcdGlmIChwYXJlbnRFbnRpdHlTZXQgJiYgaXNFbnRpdHlTZXQocGFyZW50RW50aXR5U2V0KSkge1xuXHRcdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IHtcblx0XHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQpLFxuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQpXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnRpZXNSZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLmxlbmd0aCB8fCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gcHJvcGVydGllc1Jlc3RyaWN0aW9ucztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllczogZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKHRhcmdldEVudGl0eVNldCksXG5cdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnModGFyZ2V0RW50aXR5U2V0KVxuXHRcdH07XG5cdH0gZWxzZSBpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHQvLyBGaW5kIHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0LCB0aGlzIGFwcGxpZXMgYWxzbyBmb3IgY29udGFpbm1lbnQgYXMgdGhlcmUgaXNuJ3QgYW4gZW50aXR5IHNldCBvbiB0aGUgT1Bcblx0XHRyZXR1cm4ge1xuXHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB1bmRlZmluZWQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gcHJvcGVydGllc1Jlc3RyaWN0aW9ucztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc29ydCByZXN0cmljdGlvbnMgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWQuXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5U2V0IFRoZSB0YXJnZXQgZW50aXR5IHNldCwgaWYgYXZhaWxhYmxlLiBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tc29ydGFibGUgcHJvcGVydGllcyBmcm9tIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICovXG5mdW5jdGlvbiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9uczogc3RyaW5nW10gPSBbXTtcblx0ZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uUmVzdHJpY3RlZFByb3BlcnRpZXM/LmZvckVhY2goKG5hdmlnYXRpb25SZXN0cmljdGlvbikgPT4ge1xuXHRcdC8vIGlmIGNvbnRhaW5tZW50IGVuYWJsZWQgZ2V0IG9ubHkgdGhlIHNvcnQgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwYXJlbnROYXZpZ2F0aW9uUGF0aCAhPT0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gZmluZCBjb3JyZWN0IG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVNldC5lbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmJ5X25hbWUobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKTtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGVcblx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMoZW50aXR5U2V0OiBFbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldCB0byB0aGUgbm9uU29ydGFibGVQcm9wZXJ0aWVzXG5cdFx0c29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4uZW50aXR5U2V0LmVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/Lk5vblNvcnRhYmxlUHJvcGVydGllcz8uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhcHJvcGVydHkudmFsdWUuaW5jbHVkZXMocGFyZW50TmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdC8vIHNraXAgdGhlIG5vbiBzb3J0YWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgodGFyZ2V0RW50aXR5U2V0IHx8IHBhcmVudE5hdmlnYXRpb25QYXRoKSAmJiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChub25Tb3J0YWJsZVByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0c29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4ubm9uU29ydGFibGVQcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGZyb20gdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcyBmcm9tIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM/LlJlc3RyaWN0ZWRQcm9wZXJ0aWVzPy5mb3JFYWNoKChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24pID0+IHtcblx0XHQvLyBpZiBjb250YWlubWVudCBlbmFibGVkIGdldCBvbmx5IHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwYXJlbnROYXZpZ2F0aW9uUGF0aCAhPT0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIGZpbmQgY29ycmVjdCBuYXZpZ2F0aW9uIHByb3BlcnR5XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlTZXQuZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5ieV9uYW1lKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSk7XG5cdFx0XHRpZiAobmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IGAke25hdmlnYXRpb25Qcm9wZXJ0eS5uYW1lfS8ke3Byb3BlcnR5Lm5hbWV9YClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0XHQocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHQvLyB3ZSBuZWVkIHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb24gZGVmaW5pdGlvbiB3aGVuIHRoZSB0YXJnZXRFbnRpdHlTZXQgaXMgYXZhaWxhYmxlIGFuZCBpdCdzIG5vdCBhIGNvbnRhaW5tZW50IHNjZW5hcmlvXG5cdFx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0aWYgKG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXG5cdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmICFwcm9wZXJ0eS52YWx1ZS5pbmNsdWRlcyhwYXJlbnROYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHRcdFx0Ly8gc2tpcCB0aGUgbm9uIGZpbHRlcmFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7RUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxNQUFNQSxzQ0FBc0MsR0FBRyxTQUFBQSxDQUNyREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDbEI7SUFDWCxNQUFNQyw0Q0FBNEMsR0FBR0MsK0NBQStDLENBQ25HSixTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsb0JBQ0QsQ0FBQztJQUNELE1BQU1HLHdCQUF3QixHQUFHQywyQkFBMkIsQ0FBQ04sU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQixDQUFDO0lBQzlHO0lBQ0EsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsR0FBR04sNENBQTRDLEVBQUUsR0FBR0Usd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzNHLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkFLLFFBQUEsQ0FBQVgsc0NBQUEsR0FBQUEsc0NBQUE7RUFTTyxNQUFNWSxvQ0FBb0MsR0FBRyxTQUFBQSxDQUNuRFgsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDbEI7SUFDWCxNQUFNVSwwQ0FBMEMsR0FBR0MsNkNBQTZDLENBQy9GYixTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsb0JBQ0QsQ0FBQztJQUNELE1BQU1ZLHNCQUFzQixHQUFHQyx5QkFBeUIsQ0FBQ2YsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQixDQUFDO0lBQzFHO0lBQ0EsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsR0FBR0csMENBQTBDLEVBQUUsR0FBR0Usc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0VBQ3ZHLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBSixRQUFBLENBQUFDLG9DQUFBLEdBQUFBLG9DQUFBO0VBS08sTUFBTUssMkJBQTJCLEdBQUcsU0FBQUEsQ0FBVUMsZ0JBQWtDLEVBQTRCO0lBQ2xILElBQUlDLHNCQUFnRCxHQUFHO01BQUVDLHFCQUFxQixFQUFFLEVBQUU7TUFBRUMsdUJBQXVCLEVBQUU7SUFBRyxDQUFDO0lBQ2pILE1BQU1DLG1CQUFtQixHQUFHSixnQkFBZ0IsQ0FBQ0ssc0JBQXNCLENBQUMsQ0FBQztJQUNyRSxNQUFNO01BQUVDLGVBQWU7TUFBRXRCLGVBQWU7TUFBRUM7SUFBcUIsQ0FBQyxHQUFHc0Isc0JBQXNCLENBQUNILG1CQUFtQixDQUFDO0lBQzlHLElBQUlJLFdBQVcsQ0FBQ3hCLGVBQWUsQ0FBQyxFQUFFO01BQ2pDLElBQUlzQixlQUFlLElBQUlFLFdBQVcsQ0FBQ0YsZUFBZSxDQUFDLEVBQUU7UUFDcERMLHNCQUFzQixHQUFHO1VBQ3hCQyxxQkFBcUIsRUFBRVIsb0NBQW9DLENBQUNZLGVBQWUsRUFBRXRCLGVBQWUsQ0FBQztVQUM3Rm1CLHVCQUF1QixFQUFFckIsc0NBQXNDLENBQUN3QixlQUFlLEVBQUV0QixlQUFlO1FBQ2pHLENBQUM7UUFDRCxJQUFJaUIsc0JBQXNCLENBQUNDLHFCQUFxQixDQUFDTyxNQUFNLElBQUlSLHNCQUFzQixDQUFDRSx1QkFBdUIsQ0FBQ00sTUFBTSxFQUFFO1VBQ2pILE9BQU9SLHNCQUFzQjtRQUM5QjtNQUNEO01BQ0EsT0FBTztRQUNOQyxxQkFBcUIsRUFBRVIsb0NBQW9DLENBQUNWLGVBQWUsQ0FBQztRQUM1RW1CLHVCQUF1QixFQUFFckIsc0NBQXNDLENBQUNFLGVBQWU7TUFDaEYsQ0FBQztJQUNGLENBQUMsTUFBTSxJQUFJc0IsZUFBZSxJQUFJRSxXQUFXLENBQUNGLGVBQWUsQ0FBQyxFQUFFO01BQzNEO01BQ0EsT0FBTztRQUNOSixxQkFBcUIsRUFBRVIsb0NBQW9DLENBQUNZLGVBQWUsRUFBRUksU0FBUyxFQUFFekIsb0JBQW9CLENBQUM7UUFDN0drQix1QkFBdUIsRUFBRXJCLHNDQUFzQyxDQUFDd0IsZUFBZSxFQUFFSSxTQUFTLEVBQUV6QixvQkFBb0I7TUFDakgsQ0FBQztJQUNGO0lBQ0EsT0FBT2dCLHNCQUFzQjtFQUM5QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkFSLFFBQUEsQ0FBQU0sMkJBQUEsR0FBQUEsMkJBQUE7RUFPQSxTQUFTSCw2Q0FBNkNBLENBQ3JEYixTQUFvQixFQUNwQkMsZUFBMkIsRUFDM0JDLG9CQUE2QixFQUNsQjtJQUNYLE1BQU1VLDBDQUFvRCxHQUFHLEVBQUU7SUFDL0RaLFNBQVMsQ0FBQzRCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFQyxzQkFBc0IsRUFBRUMsb0JBQW9CLEVBQUVDLE9BQU8sQ0FBRUMscUJBQXFCLElBQUs7TUFDcEg7TUFDQSxJQUFJL0Isb0JBQW9CLElBQUlBLG9CQUFvQixLQUFLK0IscUJBQXFCLEVBQUVDLGtCQUFrQixFQUFFQyxLQUFLLEVBQUU7UUFDdEc7TUFDRDtNQUNBLElBQUlGLHFCQUFxQixFQUFFRyxnQkFBZ0IsRUFBRUMsUUFBUSxLQUFLLEtBQUssRUFBRTtRQUNoRTtRQUNBLE1BQU1DLGtCQUFrQixHQUFHdEMsU0FBUyxDQUFDdUMsVUFBVSxDQUFDQyxvQkFBb0IsQ0FBQ0MsT0FBTyxDQUFDUixxQkFBcUIsRUFBRUMsa0JBQWtCLEVBQUVDLEtBQUssQ0FBQztRQUM5SCxJQUFJRyxrQkFBa0IsRUFBRTtVQUN2QjtVQUNBLElBQUlwQyxvQkFBb0IsRUFBRTtZQUN6QlUsMENBQTBDLENBQUM4QixJQUFJLENBQzlDLEdBQUdKLGtCQUFrQixDQUFDSyxVQUFVLENBQUNDLGdCQUFnQixDQUFDQyxHQUFHLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLENBQ2xGLENBQUM7VUFDRixDQUFDLE1BQU07WUFDTm5DLDBDQUEwQyxDQUFDOEIsSUFBSSxDQUM5QyxHQUFHSixrQkFBa0IsQ0FBQ0ssVUFBVSxDQUFDQyxnQkFBZ0IsQ0FBQ0MsR0FBRyxDQUFFQyxRQUFRLElBQUssR0FBR1Isa0JBQWtCLENBQUNTLElBQUksSUFBSUQsUUFBUSxDQUFDQyxJQUFJLEVBQUUsQ0FDbEgsQ0FBQztVQUNGO1FBQ0Q7TUFDRCxDQUFDLE1BQU07UUFDTixNQUFNQywrQkFBK0IsR0FBR2YscUJBQXFCLEVBQUVHLGdCQUFnQixFQUFFYSxxQkFBcUIsRUFBRUosR0FBRyxDQUFFQyxRQUFRLElBQUs7VUFDekg7VUFDQSxJQUFJLENBQUM3QyxlQUFlLElBQUlDLG9CQUFvQixLQUFLNEMsUUFBUSxDQUFDSSxPQUFPLEVBQUVILElBQUksRUFBRTtZQUN4RSxPQUFPRCxRQUFRLENBQUNJLE9BQU8sRUFBRUgsSUFBSTtVQUM5QixDQUFDLE1BQU07WUFDTjtZQUNBLE9BQU9ELFFBQVEsQ0FBQ1gsS0FBSztVQUN0QjtRQUNELENBQUMsQ0FBQztRQUNGLElBQUlhLCtCQUErQixFQUFFdEIsTUFBTSxFQUFFO1VBQzVDZCwwQ0FBMEMsQ0FBQzhCLElBQUksQ0FBQyxHQUFHTSwrQkFBK0IsQ0FBQztRQUNwRjtNQUNEO0lBQ0QsQ0FBQyxDQUFDO0lBQ0YsT0FBT3BDLDBDQUEwQztFQUNsRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNHLHlCQUF5QkEsQ0FBQ2YsU0FBb0IsRUFBRUMsZUFBMkIsRUFBRUMsb0JBQTZCLEVBQVk7SUFDOUgsTUFBTWlELDJCQUFxQyxHQUFHLEVBQUU7SUFDaEQsSUFBSW5ELFNBQVMsQ0FBQzRCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFTyxnQkFBZ0IsRUFBRUMsUUFBUSxLQUFLLEtBQUssRUFBRTtNQUM3RTtNQUNBYywyQkFBMkIsQ0FBQ1QsSUFBSSxDQUFDLEdBQUcxQyxTQUFTLENBQUN1QyxVQUFVLENBQUNLLGdCQUFnQixDQUFDQyxHQUFHLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUM1RyxDQUFDLE1BQU07TUFDTixNQUFNNUIscUJBQStCLEdBQUcsRUFBRTtNQUMxQ25CLFNBQVMsQ0FBQzRCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFTyxnQkFBZ0IsRUFBRWEscUJBQXFCLEVBQUVqQixPQUFPLENBQUVjLFFBQVEsSUFBSztRQUNsRyxJQUFJNUMsb0JBQW9CLElBQUksQ0FBQzRDLFFBQVEsQ0FBQ1gsS0FBSyxDQUFDaUIsUUFBUSxDQUFDbEQsb0JBQW9CLENBQUMsRUFBRTtVQUMzRTtVQUNBO1FBQ0Q7UUFDQSxJQUFJLENBQUNELGVBQWUsSUFBSUMsb0JBQW9CLEtBQUs0QyxRQUFRLENBQUNJLE9BQU8sRUFBRUgsSUFBSSxFQUFFO1VBQ3hFNUIscUJBQXFCLENBQUN1QixJQUFJLENBQUNJLFFBQVEsQ0FBQ0ksT0FBTyxFQUFFSCxJQUFJLENBQUM7UUFDbkQsQ0FBQyxNQUFNO1VBQ041QixxQkFBcUIsQ0FBQ3VCLElBQUksQ0FBQ0ksUUFBUSxDQUFDWCxLQUFLLENBQUM7UUFDM0M7TUFDRCxDQUFDLENBQUM7TUFDRixJQUFJaEIscUJBQXFCLEVBQUVPLE1BQU0sRUFBRTtRQUNsQ3lCLDJCQUEyQixDQUFDVCxJQUFJLENBQUMsR0FBR3ZCLHFCQUFxQixDQUFDO01BQzNEO0lBQ0Q7SUFDQSxPQUFPZ0MsMkJBQTJCO0VBQ25DOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUy9DLCtDQUErQ0EsQ0FDdkRKLFNBQW9CLEVBQ3BCQyxlQUEyQixFQUMzQkMsb0JBQTZCLEVBQ2xCO0lBQ1gsTUFBTUMsNENBQXNELEdBQUcsRUFBRTtJQUNqRUgsU0FBUyxDQUFDNEIsV0FBVyxDQUFDQyxZQUFZLEVBQUVDLHNCQUFzQixFQUFFQyxvQkFBb0IsRUFBRUMsT0FBTyxDQUFFQyxxQkFBcUIsSUFBSztNQUNwSDtNQUNBLElBQUkvQixvQkFBb0IsSUFBSUEsb0JBQW9CLEtBQUsrQixxQkFBcUIsRUFBRUMsa0JBQWtCLEVBQUVDLEtBQUssRUFBRTtRQUN0RztNQUNEO01BQ0EsSUFBSUYscUJBQXFCLEVBQUVvQixrQkFBa0IsRUFBRUMsVUFBVSxLQUFLLEtBQUssRUFBRTtRQUNwRTtRQUNBLE1BQU1oQixrQkFBa0IsR0FBR3RDLFNBQVMsQ0FBQ3VDLFVBQVUsQ0FBQ0Msb0JBQW9CLENBQUNDLE9BQU8sQ0FBQ1IscUJBQXFCLEVBQUVDLGtCQUFrQixFQUFFQyxLQUFLLENBQUM7UUFDOUgsSUFBSUcsa0JBQWtCLEVBQUU7VUFDdkI7VUFDQSxJQUFJcEMsb0JBQW9CLEVBQUU7WUFDekJDLDRDQUE0QyxDQUFDdUMsSUFBSSxDQUNoRCxHQUFHSixrQkFBa0IsQ0FBQ0ssVUFBVSxDQUFDQyxnQkFBZ0IsQ0FBQ0MsR0FBRyxDQUFFQyxRQUFRLElBQUtBLFFBQVEsQ0FBQ0MsSUFBSSxDQUNsRixDQUFDO1VBQ0YsQ0FBQyxNQUFNO1lBQ041Qyw0Q0FBNEMsQ0FBQ3VDLElBQUksQ0FDaEQsR0FBR0osa0JBQWtCLENBQUNLLFVBQVUsQ0FBQ0MsZ0JBQWdCLENBQUNDLEdBQUcsQ0FBRUMsUUFBUSxJQUFLLEdBQUdSLGtCQUFrQixDQUFDUyxJQUFJLElBQUlELFFBQVEsQ0FBQ0MsSUFBSSxFQUFFLENBQ2xILENBQUM7VUFDRjtRQUNEO01BQ0QsQ0FBQyxNQUFNO1FBQ04sTUFBTVEsaUNBQWlDLEdBQUd0QixxQkFBcUIsRUFBRW9CLGtCQUFrQixFQUFFRyx1QkFBdUIsRUFBRVgsR0FBRyxDQUMvR0MsUUFBUSxJQUFLO1VBQ2I7VUFDQSxJQUFJLENBQUM3QyxlQUFlLElBQUlDLG9CQUFvQixLQUFLNEMsUUFBUSxDQUFDSSxPQUFPLEVBQUVILElBQUksRUFBRTtZQUN4RSxPQUFPRCxRQUFRLENBQUNJLE9BQU8sRUFBRUgsSUFBSTtVQUM5QixDQUFDLE1BQU07WUFDTjtZQUNBLE9BQU9ELFFBQVEsQ0FBQ1gsS0FBSztVQUN0QjtRQUNELENBQ0QsQ0FBQztRQUNELElBQUlvQixpQ0FBaUMsRUFBRTdCLE1BQU0sRUFBRTtVQUM5Q3ZCLDRDQUE0QyxDQUFDdUMsSUFBSSxDQUFDLEdBQUdhLGlDQUFpQyxDQUFDO1FBQ3hGO01BQ0Q7SUFDRCxDQUFDLENBQUM7SUFDRixPQUFPcEQsNENBQTRDO0VBQ3BEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0csMkJBQTJCQSxDQUFDTixTQUFvQixFQUFFQyxlQUEyQixFQUFFQyxvQkFBNkIsRUFBWTtJQUNoSSxNQUFNdUQsNkJBQXVDLEdBQUcsRUFBRTtJQUNsRCxJQUFJekQsU0FBUyxDQUFDNEIsV0FBVyxDQUFDQyxZQUFZLEVBQUV3QixrQkFBa0IsRUFBRUMsVUFBVSxLQUFLLEtBQUssRUFBRTtNQUNqRjtNQUNBRyw2QkFBNkIsQ0FBQ2YsSUFBSSxDQUFDLEdBQUcxQyxTQUFTLENBQUN1QyxVQUFVLENBQUNLLGdCQUFnQixDQUFDQyxHQUFHLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUM5RyxDQUFDLE1BQU07TUFDTixNQUFNM0IsdUJBQWlDLEdBQUcsRUFBRTtNQUM1Q3BCLFNBQVMsQ0FBQzRCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFd0Isa0JBQWtCLEVBQUVHLHVCQUF1QixFQUFFeEIsT0FBTyxDQUFFYyxRQUFRLElBQUs7UUFDdEcsSUFBSTVDLG9CQUFvQixJQUFJLENBQUM0QyxRQUFRLENBQUNYLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQ2xELG9CQUFvQixDQUFDLEVBQUU7VUFDM0U7VUFDQTtRQUNEO1FBQ0EsSUFBSSxDQUFDRCxlQUFlLElBQUlDLG9CQUFvQixLQUFLNEMsUUFBUSxDQUFDSSxPQUFPLEVBQUVILElBQUksRUFBRTtVQUN4RTNCLHVCQUF1QixDQUFDc0IsSUFBSSxDQUFDSSxRQUFRLENBQUNJLE9BQU8sRUFBRUgsSUFBSSxDQUFDO1FBQ3JELENBQUMsTUFBTTtVQUNOM0IsdUJBQXVCLENBQUNzQixJQUFJLENBQUNJLFFBQVEsQ0FBQ1gsS0FBSyxDQUFDO1FBQzdDO01BQ0QsQ0FBQyxDQUFDO01BQ0YsSUFBSWYsdUJBQXVCLEVBQUVNLE1BQU0sRUFBRTtRQUNwQytCLDZCQUE2QixDQUFDZixJQUFJLENBQUMsR0FBR3RCLHVCQUF1QixDQUFDO01BQy9EO0lBQ0Q7SUFDQSxPQUFPcUMsNkJBQTZCO0VBQ3JDO0VBQUMsT0FBQS9DLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==