@sapui5/sap.fe.core 1.92.0 → 1.93.3

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 (84) hide show
  1. package/package.json +2 -3
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +2 -2
  4. package/src/sap/fe/core/AppComponent.js +21 -1
  5. package/src/sap/fe/core/CommonUtils.js +130 -48
  6. package/src/sap/fe/core/ExtensionAPI.js +238 -226
  7. package/src/sap/fe/core/PageController.js +5 -2
  8. package/src/sap/fe/core/TemplateComponent.js +1 -0
  9. package/src/sap/fe/core/TransactionHelper.js +35 -8
  10. package/src/sap/fe/core/actions/draft.js +1 -1
  11. package/src/sap/fe/core/actions/messageHandling.js +18 -6
  12. package/src/sap/fe/core/actions/operations.js +17 -41
  13. package/src/sap/fe/core/controllerextensions/EditFlow.js +127 -43
  14. package/src/sap/fe/core/controllerextensions/InternalRouting.js +11 -11
  15. package/src/sap/fe/core/controllerextensions/KPIManagement.js +417 -0
  16. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +399 -0
  17. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -3
  18. package/src/sap/fe/core/controllerextensions/PageReady.ts +1 -1
  19. package/src/sap/fe/core/controllerextensions/Share.js +102 -66
  20. package/src/sap/fe/core/controllerextensions/SideEffects.js +60 -14
  21. package/src/sap/fe/core/controllerextensions/SideEffects.ts +53 -12
  22. package/src/sap/fe/core/controllerextensions/ViewState.js +18 -18
  23. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +13 -0
  24. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +68 -2
  25. package/src/sap/fe/core/converters/ConverterContext.js +15 -1
  26. package/src/sap/fe/core/converters/ConverterContext.ts +11 -0
  27. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  28. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -2
  29. package/src/sap/fe/core/converters/ManifestWrapper.js +14 -14
  30. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -12
  31. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -2
  32. package/src/sap/fe/core/converters/MetaModelConverter.ts +39 -2
  33. package/src/sap/fe/core/converters/annotations/DataField.js +10 -6
  34. package/src/sap/fe/core/converters/annotations/DataField.ts +9 -5
  35. package/src/sap/fe/core/converters/common/AnnotationConverter.js +14 -4
  36. package/src/sap/fe/core/converters/controls/Common/Action.js +25 -15
  37. package/src/sap/fe/core/converters/controls/Common/Action.ts +33 -19
  38. package/src/sap/fe/core/converters/controls/Common/Criticality.js +50 -0
  39. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +33 -0
  40. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -3
  41. package/src/sap/fe/core/converters/controls/Common/Form.ts +1 -2
  42. package/src/sap/fe/core/converters/controls/Common/KPI.js +181 -0
  43. package/src/sap/fe/core/converters/controls/Common/KPI.ts +220 -0
  44. package/src/sap/fe/core/converters/controls/Common/Table.js +121 -59
  45. package/src/sap/fe/core/converters/controls/Common/Table.ts +130 -62
  46. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -4
  47. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +9 -3
  48. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +62 -7
  49. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +58 -6
  50. package/src/sap/fe/core/converters/helpers/Aggregation.js +86 -11
  51. package/src/sap/fe/core/converters/helpers/Aggregation.ts +79 -8
  52. package/src/sap/fe/core/converters/helpers/BindingHelper.js +44 -2
  53. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +43 -2
  54. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  55. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  56. package/src/sap/fe/core/converters/helpers/IssueManager.js +8 -2
  57. package/src/sap/fe/core/converters/helpers/IssueManager.ts +7 -1
  58. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +93 -0
  59. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +92 -0
  60. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +102 -23
  61. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -17
  62. package/src/sap/fe/core/converters/templates/ListReportConverter.js +44 -5
  63. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +39 -2
  64. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +41 -30
  65. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +47 -30
  66. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -1
  67. package/src/sap/fe/core/formatters/CriticalityFormatter.js +77 -0
  68. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +58 -0
  69. package/src/sap/fe/core/formatters/KPIFormatter.js +103 -0
  70. package/src/sap/fe/core/formatters/KPIFormatter.ts +88 -0
  71. package/src/sap/fe/core/fpm/manifest.json +1 -3
  72. package/src/sap/fe/core/helpers/BindingExpression.js +161 -97
  73. package/src/sap/fe/core/helpers/BindingExpression.ts +188 -117
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +45 -1
  76. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -1
  77. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -0
  78. package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -8
  79. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +16 -4
  80. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -3
  81. package/src/sap/fe/core/templating/DataModelPathHelper.js +7 -3
  82. package/src/sap/fe/core/templating/DataModelPathHelper.ts +7 -2
  83. package/src/sap/fe/core/templating/UIFormatters.js +1 -5
  84. package/src/sap/fe/core/templating/UIFormatters.ts +0 -3
@@ -0,0 +1,399 @@
1
+ import { ControllerExtension } from "sap/ui/core/mvc";
2
+ import { ControllerExtensionMetadata } from "sap/fe/core/controllerextensions";
3
+ import { UI5Class, Override } from "../helpers/ClassSupport";
4
+ import { JSONModel } from "sap/ui/model/json";
5
+ import { Log } from "sap/base";
6
+ import { KPIDefinition } from "sap/fe/core/converters/controls/Common/KPI";
7
+ import { CommonUtils } from "sap/fe/core";
8
+ import { Context } from "sap/ui/model/odata/v4";
9
+ import { MessageType } from "sap/fe/core/formatters/TableFormatterTypes";
10
+ import { FilterDefinition } from "sap/fe/core/converters/helpers/SelectionVariantHelper";
11
+ import { NumberFormat } from "sap/ui/core/format";
12
+ import { Locale } from "sap/ui/core";
13
+ import { Filter, FilterOperator } from "sap/ui/model";
14
+
15
+ /**
16
+ * Function to calculate a message state from a criticality value.
17
+ *
18
+ * @param {number|string} criticalityValue The criticality values.
19
+ * @returns {MessageType} Returns the corresponding MessageType
20
+ */
21
+ function messageTypeFromCriticality(criticalityValue: number | string): MessageType {
22
+ let criticalityProperty: MessageType;
23
+
24
+ switch (criticalityValue) {
25
+ case 1:
26
+ criticalityProperty = MessageType.Error;
27
+ break;
28
+ case 2:
29
+ criticalityProperty = MessageType.Warning;
30
+ break;
31
+ case 3:
32
+ criticalityProperty = MessageType.Success;
33
+ break;
34
+ case 5:
35
+ criticalityProperty = MessageType.Information;
36
+ break;
37
+ default:
38
+ criticalityProperty = MessageType.None;
39
+ }
40
+
41
+ return criticalityProperty;
42
+ }
43
+
44
+ /**
45
+ * Function to calculate the message state for a criticality calculation of type 'Target'.
46
+ *
47
+ * @param {number} kpiValue The value of the KPI to be tested against.
48
+ * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
49
+ * @returns {MessageType} Returns the corresponding MessageType
50
+ */
51
+ function messageTypeFromTargetCalculation(kpiValue: number, aThresholds: (number | undefined | null)[]): MessageType {
52
+ let criticalityProperty: MessageType;
53
+
54
+ if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
55
+ criticalityProperty = MessageType.Error;
56
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
57
+ criticalityProperty = MessageType.Warning;
58
+ } else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
59
+ criticalityProperty = MessageType.None;
60
+ } else if (aThresholds[5] !== undefined && aThresholds[5] !== null && kpiValue > aThresholds[5]) {
61
+ criticalityProperty = MessageType.Error;
62
+ } else if (aThresholds[4] !== undefined && aThresholds[4] !== null && kpiValue > aThresholds[4]) {
63
+ criticalityProperty = MessageType.Warning;
64
+ } else if (aThresholds[3] !== undefined && aThresholds[3] !== null && kpiValue > aThresholds[3]) {
65
+ criticalityProperty = MessageType.None;
66
+ } else {
67
+ criticalityProperty = MessageType.Success;
68
+ }
69
+
70
+ return criticalityProperty;
71
+ }
72
+
73
+ /**
74
+ * Function to calculate the message state for a criticality calculation of type 'Minimize'.
75
+ *
76
+ * @param {number} kpiValue The value of the KPI to be tested against.
77
+ * @param {number[]} aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
78
+ * @returns {MessageType} Returns the corresponding MessageType
79
+ */
80
+ function messageTypeFromMinimizeCalculation(kpiValue: number, aThresholds: (number | undefined | null)[]): MessageType {
81
+ let criticalityProperty: MessageType;
82
+
83
+ if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue > aThresholds[2]) {
84
+ criticalityProperty = MessageType.Error;
85
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue > aThresholds[1]) {
86
+ criticalityProperty = MessageType.Warning;
87
+ } else if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue > aThresholds[0]) {
88
+ criticalityProperty = MessageType.None;
89
+ } else {
90
+ criticalityProperty = MessageType.Success;
91
+ }
92
+
93
+ return criticalityProperty;
94
+ }
95
+
96
+ /**
97
+ * Function to calculate the message state for a criticality calculation of type 'Maximize'.
98
+ *
99
+ * @param {number} kpiValue The value of the KPI to be tested against.
100
+ * @param {number[]} aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
101
+ * @returns {MessageType} Returns the corresponding MessageType
102
+ */
103
+ function messageTypeFromMaximizeCalculation(kpiValue: number, aThresholds: (number | undefined | null)[]): MessageType {
104
+ let criticalityProperty: MessageType;
105
+
106
+ if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
107
+ criticalityProperty = MessageType.Error;
108
+ } else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
109
+ criticalityProperty = MessageType.Warning;
110
+ } else if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue < aThresholds[2]) {
111
+ criticalityProperty = MessageType.None;
112
+ } else {
113
+ criticalityProperty = MessageType.Success;
114
+ }
115
+
116
+ return criticalityProperty;
117
+ }
118
+
119
+ /**
120
+ * Creates a sap.ui.model.Filter from a filter definition.
121
+ *
122
+ * @param filterDefinition The filter definition
123
+ * @returns Returns a sap.ui.model.Filter from the definition, or undefined if the definition is empty (no ranges)
124
+ */
125
+ export function createFilterFromDefinition(filterDefinition: FilterDefinition): Filter | undefined {
126
+ if (filterDefinition.ranges.length === 0) {
127
+ return undefined;
128
+ } else if (filterDefinition.ranges.length === 1) {
129
+ return new Filter(
130
+ filterDefinition.propertyPath,
131
+ filterDefinition.ranges[0].operator as FilterOperator,
132
+ filterDefinition.ranges[0].rangeLow,
133
+ filterDefinition.ranges[0].rangeHigh
134
+ );
135
+ } else {
136
+ const aRangeFilters = filterDefinition.ranges.map(range => {
137
+ return new Filter(filterDefinition.propertyPath, range.operator as FilterOperator, range.rangeLow, range.rangeHigh);
138
+ });
139
+ return new Filter({
140
+ filters: aRangeFilters,
141
+ and: false
142
+ });
143
+ }
144
+ }
145
+
146
+ /**
147
+ * @class A controller extension for managing KPI in an AnalyticalListPage
148
+ *
149
+ * @name sap.fe.core.controllerextensions.KPIManagement
150
+ * @hideconstructor
151
+ *
152
+ * @private
153
+ * @since 1.93.0
154
+ */
155
+ @UI5Class("sap.fe.core.controllerextensions.KPIManagement", ControllerExtensionMetadata)
156
+ class KPIManagementControllerExtension extends ControllerExtension {
157
+ protected aKPIDefinitions?: KPIDefinition[];
158
+ protected oAppComponent!: any;
159
+
160
+ @Override()
161
+ public onInit(): void {
162
+ this.aKPIDefinitions = this.getKPIData();
163
+
164
+ if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
165
+ const oView = this.getView();
166
+ this.oAppComponent = CommonUtils.getAppComponent(oView);
167
+
168
+ // Create a JSON model to store KPI data
169
+ const oKPIModel = new JSONModel();
170
+ oView.setModel(oKPIModel, "kpiModel");
171
+
172
+ this.aKPIDefinitions.forEach(kpiDefinition => {
173
+ // Create the manifest for the KPI card and store it in the KPI model
174
+ const oCardManifest = {
175
+ "sap.app": {
176
+ id: "sap.fe",
177
+ type: "card"
178
+ },
179
+ "sap.ui": {
180
+ technology: "UI5"
181
+ },
182
+ "sap.card": {
183
+ type: "Analytical",
184
+ data: {
185
+ json: {}
186
+ },
187
+ header: {
188
+ type: "Numeric",
189
+ mainIndicator: {
190
+ number: "{mainValue}",
191
+ unit: "{mainUnit}"
192
+ },
193
+ title: "{cardTitle}"
194
+ },
195
+ content: {
196
+ plotArea: {
197
+ "dataLabel": {
198
+ "visible": false
199
+ },
200
+ "categoryAxisText": {
201
+ "visible": false
202
+ },
203
+ "valueAxisText": {
204
+ "visible": false
205
+ }
206
+ },
207
+ title: {
208
+ text: "{chartTitle}",
209
+ visible: true,
210
+ alignment: "Left"
211
+ },
212
+ measureAxis: "valueAxis",
213
+ dimensionAxis: "categoryAxis",
214
+ data: {
215
+ path: "/chartData"
216
+ }
217
+ }
218
+ }
219
+ };
220
+
221
+ oKPIModel.setProperty("/" + kpiDefinition.id, {
222
+ manifest: oCardManifest
223
+ });
224
+
225
+ // Load tag data for the KPI
226
+ this.loadKPITagData(kpiDefinition).catch(function(err: any) {
227
+ Log.error(err);
228
+ });
229
+ });
230
+ }
231
+ }
232
+
233
+ @Override()
234
+ public onExit(): void {
235
+ const oKPIModel = this.getView().getModel("kpiModel") as JSONModel;
236
+
237
+ if (oKPIModel) {
238
+ oKPIModel.destroy();
239
+ }
240
+ }
241
+
242
+ private getKPIData(): KPIDefinition[] | undefined {
243
+ const oView = this.getView(),
244
+ sCustomData = oView.getContent()[0].data("KPIData");
245
+
246
+ if (sCustomData) {
247
+ const vData = typeof sCustomData === "string" ? JSON.parse(sCustomData) : sCustomData;
248
+ if ("customData" in vData) {
249
+ return vData["customData"];
250
+ } else {
251
+ return vData;
252
+ }
253
+ } else {
254
+ return undefined;
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Loads tag data for a KPI.
260
+ *
261
+ * @param {KPIDefinition} kpiDefinition The definition of the KPI.
262
+ * @returns {Promise} Returns the Promise that is resolved when data is loaded.
263
+ */
264
+ protected loadKPITagData(kpiDefinition: KPIDefinition): any {
265
+ const oModel = this.oAppComponent.getModel();
266
+ const oKPIModel = this.getView().getModel("kpiModel") as JSONModel;
267
+ const oListBinding = oModel.bindList("/" + kpiDefinition.entitySet);
268
+ const oAggregate: Record<string, { unit?: string }> = {};
269
+
270
+ // Main value + currency/unit
271
+ if (kpiDefinition.datapoint.unit?.isPath) {
272
+ oAggregate[kpiDefinition.datapoint.propertyPath] = { unit: kpiDefinition.datapoint.unit.value };
273
+ } else {
274
+ oAggregate[kpiDefinition.datapoint.propertyPath] = {};
275
+ }
276
+
277
+ // Property for criticality
278
+ if (kpiDefinition.datapoint.criticalityPath) {
279
+ oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
280
+ }
281
+ oListBinding.setAggregation({ aggregate: oAggregate });
282
+
283
+ // Manage SelectionVariant filters
284
+ if (kpiDefinition.selectionVariantFilterDefinitions?.length) {
285
+ const aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition);
286
+ oListBinding.filter(aFilters);
287
+ }
288
+
289
+ return oListBinding.requestContexts(0, 1).then((aContexts: Context[]) => {
290
+ if (aContexts.length) {
291
+ const currentLocale = new Locale(
292
+ sap.ui
293
+ .getCore()
294
+ .getConfiguration()
295
+ .getLanguage()
296
+ );
297
+ const rawUnit = kpiDefinition.datapoint.unit?.isPath
298
+ ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value)
299
+ : kpiDefinition.datapoint.unit?.value;
300
+
301
+ if (kpiDefinition.datapoint.unit && !rawUnit) {
302
+ // A unit/currency is defined, but its value is undefined --> multi-unit situation
303
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", "*");
304
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", "*");
305
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", undefined);
306
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
307
+ } else {
308
+ const isPercentage = kpiDefinition.datapoint.unit?.isCurrency === false && rawUnit === "%";
309
+
310
+ // Main KPI value
311
+ const rawValue = Number.parseFloat(aContexts[0].getProperty(kpiDefinition.datapoint.propertyPath));
312
+ const kpiValue = NumberFormat.getFloatInstance(
313
+ {
314
+ style: isPercentage ? undefined : "short",
315
+ minFractionDigits: 0,
316
+ maxFractionDigits: 1,
317
+ showScale: !isPercentage
318
+ },
319
+ currentLocale
320
+ ).format(rawValue);
321
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", kpiValue);
322
+ const kpiValueUnscaled = NumberFormat.getFloatInstance(
323
+ {
324
+ maxFractionDigits: 2,
325
+ showScale: false,
326
+ groupingEnabled: true
327
+ },
328
+ currentLocale
329
+ ).format(rawValue);
330
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", kpiValueUnscaled);
331
+
332
+ // Unit or currency
333
+ if (kpiDefinition.datapoint.unit && rawUnit) {
334
+ if (kpiDefinition.datapoint.unit.isCurrency) {
335
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", rawUnit);
336
+ } else {
337
+ // In case of unit of measure, we have to format it properly
338
+ const kpiUnit = NumberFormat.getUnitInstance({ showNumber: false }, currentLocale).format(rawValue, rawUnit);
339
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", kpiUnit);
340
+ }
341
+ }
342
+
343
+ // Criticality
344
+ if (kpiDefinition.datapoint.criticalityValue) {
345
+ // Criticality is a fixed value
346
+ oKPIModel.setProperty(
347
+ "/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality",
348
+ kpiDefinition.datapoint.criticalityValue
349
+ );
350
+ } else if (kpiDefinition.datapoint.criticalityPath) {
351
+ // Criticality comes from another property (via a path)
352
+ const criticalityValue = messageTypeFromCriticality(
353
+ aContexts[0].getProperty(kpiDefinition.datapoint.criticalityPath)
354
+ );
355
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
356
+ } else if (
357
+ kpiDefinition.datapoint.criticalityCalculationThresholds &&
358
+ kpiDefinition.datapoint.criticalityCalculationMode
359
+ ) {
360
+ // Criticality calculation
361
+ let calculatedCriticality: MessageType;
362
+ switch (kpiDefinition.datapoint.criticalityCalculationMode) {
363
+ case "UI.ImprovementDirectionType/Target":
364
+ calculatedCriticality = messageTypeFromTargetCalculation(
365
+ rawValue,
366
+ kpiDefinition.datapoint.criticalityCalculationThresholds
367
+ );
368
+ break;
369
+
370
+ case "UI.ImprovementDirectionType/Minimize":
371
+ calculatedCriticality = messageTypeFromMinimizeCalculation(
372
+ rawValue,
373
+ kpiDefinition.datapoint.criticalityCalculationThresholds
374
+ );
375
+ break;
376
+
377
+ case "UI.ImprovementDirectionType/Maximize":
378
+ default:
379
+ calculatedCriticality = messageTypeFromMaximizeCalculation(
380
+ rawValue,
381
+ kpiDefinition.datapoint.criticalityCalculationThresholds
382
+ );
383
+ break;
384
+ }
385
+ oKPIModel.setProperty(
386
+ "/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality",
387
+ calculatedCriticality
388
+ );
389
+ } else {
390
+ // No criticality
391
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
392
+ }
393
+ }
394
+ }
395
+ });
396
+ }
397
+ }
398
+
399
+ export default KPIManagementControllerExtension;
@@ -72,8 +72,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
72
72
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
73
73
  // @ts-ignore
74
74
  delete this._oAppComponent;
75
-
76
- this._oContainer.removeEventDelegate(this._fnContainerDelegate);
75
+ this._oContainer && this._oContainer.removeEventDelegate(this._fnContainerDelegate);
77
76
  }
78
77
  }, {
79
78
  key: "waitFor",
@@ -400,4 +399,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
400
399
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitFor", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitFor"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "isPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEventOnce", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEventOnce"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "detachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "detachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isContextExpected", [Private, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "isContextExpected"), _class2.prototype)), _class2)) || _class);
401
400
  return PageReadyControllerExtension;
402
401
  }, false);
403
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9vRXZlbnRQcm92aWRlciIsIkV2ZW50UHJvdmlkZXIiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImF0dGFjaENvbnRhaW5lckRlZmluZWQiLCJvRXZlbnQiLCJyZWdpc3RlckNvbnRhaW5lciIsImdldFBhcmFtZXRlciIsIl9vQ29udGFpbmVyIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9mbkNvbnRhaW5lckRlbGVnYXRlIiwib1Byb21pc2UiLCJmaW5hbGx5Iiwic2V0VGltZW91dCIsImNhdGNoIiwiX2JJc1BhZ2VSZWFkeSIsImNoZWNrUGFnZVJlYWR5RGVib3VuY2VkIiwib0JpbmRpbmdDb250ZXh0IiwiX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCIsImFCb3VuZEVsZW1lbnRzIiwiYU5vdEJvdW5kTURDVGFibGVzIiwiaVJlcXVlc3RlZCIsImlSZWNlaXZlZCIsImZuUmVxdWVzdGVkIiwiZ2V0U291cmNlIiwiZGV0YWNoRGF0YVJlcXVlc3RlZCIsImJEYXRhUmVjZWl2ZWQiLCJmblJlY2VpdmVkIiwic0dyb3VwSWQiLCJmaXJlRXZlbnQiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJmblNlYXJjaCIsImFNRENUYWJsZXMiLCJmaWx0ZXIiLCJvRWxlbSIsInNJZCIsImdldEZpbHRlciIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsIkxvZyIsImVycm9yIiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJ1bmRlZmluZWQiLCJiSGFzQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIm9FbGVtZW50IiwiZGV0YWNoRXZlbnQiLCJtYWluT2JqZWN0QmluZGluZyIsImdldEJpbmRpbmciLCJhVGFibGVJbml0aWFsaXplZFByb21pc2VzIiwiZmluZEFnZ3JlZ2F0ZWRPYmplY3RzIiwib09iamVjdEJpbmRpbmciLCJnZXRPYmplY3RCaW5kaW5nIiwiYUJpbmRpbmdLZXlzIiwiT2JqZWN0Iiwia2V5cyIsIm1CaW5kaW5nSW5mb3MiLCJsZW5ndGgiLCJzUHJvcGVydHlOYW1lIiwib0xpc3RCaW5kaW5nIiwiYmluZGluZyIsImlzQSIsImJUYWJsZXNMb2FkZWQiLCJpbml0aWFsaXplZCIsInRoZW4iLCJvRXJyb3IiLCJhdHRhY2hFdmVudCIsIlByb21pc2UiLCJhbGwiLCJpbmZvIiwicmVzb2x2ZSIsImlzUGFnZVJlYWR5Iiwic0V2ZW50SWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJvQ29udGFpbmVyIiwib25CZWZvcmVTaG93IiwiYlNob3duIiwib25CZWZvcmVIaWRlIiwib25BZnRlclNob3ciLCJfY2hlY2tQYWdlUmVhZHkiLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5VGltZXIiLCJjbGVhclRpbWVvdXQiLCJiRnJvbU5hdiIsImZuVUlVcGRhdGVkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0VUlEaXJ0eSIsIl9iV2FpdGluZ0ZvclJlZnJlc2giLCJjaGVja1VJVXBkYXRlZCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BVU1BLDRCLFdBRExD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S0FBa0IsQ0FBdEYsRUFBeUY7QUFDL0YsbUJBQUt5RyxtQkFBTCxHQUEyQixJQUEzQjtBQUNBSixjQUFBQSxHQUFHLENBQUNDLEVBQUosQ0FBT0MsT0FBUCxHQUFpQnZCLFdBQWpCLENBQTZCLFdBQTdCLEVBQTBDb0IsV0FBMUM7QUFDQS9FLGNBQUFBLFVBQVUsQ0FBQ3FGLGNBQUQsRUFBaUIsR0FBakIsQ0FBVjtBQUNBLGFBSk0sTUFJQSxJQUFJLENBQUMsS0FBS0QsbUJBQVYsRUFBK0I7QUFDckM7QUFDQTtBQUNBLG1CQUFLbEYsYUFBTCxHQUFxQixJQUFyQjs7QUFDQSxtQkFBS3RCLGVBQUwsQ0FBcUJvQyxTQUFyQixDQUErQixXQUEvQjtBQUNBO0FBQ0Q7QUFDRDs7OztJQWhWeUNzRSxtQixpV0F3Q3pDQyxNLEVBQ0FDLEsseW9CQTRLQUQsTSxFQUNBQyxLLHlKQUtBRCxNLEVBQ0FDLEssNkpBa0JBRCxNLEVBQ0FDLEssMkpBS0FELE0sRUFDQUMsSyx1SkFLQUQsTSxFQUNBQyxLLDZKQXdCQUMsTztTQWdFYXJILDRCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uLCBPdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBBcHBDb21wb25lbnQsIENvbW1vblV0aWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBNYW5hZ2VkT2JqZWN0LCBFdmVudFByb3ZpZGVyIH0gZnJvbSBcInNhcC91aS9iYXNlXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIEV4dGVuc2libGUsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcblxuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuUGFnZVJlYWR5XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFBhZ2VSZWFkeUNvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb0V2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IGFueTtcblx0cHJpdmF0ZSBfb0NvbnRhaW5lciE6IGFueTtcblx0cHJpdmF0ZSBfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkITogYm9vbGVhbjtcblx0cHJpdmF0ZSBfZm5Db250YWluZXJEZWxlZ2F0ZTogYW55O1xuXHRwcml2YXRlIF9uYldhaXRzITogbnVtYmVyO1xuXHRwcml2YXRlIF9iSXNQYWdlUmVhZHkhOiBib29sZWFuO1xuXHRwcml2YXRlIF9iV2FpdGluZ0ZvclJlZnJlc2ghOiBib29sZWFuO1xuXHRwcml2YXRlIGJTaG93biE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkhhc0NvbnRleHQhOiBib29sZWFuO1xuXHRwcml2YXRlIGJEYXRhUmVjZWl2ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgYlRhYmxlc0xvYWRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBwYWdlUmVhZHlUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9uYldhaXRzID0gMDtcblx0XHR0aGlzLl9vRXZlbnRQcm92aWRlciA9IG5ldyBFdmVudFByb3ZpZGVyKCk7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KTtcblxuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5hdHRhY2hDb250YWluZXJEZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5hdHRhY2hDb250YWluZXJEZWZpbmVkKChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB0aGlzLnJlZ2lzdGVyQ29udGFpbmVyKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250YWluZXJcIikpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5yZWdpc3RlckNvbnRhaW5lcih0aGlzLl9vVmlldyk7XG5cdFx0fVxuXHR9XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uRXhpdCgpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGRlbGV0ZSB0aGlzLl9vQXBwQ29tcG9uZW50O1xuXHRcdHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIXRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCkge1xuXHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gdHJ1ZTtcblx0XHRcdGxldCBhQm91bmRFbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFOb3RCb3VuZE1EQ1RhYmxlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBpUmVxdWVzdGVkID0gMDtcblx0XHRcdGxldCBpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0Y29uc3QgZm5SZXF1ZXN0ZWQgPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdGlSZXF1ZXN0ZWQrKztcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5SZWNlaXZlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdHN3aXRjaCAob0V2ZW50LmdldFNvdXJjZSgpLnNHcm91cElkKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLldvcmtlcnNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcIndvcmtlcnNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLkhlcm9lc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdH1cblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmRldGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0aVJlY2VpdmVkKys7XG5cdFx0XHRcdGlmIChpUmVjZWl2ZWQgPT09IGlSZXF1ZXN0ZWQgJiYgaVJlcXVlc3RlZCAhPT0gMCkge1xuXHRcdFx0XHRcdGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0XHRcdGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblNlYXJjaCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFNRENUYWJsZXMgPSBhTm90Qm91bmRNRENUYWJsZXMuZmlsdGVyKG9FbGVtID0+IHtcblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLnNJZCA9PT0gb0VsZW0uZ2V0RmlsdGVyKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhTURDVGFibGVzLmZvckVhY2goKG9NRENUYWJsZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob1Jvd0JpbmRpbmcpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGF0dGFjaCBldmVudHMgdG8gdW5ib3VuZCB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHR0aGlzLl9vVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9FbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb09iamVjdEJpbmRpbmcgPSBvRWxlbWVudC5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvT2JqZWN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBvYmplY3QgYmluZGluZyAobW9zdGx5IHVzZWQgb24gb2JqZWN0IHBhZ2VzKVxuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9PYmplY3RCaW5kaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBhQmluZGluZ0tleXMgPSBPYmplY3Qua2V5cyhvRWxlbWVudC5tQmluZGluZ0luZm9zKTtcblx0XHRcdFx0XHRpZiAoYUJpbmRpbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFCaW5kaW5nS2V5cy5mb3JFYWNoKHNQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvRWxlbWVudC5tQmluZGluZ0luZm9zW3NQcm9wZXJ0eU5hbWVdLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBsaXN0IGJpbmRpbmcsIGdvb2QgZm9yIGJhc2ljIHRhYmxlcywgcHJvYmxlbWF0aWMgZm9yIE1EQywgc2VlIGFib3ZlXG5cdFx0XHRcdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhpcyBpcyBkaXJ0eSBidXQgTURDIFRhYmxlIGhhcyBhIHdlaXJkIGxvYWRpbmcgbGlmZWN5Y2xlXG5cdFx0XHRcdGlmIChvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRcdGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdG9FbGVtZW50XG5cdFx0XHRcdFx0XHRcdC5pbml0aWFsaXplZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtZW50LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFOb3RCb3VuZE1EQ1RhYmxlcy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbHRlckJhclwiKSkge1xuXHRcdFx0XHRcdG9FbGVtZW50LmF0dGFjaEV2ZW50KFwic2VhcmNoXCIsIGZuU2VhcmNoKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCBvbmUgb3IgbXVsdGlwbGUgdGFibGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGlzUGFnZVJlYWR5KCkge1xuXHRcdHJldHVybiB0aGlzLl9iSXNQYWdlUmVhZHk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgd2FpdFBhZ2VSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkOiBzdHJpbmcsIG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IEZ1bmN0aW9uLCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChzRXZlbnRJZCwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGRldGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIGZuRnVuY3Rpb246IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChzRXZlbnRJZCwgZm5GdW5jdGlvbik7XG5cdH1cblx0cHJpdmF0ZSByZWdpc3RlckNvbnRhaW5lcihvQ29udGFpbmVyOiBNYW5hZ2VkT2JqZWN0KSB7XG5cdFx0dGhpcy5fb0NvbnRhaW5lciA9IG9Db250YWluZXI7XG5cdFx0dGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkJlZm9yZUhpZGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0b25BZnRlclNob3c6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSh0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuX29Db250YWluZXIuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdHB1YmxpYyBpc0NvbnRleHRFeHBlY3RlZCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKSB7XG5cdFx0aWYgKHRoaXMucGFnZVJlYWR5VGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnBhZ2VSZWFkeVRpbWVyKTtcblx0XHR9XG5cdFx0dGhpcy5wYWdlUmVhZHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHVibGljIF9jaGVja1BhZ2VSZWFkeShiRnJvbU5hdjogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgZm5VSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHQvLyBXYWl0IHVudGlsIHRoZSBVSSBpcyBubyBsb25nZXIgZGlydHlcblx0XHRcdGlmICghc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5kZXRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0XHR9LCAyMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEluIGNhc2UgVUlVcGRhdGUgZG9lcyBub3QgZ2V0IGNhbGxlZCwgY2hlY2sgaWYgVUkgaXMgbm90IGRpcnR5IGFuZCB0aGVuIGNhbGwgX2NoZWNrUGFnZVJlYWR5XG5cdFx0Y29uc3QgY2hlY2tVSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5iU2hvd24gJiZcblx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdCghdGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpIHx8IHRoaXMuYkhhc0NvbnRleHQpIC8vIEVpdGhlciBubyBjb250ZXh0IGlzIGV4cGVjdGVkIG9yIHRoZXJlIGlzIG9uZVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuYkRhdGFSZWNlaXZlZCA9PT0gdHJ1ZSAmJiAhYkZyb21OYXYgJiYgIXRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCAmJiBzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQvLyBJZiB3ZSByZXF1ZXN0ZWQgZGF0YSB3ZSBnZXQgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBhcnJpdmVkLCBzbyBiZWZvcmUgdGhlIG5leHQgcmVuZGVyaW5nIHRpY2tcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmF0dGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAoKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHx8IHRoaXMuX25iV2FpdHMgIT09IDApIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
402
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9vRXZlbnRQcm92aWRlciIsIkV2ZW50UHJvdmlkZXIiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImF0dGFjaENvbnRhaW5lckRlZmluZWQiLCJvRXZlbnQiLCJyZWdpc3RlckNvbnRhaW5lciIsImdldFBhcmFtZXRlciIsIl9vQ29udGFpbmVyIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9mbkNvbnRhaW5lckRlbGVnYXRlIiwib1Byb21pc2UiLCJmaW5hbGx5Iiwic2V0VGltZW91dCIsImNhdGNoIiwiX2JJc1BhZ2VSZWFkeSIsImNoZWNrUGFnZVJlYWR5RGVib3VuY2VkIiwib0JpbmRpbmdDb250ZXh0IiwiX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCIsImFCb3VuZEVsZW1lbnRzIiwiYU5vdEJvdW5kTURDVGFibGVzIiwiaVJlcXVlc3RlZCIsImlSZWNlaXZlZCIsImZuUmVxdWVzdGVkIiwiZ2V0U291cmNlIiwiZGV0YWNoRGF0YVJlcXVlc3RlZCIsImJEYXRhUmVjZWl2ZWQiLCJmblJlY2VpdmVkIiwic0dyb3VwSWQiLCJmaXJlRXZlbnQiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJmblNlYXJjaCIsImFNRENUYWJsZXMiLCJmaWx0ZXIiLCJvRWxlbSIsInNJZCIsImdldEZpbHRlciIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsIkxvZyIsImVycm9yIiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJ1bmRlZmluZWQiLCJiSGFzQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIm9FbGVtZW50IiwiZGV0YWNoRXZlbnQiLCJtYWluT2JqZWN0QmluZGluZyIsImdldEJpbmRpbmciLCJhVGFibGVJbml0aWFsaXplZFByb21pc2VzIiwiZmluZEFnZ3JlZ2F0ZWRPYmplY3RzIiwib09iamVjdEJpbmRpbmciLCJnZXRPYmplY3RCaW5kaW5nIiwiYUJpbmRpbmdLZXlzIiwiT2JqZWN0Iiwia2V5cyIsIm1CaW5kaW5nSW5mb3MiLCJsZW5ndGgiLCJzUHJvcGVydHlOYW1lIiwib0xpc3RCaW5kaW5nIiwiYmluZGluZyIsImlzQSIsImJUYWJsZXNMb2FkZWQiLCJpbml0aWFsaXplZCIsInRoZW4iLCJvRXJyb3IiLCJhdHRhY2hFdmVudCIsIlByb21pc2UiLCJhbGwiLCJpbmZvIiwicmVzb2x2ZSIsImlzUGFnZVJlYWR5Iiwic0V2ZW50SWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJvQ29udGFpbmVyIiwib25CZWZvcmVTaG93IiwiYlNob3duIiwib25CZWZvcmVIaWRlIiwib25BZnRlclNob3ciLCJfY2hlY2tQYWdlUmVhZHkiLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5VGltZXIiLCJjbGVhclRpbWVvdXQiLCJiRnJvbU5hdiIsImZuVUlVcGRhdGVkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0VUlEaXJ0eSIsIl9iV2FpdGluZ0ZvclJlZnJlc2giLCJjaGVja1VJVXBkYXRlZCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BVU1BLDRCLFdBRExD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QTlCLElBQWdFLEtBQUt4RyxRQUFMLEtBQWtCLENBQXRGLEVBQXlGO0FBQy9GLG1CQUFLeUcsbUJBQUwsR0FBMkIsSUFBM0I7QUFDQUosY0FBQUEsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJ2QixXQUFqQixDQUE2QixXQUE3QixFQUEwQ29CLFdBQTFDO0FBQ0EvRSxjQUFBQSxVQUFVLENBQUNxRixjQUFELEVBQWlCLEdBQWpCLENBQVY7QUFDQSxhQUpNLE1BSUEsSUFBSSxDQUFDLEtBQUtELG1CQUFWLEVBQStCO0FBQ3JDO0FBQ0E7QUFDQSxtQkFBS2xGLGFBQUwsR0FBcUIsSUFBckI7O0FBQ0EsbUJBQUt0QixlQUFMLENBQXFCb0MsU0FBckIsQ0FBK0IsV0FBL0I7QUFDQTtBQUNEO0FBQ0Q7Ozs7SUFoVnlDc0UsbUIsaVdBd0N6Q0MsTSxFQUNBQyxLLHlvQkE0S0FELE0sRUFDQUMsSyx5SkFLQUQsTSxFQUNBQyxLLDZKQWtCQUQsTSxFQUNBQyxLLDJKQUtBRCxNLEVBQ0FDLEssdUpBS0FELE0sRUFDQUMsSyw2SkF3QkFDLE87U0FnRWFySCw0QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiwgT3ZlcnJpZGVFeGVjdXRpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50LCBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgTWFuYWdlZE9iamVjdCwgRXZlbnRQcm92aWRlciB9IGZyb20gXCJzYXAvdWkvYmFzZVwiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMsIEZpbmFsLCBFeHRlbnNpYmxlLCBQcml2YXRlIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlBhZ2VSZWFkeVwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29FdmVudFByb3ZpZGVyITogRXZlbnRQcm92aWRlcjtcblx0cHJpdmF0ZSBfb1ZpZXc6IGFueTtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBhbnk7XG5cdHByaXZhdGUgX29Db250YWluZXIhOiBhbnk7XG5cdHByaXZhdGUgX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2ZuQ29udGFpbmVyRGVsZWdhdGU6IGFueTtcblx0cHJpdmF0ZSBfbmJXYWl0cyE6IG51bWJlcjtcblx0cHJpdmF0ZSBfYklzUGFnZVJlYWR5ITogYm9vbGVhbjtcblx0cHJpdmF0ZSBfYldhaXRpbmdGb3JSZWZyZXNoITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiU2hvd24hOiBib29sZWFuO1xuXHRwcml2YXRlIGJIYXNDb250ZXh0ITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiRGF0YVJlY2VpdmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGJUYWJsZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcGFnZVJlYWR5VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fbmJXYWl0cyA9IDA7XG5cdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIgPSBuZXcgRXZlbnRQcm92aWRlcigpO1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldyk7XG5cblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCgob0V2ZW50OiBVSTVFdmVudCkgPT4gdGhpcy5yZWdpc3RlckNvbnRhaW5lcihvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGFpbmVyXCIpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVnaXN0ZXJDb250YWluZXIodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIXRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCkge1xuXHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gdHJ1ZTtcblx0XHRcdGxldCBhQm91bmRFbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFOb3RCb3VuZE1EQ1RhYmxlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBpUmVxdWVzdGVkID0gMDtcblx0XHRcdGxldCBpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0Y29uc3QgZm5SZXF1ZXN0ZWQgPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdGlSZXF1ZXN0ZWQrKztcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5SZWNlaXZlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdHN3aXRjaCAob0V2ZW50LmdldFNvdXJjZSgpLnNHcm91cElkKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLldvcmtlcnNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcIndvcmtlcnNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLkhlcm9lc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdH1cblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmRldGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0aVJlY2VpdmVkKys7XG5cdFx0XHRcdGlmIChpUmVjZWl2ZWQgPT09IGlSZXF1ZXN0ZWQgJiYgaVJlcXVlc3RlZCAhPT0gMCkge1xuXHRcdFx0XHRcdGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0XHRcdGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblNlYXJjaCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFNRENUYWJsZXMgPSBhTm90Qm91bmRNRENUYWJsZXMuZmlsdGVyKG9FbGVtID0+IHtcblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLnNJZCA9PT0gb0VsZW0uZ2V0RmlsdGVyKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhTURDVGFibGVzLmZvckVhY2goKG9NRENUYWJsZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob1Jvd0JpbmRpbmcpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGF0dGFjaCBldmVudHMgdG8gdW5ib3VuZCB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHR0aGlzLl9vVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9FbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb09iamVjdEJpbmRpbmcgPSBvRWxlbWVudC5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvT2JqZWN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBvYmplY3QgYmluZGluZyAobW9zdGx5IHVzZWQgb24gb2JqZWN0IHBhZ2VzKVxuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9PYmplY3RCaW5kaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBhQmluZGluZ0tleXMgPSBPYmplY3Qua2V5cyhvRWxlbWVudC5tQmluZGluZ0luZm9zKTtcblx0XHRcdFx0XHRpZiAoYUJpbmRpbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFCaW5kaW5nS2V5cy5mb3JFYWNoKHNQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvRWxlbWVudC5tQmluZGluZ0luZm9zW3NQcm9wZXJ0eU5hbWVdLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBsaXN0IGJpbmRpbmcsIGdvb2QgZm9yIGJhc2ljIHRhYmxlcywgcHJvYmxlbWF0aWMgZm9yIE1EQywgc2VlIGFib3ZlXG5cdFx0XHRcdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhpcyBpcyBkaXJ0eSBidXQgTURDIFRhYmxlIGhhcyBhIHdlaXJkIGxvYWRpbmcgbGlmZWN5Y2xlXG5cdFx0XHRcdGlmIChvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRcdGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdG9FbGVtZW50XG5cdFx0XHRcdFx0XHRcdC5pbml0aWFsaXplZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtZW50LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFOb3RCb3VuZE1EQ1RhYmxlcy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbHRlckJhclwiKSkge1xuXHRcdFx0XHRcdG9FbGVtZW50LmF0dGFjaEV2ZW50KFwic2VhcmNoXCIsIGZuU2VhcmNoKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCBvbmUgb3IgbXVsdGlwbGUgdGFibGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGlzUGFnZVJlYWR5KCkge1xuXHRcdHJldHVybiB0aGlzLl9iSXNQYWdlUmVhZHk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgd2FpdFBhZ2VSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkOiBzdHJpbmcsIG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IEZ1bmN0aW9uLCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChzRXZlbnRJZCwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGRldGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIGZuRnVuY3Rpb246IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChzRXZlbnRJZCwgZm5GdW5jdGlvbik7XG5cdH1cblx0cHJpdmF0ZSByZWdpc3RlckNvbnRhaW5lcihvQ29udGFpbmVyOiBNYW5hZ2VkT2JqZWN0KSB7XG5cdFx0dGhpcy5fb0NvbnRhaW5lciA9IG9Db250YWluZXI7XG5cdFx0dGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkJlZm9yZUhpZGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0b25BZnRlclNob3c6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSh0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuX29Db250YWluZXIuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdHB1YmxpYyBpc0NvbnRleHRFeHBlY3RlZCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKSB7XG5cdFx0aWYgKHRoaXMucGFnZVJlYWR5VGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnBhZ2VSZWFkeVRpbWVyKTtcblx0XHR9XG5cdFx0dGhpcy5wYWdlUmVhZHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHVibGljIF9jaGVja1BhZ2VSZWFkeShiRnJvbU5hdjogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgZm5VSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHQvLyBXYWl0IHVudGlsIHRoZSBVSSBpcyBubyBsb25nZXIgZGlydHlcblx0XHRcdGlmICghc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5kZXRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0XHR9LCAyMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEluIGNhc2UgVUlVcGRhdGUgZG9lcyBub3QgZ2V0IGNhbGxlZCwgY2hlY2sgaWYgVUkgaXMgbm90IGRpcnR5IGFuZCB0aGVuIGNhbGwgX2NoZWNrUGFnZVJlYWR5XG5cdFx0Y29uc3QgY2hlY2tVSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5iU2hvd24gJiZcblx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdCghdGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpIHx8IHRoaXMuYkhhc0NvbnRleHQpIC8vIEVpdGhlciBubyBjb250ZXh0IGlzIGV4cGVjdGVkIG9yIHRoZXJlIGlzIG9uZVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuYkRhdGFSZWNlaXZlZCA9PT0gdHJ1ZSAmJiAhYkZyb21OYXYgJiYgIXRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCAmJiBzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQvLyBJZiB3ZSByZXF1ZXN0ZWQgZGF0YSB3ZSBnZXQgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBhcnJpdmVkLCBzbyBiZWZvcmUgdGhlIG5leHQgcmVuZGVyaW5nIHRpY2tcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmF0dGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAoKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHx8IHRoaXMuX25iV2FpdHMgIT09IDApIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
@@ -45,7 +45,7 @@ class PageReadyControllerExtension extends ControllerExtension {
45
45
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
46
46
  // @ts-ignore
47
47
  delete this._oAppComponent;
48
- this._oContainer.removeEventDelegate(this._fnContainerDelegate);
48
+ this._oContainer && this._oContainer.removeEventDelegate(this._fnContainerDelegate);
49
49
  }
50
50
 
51
51
  @Public