@sapui5/sap.fe.base 1.128.0 → 1.129.1

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.
@@ -1,10 +1,12 @@
1
1
  import ObjectPath from "sap/base/util/ObjectPath";
2
+ import deepClone from "sap/base/util/deepClone";
2
3
  import merge from "sap/base/util/merge";
3
4
  import uid from "sap/base/util/uid";
4
5
  import { hookable } from "sap/fe/base/HookSupport";
5
6
  import type { Ref } from "sap/fe/base/jsx-runtime/jsx";
6
7
  import type UI5Event from "sap/ui/base/Event";
7
8
  import type ManagedObject from "sap/ui/base/ManagedObject";
9
+ import type { AggregationBindingInfo } from "sap/ui/base/ManagedObject";
8
10
  import Metadata from "sap/ui/base/Metadata";
9
11
  import BaseObject from "sap/ui/base/Object";
10
12
  import type Control from "sap/ui/core/Control";
@@ -13,6 +15,8 @@ import type UI5Element from "sap/ui/core/Element";
13
15
  import type ControllerExtension from "sap/ui/core/mvc/ControllerExtension";
14
16
  import ControllerMetadata from "sap/ui/core/mvc/ControllerMetadata";
15
17
  import type OverrideExecution from "sap/ui/core/mvc/OverrideExecution";
18
+ import type Context from "sap/ui/model/Context";
19
+ import JSONModel from "sap/ui/model/json/JSONModel";
16
20
 
17
21
  type OverrideDefinition = Record<string, Function>;
18
22
  type UI5ControllerMethodDefinition = {
@@ -65,10 +69,13 @@ export type UI5ControlMetadataDefinition = {
65
69
  config?: {
66
70
  fullWidth?: boolean;
67
71
  };
72
+ stateProperty?: string;
73
+ statePropertyDefaultValue?: unknown;
68
74
  manifest?: string | unknown;
69
75
  returnTypes?: string[];
70
76
  buildingBlockMetadata?: unknown;
71
77
  };
78
+ export type AccessorDescriptor<T> = TypedPropertyDescriptor<T> & { initializer?: () => T };
72
79
  type UI5ControllerDefinition = {
73
80
  override?: { extension?: Record<string, OverrideDefinition> } & {
74
81
  [k: string]: Function;
@@ -110,9 +117,12 @@ export type PropertiesOf<T, K extends keyof T | undefined = undefined> = Partial
110
117
  export type ConvertContextToString<T> = {
111
118
  [K in keyof T]: K extends "metaPath" | "contextPath" ? string : T[K];
112
119
  };
113
- export type StrictPropertiesOf<T, K extends keyof T | undefined = undefined> = Pick<T, ControlPropertyNames<T>> &
114
- (K extends keyof T ? Pick<T, K> : {}) &
115
- $ControlSettings;
120
+ type ContextToString<T> = {
121
+ [K in keyof T]: T[K] extends Context | undefined ? string | undefined : T[K];
122
+ };
123
+
124
+ export type PropertiesOfBuildingBlock<T> = ContextToString<PropertiesOf<T>>;
125
+ export type StrictPropertiesOf<T> = Pick<T, ControlPropertyNames<T>>;
116
126
  export type UI5Accessors<T> = {
117
127
  // Add all the getXXX method, might add too much as I'm not filtering on actual properties...
118
128
  [P in keyof Required<T> as `get${Capitalize<string & P>}`]: () => T[P];
@@ -149,7 +159,6 @@ const ensureMetadata = function (target: UI5ControllerDefinition | UI5ControlDef
149
159
 
150
160
  /**
151
161
  * Method that will find the correct API object based on the current control hierarchy.
152
- *
153
162
  * @param target
154
163
  * @returns The proper getAPI function for this constructor
155
164
  */
@@ -191,7 +200,6 @@ function prepareGetAPIFunction(target: UI5APIControl) {
191
200
 
192
201
  /**
193
202
  * Ensures that when an xmlEventHandler is defined, the `getAPI` function is properly assigned.
194
- *
195
203
  * @param target The class constructor that should hold the static functions
196
204
  */
197
205
  const ensureGetAPI = function (target: UI5APIControl): void {
@@ -208,11 +216,54 @@ const ensureGetAPI = function (target: UI5APIControl): void {
208
216
  }
209
217
  };
210
218
 
219
+ export type StateOf<T> = {
220
+ [K in keyof T]: T[K] extends Array<infer U> ? ReadonlyArray<U> & Partial<U> : T[K];
221
+ };
222
+ export type BindingInfoHolder = {
223
+ __bindingInfo: {
224
+ path: string;
225
+ model: string;
226
+ };
227
+ };
228
+
229
+ /**
230
+ * Creates the binding info for an array property coming from the state.
231
+ * @param stateProperty
232
+ * @returns The aggregation binding info
233
+ */
234
+ export function bindStateArray(stateProperty: readonly object[]): AggregationBindingInfo | undefined {
235
+ if ((stateProperty as unknown as BindingInfoHolder).__bindingInfo !== undefined) {
236
+ return {
237
+ path: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.path,
238
+ model: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.model
239
+ };
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Allows to define a property that will hold the control state.
245
+ *
246
+ * Properties defined with this decorator will be automatically bound to the control state when used in JSX.
247
+ * Arrays need to be bound using the `bindState` function.
248
+ * @experimental
249
+ * @returns A property decorator
250
+ */
251
+ export function defineState(): PropertyDecorator {
252
+ return function (target: UI5ControlDefinition, propertyKey: string, propertyDescriptor: TypedPropertyDescriptor<unknown>) {
253
+ const metadata = ensureMetadata(target);
254
+ metadata.stateProperty = propertyKey;
255
+ delete propertyDescriptor.writable;
256
+ metadata.statePropertyDefaultValue ??= (propertyDescriptor as { initializer?: Function }).initializer?.();
257
+ delete (propertyDescriptor as { initializer?: Function }).initializer;
258
+
259
+ return propertyDescriptor;
260
+ } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
261
+ }
262
+
211
263
  /* #region CONTROLLER EXTENSIONS */
212
264
 
213
265
  /**
214
266
  * Defines that the following method is an override for the method name with the same name in the specific controller extension or base implementation.
215
- *
216
267
  * @param extensionName The name of the extension that will be overridden
217
268
  * @returns The decorated method
218
269
  */
@@ -240,7 +291,6 @@ export function methodOverride(extensionName?: string): MethodDecorator {
240
291
 
241
292
  /**
242
293
  * Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
243
- *
244
294
  * @param overrideExecution The OverrideExecution defining when the override should run (Before / After / Instead)
245
295
  * @returns The decorated method
246
296
  */
@@ -261,7 +311,6 @@ export function extensible(overrideExecution: ExtensionOverrideExecution): Metho
261
311
 
262
312
  /**
263
313
  * Defines that the method will be publicly available for controller extension usage.
264
- *
265
314
  * @returns The decorated method
266
315
  */
267
316
  export function publicExtension(): MethodDecorator {
@@ -276,7 +325,6 @@ export function publicExtension(): MethodDecorator {
276
325
  }
277
326
  /**
278
327
  * Defines that the method will be only available for internal usage of the controller extension.
279
- *
280
328
  * @returns The decorated method
281
329
  */
282
330
  export function privateExtension(): MethodDecorator {
@@ -291,7 +339,6 @@ export function privateExtension(): MethodDecorator {
291
339
  }
292
340
  /**
293
341
  * Defines that the method cannot be further extended by other controller extension.
294
- *
295
342
  * @returns The decorated method
296
343
  */
297
344
  export function finalExtension(): MethodDecorator {
@@ -307,7 +354,6 @@ export function finalExtension(): MethodDecorator {
307
354
 
308
355
  /**
309
356
  * Defines that we are going to use instantiate a controller extension under the following variable name.
310
- *
311
357
  * @param extensionClass The controller extension that will be instantiated
312
358
  * @returns The decorated property
313
359
  */
@@ -325,11 +371,10 @@ export function usingExtension(extensionClass: typeof ControllerExtension | Func
325
371
  /* #region CONTROL */
326
372
  /**
327
373
  * Indicates that the property shall be declared as an event on the control metadata.
328
- *
329
374
  * @returns The decorated property
330
375
  */
331
376
  export function event(): PropertyDecorator {
332
- return function (target: UI5ControlDefinition, eventKey) {
377
+ return function (target: UI5ControlDefinition, eventKey: string | Symbol) {
333
378
  const metadata = ensureMetadata(target);
334
379
  if (!metadata.events[eventKey.toString()]) {
335
380
  metadata.events[eventKey.toString()] = {};
@@ -338,8 +383,7 @@ export function event(): PropertyDecorator {
338
383
  }
339
384
 
340
385
  /**
341
- * Defines the following property in the control metatada.
342
- *
386
+ * Defines the following property in the control metadata.
343
387
  * @param attributeDefinition The property definition
344
388
  * @returns The decorated property.
345
389
  */
@@ -361,12 +405,11 @@ export function property(attributeDefinition: UI5PropertyMetadata): PropertyDeco
361
405
  delete (propertyDescriptor as { initializer?: unknown }).initializer;
362
406
 
363
407
  return propertyDescriptor;
364
- } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
408
+ } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
365
409
  }
366
410
 
367
411
  /**
368
- * Defines and configure the following aggregation in the control metatada.
369
- *
412
+ * Defines and configures the following aggregation in the control metadata.
370
413
  * @param aggregationDefinition The aggregation definition
371
414
  * @returns The decorated property.
372
415
  */
@@ -388,12 +431,11 @@ export function aggregation(aggregationDefinition: UI5AggregationMetadata): Prop
388
431
  delete (propertyDescriptor as { initializer?: unknown }).initializer;
389
432
 
390
433
  return propertyDescriptor;
391
- } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
434
+ } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
392
435
  }
393
436
 
394
437
  /**
395
- * Defines and configure the following association in the control metatada.
396
- *
438
+ * Defines and configures the following association in the control metadata.
397
439
  * @param ui5AssociationMetadata The definition of the association.
398
440
  * @returns The decorated property
399
441
  */
@@ -407,12 +449,11 @@ export function association(ui5AssociationMetadata: UI5AssociationMetadata): Pro
407
449
  delete (propertyDescriptor as { initializer?: unknown }).initializer;
408
450
 
409
451
  return propertyDescriptor;
410
- } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
452
+ } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
411
453
  }
412
454
 
413
455
  /**
414
456
  * Defines in the metadata that this control implements a specific interface.
415
- *
416
457
  * @param interfaceName The name of the implemented interface
417
458
  * @returns The decorated method
418
459
  */
@@ -426,7 +467,6 @@ export function implementInterface(interfaceName: string): PropertyDecorator {
426
467
 
427
468
  /**
428
469
  * Indicates that the following method should also be exposed statically so we can call it from XML.
429
- *
430
470
  * @returns The decorated method
431
471
  */
432
472
  export function xmlEventHandler(): MethodDecorator {
@@ -434,7 +474,7 @@ export function xmlEventHandler(): MethodDecorator {
434
474
  const currentConstructor: UI5APIControl = target.constructor as unknown as UI5APIControl;
435
475
  ensureGetAPI(currentConstructor);
436
476
  currentConstructor[propertykey.toString()] = function (...args: unknown[]): void {
437
- if (args && args.length) {
477
+ if (args?.length) {
438
478
  const currentTarget = currentConstructor.getAPI(args[0] as UI5Event);
439
479
  currentTarget?.[propertykey.toString()](...args);
440
480
  }
@@ -453,7 +493,6 @@ type UI5ControlAndMore = typeof Control &
453
493
 
454
494
  /**
455
495
  * Indicates that the following class should define a UI5 control of the specified name.
456
- *
457
496
  * @param sTarget The fully qualified name of the UI5 class
458
497
  * @param metadataDefinition Inline metadata definition
459
498
  * @returns A class decorator that will create a ui5 class
@@ -495,7 +534,6 @@ export function createReference<T extends UI5Element>(): Ref<T> {
495
534
  }
496
535
  /**
497
536
  * Defines that the following object will hold a reference to a control through jsx templating.
498
- *
499
537
  * @returns The decorated property.
500
538
  */
501
539
  export function defineReference(): PropertyDecorator {
@@ -515,9 +553,95 @@ export function defineReference(): PropertyDecorator {
515
553
  } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
516
554
  }
517
555
 
556
+ function _createStateProperty(
557
+ obj: UI5ControlDefinition,
558
+ targetControl: Control & { _updateState: Function; _updateStateDebounced: Function; _updateStateTimer: unknown }
559
+ ): void {
560
+ if (obj.metadata?.stateProperty) {
561
+ const stateModel = new JSONModel({});
562
+ targetControl.setModel(stateModel, "$componentState");
563
+ let updatingState = false;
564
+ targetControl._updateState = function (): void {
565
+ delete this._updateStateTimer;
566
+ if (!updatingState) {
567
+ updatingState = true;
568
+ (this as { onStateChange?: Function }).onStateChange?.();
569
+ updatingState = false;
570
+ }
571
+ };
572
+ targetControl._updateStateDebounced = function (): void {
573
+ if (!this._updateStateTimer && !updatingState) {
574
+ this._updateStateTimer = setTimeout(() => {
575
+ this._updateState();
576
+ }, 200);
577
+ }
578
+ };
579
+ Object.defineProperty(targetControl, obj.metadata.stateProperty, {
580
+ configurable: true,
581
+ get: () => {
582
+ return new Proxy(stateModel, {
583
+ get: function (jsonModel, prop): unknown {
584
+ const pathInModel = `/${prop.toString()}`;
585
+ const oObj = deepClone(jsonModel.getObject(pathInModel));
586
+ let oTarget;
587
+ if (typeof oObj === "string") {
588
+ oTarget = { value: oObj };
589
+ oTarget.toString = function (): string {
590
+ return this.value;
591
+ };
592
+ } else if (typeof oObj === "number") {
593
+ oTarget = { value: oObj };
594
+ oTarget.toString = function (): string {
595
+ return this.value.toString();
596
+ };
597
+ } else if (typeof oObj === "boolean") {
598
+ oTarget = new Boolean(oObj);
599
+ } else if (Array.isArray(oObj)) {
600
+ oTarget = new Proxy(oObj.concat(), {
601
+ get(target: unknown[], p: string | symbol, receiver: unknown[]): unknown {
602
+ const ref = Reflect.get(target, p, receiver);
603
+ if (typeof ref === "function") {
604
+ return ref.bind(target);
605
+ } else if (ref === undefined && isNaN(Number(p.toString()))) {
606
+ return {
607
+ __bindingInfo: {
608
+ model: "$componentState",
609
+ path: p
610
+ }
611
+ };
612
+ }
613
+ return ref;
614
+ }
615
+ });
616
+ } else {
617
+ oTarget = { ...oObj };
618
+ }
619
+ oTarget.__bindingInfo = {
620
+ model: "$componentState",
621
+ path: pathInModel
622
+ };
623
+ return oTarget;
624
+ },
625
+ set: (setStateModel: JSONModel, prop, value): boolean => {
626
+ const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
627
+ targetControl._updateStateDebounced();
628
+ return setResult;
629
+ }
630
+ });
631
+ },
632
+ set: function (value) {
633
+ // Replacing the complete state
634
+ stateModel.setProperty(`/`, value);
635
+ }
636
+ });
637
+ if (obj.metadata.statePropertyDefaultValue) {
638
+ targetControl[obj.metadata.stateProperty as keyof Control] = obj.metadata.statePropertyDefaultValue as never;
639
+ }
640
+ }
641
+ }
642
+
518
643
  /**
519
644
  * Internal heavy lifting that will take care of creating the class property for ui5 to use.
520
- *
521
645
  * @param clazz The class prototype
522
646
  * @param name The name of the class to create
523
647
  * @param inObj The metadata object
@@ -706,7 +830,9 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
706
830
  }
707
831
  }
708
832
  }
833
+ _createStateProperty(obj, this);
709
834
  };
835
+
710
836
  clazz.override = function (oExtension: unknown): Function {
711
837
  const pol = {};
712
838
  (pol as Function).constructor = function (...args: unknown[]): Function {
@@ -16,7 +16,6 @@ sap.ui.define([], function () {
16
16
 
17
17
  /**
18
18
  * Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
19
- *
20
19
  * @param execution
21
20
  * @returns A method decorator
22
21
  */
@@ -80,7 +79,6 @@ sap.ui.define([], function () {
80
79
 
81
80
  /**
82
81
  * Checks whether a newRegistration is already included in some existingRegistrations by comparing all relevant attributes.
83
- *
84
82
  * @param existingRegistrations
85
83
  * @param newRegistration
86
84
  * @returns Result of the check
@@ -94,7 +92,6 @@ sap.ui.define([], function () {
94
92
  * Registers a method as controller extension hook handler.
95
93
  *
96
94
  * Currently, only methods of runtime building blocks are supported.
97
- *
98
95
  * @param name Controller extension to hook into
99
96
  * @param method Method to hook into
100
97
  * @returns A method decorator
@@ -120,7 +117,6 @@ sap.ui.define([], function () {
120
117
 
121
118
  /**
122
119
  * Initializes all controller extension handlers registered for a given target.
123
- *
124
120
  * @param target Target class to initialize the handlers for
125
121
  * @param target.constructor
126
122
  * @param controller PageController instance to get the controller extensions instances from
@@ -155,4 +151,4 @@ sap.ui.define([], function () {
155
151
  _exports.xmlViewPreprocessor = xmlViewPreprocessor;
156
152
  return _exports;
157
153
  }, false);
158
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJ0b1N0cmluZyIsImZuIiwiY0V4VEluc3RhbmNlSG9va01hcCIsImhvb2tlZEhhbmRsZXJzIiwicHVzaCIsImhhbmRsZXJzIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiYmluZCIsImFyZ3VtZW50cyIsImhhbmRsZXIiLCJfZXhwb3J0cyIsImlzQWxyZWFkeVJlZ2lzdGVyZWQiLCJleGlzdGluZ1JlZ2lzdHJhdGlvbnMiLCJuZXdSZWdpc3RyYXRpb24iLCJmaW5kIiwiciIsIm5hbWUiLCJtZXRob2QiLCJ0YXJnZXRNZXRob2QiLCJjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlciIsIlN0cmluZyIsImNvbnN0cnVjdG9yIiwiaW5pdENvbnRyb2xsZXJFeHRlbnNpb25Ib29rSGFuZGxlcnMiLCJjb250cm9sbGVyIiwiaW5kZXhhYmxlQ29udHJvbGxlciIsInJlZ2lzdGVyZWRIYW5kbGVyIiwiX2NvbnRyb2xsZXIkZ2V0VmlldyIsImhhbmRsZXJGdW5jdGlvbiIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwieG1sVmlld1ByZXByb2Nlc3NvciIsInNvdXJjZSIsIl9jYWxsZXIiLCJfc2V0dGluZ3MiLCJzb3VyY2VWaWV3IiwiZ2V0Q29udHJvbGxlciIsIm1hY3JvQVBJQ2hpbGQiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJzIiwiaXNBIiwibWFuYWdlZE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSG9va1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuXG4vKipcbiAqIFRoaXMgdHlwZSBpcyB0byBiZSBleHRlbmRlZCB3aXRoIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbnMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgaG9va2FibGUuXG4gKi9cbnR5cGUgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucyA9IHtcblx0ZWRpdEZsb3c6IHtcblx0XHRvbkFmdGVyU2F2ZTogdHJ1ZTtcblx0XHRvbkJlZm9yZVNhdmU6IHRydWU7XG5cdH07XG5cdGNvbGxhYm9yYXRpb25NYW5hZ2VyOiB7XG5cdFx0Y29sbGVjdEF2YWlsYWJsZUNhcmRzOiB0cnVlO1xuXHR9O1xuXHRwYWdpbmF0b3I6IHtcblx0XHRpbml0aWFsaXplOiB0cnVlO1xuXHR9O1xuXHRyb3V0aW5nOiB7XG5cdFx0b25BZnRlckJpbmRpbmc6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xudHlwZSBIb29rTWFwID0ge1xuXHRob29rZWRIYW5kbGVyczoge1xuXHRcdFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uW107XG5cdH07XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleGVjdXRpb25cbiAqIEByZXR1cm5zIEEgbWV0aG9kIGRlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va2FibGUoZXhlY3V0aW9uOiBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbik6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiB1bmtub3duLCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBpbmRleGFibGVUYXJnZXQgPSB0YXJnZXQgYXMgRnVuY3Rpb25NYXA7XG5cblx0XHRpbmRleGFibGVUYXJnZXRbYGF0dGFjaCR7cHJvcGVydHlLZXkudG9TdHJpbmcoKX1gXSA9IGZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdGlmICghY0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVycykge1xuXHRcdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdFx0Y0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0Y0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdXNoKGZuKTtcblx0XHR9O1xuXHRcdGluZGV4YWJsZVRhcmdldFtgZGV0YWNoJHtwcm9wZXJ0eUtleS50b1N0cmluZygpfWBdID0gZnVuY3Rpb24gKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0Y29uc3QgaGFuZGxlcnMgPSBjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldO1xuXHRcdFx0Y29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKGZuKTtcblx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3Qgb2xkVmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXHRcdGlmIChleGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIiB8fCBleGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiKSB7XG5cdFx0XHRkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXJzID0gKGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzICYmIGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB8fCBbXTtcblx0XHRcdFx0bGV0IHJldHVyblZhbHVlOiB1bmtub3duO1xuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkFmdGVyQXN5bmNcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gYXdhaXQgb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBhd2FpdCBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XG5cdFx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdFx0Y29uc3QgaGFuZGxlcnMgPSAoY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnMgJiYgY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHx8IFtdO1xuXHRcdFx0XHRsZXQgcmV0dXJuVmFsdWU6IHVua25vd247XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQWZ0ZXJcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRoYW5kbGVyLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5ld1JlZ2lzdHJhdGlvbiBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHNvbWUgZXhpc3RpbmdSZWdpc3RyYXRpb25zIGJ5IGNvbXBhcmluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmdSZWdpc3RyYXRpb25zXG4gKiBAcGFyYW0gbmV3UmVnaXN0cmF0aW9uXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNoZWNrXG4gKi9cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlZ2lzdGVyZWQoZXhpc3RpbmdSZWdpc3RyYXRpb25zOiBIYW5kbGVyUmVnaXN0cmF0aW9uW10sIG5ld1JlZ2lzdHJhdGlvbjogSGFuZGxlclJlZ2lzdHJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFleGlzdGluZ1JlZ2lzdHJhdGlvbnMuZmluZChcblx0XHQocikgPT4gci5uYW1lID09PSBuZXdSZWdpc3RyYXRpb24ubmFtZSAmJiByLm1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLm1ldGhvZCAmJiByLnRhcmdldE1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLnRhcmdldE1ldGhvZFxuXHQpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG1ldGhvZCBhcyBjb250cm9sbGVyIGV4dGVuc2lvbiBob29rIGhhbmRsZXIuXG4gKlxuICogQ3VycmVudGx5LCBvbmx5IG1ldGhvZHMgb2YgcnVudGltZSBidWlsZGluZyBibG9ja3MgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBuZXdSZWdpc3RyYXRpb24gPSB7IG5hbWUsIG1ldGhvZDogU3RyaW5nKG1ldGhvZCksIHRhcmdldE1ldGhvZDogcHJvcGVydHlLZXkgfTtcblx0XHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBjbGFzcyB0byBpbml0aWFsaXplIHRoZSBoYW5kbGVycyBmb3JcbiAqIEBwYXJhbSB0YXJnZXQuY29uc3RydWN0b3JcbiAqIEBwYXJhbSBjb250cm9sbGVyIFBhZ2VDb250cm9sbGVyIGluc3RhbmNlIHRvIGdldCB0aGUgY29udHJvbGxlciBleHRlbnNpb25zIGluc3RhbmNlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpOiB2b2lkIHtcblx0Y29uc3QgaW5kZXggPSByZWdpc3RlcmVkSW5zdGFuY2VzLmluZGV4T2YodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdGNvbnN0IGluZGV4YWJsZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIHVua25vd24gYXMgRGVlcEZ1bmN0aW9uTWFwO1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyB1bmtub3duIGFzIEZ1bmN0aW9uTWFwO1xuXG5cdFx0Zm9yIChjb25zdCByZWdpc3RlcmVkSGFuZGxlciBvZiByZWdpc3RlcmVkSGFuZGxlcnNbaW5kZXhdKSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyRnVuY3Rpb24gPSBpbmRleGFibGVUYXJnZXRbcmVnaXN0ZXJlZEhhbmRsZXIudGFyZ2V0TWV0aG9kXS5iaW5kKHRhcmdldCk7XG5cblx0XHRcdGluZGV4YWJsZUNvbnRyb2xsZXJbcmVnaXN0ZXJlZEhhbmRsZXIubmFtZV1bYGF0dGFjaCR7U3RyaW5nKHJlZ2lzdGVyZWRIYW5kbGVyLm1ldGhvZCl9YF0oaGFuZGxlckZ1bmN0aW9uKTtcblx0XHRcdGNvbnRyb2xsZXIuZ2V0VmlldygpPy5hdHRhY2hCZWZvcmVFeGl0KCgpID0+IHtcblx0XHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSGFuZGxlci5uYW1lXVtgZGV0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhhbmRsZXIubWV0aG9kKX1gXShoYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB4bWxWaWV3UHJlcHJvY2Vzc29yKHNvdXJjZTogb2JqZWN0LCBfY2FsbGVyPzogdW5rbm93biwgX3NldHRpbmdzPzogb2JqZWN0KTogdm9pZCB7XG5cdGNvbnN0IHNvdXJjZVZpZXcgPSBzb3VyY2UgYXMgWE1MVmlldztcblx0Y29uc3QgY29udHJvbGxlciA9IHNvdXJjZVZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIENvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG5cdGlmIChjb250cm9sbGVyKSB7XG5cdFx0Y29uc3QgbWFjcm9BUElDaGlsZCA9IHNvdXJjZVZpZXcuZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChzKSA9PiBzLmlzQShcInNhcC5mZS5tYWNyb3MuTWFjcm9BUElcIikpO1xuXHRcdGZvciAoY29uc3QgbWFuYWdlZE9iamVjdCBvZiBtYWNyb0FQSUNoaWxkKSB7XG5cdFx0XHRpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyhtYW5hZ2VkT2JqZWN0LCBjb250cm9sbGVyKTtcblx0XHR9XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7RUFJQTtBQUNBO0FBQ0E7RUFxQkE7RUFlQTtFQUNBLE1BQU1BLG1CQUErQixHQUFHLEVBQUU7RUFDMUMsTUFBTUMsa0JBQTJDLEdBQUcsRUFBRTs7RUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsUUFBUUEsQ0FBQ0MsU0FBcUMsRUFBbUI7SUFDaEYsT0FBTyxVQUFVQyxNQUFlLEVBQUVDLFdBQTRCLEVBQUVDLFVBQThCLEVBQUU7TUFDL0YsTUFBTUMsZUFBZSxHQUFHSCxNQUFxQjtNQUU3Q0csZUFBZSxDQUFDLFNBQVNGLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVUMsRUFBWSxFQUFRO1FBQ2xGLE1BQU1DLG1CQUFtQixHQUFHLElBQTBCO1FBQ3RELElBQUksQ0FBQ0EsbUJBQW1CLENBQUNDLGNBQWMsRUFBRTtVQUN4Q0QsbUJBQW1CLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEM7UUFDQSxJQUFJLENBQUNELG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ2hFRSxtQkFBbUIsQ0FBQ0MsY0FBYyxDQUFDTixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ2hFO1FBQ0FFLG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDSSxJQUFJLENBQUNILEVBQUUsQ0FBQztNQUNwRSxDQUFDO01BQ0RGLGVBQWUsQ0FBQyxTQUFTRixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVVDLEVBQVksRUFBUTtRQUNsRixNQUFNQyxtQkFBbUIsR0FBRyxJQUEwQjtRQUN0RCxN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QzdELElBQUlwQixLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDakIsTUFBTXVCLG1CQUFtQixHQUFHRCxVQUF3QztNQUNwRSxNQUFNN0IsZUFBZSxHQUFHSCxNQUFnQztNQUV4RCxLQUFLLE1BQU1rQyxpQkFBaUIsSUFBSXJDLGtCQUFrQixDQUFDYSxLQUFLLENBQUMsRUFBRTtRQUFBLElBQUF5QixtQkFBQTtRQUMxRCxNQUFNQyxlQUFlLEdBQUdqQyxlQUFlLENBQUMrQixpQkFBaUIsQ0FBQ1AsWUFBWSxDQUFDLENBQUNYLElBQUksQ0FBQ2hCLE1BQU0sQ0FBQztRQUVwRmlDLG1CQUFtQixDQUFDQyxpQkFBaUIsQ0FBQ1QsSUFBSSxDQUFDLENBQUMsU0FBU0ksTUFBTSxDQUFDSyxpQkFBaUIsQ0FBQ1IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDVSxlQUFlLENBQUM7UUFDekcsQ0FBQUQsbUJBQUEsR0FBQUgsVUFBVSxDQUFDSyxPQUFPLENBQUMsQ0FBQyxjQUFBRixtQkFBQSx1QkFBcEJBLG1CQUFBLENBQXNCRyxnQkFBZ0IsQ0FBQyxNQUFNO1VBQzVDTCxtQkFBbUIsQ0FBQ0MsaUJBQWlCLENBQUNULElBQUksQ0FBQyxDQUFDLFNBQVNJLE1BQU0sQ0FBQ0ssaUJBQWlCLENBQUNSLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQ1UsZUFBZSxDQUFDO1FBQzFHLENBQUMsQ0FBQztNQUNIO0lBQ0Q7RUFDRDtFQUFDakIsUUFBQSxDQUFBWSxtQ0FBQSxHQUFBQSxtQ0FBQTtFQUVNLFNBQVNRLG1CQUFtQkEsQ0FBQ0MsTUFBYyxFQUFFQyxPQUFpQixFQUFFQyxTQUFrQixFQUFRO0lBQ2hHLE1BQU1DLFVBQVUsR0FBR0gsTUFBaUI7SUFDcEMsTUFBTVIsVUFBVSxHQUFHVyxVQUFVLENBQUNDLGFBQWEsQ0FBQyxDQUEyQjtJQUN2RSxJQUFJWixVQUFVLEVBQUU7TUFDZixNQUFNYSxhQUFhLEdBQUdGLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUMsSUFBSSxFQUFHQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7TUFDcEcsS0FBSyxNQUFNQyxhQUFhLElBQUlKLGFBQWEsRUFBRTtRQUMxQ2QsbUNBQW1DLENBQUNrQixhQUFhLEVBQUVqQixVQUFVLENBQUM7TUFDL0Q7SUFDRDtFQUNEO0VBQUNiLFFBQUEsQ0FBQW9CLG1CQUFBLEdBQUFBLG1CQUFBO0VBQUEsT0FBQXBCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
154
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJ0b1N0cmluZyIsImZuIiwiY0V4VEluc3RhbmNlSG9va01hcCIsImhvb2tlZEhhbmRsZXJzIiwicHVzaCIsImhhbmRsZXJzIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiYmluZCIsImFyZ3VtZW50cyIsImhhbmRsZXIiLCJfZXhwb3J0cyIsImlzQWxyZWFkeVJlZ2lzdGVyZWQiLCJleGlzdGluZ1JlZ2lzdHJhdGlvbnMiLCJuZXdSZWdpc3RyYXRpb24iLCJmaW5kIiwiciIsIm5hbWUiLCJtZXRob2QiLCJ0YXJnZXRNZXRob2QiLCJjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlciIsIlN0cmluZyIsImNvbnN0cnVjdG9yIiwiaW5pdENvbnRyb2xsZXJFeHRlbnNpb25Ib29rSGFuZGxlcnMiLCJjb250cm9sbGVyIiwiaW5kZXhhYmxlQ29udHJvbGxlciIsInJlZ2lzdGVyZWRIYW5kbGVyIiwiX2NvbnRyb2xsZXIkZ2V0VmlldyIsImhhbmRsZXJGdW5jdGlvbiIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwieG1sVmlld1ByZXByb2Nlc3NvciIsInNvdXJjZSIsIl9jYWxsZXIiLCJfc2V0dGluZ3MiLCJzb3VyY2VWaWV3IiwiZ2V0Q29udHJvbGxlciIsIm1hY3JvQVBJQ2hpbGQiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJzIiwiaXNBIiwibWFuYWdlZE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSG9va1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuXG4vKipcbiAqIFRoaXMgdHlwZSBpcyB0byBiZSBleHRlbmRlZCB3aXRoIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbnMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgaG9va2FibGUuXG4gKi9cbnR5cGUgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucyA9IHtcblx0ZWRpdEZsb3c6IHtcblx0XHRvbkFmdGVyU2F2ZTogdHJ1ZTtcblx0XHRvbkJlZm9yZVNhdmU6IHRydWU7XG5cdH07XG5cdGNvbGxhYm9yYXRpb25NYW5hZ2VyOiB7XG5cdFx0Y29sbGVjdEF2YWlsYWJsZUNhcmRzOiB0cnVlO1xuXHR9O1xuXHRwYWdpbmF0b3I6IHtcblx0XHRpbml0aWFsaXplOiB0cnVlO1xuXHR9O1xuXHRyb3V0aW5nOiB7XG5cdFx0b25BZnRlckJpbmRpbmc6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xudHlwZSBIb29rTWFwID0ge1xuXHRob29rZWRIYW5kbGVyczoge1xuXHRcdFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uW107XG5cdH07XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICogQHBhcmFtIGV4ZWN1dGlvblxuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rYWJsZShleGVjdXRpb246IEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHVua25vd24sIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyBGdW5jdGlvbk1hcDtcblxuXHRcdGluZGV4YWJsZVRhcmdldFtgYXR0YWNoJHtwcm9wZXJ0eUtleS50b1N0cmluZygpfWBdID0gZnVuY3Rpb24gKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0aWYgKCFjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzKSB7XG5cdFx0XHRcdGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnMgPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gW107XG5cdFx0XHR9XG5cdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1c2goZm4pO1xuXHRcdH07XG5cdFx0aW5kZXhhYmxlVGFyZ2V0W2BkZXRhY2gke3Byb3BlcnR5S2V5LnRvU3RyaW5nKCl9YF0gPSBmdW5jdGlvbiAoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRjb25zdCBoYW5kbGVycyA9IGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdFx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoZm4pO1xuXHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBvbGRWYWx1ZSA9IGRlc2NyaXB0b3IudmFsdWU7XG5cdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiIHx8IGV4ZWN1dGlvbiA9PT0gXCJBZnRlckFzeW5jXCIpIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdFx0Y29uc3QgaGFuZGxlcnMgPSAoY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnMgJiYgY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHx8IFtdO1xuXHRcdFx0XHRsZXQgcmV0dXJuVmFsdWU6IHVua25vd247XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBhd2FpdCBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdFx0XHRcdGF3YWl0IGhhbmRsZXIuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IGF3YWl0IG9sZFZhbHVlLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcblx0XHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IChjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVycyAmJiBjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkgfHwgW107XG5cdFx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJBZnRlclwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdFx0XHRcdGhhbmRsZXIuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkJlZm9yZVwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmV3UmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gc29tZSBleGlzdGluZ1JlZ2lzdHJhdGlvbnMgYnkgY29tcGFyaW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIGV4aXN0aW5nUmVnaXN0cmF0aW9uc1xuICogQHBhcmFtIG5ld1JlZ2lzdHJhdGlvblxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc0FscmVhZHlSZWdpc3RlcmVkKGV4aXN0aW5nUmVnaXN0cmF0aW9uczogSGFuZGxlclJlZ2lzdHJhdGlvbltdLCBuZXdSZWdpc3RyYXRpb246IEhhbmRsZXJSZWdpc3RyYXRpb24pOiBib29sZWFuIHtcblx0cmV0dXJuICEhZXhpc3RpbmdSZWdpc3RyYXRpb25zLmZpbmQoXG5cdFx0KHIpID0+IHIubmFtZSA9PT0gbmV3UmVnaXN0cmF0aW9uLm5hbWUgJiYgci5tZXRob2QgPT09IG5ld1JlZ2lzdHJhdGlvbi5tZXRob2QgJiYgci50YXJnZXRNZXRob2QgPT09IG5ld1JlZ2lzdHJhdGlvbi50YXJnZXRNZXRob2Rcblx0KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBtZXRob2QgYXMgY29udHJvbGxlciBleHRlbnNpb24gaG9vayBoYW5kbGVyLlxuICpcbiAqIEN1cnJlbnRseSwgb25seSBtZXRob2RzIG9mIHJ1bnRpbWUgYnVpbGRpbmcgYmxvY2tzIGFyZSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBuZXdSZWdpc3RyYXRpb24gPSB7IG5hbWUsIG1ldGhvZDogU3RyaW5nKG1ldGhvZCksIHRhcmdldE1ldGhvZDogcHJvcGVydHlLZXkgfTtcblx0XHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGhhbmRsZXJzIGZvclxuICogQHBhcmFtIHRhcmdldC5jb25zdHJ1Y3RvclxuICogQHBhcmFtIGNvbnRyb2xsZXIgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gZ2V0IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbnMgaW5zdGFuY2VzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKHRhcmdldDogeyBjb25zdHJ1Y3RvcjogRnVuY3Rpb24gfSwgY29udHJvbGxlcjogQ29udHJvbGxlcik6IHZvaWQge1xuXHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0Y29uc3QgaW5kZXhhYmxlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIgYXMgdW5rbm93biBhcyBEZWVwRnVuY3Rpb25NYXA7XG5cdFx0Y29uc3QgaW5kZXhhYmxlVGFyZ2V0ID0gdGFyZ2V0IGFzIHVua25vd24gYXMgRnVuY3Rpb25NYXA7XG5cblx0XHRmb3IgKGNvbnN0IHJlZ2lzdGVyZWRIYW5kbGVyIG9mIHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0pIHtcblx0XHRcdGNvbnN0IGhhbmRsZXJGdW5jdGlvbiA9IGluZGV4YWJsZVRhcmdldFtyZWdpc3RlcmVkSGFuZGxlci50YXJnZXRNZXRob2RdLmJpbmQodGFyZ2V0KTtcblxuXHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSGFuZGxlci5uYW1lXVtgYXR0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhhbmRsZXIubWV0aG9kKX1gXShoYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0Y29udHJvbGxlci5nZXRWaWV3KCk/LmF0dGFjaEJlZm9yZUV4aXQoKCkgPT4ge1xuXHRcdFx0XHRpbmRleGFibGVDb250cm9sbGVyW3JlZ2lzdGVyZWRIYW5kbGVyLm5hbWVdW2BkZXRhY2gke1N0cmluZyhyZWdpc3RlcmVkSGFuZGxlci5tZXRob2QpfWBdKGhhbmRsZXJGdW5jdGlvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHhtbFZpZXdQcmVwcm9jZXNzb3Ioc291cmNlOiBvYmplY3QsIF9jYWxsZXI/OiB1bmtub3duLCBfc2V0dGluZ3M/OiBvYmplY3QpOiB2b2lkIHtcblx0Y29uc3Qgc291cmNlVmlldyA9IHNvdXJjZSBhcyBYTUxWaWV3O1xuXHRjb25zdCBjb250cm9sbGVyID0gc291cmNlVmlldy5nZXRDb250cm9sbGVyKCkgYXMgQ29udHJvbGxlciB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBtYWNyb0FQSUNoaWxkID0gc291cmNlVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKHMpID0+IHMuaXNBKFwic2FwLmZlLm1hY3Jvcy5NYWNyb0FQSVwiKSk7XG5cdFx0Zm9yIChjb25zdCBtYW5hZ2VkT2JqZWN0IG9mIG1hY3JvQVBJQ2hpbGQpIHtcblx0XHRcdGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKG1hbmFnZWRPYmplY3QsIGNvbnRyb2xsZXIpO1xuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQUlBO0FBQ0E7QUFDQTtFQXFCQTtFQWVBO0VBQ0EsTUFBTUEsbUJBQStCLEdBQUcsRUFBRTtFQUMxQyxNQUFNQyxrQkFBMkMsR0FBRyxFQUFFOztFQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsUUFBUUEsQ0FBQ0MsU0FBcUMsRUFBbUI7SUFDaEYsT0FBTyxVQUFVQyxNQUFlLEVBQUVDLFdBQTRCLEVBQUVDLFVBQThCLEVBQUU7TUFDL0YsTUFBTUMsZUFBZSxHQUFHSCxNQUFxQjtNQUU3Q0csZUFBZSxDQUFDLFNBQVNGLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVUMsRUFBWSxFQUFRO1FBQ2xGLE1BQU1DLG1CQUFtQixHQUFHLElBQTBCO1FBQ3RELElBQUksQ0FBQ0EsbUJBQW1CLENBQUNDLGNBQWMsRUFBRTtVQUN4Q0QsbUJBQW1CLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEM7UUFDQSxJQUFJLENBQUNELG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ2hFRSxtQkFBbUIsQ0FBQ0MsY0FBYyxDQUFDTixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ2hFO1FBQ0FFLG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDSSxJQUFJLENBQUNILEVBQUUsQ0FBQztNQUNwRSxDQUFDO01BQ0RGLGVBQWUsQ0FBQyxTQUFTRixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVVDLEVBQVksRUFBUTtRQUNsRixNQUFNQyxtQkFBbUIsR0FBRyxJQUEwQjtRQUN0RCxNQUFNRyxRQUFRLEdBQUdILG1CQUFt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TUFDakIsTUFBTXVCLG1CQUFtQixHQUFHRCxVQUF3QztNQUNwRSxNQUFNN0IsZUFBZSxHQUFHSCxNQUFnQztNQUV4RCxLQUFLLE1BQU1rQyxpQkFBaUIsSUFBSXJDLGtCQUFrQixDQUFDYSxLQUFLLENBQUMsRUFBRTtRQUFBLElBQUF5QixtQkFBQTtRQUMxRCxNQUFNQyxlQUFlLEdBQUdqQyxlQUFlLENBQUMrQixpQkFBaUIsQ0FBQ1AsWUFBWSxDQUFDLENBQUNYLElBQUksQ0FBQ2hCLE1BQU0sQ0FBQztRQUVwRmlDLG1CQUFtQixDQUFDQyxpQkFBaUIsQ0FBQ1QsSUFBSSxDQUFDLENBQUMsU0FBU0ksTUFBTSxDQUFDSyxpQkFBaUIsQ0FBQ1IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDVSxlQUFlLENBQUM7UUFDekcsQ0FBQUQsbUJBQUEsR0FBQUgsVUFBVSxDQUFDSyxPQUFPLENBQUMsQ0FBQyxjQUFBRixtQkFBQSx1QkFBcEJBLG1CQUFBLENBQXNCRyxnQkFBZ0IsQ0FBQyxNQUFNO1VBQzVDTCxtQkFBbUIsQ0FBQ0MsaUJBQWlCLENBQUNULElBQUksQ0FBQyxDQUFDLFNBQVNJLE1BQU0sQ0FBQ0ssaUJBQWlCLENBQUNSLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQ1UsZUFBZSxDQUFDO1FBQzFHLENBQUMsQ0FBQztNQUNIO0lBQ0Q7RUFDRDtFQUFDakIsUUFBQSxDQUFBWSxtQ0FBQSxHQUFBQSxtQ0FBQTtFQUVNLFNBQVNRLG1CQUFtQkEsQ0FBQ0MsTUFBYyxFQUFFQyxPQUFpQixFQUFFQyxTQUFrQixFQUFRO0lBQ2hHLE1BQU1DLFVBQVUsR0FBR0gsTUFBaUI7SUFDcEMsTUFBTVIsVUFBVSxHQUFHVyxVQUFVLENBQUNDLGFBQWEsQ0FBQyxDQUEyQjtJQUN2RSxJQUFJWixVQUFVLEVBQUU7TUFDZixNQUFNYSxhQUFhLEdBQUdGLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUMsSUFBSSxFQUFHQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7TUFDcEcsS0FBSyxNQUFNQyxhQUFhLElBQUlKLGFBQWEsRUFBRTtRQUMxQ2QsbUNBQW1DLENBQUNrQixhQUFhLEVBQUVqQixVQUFVLENBQUM7TUFDL0Q7SUFDRDtFQUNEO0VBQUNiLFFBQUEsQ0FBQW9CLG1CQUFBLEdBQUFBLG1CQUFBO0VBQUEsT0FBQXBCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -46,7 +46,6 @@ const registeredHandlers: HandlerRegistration[][] = [];
46
46
 
47
47
  /**
48
48
  * Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
49
- *
50
49
  * @param execution
51
50
  * @returns A method decorator
52
51
  */
@@ -112,7 +111,6 @@ export function hookable(execution: ExtensionOverrideExecution): MethodDecorator
112
111
 
113
112
  /**
114
113
  * Checks whether a newRegistration is already included in some existingRegistrations by comparing all relevant attributes.
115
- *
116
114
  * @param existingRegistrations
117
115
  * @param newRegistration
118
116
  * @returns Result of the check
@@ -127,7 +125,6 @@ function isAlreadyRegistered(existingRegistrations: HandlerRegistration[], newRe
127
125
  * Registers a method as controller extension hook handler.
128
126
  *
129
127
  * Currently, only methods of runtime building blocks are supported.
130
- *
131
128
  * @param name Controller extension to hook into
132
129
  * @param method Method to hook into
133
130
  * @returns A method decorator
@@ -152,7 +149,6 @@ export function controllerExtensionHandler<CExtName extends keyof HookableContro
152
149
 
153
150
  /**
154
151
  * Initializes all controller extension handlers registered for a given target.
155
- *
156
152
  * @param target Target class to initialize the handlers for
157
153
  * @param target.constructor
158
154
  * @param controller PageController instance to get the controller extensions instances from