@seniorsistemas/angular-components 17.31.2-feature-sds-110-0ff2e960 → 17.31.2-feature-sds-110-234267aa

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,7 @@ export declare class AutocompleteComponent<T> implements ControlValueAccessor {
32
32
  multiple: import("@angular/core").InputSignal<boolean>;
33
33
  minLengthToSearch: import("@angular/core").InputSignal<number>;
34
34
  inputClass: import("@angular/core").InputSignal<string>;
35
+ dataKey: import("@angular/core").InputSignal<keyof T | undefined>;
35
36
  value: import("@angular/core").ModelSignal<T | null | undefined>;
36
37
  values: import("@angular/core").ModelSignal<T[]>;
37
38
  disabled: import("@angular/core").ModelSignal<boolean>;
@@ -245,6 +246,6 @@ export declare class AutocompleteComponent<T> implements ControlValueAccessor {
245
246
  */
246
247
  private _validateInputs;
247
248
  static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteComponent<any>, never>;
248
- static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent<any>, "s-autocomplete", never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "suggestionValue": { "alias": "suggestionValue"; "required": false; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "dropdown": { "alias": "dropdown"; "required": false; "isSignal": true; }; "forceSelection": { "alias": "forceSelection"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "minLengthToSearch": { "alias": "minLengthToSearch"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; "disabled": "disabledChange"; "lazyLoad": "lazyLoad"; "selected": "selected"; "unselected": "unselected"; "blurred": "blurred"; "cleared": "cleared"; "keyUp": "keyUp"; "focused": "focused"; "completeMethod": "completeMethod"; }, never, never, true, never>;
249
+ static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent<any>, "s-autocomplete", never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "suggestionValue": { "alias": "suggestionValue"; "required": false; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "dropdown": { "alias": "dropdown"; "required": false; "isSignal": true; }; "forceSelection": { "alias": "forceSelection"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "minLengthToSearch": { "alias": "minLengthToSearch"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; "disabled": "disabledChange"; "lazyLoad": "lazyLoad"; "selected": "selected"; "unselected": "unselected"; "blurred": "blurred"; "cleared": "cleared"; "keyUp": "keyUp"; "focused": "focused"; "completeMethod": "completeMethod"; }, never, never, true, never>;
249
250
  }
250
251
  export {};
@@ -1,7 +1,7 @@
1
1
  import { OverlayModule } from '@angular/cdk/overlay';
2
2
  import { ScrollingModule } from '@angular/cdk/scrolling';
3
3
  import { CommonModule } from '@angular/common';
4
- import { Component, computed, DestroyRef, forwardRef, inject, input, model, output, signal, viewChild } from '@angular/core';
4
+ import { Component, computed, DestroyRef, forwardRef, inject, input, model, output, signal, viewChild, } from '@angular/core';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
7
7
  import { TranslateModule } from '@ngx-translate/core';
@@ -33,6 +33,7 @@ export class AutocompleteComponent {
33
33
  multiple = input(false);
34
34
  minLengthToSearch = input(1);
35
35
  inputClass = input('');
36
+ dataKey = input();
36
37
  value = model();
37
38
  values = model([]);
38
39
  disabled = model(false);
@@ -415,13 +416,16 @@ export class AutocompleteComponent {
415
416
  * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.
416
417
  */
417
418
  _addIdToSuggestions(suggestions) {
418
- const baseId = `${this.componentId}_suggestion`;
419
- return suggestions?.map((suggestion, index) => {
419
+ return (suggestions?.map((suggestion) => {
420
420
  return {
421
421
  data: suggestion,
422
- id: `${baseId}_${index++}`,
422
+ id: this.dataKey()
423
+ ? String(suggestion[this.dataKey()])
424
+ : ((typeof suggestion !== 'object'
425
+ ? suggestion?.toString()
426
+ : Object.values(suggestion).join('_')) ?? ''),
423
427
  };
424
- }) ?? [];
428
+ }) ?? []);
425
429
  }
426
430
  /**
427
431
  * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.
@@ -519,7 +523,7 @@ export class AutocompleteComponent {
519
523
  }
520
524
  }
521
525
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
522
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
523
527
  {
524
528
  provide: NG_VALUE_ACCESSOR,
525
529
  useExisting: forwardRef(() => AutocompleteComponent),
@@ -551,4 +555,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
551
555
  '(window:resize)': 'onWindowResize()',
552
556
  }, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n" }]
553
557
  }], ctorParameters: () => [] });
554
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBYyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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QUMsMEVBQTBFLENBQUMsQ0FBQztZQUNoRyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7d0dBeGtCUSxxQkFBcUI7NEZBQXJCLHFCQUFxQiwydkdBZm5CO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEQsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLDhJQzdDTCw0a09BcUxBLDJDRHRKUSxZQUFZLG1TQUNaLFdBQVcsOG1CQUNYLG1CQUFtQiw4QkFDbkIsYUFBYSx1dERBQ2IsZUFBZSw4QkFDZixlQUFlLDRGQUNmLHlCQUF5Qjs7NEZBaUJwQixxQkFBcUI7a0JBNUJqQyxTQUFTOytCQUNJLGdCQUFnQixjQUNkLElBQUksV0FFUDt3QkFDTCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZix5QkFBeUI7cUJBQzVCLGFBQ1U7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKLFFBQ0s7d0JBQ0YsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLHNCQUFzQixFQUFFLFVBQVU7d0JBQ2xDLHNCQUFzQixFQUFFLFdBQVc7d0JBQ25DLGtCQUFrQixFQUFFLHVEQUF1RDt3QkFDM0UsaUJBQWlCLEVBQUUsa0JBQWtCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXG4gKiBAdGVtcGxhdGUgVCBUaXBvIGRvcyBkYWRvcyBhc3NvY2lhZG9zIMOgIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBkYXRhIE9zIGRhZG9zIGRhIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXG4gKiBAcHJvcGVydHkgW2lzU2VsZWN0ZWRdIEluZGljYSBzZSBhIHN1Z2VzdMOjbyBlc3TDoSBzZWxlY2lvbmFkYS5cbiAqL1xuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1hdXRvY29tcGxldGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbigpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtaGFzcG9wdXBdJzogJ1wibGlzdGJveFwiJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcbiAgICBwdWJsaWMgaW52YWxpZCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBsYXp5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZm9yY2VTZWxlY3Rpb24gPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XG4gICAgcHVibGljIGlucHV0Q2xhc3MgPSBpbnB1dDxzdHJpbmc+KCcnKTtcblxuICAgIHB1YmxpYyB2YWx1ZSA9IG1vZGVsPFQgfCBudWxsPigpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBtb2RlbDxUW10+KFtdKTtcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBtb2RlbChmYWxzZSk7XG5cbiAgICBwdWJsaWMgbGF6eUxvYWQgPSBvdXRwdXQ8eyBxdWVyeTogc3RyaW5nOyByZXNwb25zZTogKGRhdGE6IFRbXSkgPT4gdm9pZCB9PigpO1xuICAgIHB1YmxpYyBzZWxlY3RlZCA9IG91dHB1dDxUPigpO1xuICAgIHB1YmxpYyB1bnNlbGVjdGVkID0gb3V0cHV0PFQ+KCk7XG4gICAgcHVibGljIGJsdXJyZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG4gICAgcHVibGljIGNsZWFyZWQgPSBvdXRwdXQoKTtcbiAgICBwdWJsaWMga2V5VXAgPSBvdXRwdXQ8RXZlbnQ+KCk7XG4gICAgcHVibGljIGZvY3VzZWQgPSBvdXRwdXQ8YW55PigpO1xuICAgIHB1YmxpYyBjb21wbGV0ZU1ldGhvZCA9IG91dHB1dDx7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcblxuICAgIHB1YmxpYyBmb2N1c2VkSW5kZXggPSBzaWduYWwoLTEpO1xuICAgIHB1YmxpYyBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gc2lnbmFsPFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10+KFtdKTtcbiAgICBwdWJsaWMgc2hvd0VtcHR5TWVzc2FnZSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHVibGljIGZpbHRlclRleHQgPSBzaWduYWwoJycpO1xuICAgIHB1YmxpYyBpbnB1dFZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICBwdWJsaWMgY29tcG9uZW50SWQgPSBgYXV0b2NvbXBsZXRlXyR7QXV0b2NvbXBsZXRlQ29tcG9uZW50Lm5leHRJZCsrfWA7XG4gICAgcHVibGljIGlucHV0RWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2lucHV0RWwnKTtcblxuICAgIHByaXZhdGUgX2lucHV0U3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfbGF6eUxvYWRTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlPzogKHZhbHVlOiBhbnkgfCBhbnlbXSkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIHJldG9ybmEgdW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZG8gdGlwbyBgU3VnZ2VzdGlvbldyYXBwZXI8VD5gLFxuICAgICAqIGFkaWNpb25hbmRvIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28uXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgcHJvY2Vzc2FkYXMgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbFN1Z2dlc3Rpb24gPSBjb21wdXRlZDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLnN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRJZFRvU3VnZ2VzdGlvbnMob3B0cyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtIGNvbmp1bnRvIChgU2V0YCkgY29tIG9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMuXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkU3VnZ2VzdGlvbklkcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxuICAgICAgICAgICAgY3VycmVudFZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkuZmluZCgocykgPT4gSlNPTi5zdHJpbmdpZnkocy5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKT8uaWQ7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBlbnJpcXVlY2lkYXMgY29tIGEgcHJvcHJpZWRhZGUgYGlzU2VsZWN0ZWRgLlxuICAgICAqIENhZGEgc3VnZXN0w6NvIHJlY2ViZSB1bSBjYW1wbyBib29sZWFubyBgaXNTZWxlY3RlZGAgaW5kaWNhbmRvIHNlIGVsYSBlc3TDoSBzZWxlY2lvbmFkYSxcbiAgICAgKiBjb20gYmFzZSBub3MgSURzIGRhcyBzdWdlc3TDtWVzIHNlbGVjaW9uYWRhcyBlIG5vIHZhbG9yIGRhIHN1Z2VzdMOjby5cbiAgICAgKiBAcmV0dXJucyBVbWEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMsIGNhZGEgdW1hIGNvbSBhIHByb3ByaWVkYWRlIGFkaWNpb25hbCBgaXNTZWxlY3RlZGAuXG4gICAgICovXG4gICAgcHVibGljIGVucmljaGVkRmlsdGVyZWRTdWdnZXN0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbklkcygpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZC5tYXAoKHN1Z2dlc3Rpb24pID0+ICh7XG4gICAgICAgICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWRJZHMuaGFzKHN1Z2dlc3Rpb24uaWQpLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBJbnB1dERlYm91bmNlKCk7XG4gICAgICAgIHRoaXMuX3NldHVwTGF6eUxvYWREZWJvdW5jZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIHZhbG9yIGRvIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVmFsb3IgYSBzZXIgZGVmaW5pZG8sIMO6bmljbyBvdSBhcnJheSwgY29uZm9ybWUgc2VsZcOnw6NvIG3Dumx0aXBsYS5cbiAgICAgKiBAdGhyb3dzIFNlIG3Dumx0aXBsbyBmb3IgZmFsc28gZSB2YWx1ZSBmb3IgYXJyYXkuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbkxhYmVsID0gdGhpcy5zdWdnZXN0aW9uTGFiZWwoKTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW3ZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBtdXN0IG5vdCBiZSBhbiBhcnJheSB3aGVuIG11bHRpcGxlIGlzIGZhbHNlLicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoIXZhbHVlID8gJycgOiBzdWdnZXN0aW9uTGFiZWwgPyBTdHJpbmcodmFsdWVbc3VnZ2VzdGlvbkxhYmVsXSkgOiBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gYSBzZXIgY2hhbWFkYSBxdWFuZG8gbyB2YWxvciBtdWRhci4gUmVjZWJlIG8gbm92byB2YWxvciBjb21vIGFyZ3VtZW50bywgcXVlIHBvZGUgc2VyIHVtIMO6bmljbyB2YWxvciBvdSB1bSBhcnJheSBkZSB2YWxvcmVzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGFueSB8IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXG4gICAgICogQHBhcmFtIG9uVG91Y2hlZCBGdW7Dp8OjbyBkZSBjYWxsYmFjayBhIHNlciBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlPyhkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgZW50cmFkYSBkbyB1c3XDoXJpbyBubyBjYW1wbyBkZSB0ZXh0byBkbyBhdXRvY29tcGxldGUuXG4gICAgICogRXN0ZSBtw6l0b2RvIMOpIGNoYW1hZG8gc2VtcHJlIHF1ZSBvIHVzdcOhcmlvIGRpZ2l0YSBhbGdvIG5vIGNhbXBvIGRlIGVudHJhZGEuXG4gICAgICogRWxlIGV4ZWN1dGEgYXMgc2VndWludGVzIGHDp8O1ZXM6XG4gICAgICogLSBEaXNwYXJhIG8gY2FsbGJhY2sgZGUgXCJ0b3VjaGVkXCIgcGFyYSBjb250cm9sZSBkZSBmb3JtdWzDoXJpb3MuXG4gICAgICogLSBPYnTDqW0gbyB2YWxvciBhdHVhbCBkbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqIC0gU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSBvIGV2ZW50byBkZSBsYXp5TG9hZCBjb20gYSBjb25zdWx0YSBlIGFicmUgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgYXR1YWxpemEgbyB0ZXh0byBkZSBmaWx0cm8sIG5vdGlmaWNhIG9zIG9ic2VydmFkb3JlcyBlIGFicmUgbyBwYWluZWwgZGUgc3VnZXN0w7VlcyBzZSBob3V2ZXIgc3VnZXN0w7VlcyBkaXNwb27DrXZlaXMuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZSBlbnRyYWRhIGRvIHRpcG8gYEV2ZW50YCBwcm92ZW5pZW50ZSBkbyBjYW1wbyBkZSB0ZXh0by5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMubGF6eSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXp5TG9hZFN1YmplY3QkLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0LnNldCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZU1ldGhvZC5lbWl0KHsgcXVlcnk6IHZhbHVlIH0pO1xuXG4gICAgICAgIHRoaXMuX2lucHV0U3ViamVjdCQubmV4dCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnMoKSkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcGVyZGEgZGUgZm9jbyAoYmx1cikgZG8gY2FtcG8gZGUgZW50cmFkYSBkbyBhdXRvY29tcGxldGUuXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIG8gdmFsb3IgZGlnaXRhZG8gcGVsbyB1c3XDoXJpbyBjb3JyZXNwb25kZSBleGF0YW1lbnRlIGEgYWxndW0gZG9zIGl0ZW5zIHN1Z2VyaWRvcy5cbiAgICAgKiAtIFNlIGhvdXZlciBjb3JyZXNwb25kw6puY2lhOlxuICAgICAqICAgLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIGFkaWNpb25hIG8gaXRlbSBzZWxlY2lvbmFkbyDDoCBsaXN0YSBkZSB2YWxvcmVzLCBjYXNvIGFpbmRhIG7Do28gZXN0ZWphIHByZXNlbnRlLlxuICAgICAqICAgLSBObyBtb2RvIHNpbXBsZXMsIHNlbGVjaW9uYSBvIGl0ZW0gY29ycmVzcG9uZGVudGUgc2UgYWluZGEgbsOjbyBlc3RpdmVyIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gU2UgbsOjbyBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYSwgbGltcGEgbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IFN0cmluZyh0aGlzLmlucHV0VmFsdWUoKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3VnZ2VzdGlvbnMuZmluZCgoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcobGFiZWwpLnRvTG93ZXJDYXNlKCkgPT09IGlucHV0VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGN1cnJlbnRWYWx1ZXMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyB2YWx1ZVt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiB2YWx1ZSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IG1hdGNoLmRhdGFbdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogbWF0Y2guZGF0YSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoWy4uLmN1cnJlbnRWYWx1ZXMsIG1hdGNoLmRhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlLnNldCgnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgIT09IG1hdGNoLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKG1hdGNoLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGFyYSBvIGV2ZW50byBkZSBmb2NvIHF1YW5kbyBvIGNhbXBvIGRlIGVudHJhZGEgcmVjZWJlIGZvY28uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIGZvY28gZGlzcGFyYWRvIHBlbG8gZWxlbWVudG8gZGUgZW50cmFkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEZvY3VzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyBnZXJlbmNpYSBhIG5hdmVnYcOnw6NvIGUgc2VsZcOnw6NvIGRlIHN1Z2VzdMO1ZXMgdXNhbmRvIGFzIHRlY2xhcyBkbyB0ZWNsYWRvLlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBzdWdlc3TDo28uXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IuXG4gICAgICogLSAnRW50ZXInIG91ICdUYWInOiBTZWxlY2lvbmEgYSBzdWdlc3TDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHNlbSBzZWxlY2lvbmFyIG5lbmh1bSBpdGVtLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQ/LigpO1xuXG4gICAgICAgIGNvbnN0IF9zZWxlY3RTdWdnZXN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRTdWdnZXN0aW9uKHN1Z2dlc3Rpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgX3NlbGVjdFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdGUgdW0gZXZlbnRvIHF1YW5kbyB1bWEgdGVjbGEgw6kgbGliZXJhZGEgbm8gY29tcG9uZW50ZS4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBhc3NvY2lhZG8gw6AgdGVjbGEgbGliZXJhZGEuXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5VXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5VXAuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlbSBldmVudG9zIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRlIGphbmVsYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHVtYSBzdWdlc3TDo28gZGEgbGlzdGEgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyAoYG11bHRpcGxlKClgIHJldG9ybmEgdHJ1ZSksIGFkaWNpb25hIGEgc3VnZXN0w6NvIMOgIGxpc3RhIGRlIHN1Z2dlc3TDtWVzIHNlbGVjaW9uYWRhcyxcbiAgICAgKiBjYXNvIGVsYSBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS4gRW0gc2VndWlkYSwgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gbsOjbyBlc3RpdmVyIGF0aXZhZG8sIGRlZmluZSBhIHN1Z2VzdMOjbyBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgYXR1YWxpemEgbyBjYW1wbyBkZSBlbnRyYWRhXG4gICAgICogY29tIG8gcsOzdHVsbyBjb3JyZXNwb25kZW50ZS5cbiAgICAgKiBFbSBhbWJvcyBvcyBjYXNvcywgZGlzcGFyYSBvIGNhbGxiYWNrIGBfb25DaGFuZ2VgIGNvbSBvIG5vdm8gdmFsb3IgZSBmZWNoYSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzLlxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uIC0gQSBzdWdlc3TDo28gYSBzZXIgc2VsZWNpb25hZGEuXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGN1cnJlbnRWYWx1ZXMuc29tZShcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gdmFsdWVbdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogdmFsdWUpID09PVxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbLi4uY3VycmVudFZhbHVlcywgc3VnZ2VzdGlvbl0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoc3VnZ2VzdGlvbik7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gc3VnZ2VzdGlvblt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiBzdWdnZXN0aW9uO1xuICAgICAgICAgICAgY29uc3QgX2lucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbik7XG5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoX2lucHV0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/LihfdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBkZSBhdXRvY29tcGxldGUuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHJlbW92ZSB0b2RvcyBvcyB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsby5cbiAgICAgKiBUYW1iw6ltIGxpbXBhIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBmZWNoYSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzXG4gICAgICogZSBsaW1wYSBvIHZhbG9yIGRvIGNhbXBvIGRlIGVudHJhZGEuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICB0aGlzLmNsZWFyZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRvIGRyb3Bkb3duIGRlIHN1Z2VzdMO1ZXMgZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyBjb25maWd1cmEgbyBkZWJvdW5jZSBkbyBpbnB1dCwgdmVyaWZpY2Egc2UgaMOhIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzXG4gICAgICogZSwgY2FzbyBuw6NvIGhhamEgc3VnZXN0w7VlcyBlIG8gdGV4dG8gZG8gZmlsdHJvIGVzdGVqYSB2YXppbywgcmVkZWZpbmUgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogUG9yIGZpbSwgYWx0ZXJuYSBvIGVzdGFkbyBkZSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclRleHQoKSA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCgnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoIXRoaXMuaXNPcGVuKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIHV0aWxpemFkYSBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzIG5vIEFuZ3VsYXIsIHBlcm1pdGluZG8gcXVlIG8gZnJhbWV3b3JrXG4gICAgICogaWRlbnRpZmlxdWUgY2FkYSBpdGVtIGRlIGZvcm1hIMO6bmljYSBwZWxvIHNldSBgaWRgLiBEZXZlIHNlciB1dGlsaXphZGEgY29tbyBmdW7Dp8OjbyBkZSBgdHJhY2tCeWBcbiAgICAgKiBlbSBkaXJldGl2YXMgY29tbyBgKm5nRm9yYC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gT2JqZXRvIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCBxdWUgcmVwcmVzZW50YSBvIGl0ZW0gYXR1YWwuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZG8gaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogU3VnZ2VzdGlvbldyYXBwZXI8VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdW1hIHN1Z2VzdMOjbyBkYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiBPIGl0ZW0gYSBzZXIgcmVtb3ZpZG8gZGEgbGlzdGEgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25WYWx1ZSA9IHRoaXMuc3VnZ2VzdGlvblZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFxuICAgICAgICAgICAgdGhpcy52YWx1ZXMoKS5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbc3VnZ2VzdGlvblZhbHVlXSAhPT0gc3VnZ2VzdGlvbltzdWdnZXN0aW9uVmFsdWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHN1Z2dlc3Rpb247XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLmVtaXQoc3VnZ2VzdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVpbmljaWEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSBvIG1vZG8gbGF6eSBlc3RpdmVyIGF0aXZhZG8sIGVtaXRlIHVtIGV2ZW50byBwYXJhIGNhcnJlZ2FyIHN1Z2VzdMO1ZXMgY29tIHVtYSBjb25zdWx0YSB2YXppYS5cbiAgICAgKiBFbSBzZWd1aWRhLCByZWRlZmluZSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcyBwYXJhIG8gdmFsb3IgcmV0b3JuYWRvIHBvciBgaW50ZXJuYWxTdWdnZXN0aW9uKClgLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNldEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQodGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvIG5hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMsIHNlIGhvdXZlci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9ucyBMaXN0YSBkZSBzdWdlc3TDtWVzIGRpc3BvbsOtdmVpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRTdWdnZXN0aW9uKHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uV3JhcHBlcjxUPltdKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IgbmEgbGlzdGEgZGUgc3VnZXN0w7Vlcywgc2UgaG91dmVyLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkU3VnZ2VzdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm9sYSBhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBzdWdlc3TDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkU3VnZ2VzdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIHN1Z2VzdMOjbyBmb3JuZWNpZGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgLSBVbSBhcnJheSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gVC5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBvYmpldG9zIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAsIGNhZGEgdW0gY29udGVuZG8gYSBzdWdlc3TDo28gb3JpZ2luYWwgZSB1bSBpZGVudGlmaWNhZG9yIMO6bmljby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvU3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnM6IFRbXSk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xuICAgICAgICBjb25zdCBiYXNlSWQgPSBgJHt0aGlzLmNvbXBvbmVudElkfV9zdWdnZXN0aW9uYDtcblxuICAgICAgICByZXR1cm4gc3VnZ2VzdGlvbnM/Lm1hcCgoc3VnZ2VzdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogc3VnZ2VzdGlvbixcbiAgICAgICAgICAgICAgICBpZDogYCR7YmFzZUlkfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pID8/IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYSBvIGRlYm91bmNlIGUgc3dpdGNoTWFwIHBhcmEgbGF6eSBsb2FkaW5nLCByZXNvbHZlbmRvIHJhY2UgY29uZGl0aW9ucy5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdXRpbGl6YSBzd2l0Y2hNYXAgcGFyYSBjYW5jZWxhciByZXF1aXNpw6fDtWVzIGFudGVyaW9yZXMgYXV0b21hdGljYW1lbnRlXG4gICAgICogcXVhbmRvIHVtYSBub3ZhIGJ1c2NhIMOpIGluaWNpYWRhLCBldml0YW5kbyBxdWUgcmVzdWx0YWRvcyBhbnRpZ29zIHNvYnJlc2NyZXZhbVxuICAgICAqIHJlc3VsdGFkb3MgbWFpcyByZWNlbnRlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldHVwTGF6eUxvYWREZWJvdW5jZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkoKSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHF1ZXJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE1hbnRlciBmZWNoYWRvIG8gZHJvcGRvd25kIGF0w6kgYSBidXNjYSBlc3RpdmVyIGNvbmNsdcOtZGFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ0xhenkgbG9hZCB0aW1lb3V0JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VDYWxsYmFjayA9IChkYXRhOiBUW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IHF1ZXJ5LCByZXNwb25zZTogcmVzcG9uc2VDYWxsYmFjayB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IFRbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWJyaXIgbyBkcm9wZG93biBzb21lbnRlIGFxdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFN1Z2dlc3Rpb25zID0gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VtcHR5TWVzc2FnZS5zZXQod3JhcHBlZFN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBYnJpciBvIGRyb3Bkb3duIHNvbWVudGUgYXF1aVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdMYXp5IGxvYWQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhIG8gZGVib3VuY2UgcGFyYSBvIGlucHV0IGRvIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdXRpbGl6YSB1bSBTdWJqZWN0IHBhcmEgZXNjdXRhciBhcyBtdWRhbsOnYXMgbm8gdmFsb3IgZG8gaW5wdXQsXG4gICAgICogYXBsaWNhbmRvIHVtIGRlYm91bmNlIGNvbSBvIHRlbXBvIGRlZmluaWRvIHBvciBgdGhpcy5kZWxheSgpYC4gUXVhbmRvIHVtIG5vdm8gdmFsb3Igw6kgZW1pdGlkbzpcbiAgICAgKiAtIFNlIGhvdXZlciB2YWxvciwgZmlsdHJhIGFzIHN1Z2VzdMO1ZXMgY29tIGJhc2Ugbm8gdGV4dG8gZGlnaXRhZG8gZSBhdHVhbGl6YSBhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxuICAgICAqIC0gU2UgbsOjbyBob3V2ZXIgdmFsb3IgZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYXRpdm8sIHJlc2V0YSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgbGltcGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBUYW1iw6ltIGF0dWFsaXphIG8gZXN0YWRvIGRhIG1lbnNhZ2VtIGRlIGxpc3RhIHZhemlhIGUsIHNlIGEgc2VsZcOnw6NvIGZvciBsaXZyZSAoYGZvcmNlU2VsZWN0aW9uYCBmb3IgZmFsc28pLFxuICAgICAqIHByb3BhZ2EgYSBtdWRhbsOnYSBkZSB2YWxvciBwYXJhIG8gZm9ybXVsw6FyaW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXR1cElucHV0RGVib3VuY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lucHV0U3ViamVjdCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KCkpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoVG9TZWFyY2goKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbHRlcigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyh0aGlzLnN1Z2dlc3Rpb25MYWJlbCgpID8gZGF0YVt0aGlzLnN1Z2dlc3Rpb25MYWJlbCgpIV0gOiBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucygpLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyb3Bkb3duKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFtdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9yY2VTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBhdXRvY29tcGxldGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgc3VnZXN0w7VlcyBmb3JlbSBvYmpldG9zIGUgYHN1Z2dlc3Rpb25MYWJlbGAgbsOjbyBmb3IgZm9ybmVjaWRvLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMoKTtcblxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzT2JqZWN0U3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb21lKFxuICAgICAgICAgICAgKHN1Z2dlc3Rpb24pID0+IHR5cGVvZiBzdWdnZXN0aW9uID09PSAnb2JqZWN0JyAmJiBzdWdnZXN0aW9uICE9PSBudWxsLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChoYXNPYmplY3RTdWdnZXN0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN1Z2dlc3Rpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VnZ2VzdGlvbkxhYmVsIGlucHV0IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBzdWdnZXN0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJmbGV4IGgtWzM1cHhdIHctZnVsbCBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzRweF0gYm9yZGVyIGZvY3VzLXdpdGhpbjpib3JkZXItMiBmb2N1cy13aXRoaW46Ym9yZGVyLXByaW1hcnkgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICBbY2xhc3NdPVwiaW5wdXRDbGFzcygpXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1ub25lIGJvcmRlci1ncmF5c2NhbGUtMjAgYmctZ3JheXNjYWxlLTUgdGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZCgpLFxuICAgICAgICAncG9pbnRlci1ldmVudHMtYXV0byBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wIHRleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCksXG4gICAgICAgICdib3JkZXItY3JpdGljYWxpdHktcmVkJzogaW52YWxpZCgpLFxuICAgIH1cIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBnYXAtMiBweC0yXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2JvcmRlci1yJzogZHJvcGRvd24oKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTIwJzogZHJvcGRvd24oKSAmJiBkaXNhYmxlZCgpLFxuICAgICAgICAgICAgJ2JvcmRlci1ncmF5c2NhbGUtMzAgZm9jdXMtd2l0aGluOmJvcmRlci1yLTIgZm9jdXMtd2l0aGluOmJvcmRlci1yLXByaW1hcnknOiBkcm9wZG93bigpICYmICFkaXNhYmxlZCgpLFxuICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS01JzogZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtMCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIEBpZiAobXVsdGlwbGUoKSAmJiB2YWx1ZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiB2YWx1ZXMoKTsgdHJhY2sgc3VnZ2VzdGlvbikge1xuICAgICAgICAgICAgICAgICAgICA8cy1hdXRvY29tcGxldGUtY2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25dPVwic3VnZ2VzdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3VnZ2VzdGlvbkxhYmVsXT1cInN1Z2dlc3Rpb25MYWJlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzdWdnZXN0aW9uUmVtb3ZlZCk9XCJyZW1vdmVTdWdnZXN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWF1dG9jb21wbGV0ZS1jaGlwPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0RWxcbiAgICAgICAgICAgIGNsYXNzPVwibWluLWgtWzM1cHhdIGdyb3cgb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudHlwZV90b19zZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUoKSA/ICdsaXN0JyA6ICdib3RoJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKVtmb2N1c2VkSW5kZXgoKV0uaWQgOiBudWxsXCJcbiAgICAgICAgICAgIHJvbGU9XCJzZWFyY2hib3hcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5VXApPVwib25LZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgLz5cblxuICAgICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYW5pbWF0ZS1zcGluXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGN4PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY3k9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByPVwiOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNDI4YmNhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjU2LjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAodmFsdWUoKSAmJiAhdGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXMgdGV4dC1ncmF5c2NhbGUtNjBcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoZHJvcGRvd24oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHctWzM1cHhdIGZsZXgtc2hyaW5rLTAgZmxleC1ncm93LTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC1kb3duXT1cIiFpc09wZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LXVwXT1cImlzT3BlbigpXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvZGl2PlxuXG5AaWYgKHNob3dFbXB0eU1lc3NhZ2UoKSB8fCAoZmlsdGVyZWRTdWdnZXN0aW9ucygpLmxlbmd0aCA+IDAgJiYgIXJlYWRvbmx5KCkpKSB7XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW4oKVwiXG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgICAgIChiYWNrZHJvcENsaWNrKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgICAgIChkZXRhY2gpPVwiaXNPcGVuLnNldChmYWxzZSlcIlxuICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2lkXT1cIidkcm9wZG93bi1jb250YWluZXItJyArIGNvbXBvbmVudElkXCJcbiAgICAgICAgICAgIGNsYXNzPVwibXQtMC41IHJvdW5kZWQtWzRweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3dcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdi5vZmZzZXRXaWR0aFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gVmlydHVhbCBzY3JvbGwgLS0+XG4gICAgICAgICAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRTdWdnZXN0aW9ucygpLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtNTIgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgc3VnZ2VzdGlvbiwgaSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKCF2aXJ0dWFsU2Nyb2xsKCkgfHwgZmlsdGVyZWRTdWdnZXN0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChzdWdnZXN0aW9uIG9mIGVucmljaGVkRmlsdGVyZWRTdWdnZXN0aW9ucygpOyB0cmFjayBzdWdnZXN0aW9uLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN1Z2dlc3Rpb25JdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dFbXB0eU1lc3NhZ2UoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtMyB0ZXh0LWdyYXlzY2FsZS02MFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG59XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXG4gICAgbGV0LXN1Z2dlc3Rpb249XCJzdWdnZXN0aW9uXCJcbiAgICBsZXQtaT1cImlcIlxuPlxuICAgIDxsaVxuICAgICAgICBbaWRdPVwic3VnZ2VzdGlvbi5pZFwiXG4gICAgICAgIGNsYXNzPVwicm91bmRlZC1zbSBmbGV4IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBnYXAtMiBweC0zIHB5LTIgdGV4dC1ncmF5c2NhbGUtNzBcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTEwXT1cImkgPT09IGZvY3VzZWRJbmRleCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0yMF09XCJzdWdnZXN0aW9uLmlzU2VsZWN0ZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInN1Z2dlc3Rpb24uaXNTZWxlY3RlZFwiXG4gICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uLmRhdGEpXCJcbiAgICA+XG4gICAgICAgIEBpZiAoY2hlY2ttYXJrKCkgJiYgbXVsdGlwbGUoKSAmJiBzdWdnZXN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNoZWNrXCI+PC9pPlxuICAgICAgICB9XG4gICAgICAgIHt7IHN1Z2dlc3Rpb25MYWJlbCgpID8gc3VnZ2VzdGlvbi5kYXRhW3N1Z2dlc3Rpb25MYWJlbCgpIV0gOiBzdWdnZXN0aW9uLmRhdGEgfX1cbiAgICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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QWtCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXG4gKiBAdGVtcGxhdGUgVCBUaXBvIGRvcyBkYWRvcyBhc3NvY2lhZG9zIMOgIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBkYXRhIE9zIGRhZG9zIGRhIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXG4gKiBAcHJvcGVydHkgW2lzU2VsZWN0ZWRdIEluZGljYSBzZSBhIHN1Z2VzdMOjbyBlc3TDoSBzZWxlY2lvbmFkYS5cbiAqL1xuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1hdXRvY29tcGxldGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbigpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtaGFzcG9wdXBdJzogJ1wibGlzdGJveFwiJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcbiAgICBwdWJsaWMgaW52YWxpZCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBsYXp5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZm9yY2VTZWxlY3Rpb24gPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XG4gICAgcHVibGljIGlucHV0Q2xhc3MgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgICBwdWJsaWMgZGF0YUtleSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBtb2RlbDxUIHwgbnVsbD4oKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gbW9kZWw8VFtdPihbXSk7XG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGxhenlMb2FkID0gb3V0cHV0PHsgcXVlcnk6IHN0cmluZzsgcmVzcG9uc2U6IChkYXRhOiBUW10pID0+IHZvaWQgfT4oKTtcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBvdXRwdXQ8VD4oKTtcbiAgICBwdWJsaWMgdW5zZWxlY3RlZCA9IG91dHB1dDxUPigpO1xuICAgIHB1YmxpYyBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBjbGVhcmVkID0gb3V0cHV0KCk7XG4gICAgcHVibGljIGtleVVwID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBmb2N1c2VkID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgY29tcGxldGVNZXRob2QgPSBvdXRwdXQ8eyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwdWJsaWMgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHNpZ25hbDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPihbXSk7XG4gICAgcHVibGljIHNob3dFbXB0eU1lc3NhZ2UgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXJUZXh0ID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgaW5wdXRWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYGF1dG9jb21wbGV0ZV8ke0F1dG9jb21wbGV0ZUNvbXBvbmVudC5uZXh0SWQrK31gO1xuICAgIHB1YmxpYyBpbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpbnB1dEVsJyk7XG5cbiAgICBwcml2YXRlIF9pbnB1dFN1YmplY3QkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgX2xhenlMb2FkU3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZT86ICh2YWx1ZTogYW55IHwgYW55W10pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSByZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCxcbiAgICAgKiBhZGljaW9uYW5kbyB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgc3VnZXN0w6NvLlxuICAgICAqIEByZXR1cm5zIFVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHByb2Nlc3NhZGFzIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxTdWdnZXN0aW9uID0gY29tcHV0ZWQ8U3VnZ2VzdGlvbldyYXBwZXI8VD5bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5zdWdnZXN0aW9ucygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKG9wdHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bSBjb25qdW50byAoYFNldGApIGNvbSBvcyBJRHMgZGFzIHN1Z2VzdMO1ZXMgc2VsZWNpb25hZGFzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZFN1Z2dlc3Rpb25JZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbmQoKHMpID0+IEpTT04uc3RyaW5naWZ5KHMuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk/LmlkO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZW5yaXF1ZWNpZGFzIGNvbSBhIHByb3ByaWVkYWRlIGBpc1NlbGVjdGVkYC5cbiAgICAgKiBDYWRhIHN1Z2VzdMOjbyByZWNlYmUgdW0gY2FtcG8gYm9vbGVhbm8gYGlzU2VsZWN0ZWRgIGluZGljYW5kbyBzZSBlbGEgZXN0w6Egc2VsZWNpb25hZGEsXG4gICAgICogY29tIGJhc2Ugbm9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMgZSBubyB2YWxvciBkYSBzdWdlc3TDo28uXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBjYWRhIHVtYSBjb20gYSBwcm9wcmllZGFkZSBhZGljaW9uYWwgYGlzU2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JZHMoKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyZWQubWFwKChzdWdnZXN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3VnZ2VzdGlvbixcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkSWRzLmhhcyhzdWdnZXN0aW9uLmlkKSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xuICAgICAgICB0aGlzLl9zZXR1cExhenlMb2FkRGVib3VuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBkbyBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIGEgc2VyIGRlZmluaWRvLCDDum5pY28gb3UgYXJyYXksIGNvbmZvcm1lIHNlbGXDp8OjbyBtw7psdGlwbGEuXG4gICAgICogQHRocm93cyBTZSBtw7psdGlwbG8gZm9yIGZhbHNvIGUgdmFsdWUgZm9yIGFycmF5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBtdWx0aXBsZSBpcyBmYWxzZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCF2YWx1ZSA/ICcnIDogc3VnZ2VzdGlvbkxhYmVsID8gU3RyaW5nKHZhbHVlW3N1Z2dlc3Rpb25MYWJlbF0pIDogU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gdmFsb3IgbXVkYXIuIFJlY2ViZSBvIG5vdm8gdmFsb3IgY29tbyBhcmd1bWVudG8sIHF1ZSBwb2RlIHNlciB1bSDDum5pY28gdmFsb3Igb3UgdW0gYXJyYXkgZGUgdmFsb3Jlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGVudHJhZGEgZG8gdXN1w6FyaW8gbm8gY2FtcG8gZGUgdGV4dG8gZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyDDqSBjaGFtYWRvIHNlbXByZSBxdWUgbyB1c3XDoXJpbyBkaWdpdGEgYWxnbyBubyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqIEVsZSBleGVjdXRhIGFzIHNlZ3VpbnRlcyBhw6fDtWVzOlxuICAgICAqIC0gRGlzcGFyYSBvIGNhbGxiYWNrIGRlIFwidG91Y2hlZFwiIHBhcmEgY29udHJvbGUgZGUgZm9ybXVsw6FyaW9zLlxuICAgICAqIC0gT2J0w6ltIG8gdmFsb3IgYXR1YWwgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiAtIFNlIG8gbW9kbyBsYXp5IGVzdGl2ZXIgYXRpdmFkbywgZW1pdGUgbyBldmVudG8gZGUgbGF6eUxvYWQgY29tIGEgY29uc3VsdGEgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGF0dWFsaXphIG8gdGV4dG8gZGUgZmlsdHJvLCBub3RpZmljYSBvcyBvYnNlcnZhZG9yZXMgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMgc2UgaG91dmVyIHN1Z2VzdMO1ZXMgZGlzcG9uw612ZWlzLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGUgZW50cmFkYSBkbyB0aXBvIGBFdmVudGAgcHJvdmVuaWVudGUgZG8gY2FtcG8gZGUgdGV4dG8uXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZD8uKCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dC5zZXQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5OiB2YWx1ZSB9KTtcblxuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkLm5leHQodmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHBlcmRhIGRlIGZvY28gKGJsdXIpIGRvIGNhbXBvIGRlIGVudHJhZGEgZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBvIHZhbG9yIGRpZ2l0YWRvIHBlbG8gdXN1w6FyaW8gY29ycmVzcG9uZGUgZXhhdGFtZW50ZSBhIGFsZ3VtIGRvcyBpdGVucyBzdWdlcmlkb3MuXG4gICAgICogLSBTZSBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYTpcbiAgICAgKiAgIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCBhZGljaW9uYSBvIGl0ZW0gc2VsZWNpb25hZG8gw6AgbGlzdGEgZGUgdmFsb3JlcywgY2FzbyBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS5cbiAgICAgKiAgIC0gTm8gbW9kbyBzaW1wbGVzLCBzZWxlY2lvbmEgbyBpdGVtIGNvcnJlc3BvbmRlbnRlIHNlIGFpbmRhIG7Do28gZXN0aXZlciBzZWxlY2lvbmFkby5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIGNvcnJlc3BvbmTDqm5jaWEsIGxpbXBhIG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dFZhbHVlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKTtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IHN1Z2dlc3Rpb25zLmZpbmQoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBkYXRhW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IGRhdGE7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gdmFsdWVbdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogdmFsdWUpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBtYXRjaC5kYXRhW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IG1hdGNoLmRhdGEpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFsuLi5jdXJyZW50VmFsdWVzLCBtYXRjaC5kYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBtYXRjaC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihtYXRjaC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhcmEgbyBldmVudG8gZGUgZm9jbyBxdWFuZG8gbyBjYW1wbyBkZSBlbnRyYWRhIHJlY2ViZSBmb2NvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSBmb2NvIGRpc3BhcmFkbyBwZWxvIGVsZW1lbnRvIGRlIGVudHJhZGEuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBjb21wb25lbnRlIGRlIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gZ2VyZW5jaWEgYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBzdWdlc3TDtWVzIHVzYW5kbyBhcyB0ZWNsYXMgZG8gdGVjbGFkby5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ0VudGVyJyBvdSAnVGFiJzogU2VsZWNpb25hIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGUgZmVjaGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBzZW0gc2VsZWNpb25hciBuZW5odW0gaXRlbS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcblxuICAgICAgICBjb25zdCBfc2VsZWN0U3VnZ2VzdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIF9zZWxlY3RTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRlIHVtIGV2ZW50byBxdWFuZG8gdW1hIHRlY2xhIMOpIGxpYmVyYWRhIG5vIGNvbXBvbmVudGUuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gYXNzb2NpYWRvIMOgIHRlY2xhIGxpYmVyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleVVwLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZW0gZXZlbnRvcyBkZSByZWRpbWVuc2lvbmFtZW50byBkZSBqYW5lbGEuXG4gICAgICovXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB1bWEgc3VnZXN0w6NvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gKGBtdWx0aXBsZSgpYCByZXRvcm5hIHRydWUpLCBhZGljaW9uYSBhIHN1Z2VzdMOjbyDDoCBsaXN0YSBkZSBzdWdnZXN0w7VlcyBzZWxlY2lvbmFkYXMsXG4gICAgICogY2FzbyBlbGEgYWluZGEgbsOjbyBlc3RlamEgcHJlc2VudGUuIEVtIHNlZ3VpZGEsIGxpbXBhIG8gdmFsb3IgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCBkZWZpbmUgYSBzdWdlc3TDo28gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGF0dWFsaXphIG8gY2FtcG8gZGUgZW50cmFkYVxuICAgICAqIGNvbSBvIHLDs3R1bG8gY29ycmVzcG9uZGVudGUuXG4gICAgICogRW0gYW1ib3Mgb3MgY2Fzb3MsIGRpc3BhcmEgbyBjYWxsYmFjayBgX29uQ2hhbmdlYCBjb20gbyBub3ZvIHZhbG9yIGUgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAtIEEgc3VnZXN0w6NvIGEgc2VyIHNlbGVjaW9uYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHZhbHVlW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHN1Z2dlc3Rpb24pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoWy4uLmN1cnJlbnRWYWx1ZXMsIHN1Z2dlc3Rpb25dKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KHN1Z2dlc3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IF9pbnB1dFZhbHVlID0gU3RyaW5nKHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24pO1xuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KF9pbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4oX3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChzdWdnZXN0aW9uKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBkZWZpbmUgbyB2YWxvciBjb21vIG51bG8uXG4gICAgICogVGFtYsOpbSBsaW1wYSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlc1xuICAgICAqIGUgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoW10pO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkbyBkcm9wZG93biBkZSBzdWdlc3TDtWVzIGRvIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gY29uZmlndXJhIG8gZGVib3VuY2UgZG8gaW5wdXQsIHZlcmlmaWNhIHNlIGjDoSBzdWdlc3TDtWVzIGZpbHRyYWRhc1xuICAgICAqIGUsIGNhc28gbsOjbyBoYWphIHN1Z2VzdMO1ZXMgZSBvIHRleHRvIGRvIGZpbHRybyBlc3RlamEgdmF6aW8sIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFBvciBmaW0sIGFsdGVybmEgbyBlc3RhZG8gZGUgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXR1cElucHV0RGVib3VuY2UoKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJUZXh0KCkgPT09ICcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXp5TG9hZFN1YmplY3QkLm5leHQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KCF0aGlzLmlzT3BlbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyB1dGlsaXphZGEgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3RhcyBubyBBbmd1bGFyLCBwZXJtaXRpbmRvIHF1ZSBvIGZyYW1ld29ya1xuICAgICAqIGlkZW50aWZpcXVlIGNhZGEgaXRlbSBkZSBmb3JtYSDDum5pY2EgcGVsbyBzZXUgYGlkYC4gRGV2ZSBzZXIgdXRpbGl6YWRhIGNvbW8gZnVuw6fDo28gZGUgYHRyYWNrQnlgXG4gICAgICogZW0gZGlyZXRpdmFzIGNvbW8gYCpuZ0ZvcmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE9iamV0byBkbyB0aXBvIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAgcXVlIHJlcHJlc2VudGEgbyBpdGVtIGF0dWFsLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRvIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHVtYSBzdWdlc3TDo28gZGEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gTyBpdGVtIGEgc2VyIHJlbW92aWRvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uVmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMudmFsdWVzLnNldChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW3N1Z2dlc3Rpb25WYWx1ZV0gIT09IHN1Z2dlc3Rpb25bc3VnZ2VzdGlvblZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBzdWdnZXN0aW9uO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlaW5pY2lhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSB1bSBldmVudG8gcGFyYSBjYXJyZWdhciBzdWdlc3TDtWVzIGNvbSB1bWEgY29uc3VsdGEgdmF6aWEuXG4gICAgICogRW0gc2VndWlkYSwgcmVkZWZpbmUgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMgcGFyYSBvIHZhbG9yIHJldG9ybmFkbyBwb3IgYGludGVybmFsU3VnZ2VzdGlvbigpYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIHN1Z2VzdMOjbyBuYSBsaXN0YSBkZSBzdWdlc3TDtWVzLCBzZSBob3V2ZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgTGlzdGEgZGUgc3VnZXN0w7VlcyBkaXNwb27DrXZlaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IHZvaWQge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRTdWdnZXN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yIG5hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMsIHNlIGhvdXZlci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb25zIC0gVW0gYXJyYXkgZGUgc3VnZXN0w7VlcyBkbyB0aXBvIFQuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgU3VnZ2VzdGlvbldyYXBwZXI8VD5gLCBjYWRhIHVtIGNvbnRlbmRvIGEgc3VnZXN0w6NvIG9yaWdpbmFsIGUgdW0gaWRlbnRpZmljYWRvciDDum5pY28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb1N1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zOiBUW10pOiBTdWdnZXN0aW9uV3JhcHBlcjxUPltdIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPy5tYXAoKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzdWdnZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKHN1Z2dlc3Rpb25bdGhpcy5kYXRhS2V5KCkhXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0eXBlb2Ygc3VnZ2VzdGlvbiAhPT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbj8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QudmFsdWVzKHN1Z2dlc3Rpb24gYXMgT2JqZWN0KS5qb2luKCdfJykpID8/ICcnKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmEgbyBkZWJvdW5jZSBlIHN3aXRjaE1hcCBwYXJhIGxhenkgbG9hZGluZywgcmVzb2x2ZW5kbyByYWNlIGNvbmRpdGlvbnMuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgc3dpdGNoTWFwIHBhcmEgY2FuY2VsYXIgcmVxdWlzacOnw7VlcyBhbnRlcmlvcmVzIGF1dG9tYXRpY2FtZW50ZVxuICAgICAqIHF1YW5kbyB1bWEgbm92YSBidXNjYSDDqSBpbmljaWFkYSwgZXZpdGFuZG8gcXVlIHJlc3VsdGFkb3MgYW50aWdvcyBzb2JyZXNjcmV2YW1cbiAgICAgKiByZXN1bHRhZG9zIG1haXMgcmVjZW50ZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXR1cExhenlMb2FkRGVib3VuY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KCkpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYW50ZXIgZmVjaGFkbyBvIGRyb3Bkb3duZCBhdMOpIGEgYnVzY2EgZXN0aXZlciBjb25jbHXDrWRhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUW10+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCdMYXp5IGxvYWQgdGltZW91dCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ2FsbGJhY2sgPSAoZGF0YTogVFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkLmVtaXQoeyBxdWVyeSwgcmVzcG9uc2U6IHJlc3BvbnNlQ2FsbGJhY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBUW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFicmlyIG8gZHJvcGRvd24gc29tZW50ZSBhcXVpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRTdWdnZXN0aW9ucyA9IHRoaXMuX2FkZElkVG9TdWdnZXN0aW9ucyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldCh3cmFwcGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucy5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWJyaXIgbyBkcm9wZG93biBzb21lbnRlIGFxdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTGF6eSBsb2FkIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VtcHR5TWVzc2FnZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYSBvIGRlYm91bmNlIHBhcmEgbyBpbnB1dCBkbyBhdXRvY29tcGxldGUuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgdW0gU3ViamVjdCBwYXJhIGVzY3V0YXIgYXMgbXVkYW7Dp2FzIG5vIHZhbG9yIGRvIGlucHV0LFxuICAgICAqIGFwbGljYW5kbyB1bSBkZWJvdW5jZSBjb20gbyB0ZW1wbyBkZWZpbmlkbyBwb3IgYHRoaXMuZGVsYXkoKWAuIFF1YW5kbyB1bSBub3ZvIHZhbG9yIMOpIGVtaXRpZG86XG4gICAgICogLSBTZSBob3V2ZXIgdmFsb3IsIGZpbHRyYSBhcyBzdWdlc3TDtWVzIGNvbSBiYXNlIG5vIHRleHRvIGRpZ2l0YWRvIGUgYXR1YWxpemEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIHZhbG9yIGUgbyBkcm9wZG93biBlc3RpdmVyIGF0aXZvLCByZXNldGEgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGxpbXBhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogVGFtYsOpbSBhdHVhbGl6YSBvIGVzdGFkbyBkYSBtZW5zYWdlbSBkZSBsaXN0YSB2YXppYSBlLCBzZSBhIHNlbGXDp8OjbyBmb3IgbGl2cmUgKGBmb3JjZVNlbGVjdGlvbmAgZm9yIGZhbHNvKSxcbiAgICAgKiBwcm9wYWdhIGEgbXVkYW7Dp2EgZGUgdmFsb3IgcGFyYSBvIGZvcm11bMOhcmlvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBJbnB1dERlYm91bmNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSgpKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigodmFsdWUpID0+IHZhbHVlLmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFRvU2VhcmNoKCkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKS5maWx0ZXIoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcm9wZG93bigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIHN1Z2VzdMO1ZXMgZm9yZW0gb2JqZXRvcyBlIGBzdWdnZXN0aW9uTGFiZWxgIG7Do28gZm9yIGZvcm5lY2lkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLnN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgaWYgKCFzdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMuc29tZShcbiAgICAgICAgICAgIChzdWdnZXN0aW9uKSA9PiB0eXBlb2Ygc3VnZ2VzdGlvbiA9PT0gJ29iamVjdCcgJiYgc3VnZ2VzdGlvbiAhPT0gbnVsbCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0U3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN1Z2dlc3Rpb25MYWJlbCBpbnB1dCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gc3VnZ2VzdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwiZmxleCBoLVszNXB4XSB3LWZ1bGwgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJvcmRlciBmb2N1cy13aXRoaW46Ym9yZGVyLTIgZm9jdXMtd2l0aGluOmJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgW2NsYXNzXT1cImlucHV0Q2xhc3MoKVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01IHRleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCB0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXJlZCc6IGludmFsaWQoKSxcbiAgICB9XCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgZ2FwLTIgcHgtMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdib3JkZXItcic6IGRyb3Bkb3duKCksXG4gICAgICAgICAgICAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRyb3Bkb3duKCkgJiYgZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTMwIGZvY3VzLXdpdGhpbjpib3JkZXItci0yIGZvY3VzLXdpdGhpbjpib3JkZXItci1wcmltYXJ5JzogZHJvcGRvd24oKSAmJiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAnYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkgJiYgdmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHN1Z2dlc3Rpb24gb2YgdmFsdWVzKCk7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25MYWJlbF09XCJzdWdnZXN0aW9uTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3VnZ2VzdGlvblJlbW92ZWQpPVwicmVtb3ZlU3VnZ2VzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1hdXRvY29tcGxldGUtY2hpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dEVsXG4gICAgICAgICAgICBjbGFzcz1cIm1pbi1oLVszNXB4XSBncm93IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnR5cGVfdG9fc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cIm11bHRpcGxlKCkgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRJbmRleCgpID49IDAgPyBmaWx0ZXJlZFN1Z2dlc3Rpb25zKClbZm9jdXNlZEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleVVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcj1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQyOGJjYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1Ni41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKHZhbHVlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRpbWVzIHRleHQtZ3JheXNjYWxlLTYwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRyb3Bkb3duKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LVszNXB4XSBmbGV4LXNocmluay0wIGZsZXgtZ3Jvdy0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhaXNPcGVuKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuQGlmIChzaG93RW1wdHlNZXNzYWdlKCkgfHwgKGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwICYmICFyZWFkb25seSgpKSkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTAuNSByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1Z2dlc3Rpb24gb2YgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgICAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTsgdHJhY2sgc3VnZ2VzdGlvbi5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdWdnZXN0aW9uLCBpIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93RW1wdHlNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxufVxuXG48bmctdGVtcGxhdGVcbiAgICAjc3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVxuICAgIGxldC1zdWdnZXN0aW9uPVwic3VnZ2VzdGlvblwiXG4gICAgbGV0LWk9XCJpXCJcbj5cbiAgICA8bGlcbiAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtc20gZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtZ3JheXNjYWxlLTcwXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0xMF09XCJpID09PSBmb2N1c2VkSW5kZXgoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMjBdPVwic3VnZ2VzdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzdWdnZXN0aW9uLmlzU2VsZWN0ZWRcIlxuICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgPlxuICAgICAgICBAaWYgKGNoZWNrbWFyaygpICYmIG11bHRpcGxlKCkgJiYgc3VnZ2VzdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgfVxuICAgICAgICB7eyBzdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb24uZGF0YVtzdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbi5kYXRhIH19XG4gICAgPC9saT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -48,6 +48,7 @@ class AutocompleteComponent {
48
48
  multiple = input(false);
49
49
  minLengthToSearch = input(1);
50
50
  inputClass = input('');
51
+ dataKey = input();
51
52
  value = model();
52
53
  values = model([]);
53
54
  disabled = model(false);
@@ -430,13 +431,16 @@ class AutocompleteComponent {
430
431
  * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.
431
432
  */
432
433
  _addIdToSuggestions(suggestions) {
433
- const baseId = `${this.componentId}_suggestion`;
434
- return suggestions?.map((suggestion, index) => {
434
+ return (suggestions?.map((suggestion) => {
435
435
  return {
436
436
  data: suggestion,
437
- id: `${baseId}_${index++}`,
437
+ id: this.dataKey()
438
+ ? String(suggestion[this.dataKey()])
439
+ : ((typeof suggestion !== 'object'
440
+ ? suggestion?.toString()
441
+ : Object.values(suggestion).join('_')) ?? ''),
438
442
  };
439
- }) ?? [];
443
+ }) ?? []);
440
444
  }
441
445
  /**
442
446
  * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.
@@ -534,7 +538,7 @@ class AutocompleteComponent {
534
538
  }
535
539
  }
536
540
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
537
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
541
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
538
542
  {
539
543
  provide: NG_VALUE_ACCESSOR,
540
544
  useExisting: forwardRef(() => AutocompleteComponent),
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-autocomplete.mjs","sources":["../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.html","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.html","../../projects/angular-components/autocomplete/src/seniorsistemas-angular-components-autocomplete.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 's-autocomplete-chip',\n templateUrl: './autocomplete-chip.component.html',\n standalone: true,\n})\nexport class AutocompleteChipComponent<T> {\n public suggestion = input.required<T>();\n public suggestionLabel = input<keyof T>();\n\n public suggestionRemoved = output<T>();\n\n public removeSuggestion() {\n this.suggestionRemoved.emit(this.suggestion());\n }\n}\n","<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i class=\"far fa-times\"></i>\n </button>\n</div>\n","import { OverlayModule } from '@angular/cdk/overlay';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, DestroyRef, ElementRef, forwardRef, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\n\nimport { AutocompleteChipComponent } from './components/autocomplete-chip/autocomplete-chip.component';\n\n/**\n * Representa um item de sugestão encapsulado, utilizado em componentes de autocomplete.\n * @template T Tipo dos dados associados à sugestão.\n * @property data Os dados da sugestão.\n * @property id Identificador único da sugestão.\n * @property [isSelected] Indica se a sugestão está selecionada.\n */\ninterface SuggestionWrapper<T> {\n data: T;\n id: string;\n isSelected?: boolean;\n}\n\n@Component({\n selector: 's-autocomplete',\n standalone: true,\n templateUrl: './autocomplete.component.html',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n OverlayModule,\n ScrollingModule,\n TranslateModule,\n AutocompleteChipComponent,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AutocompleteComponent),\n multi: true,\n },\n ],\n host: {\n role: 'combobox',\n '[attr.aria-expanded]': 'isOpen()',\n '[attr.aria-haspopup]': '\"listbox\"',\n '[attr.aria-owns]': 'isOpen() ? \"dropdown-container-\" + componentId : null',\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class AutocompleteComponent<T> implements ControlValueAccessor {\n private static nextId = 0;\n\n public suggestions = input<T[]>([]);\n public placeholder = input<string>();\n public suggestionValue = input<keyof T>();\n public suggestionLabel = input<keyof T>();\n public readonly = input(false);\n public emptyMessage = input<string>();\n public delay = input(300);\n public invalid = input(false);\n public virtualScroll = input(false);\n public virtualScrollItemSize = input(37);\n public lazy = input(false);\n public dropdown = input(false);\n public forceSelection = input(false);\n public checkmark = input(false);\n public multiple = input(false);\n public minLengthToSearch = input(1);\n public inputClass = input<string>('');\n\n public value = model<T | null>();\n public values = model<T[]>([]);\n public disabled = model(false);\n\n public lazyLoad = output<{ query: string; response: (data: T[]) => void }>();\n public selected = output<T>();\n public unselected = output<T>();\n public blurred = output<Event>();\n public cleared = output();\n public keyUp = output<Event>();\n public focused = output<any>();\n public completeMethod = output<{ query: string }>();\n\n public focusedIndex = signal(-1);\n public isOpen = signal(false);\n public filteredSuggestions = signal<SuggestionWrapper<T>[]>([]);\n public showEmptyMessage = signal(false);\n public filterText = signal('');\n public inputValue = signal('');\n public loading = signal(false);\n\n public componentId = `autocomplete_${AutocompleteComponent.nextId++}`;\n public inputEl = viewChild<ElementRef>('inputEl');\n\n private _inputSubject$ = new Subject<string>();\n private _lazyLoadSubject$ = new Subject<string>();\n private _destroyRef = inject(DestroyRef);\n private _onChange?: (value: any | any[]) => void;\n private _onTouched?: () => void;\n\n /**\n * Computed que retorna uma lista de sugestões do tipo `SuggestionWrapper<T>`,\n * adicionando um identificador único a cada sugestão.\n * @returns Uma lista de sugestões processadas com identificadores únicos.\n */\n public internalSuggestion = computed<SuggestionWrapper<T>[]>(() => {\n const opts = this.suggestions();\n return this._addIdToSuggestions(opts);\n });\n\n /**\n * Retorna um conjunto (`Set`) com os IDs das sugestões selecionadas.\n */\n public selectedSuggestionIds = computed(() => {\n if (!this.multiple()) {\n return new Set<string>();\n }\n\n const currentValues = this.values();\n\n return new Set(\n currentValues.map((value) => {\n return this.internalSuggestion().find((s) => JSON.stringify(s.data) === JSON.stringify(value))?.id;\n }),\n );\n });\n\n /**\n * Retorna uma lista de sugestões filtradas, enriquecidas com a propriedade `isSelected`.\n * Cada sugestão recebe um campo booleano `isSelected` indicando se ela está selecionada,\n * com base nos IDs das sugestões selecionadas e no valor da sugestão.\n * @returns Uma lista de sugestões filtradas, cada uma com a propriedade adicional `isSelected`.\n */\n public enrichedFilteredSuggestions = computed(() => {\n const filtered = this.filteredSuggestions();\n const selectedIds = this.selectedSuggestionIds();\n\n return filtered.map((suggestion) => ({\n ...suggestion,\n isSelected: selectedIds.has(suggestion.id),\n }));\n });\n\n constructor() {\n this._validateInputs();\n this._setupInputDebounce();\n this._setupLazyLoadDebounce();\n }\n\n /**\n * Define o valor do autocomplete.\n * @param value Valor a ser definido, único ou array, conforme seleção múltipla.\n * @throws Se múltiplo for falso e value for array.\n */\n public writeValue(value: T | T[]): void {\n const suggestionLabel = this.suggestionLabel();\n\n if (value && this.multiple()) {\n if (Array.isArray(value)) {\n this.values.set(value);\n } else {\n this.values.set([value]);\n }\n } else {\n if (Array.isArray(value)) {\n throw new Error('The value must not be an array when multiple is false.');\n } else {\n this.value.set(value);\n }\n\n this.inputValue.set(!value ? '' : suggestionLabel ? String(value[suggestionLabel]) : String(value));\n }\n }\n\n /**\n * Registra uma função de callback que será chamada sempre que o valor do componente mudar.\n * @param onChange Função a ser chamada quando o valor mudar. Recebe o novo valor como argumento, que pode ser um único valor ou um array de valores.\n */\n public registerOnChange(onChange: (value: any | any[]) => void): void {\n this._onChange = onChange;\n }\n\n /**\n * Registra uma função de callback que será chamada quando o componente for tocado (perder o foco).\n * @param onTouched Função de callback a ser chamada quando o componente for tocado.\n */\n public registerOnTouched(onTouched: () => void): void {\n this._onTouched = onTouched;\n }\n\n /**\n * Define o estado de desabilitado do componente.\n * @param disabled Indica se o componente deve ser desabilitado (`true`) ou habilitado (`false`).\n */\n public setDisabledState?(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Manipula o evento de entrada do usuário no campo de texto do autocomplete.\n * Este método é chamado sempre que o usuário digita algo no campo de entrada.\n * Ele executa as seguintes ações:\n * - Dispara o callback de \"touched\" para controle de formulários.\n * - Obtém o valor atual do campo de entrada.\n * - Se o modo lazy estiver ativado, emite o evento de lazyLoad com a consulta e abre o painel de sugestões.\n * - Caso contrário, atualiza o texto de filtro, notifica os observadores e abre o painel de sugestões se houver sugestões disponíveis.\n * @param event Evento de entrada do tipo `Event` proveniente do campo de texto.\n */\n public onInput(event: Event): void {\n this._onTouched?.();\n\n const value = (event.target as HTMLInputElement).value;\n\n if (this.lazy()) {\n this._lazyLoadSubject$.next(value);\n this.isOpen.set(true);\n return;\n }\n\n this.filterText.set(value);\n\n this.completeMethod.emit({ query: value });\n\n this._inputSubject$.next(value);\n\n if (this.suggestions()) {\n this.isOpen.set(true);\n }\n }\n\n /**\n * Manipula o evento de perda de foco (blur) do campo de entrada do autocomplete.\n * Este método verifica se o valor digitado pelo usuário corresponde exatamente a algum dos itens sugeridos.\n * - Se houver correspondência:\n * - No modo múltiplo (`multiple`), adiciona o item selecionado à lista de valores, caso ainda não esteja presente.\n * - No modo simples, seleciona o item correspondente se ainda não estiver selecionado.\n * - Se não houver correspondência, limpa o campo de entrada.\n */\n public onInputBlur(event: Event): void {\n const inputValue = String(this.inputValue()).toLowerCase();\n const suggestions = this.internalSuggestion();\n\n const match = suggestions.find(({ data }) => {\n const label = this.suggestionLabel() ? data[this.suggestionLabel()!] : data;\n return String(label).toLowerCase() === inputValue;\n });\n\n if (match) {\n if (this.multiple()) {\n const currentValues = this.values();\n const exists = currentValues.some(\n (value) =>\n (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n (this.suggestionValue() ? match.data[this.suggestionValue()!] : match.data),\n );\n if (!exists) {\n this.values.set([...currentValues, match.data]);\n this._onChange?.(this.values());\n }\n this.inputValue.set('');\n } else {\n if (this.value() !== match.data) {\n this.selectSuggestion(match.data);\n }\n }\n } else {\n this.inputValue.set('');\n }\n }\n\n /**\n * Dispara o evento de foco quando o campo de entrada recebe foco.\n * @param event O evento de foco disparado pelo elemento de entrada.\n */\n public onInputFocus(event: Event): void {\n this.focused.emit(event);\n }\n\n /**\n * Manipula eventos de teclado no componente de autocomplete.\n * Este método gerencia a navegação e seleção de sugestões usando as teclas do teclado.\n * - 'ArrowDown': Move o foco para a próxima sugestão.\n * - 'ArrowUp': Move o foco para a sugestão anterior.\n * - 'Enter' ou 'Tab': Seleciona a sugestão atualmente focada e fecha a lista de sugestões.\n * - 'Escape': Fecha a lista de sugestões sem selecionar nenhum item.\n * @param event O evento de teclado disparado pelo usuário.\n */\n public onKeyDown(event: KeyboardEvent): void {\n const suggestions = this.filteredSuggestions();\n\n this._onTouched?.();\n\n const _selectSuggestion = () => {\n if (this.focusedIndex() >= 0 && this.focusedIndex() < suggestions.length) {\n event.preventDefault();\n this.selectSuggestion(suggestions[this.focusedIndex()].data);\n }\n };\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._focusNextSuggestion(suggestions);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this._focusPreviousSuggestion();\n break;\n case 'Enter':\n case 'Tab':\n _selectSuggestion();\n this.isOpen.set(false);\n break;\n case 'Escape':\n this.isOpen.set(false);\n break;\n }\n }\n\n /**\n * Emite um evento quando uma tecla é liberada no componente. *\n * @param event O evento de teclado associado à tecla liberada.\n */\n public onKeyUp(event: Event): void {\n this.keyUp.emit(event);\n }\n\n /**\n * Fecha o dropdown em eventos de redimensionamento de janela.\n */\n public onWindowResize(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n }\n }\n\n /**\n * Seleciona uma sugestão da lista de sugestões.\n * Se o modo múltiplo estiver ativado (`multiple()` retorna true), adiciona a sugestão à lista de suggestões selecionadas,\n * caso ela ainda não esteja presente. Em seguida, limpa o valor do campo de entrada.\n * Se o modo múltiplo não estiver ativado, define a sugestão como valor selecionado e atualiza o campo de entrada\n * com o rótulo correspondente.\n * Em ambos os casos, dispara o callback `_onChange` com o novo valor e fecha o painel de sugestões.\n * @param suggestion - A sugestão a ser selecionada.\n */\n public selectSuggestion(suggestion: T): void {\n if (this.multiple()) {\n const currentValues = this.values();\n const exists = currentValues.some(\n (value) =>\n (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n (this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion),\n );\n\n if (!exists) {\n this.values.set([...currentValues, suggestion]);\n this._onChange?.(this.values());\n }\n\n this.inputValue.set('');\n } else {\n this.value.set(suggestion);\n const _value = this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion;\n const _inputValue = String(this.suggestionLabel() ? suggestion[this.suggestionLabel()!] : suggestion);\n\n this.inputValue.set(_inputValue);\n this._onChange?.(_value);\n }\n\n this.selected.emit(suggestion);\n this.isOpen.set(false);\n }\n\n /**\n * Limpa o valor selecionado no componente de autocomplete.\n * Se o modo múltiplo estiver ativado, remove todos os valores selecionados.\n * Caso contrário, define o valor como nulo.\n * Também limpa as sugestões filtradas, fecha o painel de sugestões\n * e limpa o valor do campo de entrada.\n */\n public clear(): void {\n if (this.multiple()) {\n this.values.set([]);\n this._onChange?.(this.values());\n } else {\n this.value.set(null);\n this._onChange?.(this.value());\n }\n\n this.filteredSuggestions.set([]);\n this.isOpen.set(false);\n this.inputValue.set('');\n this.cleared.emit();\n }\n\n /**\n * Alterna a exibição do dropdown de sugestões do autocomplete.\n * Este método configura o debounce do input, verifica se há sugestões filtradas\n * e, caso não haja sugestões e o texto do filtro esteja vazio, redefine as sugestões filtradas.\n * Por fim, alterna o estado de abertura do dropdown.\n */\n public toggleDropdown(): void {\n this._setupInputDebounce();\n\n if (this.filterText() === '') {\n if (this.lazy()) {\n this._lazyLoadSubject$.next('');\n } else {\n this.resetFilteredSuggestions();\n }\n }\n\n this.isOpen.set(!this.isOpen());\n }\n\n /**\n * Função utilizada para otimizar a renderização de listas no Angular, permitindo que o framework\n * identifique cada item de forma única pelo seu `id`. Deve ser utilizada como função de `trackBy`\n * em diretivas como `*ngFor`.\n * @param _ - Índice do item na lista (não utilizado).\n * @param item - Objeto do tipo `SuggestionWrapper<T>` que representa o item atual.\n * @returns O identificador único (`id`) do item.\n */\n public trackById(_: number, item: SuggestionWrapper<T>): string {\n return item.id;\n }\n\n /**\n * Remove uma sugestão da lista de valores selecionados.\n * @param suggestion O item a ser removido da lista de sugestões.\n */\n public removeSuggestion(suggestion: T): void {\n const suggestionValue = this.suggestionValue();\n\n this.values.set(\n this.values().filter((value) => {\n if (suggestionValue) {\n return value[suggestionValue] !== suggestion[suggestionValue];\n }\n return value !== suggestion;\n }),\n );\n this._onChange?.(this.values());\n this.unselected.emit(suggestion);\n }\n\n /**\n * Reinicia a lista de sugestões filtradas.\n * Se o modo lazy estiver ativado, emite um evento para carregar sugestões com uma consulta vazia.\n * Em seguida, redefine as sugestões filtradas para o valor retornado por `internalSuggestion()`.\n * @private\n */\n private resetFilteredSuggestions(): void {\n if (this.lazy()) {\n this._lazyLoadSubject$.next('');\n } else {\n this.filteredSuggestions.set(this.internalSuggestion());\n }\n }\n\n /**\n * Move o foco para a próxima sugestão na lista de sugestões, se houver.\n * @private\n * @param suggestions Lista de sugestões disponíveis.\n */\n private _focusNextSuggestion(suggestions: SuggestionWrapper<T>[]): void {\n let nextIndex = this.focusedIndex() + 1;\n\n if (nextIndex < suggestions.length) {\n this.focusedIndex.set(nextIndex);\n this._scrollToFocusedSuggestion();\n }\n }\n\n /**\n * Move o foco para a sugestão anterior na lista de sugestões, se houver.\n * @private\n */\n private _focusPreviousSuggestion(): void {\n let prevIndex = this.focusedIndex() - 1;\n\n if (prevIndex >= 0) {\n this.focusedIndex.set(prevIndex);\n this._scrollToFocusedSuggestion();\n }\n }\n\n /**\n * Rola a lista de sugestões para garantir que a sugestão atualmente focada esteja visível.\n * @private\n */\n private _scrollToFocusedSuggestion(): void {\n const id = this.filteredSuggestions()[this.focusedIndex()]?.id;\n\n if (!id) {\n return;\n }\n\n const el = document.getElementById(id);\n el?.scrollIntoView({ block: 'nearest' });\n }\n\n /**\n * Adiciona um identificador único a cada sugestão fornecida.\n * @private\n * @param suggestions - Um array de sugestões do tipo T.\n * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.\n */\n private _addIdToSuggestions(suggestions: T[]): SuggestionWrapper<T>[] {\n const baseId = `${this.componentId}_suggestion`;\n\n return suggestions?.map((suggestion, index) => {\n return {\n data: suggestion,\n id: `${baseId}_${index++}`,\n };\n }) ?? [];\n }\n\n /**\n * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.\n * Este método utiliza switchMap para cancelar requisições anteriores automaticamente\n * quando uma nova busca é iniciada, evitando que resultados antigos sobrescrevam\n * resultados mais recentes.\n * @private\n */\n private _setupLazyLoadDebounce(): void {\n this._lazyLoadSubject$\n .pipe(\n debounceTime(this.delay()),\n distinctUntilChanged(),\n switchMap((query) => {\n this.loading.set(true);\n // TODO: Manter fechado o dropdownd até a busca estiver concluída\n return new Observable<T[]>((subscriber) => {\n const timeoutId = setTimeout(() => {\n if (!subscriber.closed) {\n subscriber.error(new Error('Lazy load timeout'));\n }\n }, 30000);\n\n const responseCallback = (data: T[]) => {\n clearTimeout(timeoutId);\n if (!subscriber.closed) {\n subscriber.next(data);\n subscriber.complete();\n }\n };\n\n this.lazyLoad.emit({ query, response: responseCallback });\n });\n }),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (data: T[]) => {\n this.loading.set(false);\n // TODO: Abrir o dropdown somente aqui\n const wrappedSuggestions = this._addIdToSuggestions(data);\n this.filteredSuggestions.set(wrappedSuggestions);\n this.showEmptyMessage.set(wrappedSuggestions.length === 0);\n },\n error: (error) => {\n this.loading.set(false);\n // TODO: Abrir o dropdown somente aqui\n console.error('Lazy load error:', error);\n this.filteredSuggestions.set([]);\n this.showEmptyMessage.set(true);\n },\n });\n }\n\n /**\n * Configura o debounce para o input do autocomplete.\n * Este método utiliza um Subject para escutar as mudanças no valor do input,\n * aplicando um debounce com o tempo definido por `this.delay()`. Quando um novo valor é emitido:\n * - Se houver valor, filtra as sugestões com base no texto digitado e atualiza a lista de sugestões filtradas.\n * - Se não houver valor e o dropdown estiver ativo, reseta as sugestões filtradas.\n * - Caso contrário, limpa a lista de sugestões filtradas.\n * Também atualiza o estado da mensagem de lista vazia e, se a seleção for livre (`forceSelection` for falso),\n * propaga a mudança de valor para o formulário.\n * @private\n */\n private _setupInputDebounce(): void {\n this._inputSubject$\n .pipe(\n debounceTime(this.delay()),\n distinctUntilChanged(),\n filter((value) => value.length >= this.minLengthToSearch() || value.length === 0),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe((value) => {\n if (value) {\n this.filteredSuggestions.set(\n this.internalSuggestion().filter(({ data }) => {\n const label = String(this.suggestionLabel() ? data[this.suggestionLabel()!] : data);\n return label.toLowerCase().includes(value.toLowerCase());\n }),\n );\n this.showEmptyMessage.set(this.filteredSuggestions().length === 0);\n } else if (this.dropdown()) {\n this.resetFilteredSuggestions();\n } else {\n this.filteredSuggestions.set([]);\n }\n\n if (!this.forceSelection()) {\n this._onChange?.(value);\n }\n });\n }\n\n /**\n * Valida as entradas do componente de autocomplete.\n * @private\n * @throws {Error} Se as sugestões forem objetos e `suggestionLabel` não for fornecido.\n */\n private _validateInputs(): void {\n const suggestions = this.suggestions();\n\n if (!suggestions.length) {\n return;\n }\n\n const hasObjectSuggestions = suggestions.some(\n (suggestion) => typeof suggestion === 'object' && suggestion !== null,\n );\n\n if (hasObjectSuggestions) {\n if (!this.suggestionLabel()) {\n throw new Error('The suggestionLabel input must be provided when suggestions are objects.');\n }\n }\n }\n}\n","<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-autocomplete.mjs","sources":["../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.html","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.html","../../projects/angular-components/autocomplete/src/seniorsistemas-angular-components-autocomplete.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 's-autocomplete-chip',\n templateUrl: './autocomplete-chip.component.html',\n standalone: true,\n})\nexport class AutocompleteChipComponent<T> {\n public suggestion = input.required<T>();\n public suggestionLabel = input<keyof T>();\n\n public suggestionRemoved = output<T>();\n\n public removeSuggestion() {\n this.suggestionRemoved.emit(this.suggestion());\n }\n}\n","<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i class=\"far fa-times\"></i>\n </button>\n</div>\n","import { OverlayModule } from '@angular/cdk/overlay';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\n\nimport { AutocompleteChipComponent } from './components/autocomplete-chip/autocomplete-chip.component';\n\n/**\n * Representa um item de sugestão encapsulado, utilizado em componentes de autocomplete.\n * @template T Tipo dos dados associados à sugestão.\n * @property data Os dados da sugestão.\n * @property id Identificador único da sugestão.\n * @property [isSelected] Indica se a sugestão está selecionada.\n */\ninterface SuggestionWrapper<T> {\n data: T;\n id: string;\n isSelected?: boolean;\n}\n\n@Component({\n selector: 's-autocomplete',\n standalone: true,\n templateUrl: './autocomplete.component.html',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n OverlayModule,\n ScrollingModule,\n TranslateModule,\n AutocompleteChipComponent,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AutocompleteComponent),\n multi: true,\n },\n ],\n host: {\n role: 'combobox',\n '[attr.aria-expanded]': 'isOpen()',\n '[attr.aria-haspopup]': '\"listbox\"',\n '[attr.aria-owns]': 'isOpen() ? \"dropdown-container-\" + componentId : null',\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class AutocompleteComponent<T> implements ControlValueAccessor {\n private static nextId = 0;\n\n public suggestions = input<T[]>([]);\n public placeholder = input<string>();\n public suggestionValue = input<keyof T>();\n public suggestionLabel = input<keyof T>();\n public readonly = input(false);\n public emptyMessage = input<string>();\n public delay = input(300);\n public invalid = input(false);\n public virtualScroll = input(false);\n public virtualScrollItemSize = input(37);\n public lazy = input(false);\n public dropdown = input(false);\n public forceSelection = input(false);\n public checkmark = input(false);\n public multiple = input(false);\n public minLengthToSearch = input(1);\n public inputClass = input<string>('');\n public dataKey = input<keyof T>();\n\n public value = model<T | null>();\n public values = model<T[]>([]);\n public disabled = model(false);\n\n public lazyLoad = output<{ query: string; response: (data: T[]) => void }>();\n public selected = output<T>();\n public unselected = output<T>();\n public blurred = output<Event>();\n public cleared = output();\n public keyUp = output<Event>();\n public focused = output<any>();\n public completeMethod = output<{ query: string }>();\n\n public focusedIndex = signal(-1);\n public isOpen = signal(false);\n public filteredSuggestions = signal<SuggestionWrapper<T>[]>([]);\n public showEmptyMessage = signal(false);\n public filterText = signal('');\n public inputValue = signal('');\n public loading = signal(false);\n\n public componentId = `autocomplete_${AutocompleteComponent.nextId++}`;\n public inputEl = viewChild<ElementRef>('inputEl');\n\n private _inputSubject$ = new Subject<string>();\n private _lazyLoadSubject$ = new Subject<string>();\n private _destroyRef = inject(DestroyRef);\n private _onChange?: (value: any | any[]) => void;\n private _onTouched?: () => void;\n\n /**\n * Computed que retorna uma lista de sugestões do tipo `SuggestionWrapper<T>`,\n * adicionando um identificador único a cada sugestão.\n * @returns Uma lista de sugestões processadas com identificadores únicos.\n */\n public internalSuggestion = computed<SuggestionWrapper<T>[]>(() => {\n const opts = this.suggestions();\n return this._addIdToSuggestions(opts);\n });\n\n /**\n * Retorna um conjunto (`Set`) com os IDs das sugestões selecionadas.\n */\n public selectedSuggestionIds = computed(() => {\n if (!this.multiple()) {\n return new Set<string>();\n }\n\n const currentValues = this.values();\n\n return new Set(\n currentValues.map((value) => {\n return this.internalSuggestion().find((s) => JSON.stringify(s.data) === JSON.stringify(value))?.id;\n }),\n );\n });\n\n /**\n * Retorna uma lista de sugestões filtradas, enriquecidas com a propriedade `isSelected`.\n * Cada sugestão recebe um campo booleano `isSelected` indicando se ela está selecionada,\n * com base nos IDs das sugestões selecionadas e no valor da sugestão.\n * @returns Uma lista de sugestões filtradas, cada uma com a propriedade adicional `isSelected`.\n */\n public enrichedFilteredSuggestions = computed(() => {\n const filtered = this.filteredSuggestions();\n const selectedIds = this.selectedSuggestionIds();\n\n return filtered.map((suggestion) => ({\n ...suggestion,\n isSelected: selectedIds.has(suggestion.id),\n }));\n });\n\n constructor() {\n this._validateInputs();\n this._setupInputDebounce();\n this._setupLazyLoadDebounce();\n }\n\n /**\n * Define o valor do autocomplete.\n * @param value Valor a ser definido, único ou array, conforme seleção múltipla.\n * @throws Se múltiplo for falso e value for array.\n */\n public writeValue(value: T | T[]): void {\n const suggestionLabel = this.suggestionLabel();\n\n if (value && this.multiple()) {\n if (Array.isArray(value)) {\n this.values.set(value);\n } else {\n this.values.set([value]);\n }\n } else {\n if (Array.isArray(value)) {\n throw new Error('The value must not be an array when multiple is false.');\n } else {\n this.value.set(value);\n }\n\n this.inputValue.set(!value ? '' : suggestionLabel ? String(value[suggestionLabel]) : String(value));\n }\n }\n\n /**\n * Registra uma função de callback que será chamada sempre que o valor do componente mudar.\n * @param onChange Função a ser chamada quando o valor mudar. Recebe o novo valor como argumento, que pode ser um único valor ou um array de valores.\n */\n public registerOnChange(onChange: (value: any | any[]) => void): void {\n this._onChange = onChange;\n }\n\n /**\n * Registra uma função de callback que será chamada quando o componente for tocado (perder o foco).\n * @param onTouched Função de callback a ser chamada quando o componente for tocado.\n */\n public registerOnTouched(onTouched: () => void): void {\n this._onTouched = onTouched;\n }\n\n /**\n * Define o estado de desabilitado do componente.\n * @param disabled Indica se o componente deve ser desabilitado (`true`) ou habilitado (`false`).\n */\n public setDisabledState?(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n /**\n * Manipula o evento de entrada do usuário no campo de texto do autocomplete.\n * Este método é chamado sempre que o usuário digita algo no campo de entrada.\n * Ele executa as seguintes ações:\n * - Dispara o callback de \"touched\" para controle de formulários.\n * - Obtém o valor atual do campo de entrada.\n * - Se o modo lazy estiver ativado, emite o evento de lazyLoad com a consulta e abre o painel de sugestões.\n * - Caso contrário, atualiza o texto de filtro, notifica os observadores e abre o painel de sugestões se houver sugestões disponíveis.\n * @param event Evento de entrada do tipo `Event` proveniente do campo de texto.\n */\n public onInput(event: Event): void {\n this._onTouched?.();\n\n const value = (event.target as HTMLInputElement).value;\n\n if (this.lazy()) {\n this._lazyLoadSubject$.next(value);\n this.isOpen.set(true);\n return;\n }\n\n this.filterText.set(value);\n\n this.completeMethod.emit({ query: value });\n\n this._inputSubject$.next(value);\n\n if (this.suggestions()) {\n this.isOpen.set(true);\n }\n }\n\n /**\n * Manipula o evento de perda de foco (blur) do campo de entrada do autocomplete.\n * Este método verifica se o valor digitado pelo usuário corresponde exatamente a algum dos itens sugeridos.\n * - Se houver correspondência:\n * - No modo múltiplo (`multiple`), adiciona o item selecionado à lista de valores, caso ainda não esteja presente.\n * - No modo simples, seleciona o item correspondente se ainda não estiver selecionado.\n * - Se não houver correspondência, limpa o campo de entrada.\n */\n public onInputBlur(event: Event): void {\n const inputValue = String(this.inputValue()).toLowerCase();\n const suggestions = this.internalSuggestion();\n\n const match = suggestions.find(({ data }) => {\n const label = this.suggestionLabel() ? data[this.suggestionLabel()!] : data;\n return String(label).toLowerCase() === inputValue;\n });\n\n if (match) {\n if (this.multiple()) {\n const currentValues = this.values();\n const exists = currentValues.some(\n (value) =>\n (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n (this.suggestionValue() ? match.data[this.suggestionValue()!] : match.data),\n );\n if (!exists) {\n this.values.set([...currentValues, match.data]);\n this._onChange?.(this.values());\n }\n this.inputValue.set('');\n } else {\n if (this.value() !== match.data) {\n this.selectSuggestion(match.data);\n }\n }\n } else {\n this.inputValue.set('');\n }\n }\n\n /**\n * Dispara o evento de foco quando o campo de entrada recebe foco.\n * @param event O evento de foco disparado pelo elemento de entrada.\n */\n public onInputFocus(event: Event): void {\n this.focused.emit(event);\n }\n\n /**\n * Manipula eventos de teclado no componente de autocomplete.\n * Este método gerencia a navegação e seleção de sugestões usando as teclas do teclado.\n * - 'ArrowDown': Move o foco para a próxima sugestão.\n * - 'ArrowUp': Move o foco para a sugestão anterior.\n * - 'Enter' ou 'Tab': Seleciona a sugestão atualmente focada e fecha a lista de sugestões.\n * - 'Escape': Fecha a lista de sugestões sem selecionar nenhum item.\n * @param event O evento de teclado disparado pelo usuário.\n */\n public onKeyDown(event: KeyboardEvent): void {\n const suggestions = this.filteredSuggestions();\n\n this._onTouched?.();\n\n const _selectSuggestion = () => {\n if (this.focusedIndex() >= 0 && this.focusedIndex() < suggestions.length) {\n event.preventDefault();\n this.selectSuggestion(suggestions[this.focusedIndex()].data);\n }\n };\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._focusNextSuggestion(suggestions);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this._focusPreviousSuggestion();\n break;\n case 'Enter':\n case 'Tab':\n _selectSuggestion();\n this.isOpen.set(false);\n break;\n case 'Escape':\n this.isOpen.set(false);\n break;\n }\n }\n\n /**\n * Emite um evento quando uma tecla é liberada no componente. *\n * @param event O evento de teclado associado à tecla liberada.\n */\n public onKeyUp(event: Event): void {\n this.keyUp.emit(event);\n }\n\n /**\n * Fecha o dropdown em eventos de redimensionamento de janela.\n */\n public onWindowResize(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n }\n }\n\n /**\n * Seleciona uma sugestão da lista de sugestões.\n * Se o modo múltiplo estiver ativado (`multiple()` retorna true), adiciona a sugestão à lista de suggestões selecionadas,\n * caso ela ainda não esteja presente. Em seguida, limpa o valor do campo de entrada.\n * Se o modo múltiplo não estiver ativado, define a sugestão como valor selecionado e atualiza o campo de entrada\n * com o rótulo correspondente.\n * Em ambos os casos, dispara o callback `_onChange` com o novo valor e fecha o painel de sugestões.\n * @param suggestion - A sugestão a ser selecionada.\n */\n public selectSuggestion(suggestion: T): void {\n if (this.multiple()) {\n const currentValues = this.values();\n const exists = currentValues.some(\n (value) =>\n (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n (this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion),\n );\n\n if (!exists) {\n this.values.set([...currentValues, suggestion]);\n this._onChange?.(this.values());\n }\n\n this.inputValue.set('');\n } else {\n this.value.set(suggestion);\n const _value = this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion;\n const _inputValue = String(this.suggestionLabel() ? suggestion[this.suggestionLabel()!] : suggestion);\n\n this.inputValue.set(_inputValue);\n this._onChange?.(_value);\n }\n\n this.selected.emit(suggestion);\n this.isOpen.set(false);\n }\n\n /**\n * Limpa o valor selecionado no componente de autocomplete.\n * Se o modo múltiplo estiver ativado, remove todos os valores selecionados.\n * Caso contrário, define o valor como nulo.\n * Também limpa as sugestões filtradas, fecha o painel de sugestões\n * e limpa o valor do campo de entrada.\n */\n public clear(): void {\n if (this.multiple()) {\n this.values.set([]);\n this._onChange?.(this.values());\n } else {\n this.value.set(null);\n this._onChange?.(this.value());\n }\n\n this.filteredSuggestions.set([]);\n this.isOpen.set(false);\n this.inputValue.set('');\n this.cleared.emit();\n }\n\n /**\n * Alterna a exibição do dropdown de sugestões do autocomplete.\n * Este método configura o debounce do input, verifica se há sugestões filtradas\n * e, caso não haja sugestões e o texto do filtro esteja vazio, redefine as sugestões filtradas.\n * Por fim, alterna o estado de abertura do dropdown.\n */\n public toggleDropdown(): void {\n this._setupInputDebounce();\n\n if (this.filterText() === '') {\n if (this.lazy()) {\n this._lazyLoadSubject$.next('');\n } else {\n this.resetFilteredSuggestions();\n }\n }\n\n this.isOpen.set(!this.isOpen());\n }\n\n /**\n * Função utilizada para otimizar a renderização de listas no Angular, permitindo que o framework\n * identifique cada item de forma única pelo seu `id`. Deve ser utilizada como função de `trackBy`\n * em diretivas como `*ngFor`.\n * @param _ - Índice do item na lista (não utilizado).\n * @param item - Objeto do tipo `SuggestionWrapper<T>` que representa o item atual.\n * @returns O identificador único (`id`) do item.\n */\n public trackById(_: number, item: SuggestionWrapper<T>): string {\n return item.id;\n }\n\n /**\n * Remove uma sugestão da lista de valores selecionados.\n * @param suggestion O item a ser removido da lista de sugestões.\n */\n public removeSuggestion(suggestion: T): void {\n const suggestionValue = this.suggestionValue();\n\n this.values.set(\n this.values().filter((value) => {\n if (suggestionValue) {\n return value[suggestionValue] !== suggestion[suggestionValue];\n }\n return value !== suggestion;\n }),\n );\n this._onChange?.(this.values());\n this.unselected.emit(suggestion);\n }\n\n /**\n * Reinicia a lista de sugestões filtradas.\n * Se o modo lazy estiver ativado, emite um evento para carregar sugestões com uma consulta vazia.\n * Em seguida, redefine as sugestões filtradas para o valor retornado por `internalSuggestion()`.\n * @private\n */\n private resetFilteredSuggestions(): void {\n if (this.lazy()) {\n this._lazyLoadSubject$.next('');\n } else {\n this.filteredSuggestions.set(this.internalSuggestion());\n }\n }\n\n /**\n * Move o foco para a próxima sugestão na lista de sugestões, se houver.\n * @private\n * @param suggestions Lista de sugestões disponíveis.\n */\n private _focusNextSuggestion(suggestions: SuggestionWrapper<T>[]): void {\n let nextIndex = this.focusedIndex() + 1;\n\n if (nextIndex < suggestions.length) {\n this.focusedIndex.set(nextIndex);\n this._scrollToFocusedSuggestion();\n }\n }\n\n /**\n * Move o foco para a sugestão anterior na lista de sugestões, se houver.\n * @private\n */\n private _focusPreviousSuggestion(): void {\n let prevIndex = this.focusedIndex() - 1;\n\n if (prevIndex >= 0) {\n this.focusedIndex.set(prevIndex);\n this._scrollToFocusedSuggestion();\n }\n }\n\n /**\n * Rola a lista de sugestões para garantir que a sugestão atualmente focada esteja visível.\n * @private\n */\n private _scrollToFocusedSuggestion(): void {\n const id = this.filteredSuggestions()[this.focusedIndex()]?.id;\n\n if (!id) {\n return;\n }\n\n const el = document.getElementById(id);\n el?.scrollIntoView({ block: 'nearest' });\n }\n\n /**\n * Adiciona um identificador único a cada sugestão fornecida.\n * @private\n * @param suggestions - Um array de sugestões do tipo T.\n * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.\n */\n private _addIdToSuggestions(suggestions: T[]): SuggestionWrapper<T>[] {\n return (\n suggestions?.map((suggestion) => {\n return {\n data: suggestion,\n id: this.dataKey()\n ? String(suggestion[this.dataKey()!])\n : ((typeof suggestion !== 'object'\n ? suggestion?.toString()\n : Object.values(suggestion as Object).join('_')) ?? ''),\n };\n }) ?? []\n );\n }\n\n /**\n * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.\n * Este método utiliza switchMap para cancelar requisições anteriores automaticamente\n * quando uma nova busca é iniciada, evitando que resultados antigos sobrescrevam\n * resultados mais recentes.\n * @private\n */\n private _setupLazyLoadDebounce(): void {\n this._lazyLoadSubject$\n .pipe(\n debounceTime(this.delay()),\n distinctUntilChanged(),\n switchMap((query) => {\n this.loading.set(true);\n // TODO: Manter fechado o dropdownd até a busca estiver concluída\n return new Observable<T[]>((subscriber) => {\n const timeoutId = setTimeout(() => {\n if (!subscriber.closed) {\n subscriber.error(new Error('Lazy load timeout'));\n }\n }, 30000);\n\n const responseCallback = (data: T[]) => {\n clearTimeout(timeoutId);\n if (!subscriber.closed) {\n subscriber.next(data);\n subscriber.complete();\n }\n };\n\n this.lazyLoad.emit({ query, response: responseCallback });\n });\n }),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({\n next: (data: T[]) => {\n this.loading.set(false);\n // TODO: Abrir o dropdown somente aqui\n const wrappedSuggestions = this._addIdToSuggestions(data);\n this.filteredSuggestions.set(wrappedSuggestions);\n this.showEmptyMessage.set(wrappedSuggestions.length === 0);\n },\n error: (error) => {\n this.loading.set(false);\n // TODO: Abrir o dropdown somente aqui\n console.error('Lazy load error:', error);\n this.filteredSuggestions.set([]);\n this.showEmptyMessage.set(true);\n },\n });\n }\n\n /**\n * Configura o debounce para o input do autocomplete.\n * Este método utiliza um Subject para escutar as mudanças no valor do input,\n * aplicando um debounce com o tempo definido por `this.delay()`. Quando um novo valor é emitido:\n * - Se houver valor, filtra as sugestões com base no texto digitado e atualiza a lista de sugestões filtradas.\n * - Se não houver valor e o dropdown estiver ativo, reseta as sugestões filtradas.\n * - Caso contrário, limpa a lista de sugestões filtradas.\n * Também atualiza o estado da mensagem de lista vazia e, se a seleção for livre (`forceSelection` for falso),\n * propaga a mudança de valor para o formulário.\n * @private\n */\n private _setupInputDebounce(): void {\n this._inputSubject$\n .pipe(\n debounceTime(this.delay()),\n distinctUntilChanged(),\n filter((value) => value.length >= this.minLengthToSearch() || value.length === 0),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe((value) => {\n if (value) {\n this.filteredSuggestions.set(\n this.internalSuggestion().filter(({ data }) => {\n const label = String(this.suggestionLabel() ? data[this.suggestionLabel()!] : data);\n return label.toLowerCase().includes(value.toLowerCase());\n }),\n );\n this.showEmptyMessage.set(this.filteredSuggestions().length === 0);\n } else if (this.dropdown()) {\n this.resetFilteredSuggestions();\n } else {\n this.filteredSuggestions.set([]);\n }\n\n if (!this.forceSelection()) {\n this._onChange?.(value);\n }\n });\n }\n\n /**\n * Valida as entradas do componente de autocomplete.\n * @private\n * @throws {Error} Se as sugestões forem objetos e `suggestionLabel` não for fornecido.\n */\n private _validateInputs(): void {\n const suggestions = this.suggestions();\n\n if (!suggestions.length) {\n return;\n }\n\n const hasObjectSuggestions = suggestions.some(\n (suggestion) => typeof suggestion === 'object' && suggestion !== null,\n );\n\n if (hasObjectSuggestions) {\n if (!this.suggestionLabel()) {\n throw new Error('The suggestionLabel input must be provided when suggestions are objects.');\n }\n }\n }\n}\n","<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seniorsistemas/angular-components",
3
- "version": "17.31.2-feature-sds-110-0ff2e960",
3
+ "version": "17.31.2-feature-sds-110-234267aa",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^18.2.14",
6
6
  "@angular/common": "^18.2.0",
@@ -64,18 +64,18 @@
64
64
  "esm": "./esm2022/breadcrumb/seniorsistemas-angular-components-breadcrumb.mjs",
65
65
  "default": "./fesm2022/seniorsistemas-angular-components-breadcrumb.mjs"
66
66
  },
67
- "./button": {
68
- "types": "./button/index.d.ts",
69
- "esm2022": "./esm2022/button/seniorsistemas-angular-components-button.mjs",
70
- "esm": "./esm2022/button/seniorsistemas-angular-components-button.mjs",
71
- "default": "./fesm2022/seniorsistemas-angular-components-button.mjs"
72
- },
73
67
  "./autocomplete": {
74
68
  "types": "./autocomplete/index.d.ts",
75
69
  "esm2022": "./esm2022/autocomplete/seniorsistemas-angular-components-autocomplete.mjs",
76
70
  "esm": "./esm2022/autocomplete/seniorsistemas-angular-components-autocomplete.mjs",
77
71
  "default": "./fesm2022/seniorsistemas-angular-components-autocomplete.mjs"
78
72
  },
73
+ "./button": {
74
+ "types": "./button/index.d.ts",
75
+ "esm2022": "./esm2022/button/seniorsistemas-angular-components-button.mjs",
76
+ "esm": "./esm2022/button/seniorsistemas-angular-components-button.mjs",
77
+ "default": "./fesm2022/seniorsistemas-angular-components-button.mjs"
78
+ },
79
79
  "./calendar-mask": {
80
80
  "types": "./calendar-mask/index.d.ts",
81
81
  "esm2022": "./esm2022/calendar-mask/seniorsistemas-angular-components-calendar-mask.mjs",