@libs-ui/components-list 0.2.56 → 0.2.57

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.
@@ -0,0 +1,189 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, signal, viewChild } from '@angular/core';
4
+ import { VirtualScrollerComponent, VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';
5
+ import { LibsUiComponentsRadioSingleComponent } from '@libs-ui/components-radio-single';
6
+ import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
7
+ import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
8
+ import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
9
+ import { cloneDeep, deleteUnicode, escapeHtml, isEmpty, isNil } from '@libs-ui/utils';
10
+ import { TranslateModule } from '@ngx-translate/core';
11
+ import { LibsUiCheckSelectedByKeyPipe } from '../../pipes/check-selected-by-key.pipe';
12
+ import { LibsUiComponentsListRowsComponent } from '../rows/rows.component';
13
+ import { LibsUiComponentsListTemplatesComponentAbstract } from '../templates.component.abstract';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@iharbeck/ngx-virtual-scroller";
16
+ import * as i2 from "@ngx-translate/core";
17
+ export class LibsUiComponentsListRadioComponent extends LibsUiComponentsListTemplatesComponentAbstract {
18
+ /* PROPERTY */
19
+ configTemplateRadio = signal(undefined);
20
+ /* VIEW CHILD */
21
+ virtualScrollerComponent = viewChild(VirtualScrollerComponent);
22
+ ngOnInit() {
23
+ if (isEmpty(this.config()?.configTemplateRadio)) {
24
+ return;
25
+ }
26
+ super.ngOnInit();
27
+ this.configTemplateRadio.set(this.config()?.configTemplateRadio);
28
+ this.fieldKey.set(this.configTemplateRadio()?.fieldKey ?? this.fieldKeyDefault());
29
+ this.callApiByService();
30
+ }
31
+ /* FUNCTIONS */
32
+ handlerScrollBottom() {
33
+ if (this.loadedLastItem()) {
34
+ this.loading.set(false);
35
+ this.outLoading.emit(this.loading());
36
+ return;
37
+ }
38
+ if (this.loading() || this.loadedLastItem()) {
39
+ return;
40
+ }
41
+ this.loading.set(true);
42
+ this.outLoading.emit(this.loading());
43
+ this.callApiByService(false);
44
+ }
45
+ processSearch() {
46
+ if (!this.isSearchOnline()) {
47
+ return this.processData(true);
48
+ }
49
+ this.callApiByService(true);
50
+ }
51
+ processKeyChangeUnSelect(item) {
52
+ if (isNil(item[this.fieldKey()]) || item[this.fieldKey()] === '' || this.keySelected() !== item[this.fieldKey()]) {
53
+ return;
54
+ }
55
+ this.keySelected.set('');
56
+ this.outSelectKey.emit(undefined);
57
+ }
58
+ handlerChange(event, item, ignoreDisable, isClickManual = true) {
59
+ if (!item) {
60
+ return;
61
+ }
62
+ if (this.disable() && !ignoreDisable) {
63
+ return;
64
+ }
65
+ if (event instanceof Event) {
66
+ if (this.clickExactly()) {
67
+ return;
68
+ }
69
+ event.stopPropagation();
70
+ this.keySelected.set(item[this.fieldKey()]);
71
+ this.outSelectKey.emit({ key: this.keySelected(), item, isClickManual });
72
+ return;
73
+ }
74
+ this.keySelected.set(item[this.fieldKey()]);
75
+ this.outSelectKey.emit({ key: this.keySelected(), item, isClickManual });
76
+ }
77
+ processData(replace) {
78
+ const itemByKeySearch = [];
79
+ const keysHidden = this.keysHiddenItem() || [];
80
+ if (replace) {
81
+ this.items.set([]);
82
+ }
83
+ this.store().forEach((item) => {
84
+ const dataStore = cloneDeep(item);
85
+ dataStore.update(store => { return { ...store, ref: item() }; });
86
+ const key = keysHidden.find(key => dataStore()[this.fieldKey()] === key);
87
+ if (key === undefined) {
88
+ const text = deleteUnicode(this.buildValueByConfig(dataStore, this.configTemplateRadio())).toLocaleLowerCase();
89
+ const textEscape = escapeHtml(text);
90
+ const keySearch = deleteUnicode(escapeHtml(this.keySearch().toLocaleLowerCase()));
91
+ if (((this.isSearchOnline() && this.config()?.httpRequestData?.serviceName && !this.config()?.httpRequestData?.serviceOther) ||
92
+ (text && (text.includes(keySearch) || textEscape.includes(keySearch)))) && (replace || (!replace && !this.items().find(dataItem => dataItem()[this.fieldKey()] === dataStore()[this.fieldKey()]))) && !itemByKeySearch.find(dataItem => dataItem()[this.fieldKey()] === dataStore()[this.fieldKey()])) {
93
+ if (this.configTemplateRadio()?.getPopover) {
94
+ dataStore.update(currentStore => {
95
+ return { ...currentStore, dataTooltip: this.configTemplateRadio()?.getPopover?.(dataStore) };
96
+ });
97
+ }
98
+ dataStore.update(currentStore => {
99
+ return {
100
+ ...currentStore,
101
+ classLabelInclude: this.configTemplateRadio()?.getClassItem?.(dataStore()),
102
+ avatarConfig: this.configTemplateRadio()?.getAvatarConfig?.(dataStore())
103
+ };
104
+ });
105
+ itemByKeySearch.push(dataStore);
106
+ }
107
+ return;
108
+ }
109
+ const indexItemRemove = this.items().findIndex(item => item()[this.fieldKey()] === key);
110
+ if (indexItemRemove > -1) {
111
+ this.items.update(items => {
112
+ items.splice(indexItemRemove, 1);
113
+ return items;
114
+ });
115
+ }
116
+ });
117
+ const checkLoadItem = (preStateHasScroll, currentHasScroll) => {
118
+ if (this.keysHiddenItem()?.length && preStateHasScroll && !currentHasScroll && (this.isSearchOnline())) {
119
+ this.callApiByService(false);
120
+ }
121
+ };
122
+ if (replace) {
123
+ this.items.set(itemByKeySearch);
124
+ this.config()?.sort?.(this.items());
125
+ this.emitKeySelectedDefaultIfExistItem(this.items());
126
+ this.autoSelectFirstItem(this.items());
127
+ this.setHeightViewPort();
128
+ this.loading.set(false);
129
+ this.outLoading.emit(this.loading());
130
+ this.outLoadItemsComplete.emit({ items: this.items(), paging: this.pagingStore() });
131
+ this.checkViewPortScroll(checkLoadItem);
132
+ this.scrollToItemSelected();
133
+ return;
134
+ }
135
+ this.items.update(items => [...(items || []), ...itemByKeySearch]);
136
+ this.config()?.sort?.(this.items());
137
+ this.setHeightViewPort();
138
+ this.loading.set(false);
139
+ this.outLoading.emit(this.loading());
140
+ this.outLoadItemsComplete.emit({ items: this.items(), paging: this.pagingStore() });
141
+ this.checkViewPortScroll(checkLoadItem);
142
+ this.scrollToItemSelected();
143
+ }
144
+ scrollToItemSelected() {
145
+ if (!this.configTemplateRadio()?.autoScrollToItemSelected) {
146
+ return;
147
+ }
148
+ clearTimeout(this.timeAutoScrollItemSelected());
149
+ this.timeAutoScrollItemSelected.set(setTimeout(() => {
150
+ if (!this.keySelected) {
151
+ return;
152
+ }
153
+ const index = this.items().findIndex(item => item()[this.fieldKey()] === this.keySelected());
154
+ if (index !== -1) {
155
+ this.virtualScrollerComponent()?.scrollToIndex(index);
156
+ }
157
+ }));
158
+ }
159
+ autoSelectFirstItem(items) {
160
+ if (this.keySelected() || !this.config()?.autoSelectFirstItem || !items || !items.length) {
161
+ return;
162
+ }
163
+ this.handlerChange('radio', items[0], true, false);
164
+ }
165
+ emitKeySelectedDefaultIfExistItem(items) {
166
+ const item = items.find(store => store()[this.fieldKey()] === this.keySelected());
167
+ if (item) {
168
+ this.handlerChange('radio', item, true, false);
169
+ }
170
+ }
171
+ getLengthItem() {
172
+ return this.items().length;
173
+ }
174
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListRadioComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
175
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListRadioComponent, isStandalone: true, selector: "libs_ui-components-list-templates_radio", viewQueries: [{ propertyName: "virtualScrollerComponent", first: true, predicate: VirtualScrollerComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (configTemplateRadio(); as configTemplateRadio) {\n <div class=\"relative h-full w-full\">\n @if (items().length) {\n <div #elementScroll\n LibsUiComponentsScrollOverlayDirective\n class=\"w-full\"\n [style.height]=\"heightViewPort() ? heightViewPort()+'px':'100%'\"\n (moScrollBottom)=\"handlerScrollBottom()\">\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n @for (item of scroll.viewPortItems; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"'libs-ui-list-template-radio-item flex ' + (configTemplateRadio.classItemInclude || '')\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly()\"\n [class.libs-ui-bg-list-hover-active]=\"!clickExactly()\"\n [class.pl-[12px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.py-[2px]]=\"clickExactly()\"\n (click)=\"handlerChange($event,item())\">\n <div class=\"flex flex-col w-full\">\n @if (item().fieldLabel) {\n <libs_ui-components-radio-single [label]=\"item().fieldLabel\"\n [avatarConfig]=\"item().avatarConfig\"\n [active]=\"keySelected() === item()[fieldKey()]\"\n [key]=\"item()[fieldKey()]\"\n [imgTypeIcon]=\"configTemplateRadio.hasAvatarGroupSocial\"\n [linkImage]=\"configTemplateRadio.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateRadio.getImageError ? configTemplateRadio.getImageError : configTemplateRadio.getImage):item()) | async) : item()[configTemplateRadio.fieldGetImage || '']\"\n [classImageInclude]=\"configTemplateRadio.classIncludeImage || ''\"\n [bullet]=\"item().bullet\"\n [disable]=\"loading() || disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [classLabelInclude]=\"item().classLabelInclude || ''\"\n [popover]=\"item().dataPopover\"\n [clickExactly]=\"clickExactly()\"\n [disableLabel]=\"disableLabel()\"\n [zIndexLabel]=\"configTemplateRadio.zIndexPopover ?? 1200\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChange('radio',item())\" />\n }\n @if (configTemplateRadio?.rows) {\n <libs_ui-components-list-templates_rows class=\"w-full {{ configTemplateRadio.classRows ?? '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateRadio\"\n (outEvent)=\"handlerChange('radio',$event.item)\" />\n }\n </div>\n </div>\n }\n </virtual-scroller>\n </div>\n }\n @if (items().length) {\n <div [class]=\"'libs-ui-font-h4r text-[#c1c1c1] '+ (config()?.textNoDataClassInclude ?? 'py-[4px] px-[12px]')\">\n @if (!keySearch() && !loading()) {\n <span>{{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}</span>\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n <span>{{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}</span>\n }\n @if (loading()) {\n <span>&nbsp;</span>\n }\n </div>\n }\n\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n}\n", styles: [".libs-ui-list-template-radio-item{padding:4px 22px 4px 1px;font-size:12px;line-height:18px;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i1.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["classContainer", "options"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabe", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "component", type: LibsUiComponentsListRowsComponent, selector: "libs_ui-components-list-templates_rows", inputs: ["configTemplate", "item", "keySelected", "fieldKey", "zIndex"], outputs: ["outChangStageFlagMousePopover", "outEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
176
+ }
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListRadioComponent, decorators: [{
178
+ type: Component,
179
+ args: [{ selector: 'libs_ui-components-list-templates_radio', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
180
+ VirtualScrollerModule, AsyncPipe, TranslateModule, NgTemplateOutlet,
181
+ LibsUiComponentsSpinnerComponent,
182
+ LibsUiComponentsScrollOverlayDirective,
183
+ LibsUiComponentsRadioSingleComponent,
184
+ LibsUiPipesCallFunctionInTemplatePipe,
185
+ LibsUiCheckSelectedByKeyPipe,
186
+ LibsUiComponentsListRowsComponent
187
+ ], template: "@if (configTemplateRadio(); as configTemplateRadio) {\n <div class=\"relative h-full w-full\">\n @if (items().length) {\n <div #elementScroll\n LibsUiComponentsScrollOverlayDirective\n class=\"w-full\"\n [style.height]=\"heightViewPort() ? heightViewPort()+'px':'100%'\"\n (moScrollBottom)=\"handlerScrollBottom()\">\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n @for (item of scroll.viewPortItems; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"'libs-ui-list-template-radio-item flex ' + (configTemplateRadio.classItemInclude || '')\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly()\"\n [class.libs-ui-bg-list-hover-active]=\"!clickExactly()\"\n [class.pl-[12px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.py-[2px]]=\"clickExactly()\"\n (click)=\"handlerChange($event,item())\">\n <div class=\"flex flex-col w-full\">\n @if (item().fieldLabel) {\n <libs_ui-components-radio-single [label]=\"item().fieldLabel\"\n [avatarConfig]=\"item().avatarConfig\"\n [active]=\"keySelected() === item()[fieldKey()]\"\n [key]=\"item()[fieldKey()]\"\n [imgTypeIcon]=\"configTemplateRadio.hasAvatarGroupSocial\"\n [linkImage]=\"configTemplateRadio.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateRadio.getImageError ? configTemplateRadio.getImageError : configTemplateRadio.getImage):item()) | async) : item()[configTemplateRadio.fieldGetImage || '']\"\n [classImageInclude]=\"configTemplateRadio.classIncludeImage || ''\"\n [bullet]=\"item().bullet\"\n [disable]=\"loading() || disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [classLabelInclude]=\"item().classLabelInclude || ''\"\n [popover]=\"item().dataPopover\"\n [clickExactly]=\"clickExactly()\"\n [disableLabel]=\"disableLabel()\"\n [zIndexLabel]=\"configTemplateRadio.zIndexPopover ?? 1200\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChange('radio',item())\" />\n }\n @if (configTemplateRadio?.rows) {\n <libs_ui-components-list-templates_rows class=\"w-full {{ configTemplateRadio.classRows ?? '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateRadio\"\n (outEvent)=\"handlerChange('radio',$event.item)\" />\n }\n </div>\n </div>\n }\n </virtual-scroller>\n </div>\n }\n @if (items().length) {\n <div [class]=\"'libs-ui-font-h4r text-[#c1c1c1] '+ (config()?.textNoDataClassInclude ?? 'py-[4px] px-[12px]')\">\n @if (!keySearch() && !loading()) {\n <span>{{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}</span>\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n <span>{{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}</span>\n }\n @if (loading()) {\n <span>&nbsp;</span>\n }\n </div>\n }\n\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n}\n", styles: [".libs-ui-list-template-radio-item{padding:4px 22px 4px 1px;font-size:12px;line-height:18px;position:relative}\n"] }]
188
+ }] });
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9yYWRpby9yYWRpby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3JhZGlvL3JhZGlvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsOENBQThDLEVBQUUsTUFBTSxpQ0FBaUMs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d0tEckRJLHFCQUFxQixrdEJBQUUsU0FBUyw2Q0FBRSxlQUFlLDRGQUFFLGdCQUFnQixvSkFDbkUsZ0NBQWdDLGlHQUNoQyxzQ0FBc0MsbU5BQ3RDLG9DQUFvQywyZUFDcEMscUNBQXFDLHlFQUNyQyw0QkFBNEIscUVBQzVCLGlDQUFpQzs7NEZBR3hCLGtDQUFrQztrQkFqQjlDLFNBQVM7K0JBRUUseUNBQXlDLGNBR3ZDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLGdCQUFnQjt3QkFDbkUsZ0NBQWdDO3dCQUNoQyxzQ0FBc0M7d0JBQ3RDLG9DQUFvQzt3QkFDcEMscUNBQXFDO3dCQUNyQyw0QkFBNEI7d0JBQzVCLGlDQUFpQztxQkFDbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBzaWduYWwsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcmFkaW8tc2luZ2xlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGRlbGV0ZVVuaWNvZGUsIGVzY2FwZUh0bWwsIGlzRW1wdHksIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RSb3dzQ29tcG9uZW50IH0gZnJvbSAnLi4vcm93cy9yb3dzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdFRlbXBsYXRlc0NvbXBvbmVudEFic3RyYWN0IH0gZnJvbSAnLi4vdGVtcGxhdGVzLmNvbXBvbmVudC5hYnN0cmFjdCc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW1SYWRpbyB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9jb25maWctaXRlbS5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfcmFkaW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yYWRpby5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdFJhZGlvQ29tcG9uZW50IGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBjb25maWdUZW1wbGF0ZVJhZGlvID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbVJhZGlvIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCA9IHZpZXdDaGlsZChWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQpO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIGlmIChpc0VtcHR5KHRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlUmFkaW8pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZVJhZGlvLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVJhZGlvKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlUmFkaW8oKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oKSB7XG4gICAgaWYgKHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9hZGluZygpIHx8IHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2goKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0tleUNoYW5nZVVuU2VsZWN0KGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmIChpc05pbChpdGVtW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW1bdGhpcy5maWVsZEtleSgpXSA9PT0gJycgfHwgdGhpcy5rZXlTZWxlY3RlZCgpICE9PSBpdGVtW3RoaXMuZmllbGRLZXkoKV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoJycpO1xuICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlKGV2ZW50OiBhbnksIGl0ZW06IGFueSwgaWdub3JlRGlzYWJsZT86IGJvb2xlYW4sIGlzQ2xpY2tNYW51YWwgPSB0cnVlKSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGUoKSAmJiAhaWdub3JlRGlzYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgaWYgKHRoaXMuY2xpY2tFeGFjdGx5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmtleVNlbGVjdGVkLnNldChpdGVtW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IGtleTogdGhpcy5rZXlTZWxlY3RlZCgpLCBpdGVtLCBpc0NsaWNrTWFudWFsIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5U2VsZWN0ZWQuc2V0KGl0ZW1bdGhpcy5maWVsZEtleSgpXSk7XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IGtleTogdGhpcy5rZXlTZWxlY3RlZCgpLCBpdGVtLCBpc0NsaWNrTWFudWFsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NEYXRhKHJlcGxhY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbUJ5S2V5U2VhcmNoOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiA9IFtdO1xuICAgIGNvbnN0IGtleXNIaWRkZW4gPSB0aGlzLmtleXNIaWRkZW5JdGVtKCkgfHwgW107XG5cbiAgICBpZiAocmVwbGFjZSkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU3RvcmUgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgICAgZGF0YVN0b3JlLnVwZGF0ZShzdG9yZSA9PiB7IHJldHVybiB7IC4uLnN0b3JlLCByZWY6IGl0ZW0oKSB9IH0pO1xuICAgICAgY29uc3Qga2V5ID0ga2V5c0hpZGRlbi5maW5kKGtleSA9PiBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoZGF0YVN0b3JlLCB0aGlzLmNvbmZpZ1RlbXBsYXRlUmFkaW8oKSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgICBjb25zdCBrZXlTZWFyY2ggPSBkZWxldGVVbmljb2RlKGVzY2FwZUh0bWwodGhpcy5rZXlTZWFyY2goKS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgaWYgKCgodGhpcy5pc1NlYXJjaE9ubGluZSgpICYmIHRoaXMuY29uZmlnKCk/Lmh0dHBSZXF1ZXN0RGF0YT8uc2VydmljZU5hbWUgJiYgIXRoaXMuY29uZmlnKCk/Lmh0dHBSZXF1ZXN0RGF0YT8uc2VydmljZU90aGVyKSB8fFxuICAgICAgICAgICh0ZXh0ICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpICYmIChyZXBsYWNlIHx8ICghcmVwbGFjZSAmJiAhdGhpcy5pdGVtcygpLmZpbmQoZGF0YUl0ZW0gPT4gZGF0YUl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldKSkpICYmICFpdGVtQnlLZXlTZWFyY2guZmluZChkYXRhSXRlbSA9PiBkYXRhSXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGRhdGFTdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVSYWRpbygpPy5nZXRQb3BvdmVyKSB7XG4gICAgICAgICAgICBkYXRhU3RvcmUudXBkYXRlKGN1cnJlbnRTdG9yZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmN1cnJlbnRTdG9yZSwgZGF0YVRvb2x0aXA6IHRoaXMuY29uZmlnVGVtcGxhdGVSYWRpbygpPy5nZXRQb3BvdmVyPy4oZGF0YVN0b3JlKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRhdGFTdG9yZS51cGRhdGUoY3VycmVudFN0b3JlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmN1cnJlbnRTdG9yZSxcbiAgICAgICAgICAgICAgY2xhc3NMYWJlbEluY2x1ZGU6IHRoaXMuY29uZmlnVGVtcGxhdGVSYWRpbygpPy5nZXRDbGFzc0l0ZW0/LihkYXRhU3RvcmUoKSksXG4gICAgICAgICAgICAgIGF2YXRhckNvbmZpZzogdGhpcy5jb25maWdUZW1wbGF0ZVJhZGlvKCk/LmdldEF2YXRhckNvbmZpZz8uKGRhdGFTdG9yZSgpKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdGVtQnlLZXlTZWFyY2gucHVzaChkYXRhU3RvcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhJdGVtUmVtb3ZlID0gdGhpcy5pdGVtcygpLmZpbmRJbmRleChpdGVtID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXhJdGVtUmVtb3ZlID4gLTEpIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleEl0ZW1SZW1vdmUsIDEpO1xuXG4gICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNoZWNrTG9hZEl0ZW0gPSAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLmtleXNIaWRkZW5JdGVtKCk/Lmxlbmd0aCAmJiBwcmVTdGF0ZUhhc1Njcm9sbCAmJiAhY3VycmVudEhhc1Njcm9sbCAmJiAodGhpcy5pc1NlYXJjaE9ubGluZSgpKSkge1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocmVwbGFjZSkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQoaXRlbUJ5S2V5U2VhcmNoKTtcbiAgICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/Lih0aGlzLml0ZW1zKCkpO1xuICAgICAgdGhpcy5lbWl0S2V5U2VsZWN0ZWREZWZhdWx0SWZFeGlzdEl0ZW0odGhpcy5pdGVtcygpKTtcbiAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0SXRlbSh0aGlzLml0ZW1zKCkpO1xuICAgICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydCgpO1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpLCBwYWdpbmc6IHRoaXMucGFnaW5nU3RvcmUoKSB9KTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3UG9ydFNjcm9sbChjaGVja0xvYWRJdGVtKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9JdGVtU2VsZWN0ZWQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiBbLi4uKGl0ZW1zIHx8IFtdKSwgLi4uaXRlbUJ5S2V5U2VhcmNoXSk7XG4gICAgdGhpcy5jb25maWcoKT8uc29ydD8uKHRoaXMuaXRlbXMoKSk7XG4gICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydCgpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpLCBwYWdpbmc6IHRoaXMucGFnaW5nU3RvcmUoKSB9KTtcbiAgICB0aGlzLmNoZWNrVmlld1BvcnRTY3JvbGwoY2hlY2tMb2FkSXRlbSk7XG4gICAgdGhpcy5zY3JvbGxUb0l0ZW1TZWxlY3RlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0l0ZW1TZWxlY3RlZCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnVGVtcGxhdGVSYWRpbygpPy5hdXRvU2Nyb2xsVG9JdGVtU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZUF1dG9TY3JvbGxJdGVtU2VsZWN0ZWQoKSk7XG4gICAgdGhpcy50aW1lQXV0b1Njcm9sbEl0ZW1TZWxlY3RlZC5zZXQoKHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmtleVNlbGVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcygpLmZpbmRJbmRleChpdGVtID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpO1xuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMudmlydHVhbFNjcm9sbGVyQ29tcG9uZW50KCk/LnNjcm9sbFRvSW5kZXgoaW5kZXgpO1xuICAgICAgfVxuICAgIH0pIGFzIHVua25vd24pIGFzIG51bWJlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXV0b1NlbGVjdEZpcnN0SXRlbShpdGVtczogQXJyYXk8YW55Pikge1xuICAgIGlmICh0aGlzLmtleVNlbGVjdGVkKCkgfHwgIXRoaXMuY29uZmlnKCk/LmF1dG9TZWxlY3RGaXJzdEl0ZW0gfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlKCdyYWRpbycsIGl0ZW1zWzBdLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBlbWl0S2V5U2VsZWN0ZWREZWZhdWx0SWZFeGlzdEl0ZW0oaXRlbXM6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXMuZmluZChzdG9yZSA9PiBzdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IHRoaXMua2V5U2VsZWN0ZWQoKSk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlKCdyYWRpbycsIGl0ZW0sIHRydWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGVuZ3RoSXRlbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG59IiwiQGlmIChjb25maWdUZW1wbGF0ZVJhZGlvKCk7IGFzIGNvbmZpZ1RlbXBsYXRlUmFkaW8pIHtcbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICA8ZGl2ICNlbGVtZW50U2Nyb2xsXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRWaWV3UG9ydCgpID8gaGVpZ2h0Vmlld1BvcnQoKSsncHgnOicxMDAlJ1wiXG4gICAgICAgIChtb1Njcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKClcIj5cbiAgICAgICAgPHZpcnR1YWwtc2Nyb2xsZXIgI3Njcm9sbFxuICAgICAgICAgIFtwYXJlbnRTY3JvbGxdPVwiZWxlbWVudFNjcm9sbFwiXG4gICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zKClcIlxuICAgICAgICAgIGNsYXNzPVwiaC1mdWxsXCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBzY3JvbGwudmlld1BvcnRJdGVtczsgdHJhY2sgaXRlbSgpW2ZpZWxkS2V5KCldKSB7XG4gICAgICAgICAgICA8ZGl2ICNpdGVtUmVmXG4gICAgICAgICAgICAgIFtjbGFzc109XCInbGlicy11aS1saXN0LXRlbXBsYXRlLXJhZGlvLWl0ZW0gZmxleCAnICsgKGNvbmZpZ1RlbXBsYXRlUmFkaW8uY2xhc3NJdGVtSW5jbHVkZSB8fCAnJylcIlxuICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyXT1cIiFjbGlja0V4YWN0bHkoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItYWN0aXZlXT1cIiFjbGlja0V4YWN0bHkoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wbC1bMTJweF1dPVwicGFkZGluZ0xlZnRJdGVtKClcIlxuICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmZmZmZmZdXT1cImNsaWNrRXhhY3RseSgpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnB5LVsycHhdXT1cImNsaWNrRXhhY3RseSgpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDaGFuZ2UoJGV2ZW50LGl0ZW0oKSlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtKCkuZmllbGRMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1yYWRpby1zaW5nbGUgW2xhYmVsXT1cIml0ZW0oKS5maWVsZExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJrZXlTZWxlY3RlZCgpID09PSBpdGVtKClbZmllbGRLZXkoKV1cIlxuICAgICAgICAgICAgICAgICAgICBba2V5XT1cIml0ZW0oKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbWdUeXBlSWNvbl09XCJjb25maWdUZW1wbGF0ZVJhZGlvLmhhc0F2YXRhckdyb3VwU29jaWFsXCJcbiAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJjb25maWdUZW1wbGF0ZVJhZGlvLmdldEltYWdlID8gKCgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6KGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVSYWRpby5nZXRJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVSYWRpby5nZXRJbWFnZUVycm9yIDogY29uZmlnVGVtcGxhdGVSYWRpby5nZXRJbWFnZSk6aXRlbSgpKSB8IGFzeW5jKSA6IGl0ZW0oKVtjb25maWdUZW1wbGF0ZVJhZGlvLmZpZWxkR2V0SW1hZ2UgfHwgJyddXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW1hZ2VJbmNsdWRlXT1cImNvbmZpZ1RlbXBsYXRlUmFkaW8uY2xhc3NJbmNsdWRlSW1hZ2UgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBbYnVsbGV0XT1cIml0ZW0oKS5idWxsZXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZSgpIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNEaXNhYmxlSXRlbSgpOmtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxJbmNsdWRlXT1cIml0ZW0oKS5jbGFzc0xhYmVsSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIml0ZW0oKS5kYXRhUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGlja0V4YWN0bHldPVwiY2xpY2tFeGFjdGx5KClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUxhYmVsXT1cImRpc2FibGVMYWJlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlUmFkaW8uekluZGV4UG9wb3ZlciA/PyAxMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlKCdyYWRpbycsaXRlbSgpKVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVSYWRpbz8ucm93cykge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19yb3dzIGNsYXNzPVwidy1mdWxsIHt7IGNvbmZpZ1RlbXBsYXRlUmFkaW8uY2xhc3NSb3dzID8/ICcnIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkS2V5XT1cImZpZWxkS2V5KClcIlxuICAgICAgICAgICAgICAgICAgICBba2V5U2VsZWN0ZWRdPVwia2V5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdUZW1wbGF0ZV09XCJjb25maWdUZW1wbGF0ZVJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJDaGFuZ2UoJ3JhZGlvJywkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1mb250LWg0ciB0ZXh0LVsjYzFjMWMxXSAnKyAoY29uZmlnKCk/LnRleHROb0RhdGFDbGFzc0luY2x1ZGUgPz8gJ3B5LVs0cHhdIHB4LVsxMnB4XScpXCI+XG4gICAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8c3Bhbj57eyAoY29uZmlnKCk/LnRleHROb0RhdGEgPz8gJ2kxOG5faGF2ZV9ub19zZWxlY3Rpb24nKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhKCkgJiYga2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YSgpIHx8IG51bGw7Y29udGV4dDp7a2V5U2VhcmNoOmtleVNlYXJjaCgpfVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICghdGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSAmJiBrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgICAgPHNwYW4+e3sgKGNvbmZpZygpPy50ZXh0U2VhcmNoTm9EYXRhID8/ICdpMThuX25vX3Jlc3VsdCcpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgICAgPHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIFtzaXplXT1cIidtZWRpdW0nXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxufVxuIl19
@@ -53,7 +53,7 @@ export class LibsUiComponentsListRowsComponent {
53
53
  this.outChangStageFlagMousePopover.emit(flag);
54
54
  }
55
55
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListRowsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
56
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListRowsComponent, isStandalone: true, selector: "libs_ui-components-list-templates_rows", inputs: { configTemplate: { classPropertyName: "configTemplate", publicName: "configTemplate", isSignal: true, isRequired: true, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outEvent: "outEvent" }, ngImport: i0, template: "@if (configTemplate() && configItemTextRows(); as configItemTextRows) {\n <div class=\"flex flex-col w-full {{ configTemplate().classRows ?? '' }}\">\n @for (row of configItemTextRows; track $index; let indexRow = $index;) {\n <div [class]=\"row().classRow\">\n @if (row().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:row().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:row().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,row().getImageError)\" />\n }\n @if (item()['fieldRowAvatarConfig'+indexRow]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (fieldKey() && item()['fieldLabelRow'+indexRow]; as labelRow) {\n <libs_ui-components-popover type=\"text\"\n [config]=\"row().getPopoverConfig ? (('popover' | LibsUiPipesCallFunctionInTemplatePipe:row().getPopoverConfig:item()) | async) : { zIndex: zIndex()}\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || row().classGetValue || '') :(row().classGetValue || '')\"\n [innerHtml]=\"labelRow\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),row().action)\" />\n }\n @if (row().cols?.()?.length) {\n <div [class]=\"row().classCols || 'flex'\"\n [style]=\"item()[item()['fieldRowStylesDynamicCols'+indexRow]]\">\n @for (col of row().cols?.(); track $index; let colIndex = $index) {\n @if (col().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:col().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:col().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,col().getImageError)\" />\n }\n @if (item()['fieldColAvatarConfig'+indexRow+colIndex]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (item()['fieldLabelCol'+indexRow+colIndex]; as labelColFunc) {\n <libs_ui-components-popover type=\"text\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || col().classCol || '') :(col().classCol || '')\"\n [innerHtml]=\"('fieldLabelCol' | LibsUiPipesCallFunctionInTemplatePipe:labelColFunc:item()) | async\"\n [config]=\"{ zIndex: zIndex() }\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\" />\n }\n @if (item()['fieldColPopover'+indexRow+colIndex]; as popover) {\n <libs_ui-components-popover [type]=\"popover.type ?? 'other'\"\n [config]=\"popover?.config\"\n [classInclude]=\"col().classCol\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\">\n <span [class]=\"popover.classInclude || ''\"\n [innerHtml]=\"(popover.dataView ?? popoverIcon) | translate\">\n </span>\n </libs_ui-components-popover>\n }\n @if (item()['fieldColToggle'+indexRow+colIndex]; as toggle) {\n <libs_ui-components-label [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [hasToggle]=\"toggle.hasToggle\"\n [toggleActive]=\"toggle.toggleActive\"\n [toggleDisable]=\"toggle.toggleDisable\"\n [popover]=\"toggle.popover\"\n [classInclude]=\"toggle.classInclude\"\n [labelLeft]=\"toggle.labelLeft\"\n [labelRight]=\"toggle.labelRight\"\n (outSwitchEvent)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldColButton'+indexRow+colIndex]; as button) {\n <libs_ui-components-buttons-button [type]=\"button.type\"\n [classIconLeft]=\"button.classIconLeft\"\n [classIconRight]=\"button.classIconRight\"\n [classLabel]=\"button.classLabel\"\n [iconOnlyType]=\"button.iconOnlyType\"\n [popover]=\"button.popover\"\n [disable]=\"button.disable\"\n [ignorePointerEvent]=\"button.ignorePointerEvent\"\n [classInclude]=\"col().classCol ?? ' '\"\n [ignoreStopPropagationEvent]=\"false\"\n (outClick)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldBadge'+indexRow+colIndex]; as badge) {\n <libs_ui-components-badge [mode]=\"badge.mode || 'x+'\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [count]=\"badge.count\"\n [maxCount]=\"badge.maxCount || 99\"\n [classCircle]=\"badge.classCircle || 'libs-ui-font-h4r'\" />\n }\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [""], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListRowsComponent, isStandalone: true, selector: "libs_ui-components-list-templates_rows", inputs: { configTemplate: { classPropertyName: "configTemplate", publicName: "configTemplate", isSignal: true, isRequired: true, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outEvent: "outEvent" }, ngImport: i0, template: "@if (configTemplate() && configItemTextRows(); as configItemTextRows) {\n <div class=\"flex flex-col w-full {{ configTemplate().classRows ?? '' }}\">\n @for (row of configItemTextRows; track $index; let indexRow = $index;) {\n <div [class]=\"row().classRow\">\n @if (row().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:row().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:row().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,row().getImageError)\" />\n }\n @if (item()['fieldRowAvatarConfig'+indexRow]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (fieldKey() && item()['fieldLabelRow'+indexRow]; as labelRow) {\n <libs_ui-components-popover type=\"text\"\n [config]=\"row().getPopoverConfig ? (('popover' | LibsUiPipesCallFunctionInTemplatePipe:row().getPopoverConfig:item()) | async) : { zIndex: zIndex()}\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || row().classGetValue || '') :(row().classGetValue || '')\"\n [innerHtml]=\"labelRow\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),row().action)\" />\n }\n @if (row().cols?.()?.length) {\n <div [class]=\"row().classCols || 'flex'\"\n [style]=\"item()[item()['fieldRowStylesDynamicCols'+indexRow]]\">\n @for (col of row().cols?.(); track $index; let colIndex = $index) {\n @if (col().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:col().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:col().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,col().getImageError)\" />\n }\n @if (item()['fieldColAvatarConfig'+indexRow+colIndex]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (item()['fieldLabelCol'+indexRow+colIndex]; as labelColFunc) {\n <libs_ui-components-popover type=\"text\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || item()['fieldColClass'+indexRow+colIndex] || '') :(item()['fieldColClass'+indexRow+colIndex] || '')\"\n [innerHtml]=\"('fieldLabelCol' | LibsUiPipesCallFunctionInTemplatePipe:labelColFunc:item()) | async\"\n [config]=\"{ zIndex: zIndex() }\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\" />\n }\n @if (item()['fieldColPopover'+indexRow+colIndex]; as popover) {\n <libs_ui-components-popover [type]=\"popover.type ?? 'other'\"\n [config]=\"popover?.config\"\n [classInclude]=\"item()['fieldColClass'+indexRow+colIndex]\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\">\n <span [class]=\"popover.classInclude || ''\"\n [innerHtml]=\"(popover.dataView ?? popoverIcon) | translate\">\n </span>\n </libs_ui-components-popover>\n }\n @if (item()['fieldColToggle'+indexRow+colIndex]; as toggle) {\n <libs_ui-components-label [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [hasToggle]=\"toggle.hasToggle\"\n [toggleActive]=\"toggle.toggleActive\"\n [toggleDisable]=\"toggle.toggleDisable\"\n [popover]=\"toggle.popover\"\n [classInclude]=\"toggle.classInclude\"\n [labelLeft]=\"toggle.labelLeft\"\n [labelRight]=\"toggle.labelRight\"\n (outSwitchEvent)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldColButton'+indexRow+colIndex]; as button) {\n <libs_ui-components-buttons-button [type]=\"button.type\"\n [classIconLeft]=\"button.classIconLeft\"\n [classIconRight]=\"button.classIconRight\"\n [classLabel]=\"button.classLabel\"\n [iconOnlyType]=\"button.iconOnlyType\"\n [popover]=\"button.popover\"\n [disable]=\"button.disable\"\n [ignorePointerEvent]=\"button.ignorePointerEvent\"\n [classInclude]=\"item()['fieldColClass'+indexRow+colIndex] ?? ' '\"\n [ignoreStopPropagationEvent]=\"false\"\n (outClick)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldBadge'+indexRow+colIndex]; as badge) {\n <libs_ui-components-badge [mode]=\"badge.mode || 'x+'\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [count]=\"badge.count\"\n [maxCount]=\"badge.maxCount || 99\"\n [classCircle]=\"badge.classCircle || 'libs-ui-font-h4r'\" />\n }\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [""], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57
57
  }
58
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListRowsComponent, decorators: [{
59
59
  type: Component,
@@ -65,6 +65,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
65
65
  LibsUiComponentsLabelComponent,
66
66
  LibsUiComponentsBadgeComponent,
67
67
  LibsUiPipesCallFunctionInTemplatePipe
68
- ], template: "@if (configTemplate() && configItemTextRows(); as configItemTextRows) {\n <div class=\"flex flex-col w-full {{ configTemplate().classRows ?? '' }}\">\n @for (row of configItemTextRows; track $index; let indexRow = $index;) {\n <div [class]=\"row().classRow\">\n @if (row().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:row().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:row().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,row().getImageError)\" />\n }\n @if (item()['fieldRowAvatarConfig'+indexRow]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (fieldKey() && item()['fieldLabelRow'+indexRow]; as labelRow) {\n <libs_ui-components-popover type=\"text\"\n [config]=\"row().getPopoverConfig ? (('popover' | LibsUiPipesCallFunctionInTemplatePipe:row().getPopoverConfig:item()) | async) : { zIndex: zIndex()}\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || row().classGetValue || '') :(row().classGetValue || '')\"\n [innerHtml]=\"labelRow\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),row().action)\" />\n }\n @if (row().cols?.()?.length) {\n <div [class]=\"row().classCols || 'flex'\"\n [style]=\"item()[item()['fieldRowStylesDynamicCols'+indexRow]]\">\n @for (col of row().cols?.(); track $index; let colIndex = $index) {\n @if (col().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:col().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:col().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,col().getImageError)\" />\n }\n @if (item()['fieldColAvatarConfig'+indexRow+colIndex]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (item()['fieldLabelCol'+indexRow+colIndex]; as labelColFunc) {\n <libs_ui-components-popover type=\"text\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || col().classCol || '') :(col().classCol || '')\"\n [innerHtml]=\"('fieldLabelCol' | LibsUiPipesCallFunctionInTemplatePipe:labelColFunc:item()) | async\"\n [config]=\"{ zIndex: zIndex() }\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\" />\n }\n @if (item()['fieldColPopover'+indexRow+colIndex]; as popover) {\n <libs_ui-components-popover [type]=\"popover.type ?? 'other'\"\n [config]=\"popover?.config\"\n [classInclude]=\"col().classCol\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\">\n <span [class]=\"popover.classInclude || ''\"\n [innerHtml]=\"(popover.dataView ?? popoverIcon) | translate\">\n </span>\n </libs_ui-components-popover>\n }\n @if (item()['fieldColToggle'+indexRow+colIndex]; as toggle) {\n <libs_ui-components-label [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [hasToggle]=\"toggle.hasToggle\"\n [toggleActive]=\"toggle.toggleActive\"\n [toggleDisable]=\"toggle.toggleDisable\"\n [popover]=\"toggle.popover\"\n [classInclude]=\"toggle.classInclude\"\n [labelLeft]=\"toggle.labelLeft\"\n [labelRight]=\"toggle.labelRight\"\n (outSwitchEvent)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldColButton'+indexRow+colIndex]; as button) {\n <libs_ui-components-buttons-button [type]=\"button.type\"\n [classIconLeft]=\"button.classIconLeft\"\n [classIconRight]=\"button.classIconRight\"\n [classLabel]=\"button.classLabel\"\n [iconOnlyType]=\"button.iconOnlyType\"\n [popover]=\"button.popover\"\n [disable]=\"button.disable\"\n [ignorePointerEvent]=\"button.ignorePointerEvent\"\n [classInclude]=\"col().classCol ?? ' '\"\n [ignoreStopPropagationEvent]=\"false\"\n (outClick)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldBadge'+indexRow+colIndex]; as badge) {\n <libs_ui-components-badge [mode]=\"badge.mode || 'x+'\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [count]=\"badge.count\"\n [maxCount]=\"badge.maxCount || 99\"\n [classCircle]=\"badge.classCircle || 'libs-ui-font-h4r'\" />\n }\n }\n </div>\n }\n </div>\n }\n </div>\n}\n" }]
68
+ ], template: "@if (configTemplate() && configItemTextRows(); as configItemTextRows) {\n <div class=\"flex flex-col w-full {{ configTemplate().classRows ?? '' }}\">\n @for (row of configItemTextRows; track $index; let indexRow = $index;) {\n <div [class]=\"row().classRow\">\n @if (row().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:row().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:row().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,row().getImageError)\" />\n }\n @if (item()['fieldRowAvatarConfig'+indexRow]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (fieldKey() && item()['fieldLabelRow'+indexRow]; as labelRow) {\n <libs_ui-components-popover type=\"text\"\n [config]=\"row().getPopoverConfig ? (('popover' | LibsUiPipesCallFunctionInTemplatePipe:row().getPopoverConfig:item()) | async) : { zIndex: zIndex()}\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || row().classGetValue || '') :(row().classGetValue || '')\"\n [innerHtml]=\"labelRow\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),row().action)\" />\n }\n @if (row().cols?.()?.length) {\n <div [class]=\"row().classCols || 'flex'\"\n [style]=\"item()[item()['fieldRowStylesDynamicCols'+indexRow]]\">\n @for (col of row().cols?.(); track $index; let colIndex = $index) {\n @if (col().getImage && ((item() | LibsUiPipesCallFunctionInTemplatePipe:col().getImage:item()) | async); as imgUrl) {\n <img [class]=\"(item() | LibsUiPipesCallFunctionInTemplatePipe:col().getClassImage:item()) | async\"\n src=\"{{ imgUrl }}\"\n (error)=\"handlerErrorImage($event,col().getImageError)\" />\n }\n @if (item()['fieldColAvatarConfig'+indexRow+colIndex]; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\" />\n }\n @if (item()['fieldLabelCol'+indexRow+colIndex]; as labelColFunc) {\n <libs_ui-components-popover type=\"text\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [classInclude]=\"(keySelected() === item()[fieldKey()]) ? (row().classItemSelected || item()['fieldColClass'+indexRow+colIndex] || '') :(item()['fieldColClass'+indexRow+colIndex] || '')\"\n [innerHtml]=\"('fieldLabelCol' | LibsUiPipesCallFunctionInTemplatePipe:labelColFunc:item()) | async\"\n [config]=\"{ zIndex: zIndex() }\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\" />\n }\n @if (item()['fieldColPopover'+indexRow+colIndex]; as popover) {\n <libs_ui-components-popover [type]=\"popover.type ?? 'other'\"\n [config]=\"popover?.config\"\n [classInclude]=\"item()['fieldColClass'+indexRow+colIndex]\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n (outChangStageFlagMouse)='handlerChangStageFlagMouse($event)'\n (outEvent)=\"handlerSelectItem($event,item(),col().action)\">\n <span [class]=\"popover.classInclude || ''\"\n [innerHtml]=\"(popover.dataView ?? popoverIcon) | translate\">\n </span>\n </libs_ui-components-popover>\n }\n @if (item()['fieldColToggle'+indexRow+colIndex]; as toggle) {\n <libs_ui-components-label [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [hasToggle]=\"toggle.hasToggle\"\n [toggleActive]=\"toggle.toggleActive\"\n [toggleDisable]=\"toggle.toggleDisable\"\n [popover]=\"toggle.popover\"\n [classInclude]=\"toggle.classInclude\"\n [labelLeft]=\"toggle.labelLeft\"\n [labelRight]=\"toggle.labelRight\"\n (outSwitchEvent)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldColButton'+indexRow+colIndex]; as button) {\n <libs_ui-components-buttons-button [type]=\"button.type\"\n [classIconLeft]=\"button.classIconLeft\"\n [classIconRight]=\"button.classIconRight\"\n [classLabel]=\"button.classLabel\"\n [iconOnlyType]=\"button.iconOnlyType\"\n [popover]=\"button.popover\"\n [disable]=\"button.disable\"\n [ignorePointerEvent]=\"button.ignorePointerEvent\"\n [classInclude]=\"item()['fieldColClass'+indexRow+colIndex] ?? ' '\"\n [ignoreStopPropagationEvent]=\"false\"\n (outClick)=\"handlerSelectItem('click',item(),col().action)\" />\n }\n @if (item()['fieldBadge'+indexRow+colIndex]; as badge) {\n <libs_ui-components-badge [mode]=\"badge.mode || 'x+'\"\n [style]=\"(' ' | LibsUiPipesCallFunctionInTemplatePipe:item()['fieldColStylesDynamic'+indexRow+colIndex]:item()) | async\"\n [count]=\"badge.count\"\n [maxCount]=\"badge.maxCount || 99\"\n [classCircle]=\"badge.classCircle || 'libs-ui-font-h4r'\" />\n }\n }\n </div>\n }\n </div>\n }\n </div>\n}\n" }]
69
69
  }], ctorParameters: () => [] });
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3Jvd3Mvcm93cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3Jvd3Mvcm93cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFjLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQy9HLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7O0FBb0JqRCxNQUFNLE9BQU8saUNBQWlDO0lBQzVDLGNBQWM7SUFDSixXQUFXLEdBQUcsTUFBTSxDQUFTLG1FQUFtRSxDQUFDLENBQUM7SUFDbEcsa0JBQWtCLEdBQUcsTUFBTSxDQUEwRCxFQUFFLENBQUMsQ0FBQztJQUVuRyxXQUFXO0lBQ0YsY0FBYyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXlELENBQUM7SUFDekYsSUFBSSxHQUFHLEtBQUssRUFBTyxDQUFDO0lBQ3BCLFdBQVcsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDO0lBQy9CLE1BQU0sR0FBRyxLQUFLLENBQWlCLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXJHLDZCQUE2QixHQUFHLE1BQU0sRUFBYyxDQUFDO0lBQ3JELFFBQVEsR0FBRyxNQUFNLEVBQWtCLENBQUM7SUFFN0M7UUFDRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBNkUsRUFBRSxDQUFDLENBQUM7SUFDaEssQ0FBQztJQUVELGVBQWU7SUFDTCxpQkFBaUIsQ0FBQyxLQUF5QixFQUFFLElBQVMsRUFBRSxNQUFXO1FBQzNFLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFZLEVBQUUscUJBQXlEO1FBQ3ZHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsT0FBTztRQUNULENBQUM7UUFFRCxDQUFFLEtBQUssQ0FBQyxNQUFjLENBQUMsR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRVMsMEJBQTBCLENBQUMsSUFBZ0I7UUFDbkQsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO3dHQWxEVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQyw4MUJDL0I5QyxtZ05BdUdBLHFERGpGSSxTQUFTLDZDQUFFLGVBQWUsNEZBQzFCLCtCQUErQiw2UEFDL0IsZ0NBQWdDLDBkQUNoQyxzQ0FBc0MsaWhCQUN0Qyw4QkFBOEIsNHFCQUM5Qiw4QkFBOEIsc01BQzlCLHFDQUFxQzs7NEZBRzVCLGlDQUFpQztrQkFqQjdDLFNBQVM7K0JBRUUsd0NBQXdDLGNBR3RDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxTQUFTLEVBQUUsZUFBZTt3QkFDMUIsK0JBQStCO3dCQUMvQixnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsOEJBQThCO3dCQUM5Qiw4QkFBOEI7d0JBQzlCLHFDQUFxQztxQkFDdEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtYXZhdGFyXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1iYWRnZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWxcIjtcbmltcG9ydCB7IElGbGFnTW91c2UsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgaXNFbXB0eSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUVtaXRSb3dzRXZlbnQsIElMaXN0Vmlld0NvbmZpZ0l0ZW1DaGVja2JveCwgSUxpc3RWaWV3Q29uZmlnSXRlbVRleHQsIElMaXN0Vmlld0NvbmZpZ0l0ZW1UZXh0Um93U2lnbmFsIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiBcImxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19yb3dzXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vcm93cy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vcm93cy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnQge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgcG9wb3Zlckljb24gPSBzaWduYWw8c3RyaW5nPihgPGkgY2xhc3M9J2xpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUgdGV4dC1bMTZweF0gbWwtWzhweF0nPjwvaT5gKTtcbiAgcHJvdGVjdGVkIGNvbmZpZ0l0ZW1UZXh0Um93cyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxJTGlzdFZpZXdDb25maWdJdGVtVGV4dFJvd1NpZ25hbD4+PihbXSk7XG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGUgPSBpbnB1dC5yZXF1aXJlZDxJTGlzdFZpZXdDb25maWdJdGVtVGV4dCB8IElMaXN0Vmlld0NvbmZpZ0l0ZW1DaGVja2JveD4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0PGFueT4oKTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWQgPSBpbnB1dDx1bmtub3duPigpO1xuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZz4oJ2lkJyk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyPigxMjAwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiAhaXNFbXB0eSh2YWx1ZSkgPyAodmFsdWUgKyAxKSA6IDEyMDAgfSk7XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgb3V0RXZlbnQgPSBvdXRwdXQ8SUVtaXRSb3dzRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFmdGVyVmlld0luaXQoKSk7XG4gICAgfSk7XG4gIH1cblxuICBhZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWdUZW1wbGF0ZSgpLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnSXRlbVRleHRSb3dzLnNldCgoY29udmVydE9iamVjdFRvU2lnbmFsKHRoaXMuY29uZmlnVGVtcGxhdGUoKS5yb3dzKSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxJTGlzdFZpZXdDb25maWdJdGVtVGV4dFJvd1NpZ25hbD4+PikoKSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RJdGVtKGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQsIGl0ZW06IGFueSwgYWN0aW9uOiBhbnkpIHtcbiAgICBpZiAoZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dEV2ZW50LmVtaXQoeyBldmVudCwgaXRlbSwgYWN0aW9uIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJFcnJvckltYWdlKGV2ZW50OiBFdmVudCwgZnVuY3Rpb25HZXRJbWFnZUVycm9yPzogKGl0ZW06IGFueSkgPT4gT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoIWV2ZW50LnRhcmdldCB8fCAhZnVuY3Rpb25HZXRJbWFnZUVycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgKChldmVudC50YXJnZXQgYXMgYW55KS5zcmMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKGZ1bmN0aW9uR2V0SW1hZ2VFcnJvcih0aGlzLml0ZW0oKSkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZShmbGFnOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlci5lbWl0KGZsYWcpO1xuICB9XG59XG4iLCJAaWYgKGNvbmZpZ1RlbXBsYXRlKCkgJiYgY29uZmlnSXRlbVRleHRSb3dzKCk7IGFzIGNvbmZpZ0l0ZW1UZXh0Um93cykge1xuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwge3sgY29uZmlnVGVtcGxhdGUoKS5jbGFzc1Jvd3MgPz8gJycgfX1cIj5cbiAgICBAZm9yIChyb3cgb2YgY29uZmlnSXRlbVRleHRSb3dzOyB0cmFjayAkaW5kZXg7IGxldCBpbmRleFJvdyA9ICRpbmRleDspIHtcbiAgICAgIDxkaXYgW2NsYXNzXT1cInJvdygpLmNsYXNzUm93XCI+XG4gICAgICAgIEBpZiAocm93KCkuZ2V0SW1hZ2UgJiYgKChpdGVtKCkgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOnJvdygpLmdldEltYWdlOml0ZW0oKSkgfCBhc3luYyk7IGFzIGltZ1VybCkge1xuICAgICAgICAgIDxpbWcgW2NsYXNzXT1cIihpdGVtKCkgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOnJvdygpLmdldENsYXNzSW1hZ2U6aXRlbSgpKSB8IGFzeW5jXCJcbiAgICAgICAgICAgIHNyYz1cInt7IGltZ1VybCB9fVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlckVycm9ySW1hZ2UoJGV2ZW50LHJvdygpLmdldEltYWdlRXJyb3IpXCIgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGl0ZW0oKVsnZmllbGRSb3dBdmF0YXJDb25maWcnK2luZGV4Um93XTsgYXMgYXZhdGFyQ29uZmlnKSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1hdmF0YXIgW3R5cGVTaGFwZV09XCJhdmF0YXJDb25maWcudHlwZVNoYXBlIHx8ICdjaXJjbGUnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYXZhdGFyQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICBbc2l6ZV09J2F2YXRhckNvbmZpZy5zaXplIHx8IDMyJ1xuICAgICAgICAgICAgW2xpbmtBdmF0YXJdPVwiYXZhdGFyQ29uZmlnLmxpbmtBdmF0YXJcIlxuICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJhdmF0YXJDb25maWcubGlua0F2YXRhckVycm9yXCJcbiAgICAgICAgICAgIFtpZEdlbkNvbG9yXT1cImF2YXRhckNvbmZpZy5pZEdlbkNvbG9yXCJcbiAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cImF2YXRhckNvbmZpZy50ZXh0QXZhdGFyXCIgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGZpZWxkS2V5KCkgJiYgaXRlbSgpWydmaWVsZExhYmVsUm93JytpbmRleFJvd107IGFzIGxhYmVsUm93KSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtjb25maWddPVwicm93KCkuZ2V0UG9wb3ZlckNvbmZpZyA/ICgoJ3BvcG92ZXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpyb3coKS5nZXRQb3BvdmVyQ29uZmlnOml0ZW0oKSkgfCBhc3luYykgOiB7IHpJbmRleDogekluZGV4KCl9XCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiKGtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXSkgPyAocm93KCkuY2xhc3NJdGVtU2VsZWN0ZWQgfHwgcm93KCkuY2xhc3NHZXRWYWx1ZSB8fCAnJykgOihyb3coKS5jbGFzc0dldFZhbHVlIHx8ICcnKVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImxhYmVsUm93XCJcbiAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSgpLHJvdygpLmFjdGlvbilcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAocm93KCkuY29scz8uKCk/Lmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cInJvdygpLmNsYXNzQ29scyB8fCAnZmxleCdcIlxuICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0oKVtpdGVtKClbJ2ZpZWxkUm93U3R5bGVzRHluYW1pY0NvbHMnK2luZGV4Um93XV1cIj5cbiAgICAgICAgICAgIEBmb3IgKGNvbCBvZiByb3coKS5jb2xzPy4oKTsgdHJhY2sgJGluZGV4OyBsZXQgY29sSW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGlmIChjb2woKS5nZXRJbWFnZSAmJiAoKGl0ZW0oKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29sKCkuZ2V0SW1hZ2U6aXRlbSgpKSB8IGFzeW5jKTsgYXMgaW1nVXJsKSB7XG4gICAgICAgICAgICAgICAgPGltZyBbY2xhc3NdPVwiKGl0ZW0oKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29sKCkuZ2V0Q2xhc3NJbWFnZTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgc3JjPVwie3sgaW1nVXJsIH19XCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVyRXJyb3JJbWFnZSgkZXZlbnQsY29sKCkuZ2V0SW1hZ2VFcnJvcilcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZENvbEF2YXRhckNvbmZpZycraW5kZXhSb3crY29sSW5kZXhdOyBhcyBhdmF0YXJDb25maWcpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhciBbdHlwZVNoYXBlXT1cImF2YXRhckNvbmZpZy50eXBlU2hhcGUgfHwgJ2NpcmNsZSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAgIFtzaXplXT0nYXZhdGFyQ29uZmlnLnNpemUgfHwgMzInXG4gICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJhdmF0YXJDb25maWcubGlua0F2YXRhclwiXG4gICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiYXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgW3RleHRBdmF0YXJdPVwiYXZhdGFyQ29uZmlnLnRleHRBdmF0YXJcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZExhYmVsQ29sJytpbmRleFJvdytjb2xJbmRleF07IGFzIGxhYmVsQ29sRnVuYykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiKCcgJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aXRlbSgpWydmaWVsZENvbFN0eWxlc0R5bmFtaWMnK2luZGV4Um93K2NvbEluZGV4XTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoa2V5U2VsZWN0ZWQoKSA9PT0gaXRlbSgpW2ZpZWxkS2V5KCldKSA/IChyb3coKS5jbGFzc0l0ZW1TZWxlY3RlZCB8fCBjb2woKS5jbGFzc0NvbCB8fCAnJykgOihjb2woKS5jbGFzc0NvbCB8fCAnJylcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCIoJ2ZpZWxkTGFiZWxDb2wnIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpsYWJlbENvbEZ1bmM6aXRlbSgpKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwieyB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKCksY29sKCkuYWN0aW9uKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpdGVtKClbJ2ZpZWxkQ29sUG9wb3ZlcicraW5kZXhSb3crY29sSW5kZXhdOyBhcyBwb3BvdmVyKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cInBvcG92ZXIudHlwZSA/PyAnb3RoZXInXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwicG9wb3Zlcj8uY29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29sKCkuY2xhc3NDb2xcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIignICcgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOml0ZW0oKVsnZmllbGRDb2xTdHlsZXNEeW5hbWljJytpbmRleFJvdytjb2xJbmRleF06aXRlbSgpKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSgpLGNvbCgpLmFjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJwb3BvdmVyLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiKHBvcG92ZXIuZGF0YVZpZXcgPz8gcG9wb3Zlckljb24pIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0oKVsnZmllbGRDb2xUb2dnbGUnK2luZGV4Um93K2NvbEluZGV4XTsgYXMgdG9nZ2xlKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbCBbc3R5bGVdPVwiKCcgJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aXRlbSgpWydmaWVsZENvbFN0eWxlc0R5bmFtaWMnK2luZGV4Um93K2NvbEluZGV4XTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2hhc1RvZ2dsZV09XCJ0b2dnbGUuaGFzVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgIFt0b2dnbGVBY3RpdmVdPVwidG9nZ2xlLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJ0b2dnbGUudG9nZ2xlRGlzYWJsZVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ0b2dnbGUucG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvZ2dsZS5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsTGVmdF09XCJ0b2dnbGUubGFiZWxMZWZ0XCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbFJpZ2h0XT1cInRvZ2dsZS5sYWJlbFJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIChvdXRTd2l0Y2hFdmVudCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgnY2xpY2snLGl0ZW0oKSxjb2woKS5hY3Rpb24pXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0oKVsnZmllbGRDb2xCdXR0b24nK2luZGV4Um93K2NvbEluZGV4XTsgYXMgYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJidXR0b24udHlwZVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiYnV0dG9uLmNsYXNzSWNvblJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImJ1dHRvbi5jbGFzc0xhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiYnV0dG9uLmljb25Pbmx5VHlwZVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24ucG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24uZGlzYWJsZVwiXG4gICAgICAgICAgICAgICAgICBbaWdub3JlUG9pbnRlckV2ZW50XT1cImJ1dHRvbi5pZ25vcmVQb2ludGVyRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb2woKS5jbGFzc0NvbCA/PyAnICdcIlxuICAgICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyU2VsZWN0SXRlbSgnY2xpY2snLGl0ZW0oKSxjb2woKS5hY3Rpb24pXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0oKVsnZmllbGRCYWRnZScraW5kZXhSb3crY29sSW5kZXhdOyBhcyBiYWRnZSkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYmFkZ2UgW21vZGVdPVwiYmFkZ2UubW9kZSB8fCAneCsnXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCIoJyAnIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTppdGVtKClbJ2ZpZWxkQ29sU3R5bGVzRHluYW1pYycraW5kZXhSb3crY29sSW5kZXhdOml0ZW0oKSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBbY291bnRdPVwiYmFkZ2UuY291bnRcIlxuICAgICAgICAgICAgICAgICAgW21heENvdW50XT1cImJhZGdlLm1heENvdW50IHx8IDk5XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0NpcmNsZV09XCJiYWRnZS5jbGFzc0NpcmNsZSB8fCAnbGlicy11aS1mb250LWg0cidcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3Jvd3Mvcm93cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3Jvd3Mvcm93cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFjLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQy9HLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7O0FBb0JqRCxNQUFNLE9BQU8saUNBQWlDO0lBQzVDLGNBQWM7SUFDSixXQUFXLEdBQUcsTUFBTSxDQUFTLG1FQUFtRSxDQUFDLENBQUM7SUFDbEcsa0JBQWtCLEdBQUcsTUFBTSxDQUFzRCxFQUFFLENBQUMsQ0FBQztJQUUvRixXQUFXO0lBQ0YsY0FBYyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWlELENBQUM7SUFDakYsSUFBSSxHQUFHLEtBQUssRUFBTyxDQUFDO0lBQ3BCLFdBQVcsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDO0lBQy9CLE1BQU0sR0FBRyxLQUFLLENBQWlCLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXJHLDZCQUE2QixHQUFHLE1BQU0sRUFBYyxDQUFDO0lBQ3JELFFBQVEsR0FBRyxNQUFNLEVBQWtCLENBQUM7SUFFN0M7UUFDRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBeUUsRUFBRSxDQUFDLENBQUM7SUFDNUosQ0FBQztJQUVELGVBQWU7SUFDTCxpQkFBaUIsQ0FBQyxLQUF5QixFQUFFLElBQVMsRUFBRSxNQUFXO1FBQzNFLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFZLEVBQUUscUJBQXlEO1FBQ3ZHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsT0FBTztRQUNULENBQUM7UUFFRCxDQUFFLEtBQUssQ0FBQyxNQUFjLENBQUMsR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRVMsMEJBQTBCLENBQUMsSUFBZ0I7UUFDbkQsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO3dHQWxEVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQyw4MUJDL0I5QywrbU5BdUdBLHFERGpGSSxTQUFTLDZDQUFFLGVBQWUsNEZBQzFCLCtCQUErQiw2UEFDL0IsZ0NBQWdDLDBkQUNoQyxzQ0FBc0MsaWhCQUN0Qyw4QkFBOEIsNHFCQUM5Qiw4QkFBOEIsc01BQzlCLHFDQUFxQzs7NEZBRzVCLGlDQUFpQztrQkFqQjdDLFNBQVM7K0JBRUUsd0NBQXdDLGNBR3RDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxTQUFTLEVBQUUsZUFBZTt3QkFDMUIsK0JBQStCO3dCQUMvQixnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsOEJBQThCO3dCQUM5Qiw4QkFBOEI7d0JBQzlCLHFDQUFxQztxQkFDdEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtYXZhdGFyXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1iYWRnZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWxcIjtcbmltcG9ydCB7IElGbGFnTW91c2UsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgaXNFbXB0eSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUVtaXRSb3dzRXZlbnQsIElMaXN0Q29uZmlnSXRlbUNoZWNrYm94LCBJTGlzdENvbmZpZ0l0ZW1UZXh0LCBJTGlzdENvbmZpZ0l0ZW1UZXh0Um93U2lnbmFsIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiBcImxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19yb3dzXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vcm93cy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vcm93cy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnQge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgcG9wb3Zlckljb24gPSBzaWduYWw8c3RyaW5nPihgPGkgY2xhc3M9J2xpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUgdGV4dC1bMTZweF0gbWwtWzhweF0nPjwvaT5gKTtcbiAgcHJvdGVjdGVkIGNvbmZpZ0l0ZW1UZXh0Um93cyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxJTGlzdENvbmZpZ0l0ZW1UZXh0Um93U2lnbmFsPj4+KFtdKTtcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZSA9IGlucHV0LnJlcXVpcmVkPElMaXN0Q29uZmlnSXRlbVRleHQgfCBJTGlzdENvbmZpZ0l0ZW1DaGVja2JveD4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0PGFueT4oKTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWQgPSBpbnB1dDx1bmtub3duPigpO1xuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZz4oJ2lkJyk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyPigxMjAwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiAhaXNFbXB0eSh2YWx1ZSkgPyAodmFsdWUgKyAxKSA6IDEyMDAgfSk7XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgb3V0RXZlbnQgPSBvdXRwdXQ8SUVtaXRSb3dzRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFmdGVyVmlld0luaXQoKSk7XG4gICAgfSk7XG4gIH1cblxuICBhZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWdUZW1wbGF0ZSgpLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnSXRlbVRleHRSb3dzLnNldCgoY29udmVydE9iamVjdFRvU2lnbmFsKHRoaXMuY29uZmlnVGVtcGxhdGUoKS5yb3dzKSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxJTGlzdENvbmZpZ0l0ZW1UZXh0Um93U2lnbmFsPj4+KSgpKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdEl0ZW0oZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCwgaXRlbTogYW55LCBhY3Rpb246IGFueSkge1xuICAgIGlmIChldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3V0RXZlbnQuZW1pdCh7IGV2ZW50LCBpdGVtLCBhY3Rpb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckVycm9ySW1hZ2UoZXZlbnQ6IEV2ZW50LCBmdW5jdGlvbkdldEltYWdlRXJyb3I/OiAoaXRlbTogYW55KSA9PiBPYnNlcnZhYmxlPHN0cmluZz4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICghZXZlbnQudGFyZ2V0IHx8ICFmdW5jdGlvbkdldEltYWdlRXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoKGV2ZW50LnRhcmdldCBhcyBhbnkpLnNyYyA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oZnVuY3Rpb25HZXRJbWFnZUVycm9yKHRoaXMuaXRlbSgpKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyLmVtaXQoZmxhZyk7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnVGVtcGxhdGUoKSAmJiBjb25maWdJdGVtVGV4dFJvd3MoKTsgYXMgY29uZmlnSXRlbVRleHRSb3dzKSB7XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCB7eyBjb25maWdUZW1wbGF0ZSgpLmNsYXNzUm93cyA/PyAnJyB9fVwiPlxuICAgIEBmb3IgKHJvdyBvZiBjb25maWdJdGVtVGV4dFJvd3M7IHRyYWNrICRpbmRleDsgbGV0IGluZGV4Um93ID0gJGluZGV4Oykge1xuICAgICAgPGRpdiBbY2xhc3NdPVwicm93KCkuY2xhc3NSb3dcIj5cbiAgICAgICAgQGlmIChyb3coKS5nZXRJbWFnZSAmJiAoKGl0ZW0oKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6cm93KCkuZ2V0SW1hZ2U6aXRlbSgpKSB8IGFzeW5jKTsgYXMgaW1nVXJsKSB7XG4gICAgICAgICAgPGltZyBbY2xhc3NdPVwiKGl0ZW0oKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6cm93KCkuZ2V0Q2xhc3NJbWFnZTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgc3JjPVwie3sgaW1nVXJsIH19XCJcbiAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVyRXJyb3JJbWFnZSgkZXZlbnQscm93KCkuZ2V0SW1hZ2VFcnJvcilcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZFJvd0F2YXRhckNvbmZpZycraW5kZXhSb3ddOyBhcyBhdmF0YXJDb25maWcpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhciBbdHlwZVNoYXBlXT1cImF2YXRhckNvbmZpZy50eXBlU2hhcGUgfHwgJ2NpcmNsZSdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgIFtzaXplXT0nYXZhdGFyQ29uZmlnLnNpemUgfHwgMzInXG4gICAgICAgICAgICBbbGlua0F2YXRhcl09XCJhdmF0YXJDb25maWcubGlua0F2YXRhclwiXG4gICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyRXJyb3JcIlxuICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiYXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgW3RleHRBdmF0YXJdPVwiYXZhdGFyQ29uZmlnLnRleHRBdmF0YXJcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoZmllbGRLZXkoKSAmJiBpdGVtKClbJ2ZpZWxkTGFiZWxSb3cnK2luZGV4Um93XTsgYXMgbGFiZWxSb3cpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJyb3coKS5nZXRQb3BvdmVyQ29uZmlnID8gKCgncG9wb3ZlcicgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOnJvdygpLmdldFBvcG92ZXJDb25maWc6aXRlbSgpKSB8IGFzeW5jKSA6IHsgekluZGV4OiB6SW5kZXgoKX1cIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoa2V5U2VsZWN0ZWQoKSA9PT0gaXRlbSgpW2ZpZWxkS2V5KCldKSA/IChyb3coKS5jbGFzc0l0ZW1TZWxlY3RlZCB8fCByb3coKS5jbGFzc0dldFZhbHVlIHx8ICcnKSA6KHJvdygpLmNsYXNzR2V0VmFsdWUgfHwgJycpXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibGFiZWxSb3dcIlxuICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKCkscm93KCkuYWN0aW9uKVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChyb3coKS5jb2xzPy4oKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93KCkuY2xhc3NDb2xzIHx8ICdmbGV4J1wiXG4gICAgICAgICAgICBbc3R5bGVdPVwiaXRlbSgpW2l0ZW0oKVsnZmllbGRSb3dTdHlsZXNEeW5hbWljQ29scycraW5kZXhSb3ddXVwiPlxuICAgICAgICAgICAgQGZvciAoY29sIG9mIHJvdygpLmNvbHM/LigpOyB0cmFjayAkaW5kZXg7IGxldCBjb2xJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICBAaWYgKGNvbCgpLmdldEltYWdlICYmICgoaXRlbSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpjb2woKS5nZXRJbWFnZTppdGVtKCkpIHwgYXN5bmMpOyBhcyBpbWdVcmwpIHtcbiAgICAgICAgICAgICAgICA8aW1nIFtjbGFzc109XCIoaXRlbSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpjb2woKS5nZXRDbGFzc0ltYWdlOml0ZW0oKSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBzcmM9XCJ7eyBpbWdVcmwgfX1cIlxuICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImhhbmRsZXJFcnJvckltYWdlKCRldmVudCxjb2woKS5nZXRJbWFnZUVycm9yKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpdGVtKClbJ2ZpZWxkQ29sQXZhdGFyQ29uZmlnJytpbmRleFJvdytjb2xJbmRleF07IGFzIGF2YXRhckNvbmZpZykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyIFt0eXBlU2hhcGVdPVwiYXZhdGFyQ29uZmlnLnR5cGVTaGFwZSB8fCAnY2lyY2xlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImF2YXRhckNvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgICAgW3NpemVdPSdhdmF0YXJDb25maWcuc2l6ZSB8fCAzMidcbiAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyXCJcbiAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyRXJyb3JdPVwiYXZhdGFyQ29uZmlnLmxpbmtBdmF0YXJFcnJvclwiXG4gICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJhdmF0YXJDb25maWcuaWRHZW5Db2xvclwiXG4gICAgICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJhdmF0YXJDb25maWcudGV4dEF2YXRhclwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpdGVtKClbJ2ZpZWxkTGFiZWxDb2wnK2luZGV4Um93K2NvbEluZGV4XTsgYXMgbGFiZWxDb2xGdW5jKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCIoJyAnIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTppdGVtKClbJ2ZpZWxkQ29sU3R5bGVzRHluYW1pYycraW5kZXhSb3crY29sSW5kZXhdOml0ZW0oKSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIihrZXlTZWxlY3RlZCgpID09PSBpdGVtKClbZmllbGRLZXkoKV0pID8gKHJvdygpLmNsYXNzSXRlbVNlbGVjdGVkIHx8IGl0ZW0oKVsnZmllbGRDb2xDbGFzcycraW5kZXhSb3crY29sSW5kZXhdIHx8ICcnKSA6KGl0ZW0oKVsnZmllbGRDb2xDbGFzcycraW5kZXhSb3crY29sSW5kZXhdIHx8ICcnKVwiXG4gICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIignZmllbGRMYWJlbENvbCcgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmxhYmVsQ29sRnVuYzppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAob3V0RXZlbnQpPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LGl0ZW0oKSxjb2woKS5hY3Rpb24pXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGl0ZW0oKVsnZmllbGRDb2xQb3BvdmVyJytpbmRleFJvdytjb2xJbmRleF07IGFzIHBvcG92ZXIpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwicG9wb3Zlci50eXBlID8/ICdvdGhlcidcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwb3BvdmVyPy5jb25maWdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJpdGVtKClbJ2ZpZWxkQ29sQ2xhc3MnK2luZGV4Um93K2NvbEluZGV4XVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiKCcgJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aXRlbSgpWydmaWVsZENvbFN0eWxlc0R5bmFtaWMnK2luZGV4Um93K2NvbEluZGV4XTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKCksY29sKCkuYWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cInBvcG92ZXIuY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCIocG9wb3Zlci5kYXRhVmlldyA/PyBwb3BvdmVySWNvbikgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZENvbFRvZ2dsZScraW5kZXhSb3crY29sSW5kZXhdOyBhcyB0b2dnbGUpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtzdHlsZV09XCIoJyAnIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTppdGVtKClbJ2ZpZWxkQ29sU3R5bGVzRHluYW1pYycraW5kZXhSb3crY29sSW5kZXhdOml0ZW0oKSkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBbaGFzVG9nZ2xlXT1cInRvZ2dsZS5oYXNUb2dnbGVcIlxuICAgICAgICAgICAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJ0b2dnbGUudG9nZ2xlQWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgIFt0b2dnbGVEaXNhYmxlXT1cInRvZ2dsZS50b2dnbGVEaXNhYmxlXCJcbiAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInRvZ2dsZS5wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9nZ2xlLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cInRvZ2dsZS5sYWJlbExlZnRcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsUmlnaHRdPVwidG9nZ2xlLmxhYmVsUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgKG91dFN3aXRjaEV2ZW50KT1cImhhbmRsZXJTZWxlY3RJdGVtKCdjbGljaycsaXRlbSgpLGNvbCgpLmFjdGlvbilcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZENvbEJ1dHRvbicraW5kZXhSb3crY29sSW5kZXhdOyBhcyBidXR0b24pIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImJ1dHRvbi50eXBlXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJidXR0b24uY2xhc3NJY29uUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiYnV0dG9uLmNsYXNzTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJidXR0b24uaWNvbk9ubHlUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbi5wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbi5kaXNhYmxlXCJcbiAgICAgICAgICAgICAgICAgIFtpZ25vcmVQb2ludGVyRXZlbnRdPVwiYnV0dG9uLmlnbm9yZVBvaW50ZXJFdmVudFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIml0ZW0oKVsnZmllbGRDb2xDbGFzcycraW5kZXhSb3crY29sSW5kZXhdID8/ICcgJ1wiXG4gICAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZWxlY3RJdGVtKCdjbGljaycsaXRlbSgpLGNvbCgpLmFjdGlvbilcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbSgpWydmaWVsZEJhZGdlJytpbmRleFJvdytjb2xJbmRleF07IGFzIGJhZGdlKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1iYWRnZSBbbW9kZV09XCJiYWRnZS5tb2RlIHx8ICd4KydcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIignICcgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOml0ZW0oKVsnZmllbGRDb2xTdHlsZXNEeW5hbWljJytpbmRleFJvdytjb2xJbmRleF06aXRlbSgpKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIFtjb3VudF09XCJiYWRnZS5jb3VudFwiXG4gICAgICAgICAgICAgICAgICBbbWF4Q291bnRdPVwiYmFkZ2UubWF4Q291bnQgfHwgOTlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzQ2lyY2xlXT1cImJhZGdlLmNsYXNzQ2lyY2xlIHx8ICdsaWJzLXVpLWZvbnQtaDRyJ1wiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbn1cbiJdfQ==