@c8y/ngx-components 1021.22.36 → 1021.22.37

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.
@@ -32,6 +32,10 @@ export declare class SelectKeyboardService {
32
32
  * Search on key event.
33
33
  */
34
34
  keyboardSearch: boolean;
35
+ /**
36
+ * Space key event is used to select.
37
+ */
38
+ spaceSelect: boolean;
35
39
  };
36
40
  /**
37
41
  * Registers the keyboard event listener for the dropdown.
@@ -1 +1 @@
1
- {"version":3,"file":"select-keyboard.service.d.ts","sourceRoot":"","sources":["../../../core/select/select-keyboard.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,UAAU,EAWX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;;AAE7D;;;;;;;;GAQG;AACH,qBACa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IAEzC,OAAO,CAAC,UAAU,CAAgC;IAElD;;OAEG;IACH,OAAO;QACL;;WAEG;;QAEH;;WAEG;;MAEH;IAEF;;;;;;;OAOG;IACH,SAAS,CACP,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,EAClC,QAAQ,EAAE,mBAAmB,GAC5B,UAAU,CAAC,MAAM,CAAC;IAqBrB,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,UAAU;IAKV;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAU/C,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,uBAAuB;IA6C/B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,aAAa;yCAzMV,qBAAqB;6CAArB,qBAAqB;CA6MjC"}
1
+ {"version":3,"file":"select-keyboard.service.d.ts","sourceRoot":"","sources":["../../../core/select/select-keyboard.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,UAAU,EAWX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;;AAE7D;;;;;;;;GAQG;AACH,qBACa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IAEzC,OAAO,CAAC,UAAU,CAAgC;IAElD;;OAEG;IACH,OAAO;QACL;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;MAEH;IAEF;;;;;;;OAOG;IACH,SAAS,CACP,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,EAClC,QAAQ,EAAE,mBAAmB,GAC5B,UAAU,CAAC,MAAM,CAAC;IAqBrB,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,UAAU;IAKV;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAU/C,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,uBAAuB;IA6C/B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,aAAa;yCA7MV,qBAAqB;6CAArB,qBAAqB;CAiNjC"}
@@ -1,11 +1,11 @@
1
- import { AfterContentInit, AfterViewInit, EventEmitter, OnDestroy, QueryList } from '@angular/core';
1
+ import { AfterContentInit, AfterViewInit, EventEmitter, OnChanges, OnDestroy, QueryList, SimpleChanges } from '@angular/core';
2
2
  import { AbstractControl, ControlValueAccessor, ValidationErrors, Validator } from '@angular/forms';
3
3
  import { SelectItemDirective } from './select-item.directive';
4
4
  import { SelectKeyboardService } from './select-keyboard.service';
5
5
  import { SelectableItem, SelectableItemTemplate } from './select.model';
6
6
  import { SelectedItemsDirective } from './selected-items.directive';
7
7
  import * as i0 from "@angular/core";
8
- export declare class SelectComponent implements AfterContentInit, OnDestroy, AfterViewInit, ControlValueAccessor, Validator {
8
+ export declare class SelectComponent implements AfterContentInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor, Validator {
9
9
  private selectKeyboardService;
10
10
  /**
11
11
  * Placeholder text to be displayed in the select.
@@ -56,6 +56,10 @@ export declare class SelectComponent implements AfterContentInit, OnDestroy, Aft
56
56
  * If set to true, the user can select multiple items.
57
57
  */
58
58
  multi: boolean;
59
+ /**
60
+ * If enabled, an item can be selected with the space key.
61
+ */
62
+ canSelectWithSpace: boolean;
59
63
  /**
60
64
  * If set to true, the select is disabled.
61
65
  */
@@ -148,7 +152,14 @@ export declare class SelectComponent implements AfterContentInit, OnDestroy, Aft
148
152
  * @ignore
149
153
  */
150
154
  ngAfterContentInit(): void;
155
+ /**
156
+ * @ignore
157
+ */
151
158
  ngAfterViewInit(): void;
159
+ /**
160
+ * @ignore
161
+ */
162
+ ngOnChanges(changes: SimpleChanges): void;
152
163
  /**
153
164
  * @ignore
154
165
  */
@@ -219,6 +230,6 @@ export declare class SelectComponent implements AfterContentInit, OnDestroy, Aft
219
230
  onHidden(): void;
220
231
  private emitChangeEvent;
221
232
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, never>;
222
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "c8y-select", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "items": { "alias": "items"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "container": { "alias": "container"; "required": false; }; "multi": { "alias": "multi"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "autoClose": { "alias": "autoClose"; "required": false; }; "insideClick": { "alias": "insideClick"; "required": false; }; "required": { "alias": "required"; "required": false; }; "canDeselect": { "alias": "canDeselect"; "required": false; }; "name": { "alias": "name"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, { "onSelect": "onSelect"; "onDeselect": "onDeselect"; "onIconClick": "onIconClick"; }, ["projectedSelectedItems", "projectedSelectableItems"], ["div"], false, never>;
233
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "c8y-select", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "items": { "alias": "items"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "container": { "alias": "container"; "required": false; }; "multi": { "alias": "multi"; "required": false; }; "canSelectWithSpace": { "alias": "canSelectWithSpace"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "autoClose": { "alias": "autoClose"; "required": false; }; "insideClick": { "alias": "insideClick"; "required": false; }; "required": { "alias": "required"; "required": false; }; "canDeselect": { "alias": "canDeselect"; "required": false; }; "name": { "alias": "name"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, { "onSelect": "onSelect"; "onDeselect": "onDeselect"; "onIconClick": "onIconClick"; }, ["projectedSelectedItems", "projectedSelectableItems"], ["div"], false, never>;
223
234
  }
224
235
  //# sourceMappingURL=select.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.component.d.ts","sourceRoot":"","sources":["../../../core/select/select.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select.component.d.ts","sourceRoot":"","sources":["../../../core/select/select.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAKb,YAAY,EAEZ,SAAS,EACT,SAAS,EAET,SAAS,EACT,aAAa,EAId,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,oBAAoB,EAGpB,gBAAgB,EAChB,SAAS,EACV,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;;AAEpE,qBAkBa,eACX,YAAW,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,SAAS;IA2MrF,OAAO,CAAC,qBAAqB;IAzMzC;;OAEG;IACM,WAAW,SAAkB;IAEtC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,IAAa,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,sBAAsB,EAAE,EAO/E;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,sBAAsB,EAAE,CAEpC;IAED;;OAEG;IACH,IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,EAW3E;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,cAAc,EAAE,CAE/B;IAED;;OAEG;IAEH,SAAS,EAAE,EAAE,GAAG,MAAM,CAAU;IAEhC;;OAEG;IAEH,KAAK,UAAS;IAEd;;OAEG;IACM,kBAAkB,UAAe;IAE1C;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,SAAS,UAAQ;IAEjB;;;OAGG;IAEH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,WAAW,UAAS;IAEpB;;OAEG;IAEH,IAAI,SAAY;IAEhB;;OAEG;IAEH,IAAI,SAAgB;IAEpB;;OAEG;IAEH,QAAQ,+BAAsC;IAE9C;;OAEG;IAEH,UAAU,+BAAsC;IAEhD;;OAEG;IAEH,WAAW;cAA4B,MAAM;gBAAU,UAAU;OAAM;IAEvE;;OAEG;IACH,cAAc,UAAS;IAEvB;;;OAGG;IACmC,wBAAwB,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAE/F;;;OAGG;IACmC,sBAAsB,EAAE,sBAAsB,CAAC;IAEtC,OAAO,CAAC,aAAa,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,IAAI,CAA+B;IAE5E;;OAEG;IACH,IAAI,eAAe,IAAI,cAAc,CAEpC;IAED;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAwB;IAEzC;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAiB;IAEzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,SAAS,CAAa;IAE9B;;;OAGG;gBACiB,qBAAqB,EAAE,qBAAqB;IAQhE;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAgB1B;;OAEG;IACH,eAAe,IAAI,IAAI;IAYvB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAUzC;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAkBlC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAUpC;;OAEG;IACH,WAAW,IAAI,IAAI;IAWnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE;IAMnD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,KAAK,IAAI,GAAG,IAAI;IAI9E;;;OAGG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;;OAGG;IACH,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAI3C;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,gBAAgB;IAOpD;;;OAGG;IACH,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,eAAe;yCA7ZZ,eAAe;2CAAf,eAAe;CAka3B"}
@@ -31,7 +31,11 @@ export class SelectKeyboardService {
31
31
  /**
32
32
  * Search on key event.
33
33
  */
34
- keyboardSearch: false
34
+ keyboardSearch: false,
35
+ /**
36
+ * Space key event is used to select.
37
+ */
38
+ spaceSelect: false
35
39
  };
36
40
  }
37
41
  /**
@@ -71,7 +75,7 @@ export class SelectKeyboardService {
71
75
  this.KEYCODE_DOWN,
72
76
  this.KEYCODE_TAB,
73
77
  this.KEYCODE_UP,
74
- this.KEYCODE_SPACE
78
+ ...(this.options.spaceSelect ? [this.KEYCODE_SPACE] : [])
75
79
  ].includes(event.code);
76
80
  }
77
81
  handleKeyboard(event, input, items, dropdown) {
@@ -173,4 +177,4 @@ export class SelectKeyboardService {
173
177
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectKeyboardService, decorators: [{
174
178
  type: Injectable
175
179
  }] });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWtleWJvYXJkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3NlbGVjdC9zZWxlY3Qta2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFFTCxPQUFPLEVBQ1AsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1YsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUduQzs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFbUIsZUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLFdBQVcsQ0FBQztRQUMzQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUN2QixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUVqQyxlQUFVLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFbEQ7O1dBRUc7UUFDSCxZQUFPLEdBQUc7WUFDUjs7ZUFFRztZQUNILFVBQVUsRUFBRSxLQUFLO1lBQ2pCOztlQUVHO1lBQ0gsY0FBYyxFQUFFLEtBQUs7U0FDdEIsQ0FBQztLQXVMSDtJQXJMQzs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUNQLEtBQXVCLEVBQ3ZCLElBQWtDLEVBQ2xDLFFBQTZCO1FBRTdCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxD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QUMxQixLQUFhLEVBQ2IsUUFBZ0I7UUFFaEIsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBdUI7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQzs4R0E1TVUscUJBQXFCO2tIQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWdyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIGtleWJvYXJkIG5hdmlnYXRpb24gZm9yIGRyb3Bkb3ducy5cbiAqXG4gKiBJdCBhbGxvd3MgdG8gbmF2aWdhdGUgb3ZlciB0aGUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIHVzaW5nIHRoZSBrZXlib2FyZFxuICogb3Igc2VhcmNoIGZvciB0aGVtLiBGb3IgdGhpcyB0byBjb3JyZWN0bHkgd29yaywgdGhlIHNlcnZpY2UgbmVlZHMgdG8gcHJvdmlkZWRcbiAqIGFzIGNvbXBvbmVudCBwcm92aWRlciBpbiB0aGUgY29tcG9uZW50LiBBZGRpdGlvbmFsbHkgdGhlIGBMaXN0SXRlbUNvbXBvbmVudGBcbiAqIG5lZWRzIHRvIGJlIHVzZWQgaW4gdGhlIGRyb3Bkb3duIGl0ZW1zLiBBbHNvIGVhY2ggaXRlbSBuZWVkcyB0byBoYXZlIGFcbiAqIHNwYW5bZGF0YS1zZWFyY2gtbGFiZWxdIGVsZW1lbnQgdG8gc2VhcmNoIGZvciB0aGUgaXRlbS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlbGVjdEtleWJvYXJkU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgS0VZQ09ERV9VUCA9ICdBcnJvd1VwJztcbiAgcHJpdmF0ZSByZWFkb25seSBLRVlDT0RFX0RPV04gPSAnQXJyb3dEb3duJztcbiAgcHJpdmF0ZSByZWFkb25seSBLRVlDT0RFX1RBQiA9ICdUYWInO1xuICBwcml2YXRlIHJlYWRvbmx5IEtFWUNPREVfRU5URVIgPSAnRW50ZXInO1xuICBwcml2YXRlIHJlYWRvbmx5IEtFWUNPREVfRVNDID0gJ0VzY2FwZSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgS0VZQ09ERV9TUEFDRSA9ICdTcGFjZSc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogQ29uaWZndXJhdGlvbiBvcHRpb25zIGZvciB0aGUga2V5Ym9hcmQgc2VydmljZS5cbiAgICovXG4gIG9wdGlvbnMgPSB7XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlIGlucHV0IHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS5cbiAgICAgKi9cbiAgICBlbXB0eUlucHV0OiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBTZWFyY2ggb24ga2V5IGV2ZW50LlxuICAgICAqL1xuICAgIGtleWJvYXJkU2VhcmNoOiBmYWxzZVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGtleWJvYXJkIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgZHJvcGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgZWxlbWVudCB0byBzZWFyY2ggZm9yIGl0ZW1zLlxuICAgKiBAcGFyYW0gbGlzdCBBIFF1ZXJ5TGlzdCBvZiBhbGwgdGhlIFtMaXN0SXRlbUNvbXBvbmVudF0gb24gd2hpY2ggY2FuIGJlIHNlYXJjaGVkXG4gICAqIEBwYXJhbSBkcm9wZG93biBUaGUgZHJvcGRvd24gaXRzZWxmIGFzIFtCc0Ryb3Bkb3duRGlyZWN0aXZlXS5cbiAgICogQHJldHVybnMgQSBPYnNlcnZhYmxlPG51bWJlcj4gd2hlcmUgbnVtYmVyIGlzIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgW0xpc3RJdGVtQ29tcG9uZW50XVxuICAgKi9cbiAgcmVnaXN0ZXIkKFxuICAgIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LFxuICAgIGxpc3Q6IFF1ZXJ5TGlzdDxMaXN0SXRlbUNvbXBvbmVudD4sXG4gICAgZHJvcGRvd246IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQkLmlzU3RvcHBlZCkge1xuICAgICAgdGhpcy5kZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3QuY2hhbmdlcy5waXBlKFxuICAgICAgc3RhcnRXaXRoKGxpc3QpLFxuICAgICAgc3dpdGNoTWFwKChpdGVtczogUXVlcnlMaXN0PExpc3RJdGVtQ29tcG9uZW50PikgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oaW5wdXQsICdrZXl1cCcpLFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGlucHV0LCAna2V5ZG93bicpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvZihpdGVtcy50b0FycmF5KCkpXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgbWFwKChbZSwgaXRlbXNdKSA9PiB0aGlzLmhhbmRsZUtleWJvYXJkKGUsIGlucHV0LCBpdGVtcywgZHJvcGRvd24pKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHRoZSBrZXlib2FyZCBldmVudCBsaXN0bmVyLlxuICAgKi9cbiAgdW5yZWdpc3RlcigpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5Ym9hcmQgZXZlbnQgaXMgZmlyZWQgYnkgYSBzZWxlY3Rpb24gZXZlbnQgKEVudGVyLCBEb3duLCBUYWIsIFVwLCBTcGFjZSlcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBzZWxlY3Rpb24gZXZlbnQuXG4gICAqL1xuICBpc1NlbGVjdGlvbkV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuS0VZQ09ERV9FTlRFUixcbiAgICAgIHRoaXMuS0VZQ09ERV9ET1dOLFxuICAgICAgdGhpcy5LRVlDT0RFX1RBQixcbiAgICAgIHRoaXMuS0VZQ09ERV9VUCxcbiAgICAgIHRoaXMuS0VZQ09ERV9TUEFDRVxuICAgIF0uaW5jbHVkZXMoZXZlbnQuY29kZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleWJvYXJkKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LFxuICAgIGl0ZW1zOiBMaXN0SXRlbUNvbXBvbmVudFtdLFxuICAgIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlXG4gICk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25FdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFycm93S2V5U2VsZWN0aW9uKGV2ZW50LCBpbnB1dCwgaXRlbXMsIGRyb3Bkb3duKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gdGhpcy5LRVlDT0RFX0VTQykge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQ2FuY2VsKGV2ZW50LCBkcm9wZG93biwgaW5wdXQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMua2V5Ym9hcmRTZWFyY2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUlucHV0Qm94U2VhcmNoKGl0ZW1zLCBpbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5wdXRCb3hTZWFyY2goaXRlbXM6IExpc3RJdGVtQ29tcG9uZW50W10sIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgaWYgKCFpbnB1dC52YWx1ZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleChpdGVtcywgaXRlbSA9PiB7XG4gICAgICBjb25zdCBsYWJlbDogSFRNTEVsZW1lbnQgPVxuICAgICAgICBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuW2RhdGEtc2VhcmNoLWxhYmVsXScpO1xuICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFiZWxcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWFyY2gtbGFiZWwnKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAuc3RhcnRzV2l0aChpbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IChpdGVtLmhpZ2hsaWdodGVkID0gZmFsc2UpKTtcbiAgICAgIGl0ZW1zW2luZGV4XS5oaWdobGlnaHRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlTZWxlY3Rpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgaXRlbXM6IExpc3RJdGVtQ29tcG9uZW50W10sXG4gICAgZHJvcGRvd246IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQuY29kZTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IGZpbmRJbmRleChpdGVtcywgaXRlbSA9PiBpdGVtLmFjdGl2ZSk7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRJbmRleCA9IGZpbmRJbmRleChpdGVtcywgaXRlbSA9PiBpdGVtLmhpZ2hsaWdodGVkKTtcbiAgICBjb25zdCBpbmRleCA9IGhpZ2hsaWdodGVkSW5kZXggPiAtMSA/IGhpZ2hsaWdodGVkSW5kZXggOiBhY3RpdmVJbmRleDtcblxuICAgIGlmIChldmVudC50eXBlICE9PSAna2V5ZG93bicpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5SW5wdXQpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IHRoaXMuS0VZQ09ERV9FTlRFUiB8fCBrZXlDb2RlID09PSB0aGlzLktFWUNPREVfVEFCKSB7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpdGVtc1tpbmRleF0uZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICB9XG4gICAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgICBpbnB1dC5ibHVyKCk7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID09PSB0aGlzLktFWUNPREVfU1BBQ0UpIHtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgICAgYnViYmxlczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW1zW2luZGV4XS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICAgIH1cbiAgICAgIGRyb3Bkb3duLnNob3coKTtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgY29uc3QgdXBPckRvd24gPSBrZXlDb2RlID09PSB0aGlzLktFWUNPREVfRE9XTiA/IDEgOiAtMTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgaXRlbXNbaW5kZXhdLmhpZ2hsaWdodGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdE5leHRJdGVtT25LZXlib2FyZE1vdmUoaXRlbXMsIGluZGV4LCB1cE9yRG93bik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNhbmNlbChcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBkcm9wZG93bjogQnNEcm9wZG93bkRpcmVjdGl2ZSxcbiAgICBpbnB1dDogSFRNTElucHV0RWxlbWVudFxuICApIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgaW5wdXQuYmx1cigpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0TmV4dEl0ZW1PbktleWJvYXJkTW92ZShcbiAgICBpdGVtczogTGlzdEl0ZW1Db21wb25lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHVwT3JEb3duOiAtMSB8IDFcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoaXRlbXNbaW5kZXggKyB1cE9yRG93bl0pIHtcbiAgICAgIGlmICghaXRlbXNbaW5kZXggKyB1cE9yRG93bl0uc2VsZWN0YWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3ROZXh0SXRlbU9uS2V5Ym9hcmRNb3ZlKGl0ZW1zLCBpbmRleCArIHVwT3JEb3duLCB1cE9yRG93bik7XG4gICAgICB9XG4gICAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbXNbaW5kZXggKyB1cE9yRG93bl0pO1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBpZiAoaW5kZXggKyB1cE9yRG93biA+IC0xKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbXNbMF0pO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtc1tpdGVtcy5sZW5ndGggLSAxXSk7XG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCAtIDE7XG4gIH1cblxuICBwcml2YXRlIGhpZ2hsaWdodEl0ZW0oaXRlbTogTGlzdEl0ZW1Db21wb25lbnQpIHtcbiAgICBpdGVtLmhpZ2hsaWdodGVkID0gdHJ1ZTtcbiAgICBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gIH1cbn1cbiJdfQ==
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWtleWJvYXJkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3NlbGVjdC9zZWxlY3Qta2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFFTCxPQUFPLEVBQ1AsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1YsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUduQzs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFbUIsZUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLFdBQVcsQ0FBQztRQUMzQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUN2QixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUVqQyxlQUFVLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFbEQ7O1dBRUc7UUFDSCxZQUFPLEdBQUc7WUFDUjs7ZUFFRztZQUNILFVBQVUsRUFBRSxLQUFLO1lBQ2pCOztlQUVHO1lBQ0gsY0FBYyxFQUFFLEtBQUs7WUFDckI7O2VBRUc7WUFDSCxXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDO0tBdUxIO0lBckxDOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQ1AsS0FBdUIsRUFDdkIsSUFBa0MsRUFDbEMsUUFBNkI7UUFFN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEs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RGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWdyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIGtleWJvYXJkIG5hdmlnYXRpb24gZm9yIGRyb3Bkb3ducy5cbiAqXG4gKiBJdCBhbGxvd3MgdG8gbmF2aWdhdGUgb3ZlciB0aGUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIHVzaW5nIHRoZSBrZXlib2FyZFxuICogb3Igc2VhcmNoIGZvciB0aGVtLiBGb3IgdGhpcyB0byBjb3JyZWN0bHkgd29yaywgdGhlIHNlcnZpY2UgbmVlZHMgdG8gcHJvdmlkZWRcbiAqIGFzIGNvbXBvbmVudCBwcm92aWRlciBpbiB0aGUgY29tcG9uZW50LiBBZGRpdGlvbmFsbHkgdGhlIGBMaXN0SXRlbUNvbXBvbmVudGBcbiAqIG5lZWRzIHRvIGJlIHVzZWQgaW4gdGhlIGRyb3Bkb3duIGl0ZW1zLiBBbHNvIGVhY2ggaXRlbSBuZWVkcyB0byBoYXZlIGFcbiAqIHNwYW5bZGF0YS1zZWFyY2gtbGFiZWxdIGVsZW1lbnQgdG8gc2VhcmNoIGZvciB0aGUgaXRlbS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlbGVjdEtleWJvYXJkU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgS0VZQ09ERV9VUCA9ICdBcnJvd1VwJztcbiAgcHJpdmF0ZSByZWFkb25seSBLRVlDT0RFX0RPV04gPSAnQXJyb3dEb3duJztcbiAgcHJpdmF0ZSByZWFkb25seSBLRVlDT0RFX1RBQiA9ICdUYWInO1xuICBwcml2YXRlIHJlYWRvbmx5IEtFWUNPREVfRU5URVIgPSAnRW50ZXInO1xuICBwcml2YXRlIHJlYWRvbmx5IEtFWUNPREVfRVNDID0gJ0VzY2FwZSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgS0VZQ09ERV9TUEFDRSA9ICdTcGFjZSc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogQ29uaWZndXJhdGlvbiBvcHRpb25zIGZvciB0aGUga2V5Ym9hcmQgc2VydmljZS5cbiAgICovXG4gIG9wdGlvbnMgPSB7XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlIGlucHV0IHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS5cbiAgICAgKi9cbiAgICBlbXB0eUlucHV0OiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBTZWFyY2ggb24ga2V5IGV2ZW50LlxuICAgICAqL1xuICAgIGtleWJvYXJkU2VhcmNoOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBTcGFjZSBrZXkgZXZlbnQgaXMgdXNlZCB0byBzZWxlY3QuXG4gICAgICovXG4gICAgc3BhY2VTZWxlY3Q6IGZhbHNlXG4gIH07XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUga2V5Ym9hcmQgZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBkcm9wZG93bi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBlbGVtZW50IHRvIHNlYXJjaCBmb3IgaXRlbXMuXG4gICAqIEBwYXJhbSBsaXN0IEEgUXVlcnlMaXN0IG9mIGFsbCB0aGUgW0xpc3RJdGVtQ29tcG9uZW50XSBvbiB3aGljaCBjYW4gYmUgc2VhcmNoZWRcbiAgICogQHBhcmFtIGRyb3Bkb3duIFRoZSBkcm9wZG93biBpdHNlbGYgYXMgW0JzRHJvcGRvd25EaXJlY3RpdmVdLlxuICAgKiBAcmV0dXJucyBBIE9ic2VydmFibGU8bnVtYmVyPiB3aGVyZSBudW1iZXIgaXMgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBbTGlzdEl0ZW1Db21wb25lbnRdXG4gICAqL1xuICByZWdpc3RlciQoXG4gICAgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgbGlzdDogUXVlcnlMaXN0PExpc3RJdGVtQ29tcG9uZW50PixcbiAgICBkcm9wZG93bjogQnNEcm9wZG93bkRpcmVjdGl2ZVxuICApOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCQuaXNTdG9wcGVkKSB7XG4gICAgICB0aGlzLmRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdC5jaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgobGlzdCksXG4gICAgICBzd2l0Y2hNYXAoKGl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1Db21wb25lbnQ+KSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50PihpbnB1dCwgJ2tleXVwJyksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oaW5wdXQsICdrZXlkb3duJylcbiAgICAgICAgICApLFxuICAgICAgICAgIG9mKGl0ZW1zLnRvQXJyYXkoKSlcbiAgICAgICAgXSlcbiAgICAgICksXG4gICAgICBtYXAoKFtlLCBpdGVtc10pID0+IHRoaXMuaGFuZGxlS2V5Ym9hcmQoZSwgaW5wdXQsIGl0ZW1zLCBkcm9wZG93bikpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgdGhlIGtleWJvYXJkIGV2ZW50IGxpc3RuZXIuXG4gICAqL1xuICB1bnJlZ2lzdGVyKCkge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXlib2FyZCBldmVudCBpcyBmaXJlZCBieSBhIHNlbGVjdGlvbiBldmVudCAoRW50ZXIsIERvd24sIFRhYiwgVXAsIFNwYWNlKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpcyBhIHNlbGVjdGlvbiBldmVudC5cbiAgICovXG4gIGlzU2VsZWN0aW9uRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5LRVlDT0RFX0VOVEVSLFxuICAgICAgdGhpcy5LRVlDT0RFX0RPV04sXG4gICAgICB0aGlzLktFWUNPREVfVEFCLFxuICAgICAgdGhpcy5LRVlDT0RFX1VQLFxuICAgICAgLi4uKHRoaXMub3B0aW9ucy5zcGFjZVNlbGVjdCA/IFt0aGlzLktFWUNPREVfU1BBQ0VdIDogW10pXG4gICAgXS5pbmNsdWRlcyhldmVudC5jb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5Ym9hcmQoXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgaXRlbXM6IExpc3RJdGVtQ29tcG9uZW50W10sXG4gICAgZHJvcGRvd246IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkV2ZW50KGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXJyb3dLZXlTZWxlY3Rpb24oZXZlbnQsIGlucHV0LCBpdGVtcywgZHJvcGRvd24pO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jb2RlID09PSB0aGlzLktFWUNPREVfRVNDKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVDYW5jZWwoZXZlbnQsIGRyb3Bkb3duLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rZXlib2FyZFNlYXJjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5wdXRCb3hTZWFyY2goaXRlbXMsIGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbnB1dEJveFNlYXJjaChpdGVtczogTGlzdEl0ZW1Db21wb25lbnRbXSwgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBpZiAoIWlucHV0LnZhbHVlKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KGl0ZW1zLCBpdGVtID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsOiBIVE1MRWxlbWVudCA9XG4gICAgICAgIGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bZGF0YS1zZWFyY2gtbGFiZWxdJyk7XG4gICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbFxuICAgICAgICAuZ2V0QXR0cmlidXRlKCdkYXRhLXNlYXJjaC1sYWJlbCcpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5zdGFydHNXaXRoKGlucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4gKGl0ZW0uaGlnaGxpZ2h0ZWQgPSBmYWxzZSkpO1xuICAgICAgaXRlbXNbaW5kZXhdLmhpZ2hsaWdodGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleVNlbGVjdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbnB1dDogSFRNTElucHV0RWxlbWVudCxcbiAgICBpdGVtczogTGlzdEl0ZW1Db21wb25lbnRbXSxcbiAgICBkcm9wZG93bjogQnNEcm9wZG93bkRpcmVjdGl2ZVxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5jb2RlO1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gZmluZEluZGV4KGl0ZW1zLCBpdGVtID0+IGl0ZW0uYWN0aXZlKTtcbiAgICBjb25zdCBoaWdobGlnaHRlZEluZGV4ID0gZmluZEluZGV4KGl0ZW1zLCBpdGVtID0+IGl0ZW0uaGlnaGxpZ2h0ZWQpO1xuICAgIGNvbnN0IGluZGV4ID0gaGlnaGxpZ2h0ZWRJbmRleCA+IC0xID8gaGlnaGxpZ2h0ZWRJbmRleCA6IGFjdGl2ZUluZGV4O1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXlkb3duJykge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZW1wdHlJbnB1dCkge1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gdGhpcy5LRVlDT0RFX0VOVEVSIHx8IGtleUNvZGUgPT09IHRoaXMuS0VZQ09ERV9UQUIpIHtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGl0ZW1zW2luZGV4XS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH1cbiAgICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICAgIGlucHV0LmJsdXIoKTtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPT09IHRoaXMuS0VZQ09ERV9TUEFDRSkge1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgY29uc3QgY2xpY2tFdmVudCA9IG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHtcbiAgICAgICAgICBidWJibGVzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgaXRlbXNbaW5kZXhdLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGNsaWNrRXZlbnQpO1xuICAgICAgfVxuICAgICAgZHJvcGRvd24uc2hvdygpO1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBjb25zdCB1cE9yRG93biA9IGtleUNvZGUgPT09IHRoaXMuS0VZQ09ERV9ET1dOID8gMSA6IC0xO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBpdGVtc1tpbmRleF0uaGlnaGxpZ2h0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0TmV4dEl0ZW1PbktleWJvYXJkTW92ZShpdGVtcywgaW5kZXgsIHVwT3JEb3duKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2FuY2VsKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlLFxuICAgIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50XG4gICkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICBpbnB1dC5ibHVyKCk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3ROZXh0SXRlbU9uS2V5Ym9hcmRNb3ZlKFxuICAgIGl0ZW1zOiBMaXN0SXRlbUNvbXBvbmVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgdXBPckRvd246IC0xIHwgMVxuICApOiBudW1iZXIge1xuICAgIGlmIChpdGVtc1tpbmRleCArIHVwT3JEb3duXSkge1xuICAgICAgaWYgKCFpdGVtc1tpbmRleCArIHVwT3JEb3duXS5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdE5leHRJdGVtT25LZXlib2FyZE1vdmUoaXRlbXMsIGluZGV4ICsgdXBPckRvd24sIHVwT3JEb3duKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtc1tpbmRleCArIHVwT3JEb3duXSk7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGlmIChpbmRleCArIHVwT3JEb3duID4gLTEpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtc1swXSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdKTtcbiAgICByZXR1cm4gaXRlbXMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0SXRlbShpdGVtOiBMaXN0SXRlbUNvbXBvbmVudCkge1xuICAgIGl0ZW0uaGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgIGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgfVxufVxuIl19
@@ -101,6 +101,10 @@ export class SelectComponent {
101
101
  * If set to true, the user can select multiple items.
102
102
  */
103
103
  this.multi = false;
104
+ /**
105
+ * If enabled, an item can be selected with the space key.
106
+ */
107
+ this.canSelectWithSpace = !this.multi;
104
108
  /**
105
109
  * If set to true, the select is disabled.
106
110
  */
@@ -154,7 +158,8 @@ export class SelectComponent {
154
158
  this.destroy$ = new Subject();
155
159
  this.selectKeyboardService.options = {
156
160
  emptyInput: true,
157
- keyboardSearch: true
161
+ keyboardSearch: true,
162
+ spaceSelect: this.canSelectWithSpace
158
163
  };
159
164
  }
160
165
  /**
@@ -174,6 +179,9 @@ export class SelectComponent {
174
179
  this.insideClick = this.multi;
175
180
  }
176
181
  }
182
+ /**
183
+ * @ignore
184
+ */
177
185
  ngAfterViewInit() {
178
186
  this.selectKeyboardService
179
187
  .register$(this.searchControl.nativeElement, this.list, this.dropdown)
@@ -186,6 +194,18 @@ export class SelectComponent {
186
194
  }
187
195
  });
188
196
  }
197
+ /**
198
+ * @ignore
199
+ */
200
+ ngOnChanges(changes) {
201
+ if (changes.canSelectWithSpace) {
202
+ this.selectKeyboardService.options = {
203
+ emptyInput: true,
204
+ keyboardSearch: true,
205
+ spaceSelect: changes.canSelectWithSpace.currentValue
206
+ };
207
+ }
208
+ }
189
209
  /**
190
210
  * @ignore
191
211
  */
@@ -199,15 +219,21 @@ export class SelectComponent {
199
219
  * @param item The item to select.
200
220
  */
201
221
  select(item) {
202
- this.onSelect.emit(item);
203
222
  if (this.multi) {
204
- this._selected.indexOf(item) > -1 ? this.deselect(item) : this._selected.push(item);
223
+ const isSelected = this._selected.indexOf(item) > -1;
224
+ if (isSelected) {
225
+ this.deselect(item);
226
+ return;
227
+ }
228
+ this._selected.push(item);
205
229
  this.emitChangeEvent();
230
+ this.onSelect.emit(item);
206
231
  return;
207
232
  }
208
233
  this._selected = [item];
209
234
  this._preselectedItem = item;
210
235
  this.emitChangeEvent();
236
+ this.onSelect.emit(item);
211
237
  }
212
238
  /**
213
239
  * Deselects an item.
@@ -217,8 +243,8 @@ export class SelectComponent {
217
243
  const index = this._selected.indexOf(item);
218
244
  if (index > -1) {
219
245
  this._selected.splice(index, 1);
220
- this.onDeselect.emit(item);
221
246
  this.emitChangeEvent();
247
+ this.onDeselect.emit(item);
222
248
  this._preselectedItem = null;
223
249
  }
224
250
  }
@@ -325,7 +351,7 @@ export class SelectComponent {
325
351
  }
326
352
  }
327
353
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectComponent, deps: [{ token: i1.SelectKeyboardService }], target: i0.ɵɵFactoryTarget.Component }); }
328
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SelectComponent, selector: "c8y-select", inputs: { placeholder: "placeholder", items: "items", selected: "selected", container: "container", multi: "multi", disabled: "disabled", autoClose: "autoClose", insideClick: "insideClick", required: "required", canDeselect: "canDeselect", name: "name", icon: "icon" }, outputs: { onSelect: "onSelect", onDeselect: "onDeselect", onIconClick: "onIconClick" }, host: { classAttribute: "c8y-select-v2" }, providers: [
354
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SelectComponent, selector: "c8y-select", inputs: { placeholder: "placeholder", items: "items", selected: "selected", container: "container", multi: "multi", canSelectWithSpace: "canSelectWithSpace", disabled: "disabled", autoClose: "autoClose", insideClick: "insideClick", required: "required", canDeselect: "canDeselect", name: "name", icon: "icon" }, outputs: { onSelect: "onSelect", onDeselect: "onDeselect", onIconClick: "onIconClick" }, host: { classAttribute: "c8y-select-v2" }, providers: [
329
355
  {
330
356
  provide: NG_VALUE_ACCESSOR,
331
357
  multi: true,
@@ -337,7 +363,7 @@ export class SelectComponent {
337
363
  multi: true
338
364
  },
339
365
  SelectKeyboardService
340
- ], queries: [{ propertyName: "projectedSelectedItems", first: true, predicate: SelectedItemsDirective, descendants: true }, { propertyName: "projectedSelectableItems", predicate: SelectItemDirective }], viewQueries: [{ propertyName: "searchControl", first: true, predicate: ["searchControl"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "list", predicate: ListItemComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); select(item)\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n", dependencies: [{ kind: "directive", type: i2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i6.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i7.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i8.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: i9.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i10.C8yTranslatePipe, name: "translate" }] }); }
366
+ ], queries: [{ propertyName: "projectedSelectedItems", first: true, predicate: SelectedItemsDirective, descendants: true }, { propertyName: "projectedSelectableItems", predicate: SelectItemDirective }], viewQueries: [{ propertyName: "searchControl", first: true, predicate: ["searchControl"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "list", predicate: ListItemComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault();\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n", dependencies: [{ kind: "directive", type: i2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i6.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i7.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i8.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: i9.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i10.C8yTranslatePipe, name: "translate" }] }); }
341
367
  }
342
368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectComponent, decorators: [{
343
369
  type: Component,
@@ -353,7 +379,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
353
379
  multi: true
354
380
  },
355
381
  SelectKeyboardService
356
- ], template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); select(item)\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n" }]
382
+ ], template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault();\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n" }]
357
383
  }], ctorParameters: () => [{ type: i1.SelectKeyboardService }], propDecorators: { placeholder: [{
358
384
  type: Input
359
385
  }], items: [{
@@ -364,6 +390,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
364
390
  type: Input
365
391
  }], multi: [{
366
392
  type: Input
393
+ }], canSelectWithSpace: [{
394
+ type: Input
367
395
  }], disabled: [{
368
396
  type: Input
369
397
  }], autoClose: [{
@@ -400,4 +428,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
400
428
  type: ViewChildren,
401
429
  args: [ListItemComponent]
402
430
  }] } });
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBb0JwRSxNQUFNLE9BQU8sZUFBZTtJQVExQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSCxJQUFhLEtBQUssQ0FBQyxLQUE2RDtRQUM5RSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxD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O3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xpc3QtZ3JvdXAnO1xuaW1wb3J0IHsgU2VsZWN0SXRlbURpcmVjdGl2ZSB9IGZyb20gJy4vc2VsZWN0LWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IFNlbGVjdEtleWJvYXJkU2VydmljZSB9IGZyb20gJy4vc2VsZWN0LWtleWJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZUl0ZW0sIFNlbGVjdGFibGVJdGVtVGVtcGxhdGUgfSBmcm9tICcuL3NlbGVjdC5tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3RlZEl0ZW1zRGlyZWN0aXZlIH0gZnJvbSAnLi9zZWxlY3RlZC1pdGVtcy5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjOHktc2VsZWN0LXYyJyB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgU2VsZWN0S2V5Ym9hcmRTZXJ2aWNlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yXG57XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0IGl0ZW3igKYnO1xuXG4gIC8qKlxuICAgKiBJdGVtcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdC5cbiAgICogQ2FuIGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGBsYWJlbGAgYW5kIGB2YWx1ZWAgcHJvcGVydGllcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgaHRtbFxuICAgKiA8Yzh5LXNlbGVjdCBbaXRlbXNdPVwiW3sgbGFiZWw6ICdJdGVtIDEnLCB2YWx1ZTogJ2l0ZW0xJyB9LCB7IGxhYmVsOiAnSXRlbSAyJywgdmFsdWU6ICdpdGVtMicgfV1cIj48L2M4eS1zZWxlY3Q+XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxjOHktc2VsZWN0IFtpdGVtc109XCJbJ0l0ZW0gMScsICdJdGVtIDInLCAnSXRlbSAzJ11cIj48L2M4eS1zZWxlY3Q+XG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3IgbW9yZSBjb21wbGV4IHNjZW5hcmlvcywgeW91IGNhbiB1c2UgY29udGVudC1wcm9qZWN0aW9uOlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxjOHktc2VsZWN0PlxuICAgKiAgICA8aSBbYzh5SWNvbl09XCIncm9ja2V0J1wiIGNsYXNzPVwidGV4dC0xNlwiICpjOHlTZWxlY3RJdGVtPVwiJ3JvY2tldCc7IGxhYmVsOiAnUm9ja2V0J1wiPjwvaT5cbiAgICogICAgPGkgW2M4eUljb25dPVwiJ2NhcidcIiBjbGFzcz1cInRleHQtMTZcIiAqYzh5U2VsZWN0SXRlbT1cIidjYXInOyBsYWJlbDogJ0NhcidcIj48L2k+XG4gICAqIDwvYzh5LXNlbGVjdD5cbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaXRlbXModmFsdWU6IHN0cmluZ1tdIHwgU2VsZWN0YWJsZUl0ZW1bXSB8IFNlbGVjdGFibGVJdGVtVGVtcGxhdGVbXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gdmFsdWUubWFwKGl0ZW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4geyBsYWJlbDogaXRlbSwgdmFsdWU6IGl0ZW0gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdC5cbiAgICovXG4gIGdldCBpdGVtcygpOiBTZWxlY3RhYmxlSXRlbVRlbXBsYXRlW10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgaXRlbS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogc3RyaW5nIHwgU2VsZWN0YWJsZUl0ZW0gfCBBcnJheTxzdHJpbmcgfCBTZWxlY3RhYmxlSXRlbT4pIHtcbiAgICBjb25zdCBlbnN1cmVkQXJyYXk6IChzdHJpbmcgfCBTZWxlY3RhYmxlSXRlbSlbXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRBcnJheSA9IGVuc3VyZWRBcnJheS5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBpdGVtLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBub3JtYWxpemVkQXJyYXkubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbmQoaSA9PiBpLnZhbHVlID09PSBpdGVtLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkKCk6IFNlbGVjdGFibGVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIHB1dCB0aGUgZHJvcGRvd24gdG8uIERlZmF1bHRzIHRvIGJvZHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBjb250YWluZXI6ICcnIHwgJ2JvZHknID0gJ2JvZHknO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIHVzZXIgY2FuIHNlbGVjdCBtdWx0aXBsZSBpdGVtcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIG11bHRpID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCB0aGUgc2VsZWN0IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGVmaW5lcywgaWYgdGhlIGRyb3Bkb3duIHNob3VsZCBjbG9zZSBhdXRvbWF0aWNhbGx5IGFmdGVyIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBhdXRvQ2xvc2UgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGlmIHRoZSBkcm9wZG93biBzaG91bGQgc3RheSBvcGVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGluc2lkZSB0aGUgc2VsZWN0LlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGRyb3Bkb3duIHdpbGwgb25seSBjbG9zZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIHRoZSBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKVxuICBpbnNpZGVDbGljazogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWFya3MgdGhlIHNlbGVjdCBhcyByZXF1aXJlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBkZXNlbGVjdCBhbiBpdGVtLlxuICAgKi9cbiAgQElucHV0KClcbiAgY2FuRGVzZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgdXNlZCBmb3IgdGhpcyBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKVxuICBuYW1lID0gJ3NlbGVjdCc7XG5cbiAgLyoqXG4gICAqIFRoZSBpY29uIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgaWNvbiA9ICdjYXJldC1kb3duJztcblxuICAvKipcbiAgICogRW1pdHMgaWYgYSBpdGVtIGlzIHNlbGVjdGVkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RhYmxlSXRlbT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgaWYgYSBpdGVtIHdhcyBkZXNlbGVjdGVkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIG9uRGVzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGFibGVJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSBzZWxlY3QgaWNvbiBpcyBjbGlja2VkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIG9uSWNvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGljb246IHN0cmluZzsgJGV2ZW50OiBNb3VzZUV2ZW50IH0+KCk7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgc2VhcmNoIGlucHV0IGhhcyBmb2N1cy5cbiAgICovXG4gIHNlYXJjaEhhc0ZvY3VzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3RhYmxlIGl0ZW1zIHdoZW4gY29udGVudCBwcm9qZWN0aW9uIGlzIHVzZWQuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oU2VsZWN0SXRlbURpcmVjdGl2ZSkgcHJvamVjdGVkU2VsZWN0YWJsZUl0ZW1zOiBRdWVyeUxpc3Q8U2VsZWN0SXRlbURpcmVjdGl2ZT47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3RlZCBpdGVtcyB3aGVuIGNvbnRlbnQgcHJvamVjdGlvbiBpcyB1c2VkLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAQ29udGVudENoaWxkKFNlbGVjdGVkSXRlbXNEaXJlY3RpdmUpIHByb2plY3RlZFNlbGVjdGVkSXRlbXM6IFNlbGVjdGVkSXRlbXNEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoQ29udHJvbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIHNlYXJjaENvbnRyb2w6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgZHJvcGRvd246IEJzRHJvcGRvd25EaXJlY3RpdmU7XG4gIEBWaWV3Q2hpbGRyZW4oTGlzdEl0ZW1Db21wb25lbnQpIHByaXZhdGUgbGlzdDogUXVlcnlMaXN0PExpc3RJdGVtQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogQSBpdGVtIHdoaWNoIGlzIHByZXNlbGVjdGVkLiBJdCBpcyB1c2VkIHdoZW4gYSB1c2VyIHR5cGVzIGluIHRoZSBzZWFyY2ggaW5wdXQgdG8gZ2l2ZSBhIHZpc3VhbCB0eXBlYWhlYWQgZmVlZGJhY2suXG4gICAqL1xuICBnZXQgcHJlc2VsZWN0ZWRJdGVtKCk6IFNlbGVjdGFibGVJdGVtIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBzZWxlY3QgZWxlbWVudC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFNlbGVjdGFibGVJdGVtW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIHByZS1zZWxlY3QgZWxlbWVudC4gSXQgaXMgdXNlZCB3aGVuIGEgdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGlucHV0IHRvIGdpdmUgYSB2aXN1YWwgdHlwZWFoZWFkIGZlZWRiYWNrLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIF9wcmVzZWxlY3RlZEl0ZW06IFNlbGVjdGFibGVJdGVtO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgaXRlbXMgZWxlbWVudC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfaXRlbXM6IFNlbGVjdGFibGVJdGVtVGVtcGxhdGVbXSA9IFtdO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAoaXRlbXM6IFNlbGVjdGFibGVJdGVtIHwgU2VsZWN0YWJsZUl0ZW1bXSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHBhcmFtIHNlbGVjdEtleWJvYXJkU2VydmljZSBUaGUgc2VydmljZSB0byBoYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VsZWN0S2V5Ym9hcmRTZXJ2aWNlOiBTZWxlY3RLZXlib2FyZFNlcnZpY2UpIHtcbiAgICB0aGlzLnNlbGVjdEtleWJvYXJkU2VydmljZS5vcHRpb25zID0ge1xuICAgICAgZW1wdHlJbnB1dDogdHJ1ZSxcbiAgICAgIGtleWJvYXJkU2VhcmNoOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvamVjdGVkU2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucHJvamVjdGVkU2VsZWN0YWJsZUl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1zLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgICAgIHRlbXBsYXRlOiBpdGVtLnRlbXBsYXRlUmVmXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmluc2lkZUNsaWNrKSB7XG4gICAgICB0aGlzLmluc2lkZUNsaWNrID0gdGhpcy5tdWx0aTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RLZXlib2FyZFNlcnZpY2VcbiAgICAgIC5yZWdpc3RlciQodGhpcy5zZWFyY2hDb250cm9sLm5hdGl2ZUVsZW1lbnQsIHRoaXMubGlzdCwgdGhpcy5kcm9wZG93bilcbiAgICAgIC5zdWJzY3JpYmUoc2VsZWN0ZWRJbmRleCA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLl9wcmVzZWxlY3RlZEl0ZW0gPSB0aGlzLl9pdGVtc1tzZWxlY3RlZEluZGV4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmVzZWxlY3RlZEl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zZWxlY3RLZXlib2FyZFNlcnZpY2UudW5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYW4gaXRlbVxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBzZWxlY3QuXG4gICAqL1xuICBzZWxlY3QoaXRlbTogU2VsZWN0YWJsZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQoaXRlbSk7XG4gICAgaWYgKHRoaXMubXVsdGkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkLmluZGV4T2YoaXRlbSkgPiAtMSA/IHRoaXMuZGVzZWxlY3QoaXRlbSkgOiB0aGlzLl9zZWxlY3RlZC5wdXNoKGl0ZW0pO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBbaXRlbV07XG4gICAgdGhpcy5fcHJlc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyBhbiBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBkZXNlbGVjdC5cbiAgICovXG4gIGRlc2VsZWN0KGl0ZW06IFNlbGVjdGFibGVJdGVtKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZC5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5vbkRlc2VsZWN0LmVtaXQoaXRlbSk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgdGhpcy5fcHJlc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIGFsbCBpdGVtc1xuICAgKi9cbiAgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMub25EZXNlbGVjdC5lbWl0KCk7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IFtdO1xuICAgICAgdGhpcy5fcHJlc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICAgIHRoaXMuc2VhcmNoQ29udHJvbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bi5oaWRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBTZWxlY3RhYmxlSXRlbSB8IFNlbGVjdGFibGVJdGVtW10pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvciBvbkNoYW5nZS5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChpdGVtczogU2VsZWN0YWJsZUl0ZW0gfCBTZWxlY3RhYmxlSXRlbVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byByZWdpc3RlciBmb3Igb25Ub3VjaGVkLlxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgU2hvdWxkIGRpc2FibGUgb3Igbm90XG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkb0JsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hIYXNGb2N1cyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9uVG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZG9Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4oKTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaEhhc0ZvY3VzID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4geyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgaWYgdGhlIGRyb3Bkb3duIHdhcyBzaG93bi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25TaG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJlZCBpZiB0aGUgZHJvcGRvd24gd2FzIGhpZGRlbi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLl9wcmVzZWxlY3RlZEl0ZW0gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMubXVsdGkgPyB0aGlzLl9zZWxlY3RlZCA6IHRoaXMuX3NlbGVjdGVkWzBdKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjOHktc2VhcmNoLWRyb3Bkb3duIGRyb3Bkb3duIGZpdC13XCJcbiAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICBkcm9wZG93blxuICBbY29udGFpbmVyXT1cImNvbnRhaW5lclwiXG4gICNkcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxuICBbaXNEaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtpbnNpZGVDbGlja109XCJpbnNpZGVDbGlja1wiXG4gIChvblNob3duKT1cIm9uU2hvd24oKVwiXG4gIChvbkhpZGRlbik9XCJvbkhpZGRlbigpXCJcbiAgZHJvcGRvd25Ub2dnbGVcbiAgKGNsaWNrKT1cIm9wZW4oKVwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWRyb3Bkb3duXCJcbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgKm5nSWY9XCJ0cnVlXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ20tci04MCc6IGNhbkRlc2VsZWN0ICYmIHNlbGVjdGVkLmxlbmd0aCA+IDAsXG4gICAgICAgICdtLXItNDAnOiAhY2FuRGVzZWxlY3QgfHwgc2VsZWN0ZWQubGVuZ3RoID09PSAwLFxuICAgICAgICAndGV4dC10cnVuY2F0ZSc6ICFtdWx0aSxcbiAgICAgICAgJ2lubmVyLXNjcm9sbCBkLWZsZXggYS1pLWNlbnRlcic6IG11bHRpXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8IS0tIHJlbmRlcmluZyBvZiBzZWxlY3RlZCBpdGVtcyAod2l0aCBjb250ZW50IHByb2plY3Rpb24pIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNlbGVjdGVkLWl0ZW1zXCJcbiAgICAgICAgKm5nSWY9XCJwcm9qZWN0ZWRTZWxlY3RlZEl0ZW1zXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VsZWN0ZWRJdGVtIG9mIHNlbGVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgcHJvamVjdGVkU2VsZWN0ZWRJdGVtcy50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHNlbGVjdGVkSXRlbSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCJcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkLmxlbmd0aCA9PT0gMCAmJiAhc2VhcmNoSGFzRm9jdXMgJiYgc2VhcmNoQ29udHJvbC52YWx1ZS5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9pPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gcmVuZGVyaW5nIG9mIHNlbGVjdGVkIGl0ZW1zIChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1pdGVtc1wiXG4gICAgICAgICpuZ0lmPVwiIXByb2plY3RlZFNlbGVjdGVkSXRlbXNcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFtdWx0aVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VhcmNoSGFzRm9jdXMgJiYgcHJlc2VsZWN0ZWRJdGVtXCI+XG4gICAgICAgICAgICB7eyBwcmVzZWxlY3RlZEl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2VhcmNoSGFzRm9jdXMgJiYgc2VsZWN0ZWQubGVuZ3RoID09PSAxXCI+XG4gICAgICAgICAgICB7eyBzZWxlY3RlZFswXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZC5sZW5ndGggPT09IDAgJiYgIXByZXNlbGVjdGVkSXRlbSAmJiBzZWFyY2hDb250cm9sLnZhbHVlLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2k+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1yLTRcIj57eyBzZWFyY2hDb250cm9sLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInRhZyB0YWctLWluZm8gY2hpcFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VsZWN0ZWRJdGVtIG9mIHNlbGVjdGVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi14cyBidG4tY2xlYW4gdGV4dC0xMCBtLXItNFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRJdGVtLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBkZXNlbGVjdChzZWxlY3RlZEl0ZW0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB7eyBzZWxlY3RlZEl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGlucHV0XG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LXRydW5jYXRlXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAjc2VhcmNoQ29udHJvbFxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncC1hYnNvbHV0ZSc6IHRydWUsXG4gICAgICAgICdtLXItODAnOiBjYW5EZXNlbGVjdCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwLFxuICAgICAgICAnbS1yLTQwJzogIWNhbkRlc2VsZWN0IHx8IHNlbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgfVwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgKGJsdXIpPVwiZG9CbHVyKClcIlxuICAgICAgKGZvY3VzKT1cImRvRm9jdXMoKVwiXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgLz5cblxuICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICA8IS0tIHRoaXMgYnV0dG9uIGlzIGRpc3BsYXllZCBvbmx5IGlmIHdlIGhhdmUgc29tZXRoaW5nIHNlbGVjdGVkIGFuZCBhcmUgYWxsb3dlZCB0byBkZXNlbGVjdCAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0Rlc2VsZWN0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImNhbkRlc2VsZWN0ICYmIHNlbGVjdGVkLmxlbmd0aCA+IDBcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZGVzZWxlY3RBbGwoKVwiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnU2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwib25JY29uQ2xpY2suZW1pdCh7IGljb24sICRldmVudCB9KVwiXG4gICAgICAgIGRhdGEtY3k9XCJzZWxlY3QtYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cInRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgW2M4eUljb25dPVwiaWNvblwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxjOHktbGlzdC1ncm91cFxuICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1tb2RhbFwiXG4gICAgW3N0eWxlLndpZHRoXT1cImNvbnRhaW5lciA9PT0gJ2JvZHknID8gc2VhcmNoQ29udHJvbC5wYXJlbnROb2RlLmNsaWVudFdpZHRoICsgJ3B4JyA6IHVuZGVmaW5lZFwiXG4gICAgcm9sZT1cIm1lbnVcIlxuICAgIGRhdGEtY3k9XCJzZWxlY3QtLWRyb3Bkb3duLW1lbnVcIlxuICAgICpkcm9wZG93bk1lbnVcbiAgPlxuICAgIDwhLS0gcmVuZGVyaW5nIG9mIGl0ZW1zIChkZWZhdWx0KSAtLT5cbiAgICA8Yzh5LWxpXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiXG4gICAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICAgIFtkZW5zZV09XCJ0cnVlXCJcbiAgICAgIFthY3RpdmVdPVwiIW11bHRpICYmIGl0ZW0udmFsdWUgPT09IHNlbGVjdGVkWzBdPy52YWx1ZVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0KGl0ZW0pXCJcbiAgICA+XG4gICAgICA8c3BhbiBbYXR0ci5kYXRhLXNlYXJjaC1sYWJlbF09XCJpdGVtLmxhYmVsIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgPGM4eS1saS1jaGVja2JveFxuICAgICAgICAqbmdJZj1cIm11bHRpXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkLmluZGV4T2YoaXRlbSkgPiAtMVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBzZWxlY3QoaXRlbSlcIlxuICAgICAgPjwvYzh5LWxpLWNoZWNrYm94PlxuICAgICAgPGM4eS1saS1ib2R5XG4gICAgICAgICpuZ0lmPVwiIWl0ZW0udGVtcGxhdGVcIlxuICAgICAgPlxuICAgICAgICB7eyBpdGVtLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0/LnRlbXBsYXRlXCJcbiAgICAgICAgbmdQcm9qZWN0QXM9XCJjOHktbGktYm9keVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktbGk+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2XCI+PC9uZy1jb250ZW50PlxuICA8L2M4eS1saXN0LWdyb3VwPlxuPC9kaXY+XG4iXX0=
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBb0JwRSxNQUFNLE9BQU8sZUFBZTtJQVExQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSCxJQUFhLEtBQUssQ0FBQyxLQUE2RDtRQUM5RSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxD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QixLQUFLO2dCQU1OLFFBQVE7c0JBRFAsS0FBSztnQkFPTixTQUFTO3NCQURSLEtBQUs7Z0JBUU4sV0FBVztzQkFEVixLQUFLO2dCQU9OLFFBQVE7c0JBRFAsS0FBSztnQkFPTixXQUFXO3NCQURWLEtBQUs7Z0JBT04sSUFBSTtzQkFESCxLQUFLO2dCQU9OLElBQUk7c0JBREgsS0FBSztnQkFPTixRQUFRO3NCQURQLE1BQU07Z0JBT1AsVUFBVTtzQkFEVCxNQUFNO2dCQU9QLFdBQVc7c0JBRFYsTUFBTTtnQkFZK0Isd0JBQXdCO3NCQUE3RCxlQUFlO3VCQUFDLG1CQUFtQjtnQkFNRSxzQkFBc0I7c0JBQTNELFlBQVk7dUJBQUMsc0JBQXNCO2dCQUVtQixhQUFhO3NCQUFuRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0ssUUFBUTtzQkFBekQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNDLElBQUk7c0JBQTVDLFlBQVk7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQnNEcm9wZG93bkRpcmVjdGl2ZSB9IGZyb20gJ25neC1ib290c3RyYXAvZHJvcGRvd24nO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWdyb3VwJztcbmltcG9ydCB7IFNlbGVjdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL3NlbGVjdC1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTZWxlY3RLZXlib2FyZFNlcnZpY2UgfSBmcm9tICcuL3NlbGVjdC1rZXlib2FyZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGFibGVJdGVtLCBTZWxlY3RhYmxlSXRlbVRlbXBsYXRlIH0gZnJvbSAnLi9zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHsgU2VsZWN0ZWRJdGVtc0RpcmVjdGl2ZSB9IGZyb20gJy4vc2VsZWN0ZWQtaXRlbXMuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnYzh5LXNlbGVjdC12MicgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudClcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIFNlbGVjdEtleWJvYXJkU2VydmljZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yXG57XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0IGl0ZW3igKYnO1xuXG4gIC8qKlxuICAgKiBJdGVtcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdC5cbiAgICogQ2FuIGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGBsYWJlbGAgYW5kIGB2YWx1ZWAgcHJvcGVydGllcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgaHRtbFxuICAgKiA8Yzh5LXNlbGVjdCBbaXRlbXNdPVwiW3sgbGFiZWw6ICdJdGVtIDEnLCB2YWx1ZTogJ2l0ZW0xJyB9LCB7IGxhYmVsOiAnSXRlbSAyJywgdmFsdWU6ICdpdGVtMicgfV1cIj48L2M4eS1zZWxlY3Q+XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxjOHktc2VsZWN0IFtpdGVtc109XCJbJ0l0ZW0gMScsICdJdGVtIDInLCAnSXRlbSAzJ11cIj48L2M4eS1zZWxlY3Q+XG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3IgbW9yZSBjb21wbGV4IHNjZW5hcmlvcywgeW91IGNhbiB1c2UgY29udGVudC1wcm9qZWN0aW9uOlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxjOHktc2VsZWN0PlxuICAgKiAgICA8aSBbYzh5SWNvbl09XCIncm9ja2V0J1wiIGNsYXNzPVwidGV4dC0xNlwiICpjOHlTZWxlY3RJdGVtPVwiJ3JvY2tldCc7IGxhYmVsOiAnUm9ja2V0J1wiPjwvaT5cbiAgICogICAgPGkgW2M4eUljb25dPVwiJ2NhcidcIiBjbGFzcz1cInRleHQtMTZcIiAqYzh5U2VsZWN0SXRlbT1cIidjYXInOyBsYWJlbDogJ0NhcidcIj48L2k+XG4gICAqIDwvYzh5LXNlbGVjdD5cbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaXRlbXModmFsdWU6IHN0cmluZ1tdIHwgU2VsZWN0YWJsZUl0ZW1bXSB8IFNlbGVjdGFibGVJdGVtVGVtcGxhdGVbXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gdmFsdWUubWFwKGl0ZW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4geyBsYWJlbDogaXRlbSwgdmFsdWU6IGl0ZW0gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdC5cbiAgICovXG4gIGdldCBpdGVtcygpOiBTZWxlY3RhYmxlSXRlbVRlbXBsYXRlW10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgaXRlbS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogc3RyaW5nIHwgU2VsZWN0YWJsZUl0ZW0gfCBBcnJheTxzdHJpbmcgfCBTZWxlY3RhYmxlSXRlbT4pIHtcbiAgICBjb25zdCBlbnN1cmVkQXJyYXk6IChzdHJpbmcgfCBTZWxlY3RhYmxlSXRlbSlbXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRBcnJheSA9IGVuc3VyZWRBcnJheS5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBpdGVtLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBub3JtYWxpemVkQXJyYXkubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbmQoaSA9PiBpLnZhbHVlID09PSBpdGVtLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkKCk6IFNlbGVjdGFibGVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIHB1dCB0aGUgZHJvcGRvd24gdG8uIERlZmF1bHRzIHRvIGJvZHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBjb250YWluZXI6ICcnIHwgJ2JvZHknID0gJ2JvZHknO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIHVzZXIgY2FuIHNlbGVjdCBtdWx0aXBsZSBpdGVtcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIG11bHRpID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElmIGVuYWJsZWQsIGFuIGl0ZW0gY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhlIHNwYWNlIGtleS5cbiAgICovXG4gIEBJbnB1dCgpIGNhblNlbGVjdFdpdGhTcGFjZSA9ICF0aGlzLm11bHRpO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIHNlbGVjdCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERlZmluZXMsIGlmIHRoZSBkcm9wZG93biBzaG91bGQgY2xvc2UgYXV0b21hdGljYWxseSBhZnRlciB1c2VyIGludGVyYWN0aW9uLlxuICAgKi9cbiAgQElucHV0KClcbiAgYXV0b0Nsb3NlID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGVmaW5lcyBpZiB0aGUgZHJvcGRvd24gc2hvdWxkIHN0YXkgb3BlbiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBpbnNpZGUgdGhlIHNlbGVjdC5cbiAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBkcm9wZG93biB3aWxsIG9ubHkgY2xvc2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSB0aGUgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgaW5zaWRlQ2xpY2s6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBzZWxlY3QgYXMgcmVxdWlyZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZGVzZWxlY3QgYW4gaXRlbS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGNhbkRlc2VsZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHVzZWQgZm9yIHRoaXMgc2VsZWN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgbmFtZSA9ICdzZWxlY3QnO1xuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNlbGVjdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb24gPSAnY2FyZXQtZG93bic7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGlmIGEgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0YWJsZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGlmIGEgaXRlbSB3YXMgZGVzZWxlY3RlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBvbkRlc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RhYmxlSXRlbT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgc2VsZWN0IGljb24gaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBvbkljb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpY29uOiBzdHJpbmc7ICRldmVudDogTW91c2VFdmVudCB9PigpO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHNlYXJjaCBpbnB1dCBoYXMgZm9jdXMuXG4gICAqL1xuICBzZWFyY2hIYXNGb2N1cyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0YWJsZSBpdGVtcyB3aGVuIGNvbnRlbnQgcHJvamVjdGlvbiBpcyB1c2VkLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKFNlbGVjdEl0ZW1EaXJlY3RpdmUpIHByb2plY3RlZFNlbGVjdGFibGVJdGVtczogUXVlcnlMaXN0PFNlbGVjdEl0ZW1EaXJlY3RpdmU+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgaXRlbXMgd2hlbiBjb250ZW50IHByb2plY3Rpb24gaXMgdXNlZC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChTZWxlY3RlZEl0ZW1zRGlyZWN0aXZlKSBwcm9qZWN0ZWRTZWxlY3RlZEl0ZW1zOiBTZWxlY3RlZEl0ZW1zRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaENvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBzZWFyY2hDb250cm9sOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICBAVmlld0NoaWxkcmVuKExpc3RJdGVtQ29tcG9uZW50KSBwcml2YXRlIGxpc3Q6IFF1ZXJ5TGlzdDxMaXN0SXRlbUNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIEEgaXRlbSB3aGljaCBpcyBwcmVzZWxlY3RlZC4gSXQgaXMgdXNlZCB3aGVuIGEgdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGlucHV0IHRvIGdpdmUgYSB2aXN1YWwgdHlwZWFoZWFkIGZlZWRiYWNrLlxuICAgKi9cbiAgZ2V0IHByZXNlbGVjdGVkSXRlbSgpOiBTZWxlY3RhYmxlSXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgc2VsZWN0IGVsZW1lbnQuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBTZWxlY3RhYmxlSXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBwcmUtc2VsZWN0IGVsZW1lbnQuIEl0IGlzIHVzZWQgd2hlbiBhIHVzZXIgdHlwZXMgaW4gdGhlIHNlYXJjaCBpbnB1dCB0byBnaXZlIGEgdmlzdWFsIHR5cGVhaGVhZCBmZWVkYmFjay5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfcHJlc2VsZWN0ZWRJdGVtOiBTZWxlY3RhYmxlSXRlbTtcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGl0ZW1zIGVsZW1lbnQuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX2l0ZW1zOiBTZWxlY3RhYmxlSXRlbVRlbXBsYXRlW10gPSBbXTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKGl0ZW1zOiBTZWxlY3RhYmxlSXRlbSB8IFNlbGVjdGFibGVJdGVtW10pID0+IHZvaWQ7XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqIEBwYXJhbSBzZWxlY3RLZXlib2FyZFNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gaGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlbGVjdEtleWJvYXJkU2VydmljZTogU2VsZWN0S2V5Ym9hcmRTZXJ2aWNlKSB7XG4gICAgdGhpcy5zZWxlY3RLZXlib2FyZFNlcnZpY2Uub3B0aW9ucyA9IHtcbiAgICAgIGVtcHR5SW5wdXQ6IHRydWUsXG4gICAgICBrZXlib2FyZFNlYXJjaDogdHJ1ZSxcbiAgICAgIHNwYWNlU2VsZWN0OiB0aGlzLmNhblNlbGVjdFdpdGhTcGFjZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb2plY3RlZFNlbGVjdGFibGVJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb2plY3RlZFNlbGVjdGFibGVJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgICB0ZW1wbGF0ZTogaXRlbS50ZW1wbGF0ZVJlZlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pbnNpZGVDbGljaykge1xuICAgICAgdGhpcy5pbnNpZGVDbGljayA9IHRoaXMubXVsdGk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdEtleWJvYXJkU2VydmljZVxuICAgICAgLnJlZ2lzdGVyJCh0aGlzLnNlYXJjaENvbnRyb2wubmF0aXZlRWxlbWVudCwgdGhpcy5saXN0LCB0aGlzLmRyb3Bkb3duKVxuICAgICAgLnN1YnNjcmliZShzZWxlY3RlZEluZGV4ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPiAtMSkge1xuICAgICAgICAgIHRoaXMuX3ByZXNlbGVjdGVkSXRlbSA9IHRoaXMuX2l0ZW1zW3NlbGVjdGVkSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3ByZXNlbGVjdGVkSXRlbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jYW5TZWxlY3RXaXRoU3BhY2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0S2V5Ym9hcmRTZXJ2aWNlLm9wdGlvbnMgPSB7XG4gICAgICAgIGVtcHR5SW5wdXQ6IHRydWUsXG4gICAgICAgIGtleWJvYXJkU2VhcmNoOiB0cnVlLFxuICAgICAgICBzcGFjZVNlbGVjdDogY2hhbmdlcy5jYW5TZWxlY3RXaXRoU3BhY2UuY3VycmVudFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zZWxlY3RLZXlib2FyZFNlcnZpY2UudW5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYW4gaXRlbVxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBzZWxlY3QuXG4gICAqL1xuICBzZWxlY3QoaXRlbTogU2VsZWN0YWJsZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aSkge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGVkLmluZGV4T2YoaXRlbSkgPiAtMTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZGVzZWxlY3QoaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NlbGVjdGVkLnB1c2goaXRlbSk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZCA9IFtpdGVtXTtcbiAgICB0aGlzLl9wcmVzZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgdGhpcy5vblNlbGVjdC5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyBhbiBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBkZXNlbGVjdC5cbiAgICovXG4gIGRlc2VsZWN0KGl0ZW06IFNlbGVjdGFibGVJdGVtKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZC5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICAgIHRoaXMub25EZXNlbGVjdC5lbWl0KGl0ZW0pO1xuICAgICAgdGhpcy5fcHJlc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIGFsbCBpdGVtc1xuICAgKi9cbiAgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMub25EZXNlbGVjdC5lbWl0KCk7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IFtdO1xuICAgICAgdGhpcy5fcHJlc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICAgIHRoaXMuc2VhcmNoQ29udHJvbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bi5oaWRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBTZWxlY3RhYmxlSXRlbSB8IFNlbGVjdGFibGVJdGVtW10pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvciBvbkNoYW5nZS5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChpdGVtczogU2VsZWN0YWJsZUl0ZW0gfCBTZWxlY3RhYmxlSXRlbVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byByZWdpc3RlciBmb3Igb25Ub3VjaGVkLlxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgU2hvdWxkIGRpc2FibGUgb3Igbm90XG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkb0JsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hIYXNGb2N1cyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9uVG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZG9Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4oKTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaEhhc0ZvY3VzID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4geyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgaWYgdGhlIGRyb3Bkb3duIHdhcyBzaG93bi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25TaG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJlZCBpZiB0aGUgZHJvcGRvd24gd2FzIGhpZGRlbi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLl9wcmVzZWxlY3RlZEl0ZW0gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMubXVsdGkgPyB0aGlzLl9zZWxlY3RlZCA6IHRoaXMuX3NlbGVjdGVkWzBdKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjOHktc2VhcmNoLWRyb3Bkb3duIGRyb3Bkb3duIGZpdC13XCJcbiAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICBkcm9wZG93blxuICBbY29udGFpbmVyXT1cImNvbnRhaW5lclwiXG4gICNkcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxuICBbaXNEaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtpbnNpZGVDbGlja109XCJpbnNpZGVDbGlja1wiXG4gIChvblNob3duKT1cIm9uU2hvd24oKVwiXG4gIChvbkhpZGRlbik9XCJvbkhpZGRlbigpXCJcbiAgZHJvcGRvd25Ub2dnbGVcbiAgKGNsaWNrKT1cIm9wZW4oKVwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWRyb3Bkb3duXCJcbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgKm5nSWY9XCJ0cnVlXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ20tci04MCc6IGNhbkRlc2VsZWN0ICYmIHNlbGVjdGVkLmxlbmd0aCA+IDAsXG4gICAgICAgICdtLXItNDAnOiAhY2FuRGVzZWxlY3QgfHwgc2VsZWN0ZWQubGVuZ3RoID09PSAwLFxuICAgICAgICAndGV4dC10cnVuY2F0ZSc6ICFtdWx0aSxcbiAgICAgICAgJ2lubmVyLXNjcm9sbCBkLWZsZXggYS1pLWNlbnRlcic6IG11bHRpXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8IS0tIHJlbmRlcmluZyBvZiBzZWxlY3RlZCBpdGVtcyAod2l0aCBjb250ZW50IHByb2plY3Rpb24pIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNlbGVjdGVkLWl0ZW1zXCJcbiAgICAgICAgKm5nSWY9XCJwcm9qZWN0ZWRTZWxlY3RlZEl0ZW1zXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VsZWN0ZWRJdGVtIG9mIHNlbGVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgcHJvamVjdGVkU2VsZWN0ZWRJdGVtcy50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHNlbGVjdGVkSXRlbSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCJcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkLmxlbmd0aCA9PT0gMCAmJiAhc2VhcmNoSGFzRm9jdXMgJiYgc2VhcmNoQ29udHJvbC52YWx1ZS5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9pPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gcmVuZGVyaW5nIG9mIHNlbGVjdGVkIGl0ZW1zIChkZWZhdWx0KSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1pdGVtc1wiXG4gICAgICAgICpuZ0lmPVwiIXByb2plY3RlZFNlbGVjdGVkSXRlbXNcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFtdWx0aVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VhcmNoSGFzRm9jdXMgJiYgcHJlc2VsZWN0ZWRJdGVtXCI+XG4gICAgICAgICAgICB7eyBwcmVzZWxlY3RlZEl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2VhcmNoSGFzRm9jdXMgJiYgc2VsZWN0ZWQubGVuZ3RoID09PSAxXCI+XG4gICAgICAgICAgICB7eyBzZWxlY3RlZFswXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZC5sZW5ndGggPT09IDAgJiYgIXByZXNlbGVjdGVkSXRlbSAmJiBzZWFyY2hDb250cm9sLnZhbHVlLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2k+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1yLTRcIj57eyBzZWFyY2hDb250cm9sLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInRhZyB0YWctLWluZm8gY2hpcFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VsZWN0ZWRJdGVtIG9mIHNlbGVjdGVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi14cyBidG4tY2xlYW4gdGV4dC0xMCBtLXItNFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRJdGVtLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBkZXNlbGVjdChzZWxlY3RlZEl0ZW0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB7eyBzZWxlY3RlZEl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGlucHV0XG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LXRydW5jYXRlXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAjc2VhcmNoQ29udHJvbFxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncC1hYnNvbHV0ZSc6IHRydWUsXG4gICAgICAgICdtLXItODAnOiBjYW5EZXNlbGVjdCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwLFxuICAgICAgICAnbS1yLTQwJzogIWNhbkRlc2VsZWN0IHx8IHNlbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgfVwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgKGJsdXIpPVwiZG9CbHVyKClcIlxuICAgICAgKGZvY3VzKT1cImRvRm9jdXMoKVwiXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgLz5cblxuICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICA8IS0tIHRoaXMgYnV0dG9uIGlzIGRpc3BsYXllZCBvbmx5IGlmIHdlIGhhdmUgc29tZXRoaW5nIHNlbGVjdGVkIGFuZCBhcmUgYWxsb3dlZCB0byBkZXNlbGVjdCAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0Rlc2VsZWN0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImNhbkRlc2VsZWN0ICYmIHNlbGVjdGVkLmxlbmd0aCA+IDBcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZGVzZWxlY3RBbGwoKVwiXG4gICAgICA+XG4gICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnU2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwib25JY29uQ2xpY2suZW1pdCh7IGljb24sICRldmVudCB9KVwiXG4gICAgICAgIGRhdGEtY3k9XCJzZWxlY3QtYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cInRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgW2M4eUljb25dPVwiaWNvblwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxjOHktbGlzdC1ncm91cFxuICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1tb2RhbFwiXG4gICAgW3N0eWxlLndpZHRoXT1cImNvbnRhaW5lciA9PT0gJ2JvZHknID8gc2VhcmNoQ29udHJvbC5wYXJlbnROb2RlLmNsaWVudFdpZHRoICsgJ3B4JyA6IHVuZGVmaW5lZFwiXG4gICAgcm9sZT1cIm1lbnVcIlxuICAgIGRhdGEtY3k9XCJzZWxlY3QtLWRyb3Bkb3duLW1lbnVcIlxuICAgICpkcm9wZG93bk1lbnVcbiAgPlxuICAgIDwhLS0gcmVuZGVyaW5nIG9mIGl0ZW1zIChkZWZhdWx0KSAtLT5cbiAgICA8Yzh5LWxpXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiXG4gICAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICAgIFtkZW5zZV09XCJ0cnVlXCJcbiAgICAgIFthY3RpdmVdPVwiIW11bHRpICYmIGl0ZW0udmFsdWUgPT09IHNlbGVjdGVkWzBdPy52YWx1ZVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0KGl0ZW0pXCJcbiAgICA+XG4gICAgICA8c3BhbiBbYXR0ci5kYXRhLXNlYXJjaC1sYWJlbF09XCJpdGVtLmxhYmVsIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgPGM4eS1saS1jaGVja2JveFxuICAgICAgICAqbmdJZj1cIm11bHRpXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkLmluZGV4T2YoaXRlbSkgPiAtMVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxuICAgICAgPjwvYzh5LWxpLWNoZWNrYm94PlxuICAgICAgPGM4eS1saS1ib2R5XG4gICAgICAgICpuZ0lmPVwiIWl0ZW0udGVtcGxhdGVcIlxuICAgICAgPlxuICAgICAgICB7eyBpdGVtLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0/LnRlbXBsYXRlXCJcbiAgICAgICAgbmdQcm9qZWN0QXM9XCJjOHktbGktYm9keVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktbGk+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2XCI+PC9uZy1jb250ZW50PlxuICA8L2M4eS1saXN0LWdyb3VwPlxuPC9kaXY+XG4iXX0=