@libs-ui/components-tabs 0.1.1-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,268 @@
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal, viewChild } from '@angular/core';
2
+ import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
3
+ import { LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective } from '@libs-ui/components-drag-drop';
4
+ import { LibsUiComponentsListComponent } from '@libs-ui/components-list';
5
+ import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
6
+ import { convertObjectToSignal, isNil, uuid } from '@libs-ui/utils';
7
+ import { TranslateService } from '@ngx-translate/core';
8
+ import { fromEvent, Subject } from 'rxjs';
9
+ import { debounceTime, takeUntil } from 'rxjs/operators';
10
+ import { LibsUiComponentsTabsItemComponent } from './item/item.component';
11
+ import { tabMoreListConfig } from './utils/tabs';
12
+ import * as i0 from "@angular/core";
13
+ export class LibsUiComponentsTabsComponent {
14
+ // #region PROPERTY
15
+ itemsDisplay = signal([]);
16
+ displayMoreItem = signal(false);
17
+ tabMoreListConfig = computed(() => tabMoreListConfig(this.translate, this.fieldKey(), this.fieldLabel(), this.tabs(), this.disable()));
18
+ changeViewTab = new Subject();
19
+ groupName = signal(uuid());
20
+ stylesDragDropOverrideComputed = computed(() => this.updateStylesDragDropOverride());
21
+ popoverFunctionControlEvent = signal(undefined);
22
+ onDestroy = new Subject();
23
+ // #region INPUT
24
+ tabs = input.required();
25
+ keySelected = model.required();
26
+ mode = input('left');
27
+ fieldKey = input('key');
28
+ fieldLabel = input('label');
29
+ disable = input();
30
+ disableLabel = input();
31
+ heightTabItem = input(40);
32
+ ignoreCalculatorTab = input(false);
33
+ size = input('medium');
34
+ allowDragDropPosition = input();
35
+ zIndex = input();
36
+ configCss = model();
37
+ popoverShowMoreTabItem = input();
38
+ checkCanChangeTabSelected = input();
39
+ // #region OUTPUT
40
+ outKeySelected = output();
41
+ outFunctionsControl = output();
42
+ outDragTabChange = output();
43
+ outDisplayMoreItem = output();
44
+ outAction = output();
45
+ /* VIEW CHILD */
46
+ headerEl = viewChild.required('headerEl');
47
+ headerLeftEl = viewChild.required('headerLeftEl');
48
+ headerRightEl = viewChild.required('headerRightEl');
49
+ /* INJECT*/
50
+ translate = inject(TranslateService);
51
+ ngOnInit() {
52
+ this.updateTabsCssConfig();
53
+ this.outFunctionsControl.emit(this.FunctionsControl);
54
+ if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {
55
+ this.tabs()
56
+ .items()
57
+ .map((item) => item.update((data) => ({ ...data, specificDisplay: true })));
58
+ this.itemsDisplay.set(this.tabs()
59
+ .items()
60
+ .filter((item) => item().specificDisplay));
61
+ return;
62
+ }
63
+ fromEvent(window, 'resize')
64
+ .pipe(debounceTime(250), takeUntil(this.onDestroy))
65
+ .subscribe(() => {
66
+ if (!this.tabs().items().length) {
67
+ return;
68
+ }
69
+ this.displayMoreItem.set(false);
70
+ this.calculatorTabsItemDisplay();
71
+ });
72
+ this.changeViewTab.pipe(debounceTime(20), takeUntil(this.onDestroy)).subscribe(() => this.calculatorTabsItemDisplay());
73
+ }
74
+ /* FUNCTIONS */
75
+ get FunctionsControl() {
76
+ return {
77
+ addTabsItem: this.addTabsItem.bind(this),
78
+ calculatorTabsItemsDisplay: this.calculatorTabsItemDisplay.bind(this),
79
+ selectedTabsItem: this.handlerSelectedTabsItem.bind(this),
80
+ };
81
+ }
82
+ updateTabsCssConfig() {
83
+ if (this.configCss()) {
84
+ return;
85
+ }
86
+ switch (this.mode()) {
87
+ case 'left':
88
+ this.configCss.set({
89
+ first: 'ml-[20px] mr-[16px]',
90
+ other: 'ml-[20px] mr-[16px]',
91
+ });
92
+ break;
93
+ case 'center':
94
+ this.configCss.set({
95
+ first: 'px-[12px] ml-[18px] mr-[18px]',
96
+ other: 'px-[12px] mx-[18px]',
97
+ header: 'flex justify-center',
98
+ });
99
+ break;
100
+ case 'center-has-line':
101
+ this.configCss.set({
102
+ first: 'px-[16px]',
103
+ other: 'px-[16px]',
104
+ headerCenter: 'items-center',
105
+ });
106
+ break;
107
+ case 'space-between':
108
+ this.configCss.set({
109
+ first: 'mx-auto',
110
+ other: 'mx-auto',
111
+ headerCenter: 'w-full',
112
+ });
113
+ break;
114
+ }
115
+ }
116
+ updateStylesDragDropOverride() {
117
+ if (this.allowDragDropPosition()) {
118
+ return [
119
+ {
120
+ className: 'libs-ui-drag-drop-item-placeholder',
121
+ styles: '',
122
+ },
123
+ {
124
+ className: 'libs-ui-drag-drop-item',
125
+ styles: 'cursor: move;',
126
+ },
127
+ {
128
+ className: 'libs-ui-drag-drop-item-dragging',
129
+ styles: 'cursor: move; background: #dddddd;',
130
+ },
131
+ ];
132
+ }
133
+ return [
134
+ {
135
+ className: 'libs-ui-drag-drop-item',
136
+ styles: '',
137
+ },
138
+ {
139
+ className: 'libs-ui-drag-drop-item-disable',
140
+ styles: '',
141
+ },
142
+ ];
143
+ }
144
+ handlerDropContainer(event) {
145
+ const { itemDragInfo } = event;
146
+ if (!itemDragInfo) {
147
+ return;
148
+ }
149
+ const items = this.tabs().items;
150
+ const { indexDrag, indexDrop } = itemDragInfo;
151
+ if (isNil(indexDrag) || isNil(indexDrop) || indexDrop === indexDrag) {
152
+ return;
153
+ }
154
+ const itemDrag = items()[indexDrag];
155
+ items.update((items) => {
156
+ items.splice(indexDrag, 1);
157
+ items.splice(indexDrop, 0, itemDrag);
158
+ return [...items];
159
+ });
160
+ this.outDragTabChange.emit();
161
+ }
162
+ handlerPopoverFunctionControlEvent(event) {
163
+ this.popoverFunctionControlEvent.set(event);
164
+ }
165
+ async handlerSelectedTabsItem(key, resetDisable = true) {
166
+ const itemSelected = this.tabs()
167
+ .items()
168
+ .find((item) => item()[this.fieldKey()] === key);
169
+ if (!itemSelected) {
170
+ return;
171
+ }
172
+ if (resetDisable) {
173
+ itemSelected.update((item) => ({ ...item, disable: false }));
174
+ }
175
+ this.handlerClickItem(itemSelected);
176
+ }
177
+ handlerSelectedKey(event) {
178
+ if (!event) {
179
+ return;
180
+ }
181
+ this.handlerClickItem(convertObjectToSignal(event.item));
182
+ this.outDragTabChange.emit();
183
+ }
184
+ async handlerClickItem(item) {
185
+ if (item().disable || this.disable()) {
186
+ return;
187
+ }
188
+ const checkCanChangeTabSelected = this.checkCanChangeTabSelected();
189
+ if (checkCanChangeTabSelected) {
190
+ const state = await checkCanChangeTabSelected();
191
+ if (state) {
192
+ this.changeItemSelected(item);
193
+ }
194
+ return;
195
+ }
196
+ this.changeItemSelected(item);
197
+ }
198
+ changeItemSelected(item) {
199
+ this.keySelected.set(item()[this.fieldKey()]);
200
+ this.outKeySelected.emit(this.keySelected());
201
+ this.popoverFunctionControlEvent()?.removePopoverOverlay();
202
+ this.calculatorTabsItemDisplay();
203
+ }
204
+ async handlerAction(event) {
205
+ this.outAction.emit(event);
206
+ }
207
+ async addTabsItem(item, selected = true, addFirst) {
208
+ const items = this.tabs().items;
209
+ items.update((items) => {
210
+ if (addFirst) {
211
+ return [item, ...items];
212
+ }
213
+ return [...items, item];
214
+ });
215
+ if (selected) {
216
+ this.handlerClickItem(item);
217
+ }
218
+ }
219
+ async calculatorTabsItemDisplay() {
220
+ let items = this.tabs().items();
221
+ const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());
222
+ if (indexItemSelected < 0) {
223
+ return;
224
+ }
225
+ this.displayMoreItem.set(false);
226
+ let displayMoreItem = false;
227
+ const headerWidth = this.headerEl().nativeElement.clientWidth || 0;
228
+ const itemSelected = items[indexItemSelected];
229
+ const itemSelectedWidth = itemSelected().specificWidth;
230
+ let totalWidthItemsDisplay = (this.headerLeftEl().nativeElement.clientWidth || 0) + (this.headerRightEl().nativeElement.clientWidth || 0) + 32;
231
+ items.forEach((item, index) => {
232
+ if (!item().specificWidth) {
233
+ return;
234
+ }
235
+ item.update((data) => ({ ...data, specificDisplay: false }));
236
+ const itemWidth = item().specificWidth || 0;
237
+ const width = totalWidthItemsDisplay + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);
238
+ totalWidthItemsDisplay += itemWidth;
239
+ if (width > headerWidth) {
240
+ displayMoreItem = true;
241
+ return;
242
+ }
243
+ item.update((data) => ({ ...data, specificDisplay: true }));
244
+ });
245
+ itemSelected.update((data) => ({ ...data, specificDisplay: true }));
246
+ const display = items.filter((item) => item().specificDisplay === true);
247
+ const notDisplay = items.filter((item) => item().specificDisplay === false);
248
+ items = display.concat(notDisplay);
249
+ items.forEach((item, index) => item.update((data) => ({ ...data, order: index })));
250
+ this.tabs().items.set(items.sort((prev, next) => (prev().order || 0) - (next().order || 0)));
251
+ this.displayMoreItem.set(displayMoreItem);
252
+ this.outDisplayMoreItem.emit(this.displayMoreItem());
253
+ this.itemsDisplay.set(this.tabs()
254
+ .items()
255
+ .filter((item) => item().specificDisplay));
256
+ }
257
+ ngOnDestroy() {
258
+ this.onDestroy.next();
259
+ this.onDestroy.complete();
260
+ }
261
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
262
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTabsComponent, isStandalone: true, selector: "libs_ui-components-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, heightTabItem: { classPropertyName: "heightTabItem", publicName: "heightTabItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorTab: { classPropertyName: "ignoreCalculatorTab", publicName: "ignoreCalculatorTab", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, allowDragDropPosition: { classPropertyName: "allowDragDropPosition", publicName: "allowDragDropPosition", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configCss: { classPropertyName: "configCss", publicName: "configCss", isSignal: true, isRequired: false, transformFunction: null }, popoverShowMoreTabItem: { classPropertyName: "popoverShowMoreTabItem", publicName: "popoverShowMoreTabItem", isSignal: true, isRequired: false, transformFunction: null }, checkCanChangeTabSelected: { classPropertyName: "checkCanChangeTabSelected", publicName: "checkCanChangeTabSelected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", configCss: "configCssChange", outKeySelected: "outKeySelected", outFunctionsControl: "outFunctionsControl", outDragTabChange: "outDragTabChange", outDisplayMoreItem: "outDisplayMoreItem", outAction: "outAction" }, viewQueries: [{ propertyName: "headerEl", first: true, predicate: ["headerEl"], descendants: true, isSignal: true }, { propertyName: "headerLeftEl", first: true, predicate: ["headerLeftEl"], descendants: true, isSignal: true }, { propertyName: "headerRightEl", first: true, predicate: ["headerRightEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition()\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / (itemsDisplay().length || 1) : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"true\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n", styles: [".libs-ui-tab{position:relative;display:flex;width:100%}.libs-ui-tab .libs-ui-tab-header{position:relative;background-color:#fff;display:flex;flex-wrap:nowrap;width:100%;overflow:hidden;flex-shrink:0}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-header-center{display:flex;flex-wrap:nowrap}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container .libs-ui-icon-arrange{display:none}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container:hover .libs-ui-icon-arrange{display:block}.libs-ui-tab .libs-ui-tab-content-container{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: LibsUiComponentsDragContainerDirective, selector: "[LibsUiComponentsDragContainerDirective]", inputs: ["disableDragContainer", "mode", "directionDrag", "viewEncapsulation", "acceptDragSameGroup", "placeholder", "groupName", "dropToGroupName", "items", "stylesOverride"], outputs: ["itemsChange", "outDragStartContainer", "outDragOverContainer", "outDragLeaveContainer", "outDragEndContainer", "outDroppedContainer", "outDroppedContainerEmpty", "outFunctionControl"] }, { kind: "directive", type: LibsUiDragItemDirective, selector: "[LibsUiDragItemDirective]", inputs: ["fieldId", "item", "itemInContainerVirtualScroll", "throttleTimeHandlerDraggingEvent", "ignoreStopEvent", "onlyMouseDownStopEvent", "dragRootElement", "dragBoundary", "dragBoundaryAcceptMouseLeaveContainer", "elementContainer", "zIndex", "disable"], outputs: ["outDragStart", "outDragOver", "outDragLeave", "outDragEnd", "outDropped"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "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", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsTabsItemComponent, selector: "libs_ui-components-tabs-item", inputs: ["ignoreCalculatorTab", "step", "mode", "tabs", "item", "keySelected", "fieldLabel", "fieldKey", "cssDefault", "size", "disable", "disableLabel", "zIndex", "changeViewTab"], outputs: ["itemChange", "outAction"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
263
+ }
264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTabsComponent, decorators: [{
265
+ type: Component,
266
+ args: [{ selector: 'libs_ui-components-tabs', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsTabsItemComponent, LibsUiComponentsListComponent], template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition()\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / (itemsDisplay().length || 1) : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"true\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n", styles: [".libs-ui-tab{position:relative;display:flex;width:100%}.libs-ui-tab .libs-ui-tab-header{position:relative;background-color:#fff;display:flex;flex-wrap:nowrap;width:100%;overflow:hidden;flex-shrink:0}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-header-center{display:flex;flex-wrap:nowrap}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container .libs-ui-icon-arrange{display:none}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container:hover .libs-ui-icon-arrange{display:block}.libs-ui-tab .libs-ui-tab-content-container{width:100%;height:100%}\n"] }]
267
+ }] });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQzdLLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBUyxzQ0FBc0MsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZILE9BQU8sRUFBb0IsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRixPQUFPLEVBQTBDLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFXakQsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxtQkFBbUI7SUFDVCxZQUFZLEdBQUcsTUFBTSxDQUFt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NkJBQTZCO2tCQVR6QyxTQUFTOytCQUVFLHlCQUF5QixjQUd2QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxzQ0FBc0MsRUFBRSx1QkFBdUIsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsRUFBRSxpQ0FBaUMsRUFBRSw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSURyb3AsIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlLCBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQb3BvdmVyLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGlzTmlsLCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElUYWJDc3NDb25maWcsIElUYWJzLCBJVGFic0Z1bmN0aW9uQ29udHJvbEV2ZW50LCBJVGFic0l0ZW0sIElUYWJzSXRlbUV2ZW50LCBUWVBFX1RBQl9NT0RFIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3RhYi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYnNJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IHRhYk1vcmVMaXN0Q29uZmlnIH0gZnJvbSAnLi91dGlscy90YWJzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYnMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSwgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1RhYnNJdGVtQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCBpdGVtc0Rpc3BsYXkgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGRpc3BsYXlNb3JlSXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCB0YWJNb3JlTGlzdENvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRhYk1vcmVMaXN0Q29uZmlnKHRoaXMudHJhbnNsYXRlLCB0aGlzLmZpZWxkS2V5KCksIHRoaXMuZmllbGRMYWJlbCgpLCB0aGlzLnRhYnMoKSwgdGhpcy5kaXNhYmxlKCkpKTtcbiAgcHJvdGVjdGVkIGNoYW5nZVZpZXdUYWIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgZ3JvdXBOYW1lID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJvdGVjdGVkIHN0eWxlc0RyYWdEcm9wT3ZlcnJpZGVDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudXBkYXRlU3R5bGVzRHJhZ0Ryb3BPdmVycmlkZSgpKTtcblxuICBwcml2YXRlIHBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB0YWJzID0gaW5wdXQucmVxdWlyZWQ8SVRhYnM+KCk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8c3RyaW5nPigpO1xuICByZWFkb25seSBtb2RlID0gaW5wdXQ8VFlQRV9UQUJfTU9ERT4oJ2xlZnQnKTtcbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmc+KCdrZXknKTtcbiAgcmVhZG9ubHkgZmllbGRMYWJlbCA9IGlucHV0PHN0cmluZz4oJ2xhYmVsJyk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlTGFiZWwgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBoZWlnaHRUYWJJdGVtID0gaW5wdXQ8bnVtYmVyPig0MCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNhbGN1bGF0b3JUYWIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNpemUgPSBpbnB1dDwnbGFuZ2VyJyB8ICdtZWRpdW0nPignbWVkaXVtJyk7XG4gIHJlYWRvbmx5IGFsbG93RHJhZ0Ryb3BQb3NpdGlvbiA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnQ3NzID0gbW9kZWw8SVRhYkNzc0NvbmZpZz4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlclNob3dNb3JlVGFiSXRlbSA9IGlucHV0PElQb3BvdmVyPigpO1xuICByZWFkb25seSBjaGVja0NhbkNoYW5nZVRhYlNlbGVjdGVkID0gaW5wdXQ8KCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0S2V5U2VsZWN0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJzRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdUYWJDaGFuZ2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RGlzcGxheU1vcmVJdGVtID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFjdGlvbiA9IG91dHB1dDxJVGFic0l0ZW1FdmVudD4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZj4oJ2hlYWRlckVsJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyTGVmdEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJMZWZ0RWwnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJSaWdodEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJSaWdodEVsJyk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVUYWJzQ3NzQ29uZmlnKCk7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdsZWZ0JyB8fCB0aGlzLmlnbm9yZUNhbGN1bGF0b3JUYWIoKSkge1xuICAgICAgdGhpcy50YWJzKClcbiAgICAgICAgLml0ZW1zKClcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSkpO1xuICAgICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KFxuICAgICAgICB0aGlzLnRhYnMoKVxuICAgICAgICAgIC5pdGVtcygpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSgpLnNwZWNpZmljRGlzcGxheSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYnMoKS5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY2hhbmdlVmlld1RhYi5waXBlKGRlYm91bmNlVGltZSgyMCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJzRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRUYWJzSXRlbTogdGhpcy5hZGRUYWJzSXRlbS5iaW5kKHRoaXMpLFxuICAgICAgY2FsY3VsYXRvclRhYnNJdGVtc0Rpc3BsYXk6IHRoaXMuY2FsY3VsYXRvclRhYnNJdGVtRGlzcGxheS5iaW5kKHRoaXMpLFxuICAgICAgc2VsZWN0ZWRUYWJzSXRlbTogdGhpcy5oYW5kbGVyU2VsZWN0ZWRUYWJzSXRlbS5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYnNDc3NDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnQ3NzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLm1vZGUoKSkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHRoaXMuY29uZmlnQ3NzLnNldCh7XG4gICAgICAgICAgZmlyc3Q6ICdtbC1bMjBweF0gbXItWzE2cHhdJyxcbiAgICAgICAgICBvdGhlcjogJ21sLVsyMHB4XSBtci1bMTZweF0nLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0aGlzLmNvbmZpZ0Nzcy5zZXQoe1xuICAgICAgICAgIGZpcnN0OiAncHgtWzEycHhdIG1sLVsxOHB4XSBtci1bMThweF0nLFxuICAgICAgICAgIG90aGVyOiAncHgtWzEycHhdIG14LVsxOHB4XScsXG4gICAgICAgICAgaGVhZGVyOiAnZmxleCBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlci1oYXMtbGluZSc6XG4gICAgICAgIHRoaXMuY29uZmlnQ3NzLnNldCh7XG4gICAgICAgICAgZmlyc3Q6ICdweC1bMTZweF0nLFxuICAgICAgICAgIG90aGVyOiAncHgtWzE2cHhdJyxcbiAgICAgICAgICBoZWFkZXJDZW50ZXI6ICdpdGVtcy1jZW50ZXInLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzcGFjZS1iZXR3ZWVuJzpcbiAgICAgICAgdGhpcy5jb25maWdDc3Muc2V0KHtcbiAgICAgICAgICBmaXJzdDogJ214LWF1dG8nLFxuICAgICAgICAgIG90aGVyOiAnbXgtYXV0bycsXG4gICAgICAgICAgaGVhZGVyQ2VudGVyOiAndy1mdWxsJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3R5bGVzRHJhZ0Ryb3BPdmVycmlkZSgpIHtcbiAgICBpZiAodGhpcy5hbGxvd0RyYWdEcm9wUG9zaXRpb24oKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInLFxuICAgICAgICAgIHN0eWxlczogJycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtJyxcbiAgICAgICAgICBzdHlsZXM6ICdjdXJzb3I6IG1vdmU7JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJhZ2dpbmcnLFxuICAgICAgICAgIHN0eWxlczogJ2N1cnNvcjogbW92ZTsgYmFja2dyb3VuZDogI2RkZGRkZDsnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbScsXG4gICAgICAgIHN0eWxlczogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRpc2FibGUnLFxuICAgICAgICBzdHlsZXM6ICcnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcm9wQ29udGFpbmVyKGV2ZW50OiBJRHJvcCkge1xuICAgIGNvbnN0IHsgaXRlbURyYWdJbmZvIH0gPSBldmVudDtcbiAgICBpZiAoIWl0ZW1EcmFnSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpLml0ZW1zO1xuICAgIGNvbnN0IHsgaW5kZXhEcmFnLCBpbmRleERyb3AgfSA9IGl0ZW1EcmFnSW5mbztcbiAgICBpZiAoaXNOaWwoaW5kZXhEcmFnKSB8fCBpc05pbChpbmRleERyb3ApIHx8IGluZGV4RHJvcCA9PT0gaW5kZXhEcmFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1EcmFnID0gaXRlbXMoKVtpbmRleERyYWcgYXMgbnVtYmVyXTtcbiAgICBpdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnIGFzIG51bWJlciwgMSk7XG4gICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcm9wIGFzIG51bWJlciwgMCwgaXRlbURyYWcpO1xuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vdXREcmFnVGFiQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlclNlbGVjdGVkVGFic0l0ZW0oa2V5OiBzdHJpbmcsIHJlc2V0RGlzYWJsZSA9IHRydWUpIHtcbiAgICBjb25zdCBpdGVtU2VsZWN0ZWQgPSB0aGlzLnRhYnMoKVxuICAgICAgLml0ZW1zKClcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KTtcbiAgICBpZiAoIWl0ZW1TZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzZXREaXNhYmxlKSB7XG4gICAgICBpdGVtU2VsZWN0ZWQudXBkYXRlKChpdGVtKSA9PiAoeyAuLi5pdGVtLCBkaXNhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlckNsaWNrSXRlbShpdGVtU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEtleShldmVudDogSUxpc3REYXRhRW1pdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2xpY2tJdGVtKGNvbnZlcnRPYmplY3RUb1NpZ25hbChldmVudC5pdGVtKSk7XG4gICAgdGhpcy5vdXREcmFnVGFiQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2tJdGVtKGl0ZW06IFdyaXRhYmxlU2lnbmFsPElUYWJzSXRlbT4pIHtcbiAgICBpZiAoaXRlbSgpLmRpc2FibGUgfHwgdGhpcy5kaXNhYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCA9IHRoaXMuY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCgpO1xuICAgIGlmIChjaGVja0NhbkNoYW5nZVRhYlNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IGNoZWNrQ2FuQ2hhbmdlVGFiU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZUl0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VJdGVtU2VsZWN0ZWQoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUl0ZW1TZWxlY3RlZChpdGVtOiBXcml0YWJsZVNpZ25hbDxJVGFic0l0ZW0+KSB7XG4gICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIHRoaXMub3V0S2V5U2VsZWN0ZWQuZW1pdCh0aGlzLmtleVNlbGVjdGVkKCkpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgdGhpcy5jYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFjdGlvbihldmVudDogSVRhYnNJdGVtRXZlbnQpIHtcbiAgICB0aGlzLm91dEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFic0l0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPiwgc2VsZWN0ZWQgPSB0cnVlLCBhZGRGaXJzdD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpLml0ZW1zO1xuICAgIGl0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgIGlmIChhZGRGaXJzdCkge1xuICAgICAgICByZXR1cm4gW2l0ZW0sIC4uLml0ZW1zXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbLi4uaXRlbXMsIGl0ZW1dO1xuICAgIH0pO1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tJdGVtKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5KCkge1xuICAgIGxldCBpdGVtcyA9IHRoaXMudGFicygpLml0ZW1zKCk7XG4gICAgY29uc3QgaW5kZXhJdGVtU2VsZWN0ZWQgPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpO1xuICAgIGlmIChpbmRleEl0ZW1TZWxlY3RlZCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9yZUl0ZW0uc2V0KGZhbHNlKTtcbiAgICBsZXQgZGlzcGxheU1vcmVJdGVtID0gZmFsc2U7XG4gICAgY29uc3QgaGVhZGVyV2lkdGggPSB0aGlzLmhlYWRlckVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCAwO1xuICAgIGNvbnN0IGl0ZW1TZWxlY3RlZCA9IGl0ZW1zW2luZGV4SXRlbVNlbGVjdGVkXTtcbiAgICBjb25zdCBpdGVtU2VsZWN0ZWRXaWR0aCA9IGl0ZW1TZWxlY3RlZCgpLnNwZWNpZmljV2lkdGg7XG4gICAgbGV0IHRvdGFsV2lkdGhJdGVtc0Rpc3BsYXkgPSAodGhpcy5oZWFkZXJMZWZ0RWwoKS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IDApICsgKHRoaXMuaGVhZGVyUmlnaHRFbCgpLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMCkgKyAzMjtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpdGVtKCkuc3BlY2lmaWNXaWR0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNEaXNwbGF5OiBmYWxzZSB9KSk7XG4gICAgICBjb25zdCBpdGVtV2lkdGggPSBpdGVtKCkuc3BlY2lmaWNXaWR0aCB8fCAwO1xuICAgICAgY29uc3Qgd2lkdGggPSB0b3RhbFdpZHRoSXRlbXNEaXNwbGF5ICsgaXRlbVdpZHRoICsgKGluZGV4IDwgaW5kZXhJdGVtU2VsZWN0ZWQgPyBpdGVtU2VsZWN0ZWRXaWR0aCA6IDApO1xuICAgICAgdG90YWxXaWR0aEl0ZW1zRGlzcGxheSArPSBpdGVtV2lkdGg7XG4gICAgICBpZiAod2lkdGggPiBoZWFkZXJXaWR0aCkge1xuICAgICAgICBkaXNwbGF5TW9yZUl0ZW0gPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNEaXNwbGF5OiB0cnVlIH0pKTtcbiAgICB9KTtcbiAgICBpdGVtU2VsZWN0ZWQudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpO1xuICAgIGNvbnN0IGRpc3BsYXkgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0oKS5zcGVjaWZpY0Rpc3BsYXkgPT09IHRydWUpO1xuICAgIGNvbnN0IG5vdERpc3BsYXkgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0oKS5zcGVjaWZpY0Rpc3BsYXkgPT09IGZhbHNlKTtcbiAgICBpdGVtcyA9IGRpc3BsYXkuY29uY2F0KG5vdERpc3BsYXkpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgb3JkZXI6IGluZGV4IH0pKSk7XG4gICAgdGhpcy50YWJzKCkuaXRlbXMuc2V0KGl0ZW1zLnNvcnQoKHByZXYsIG5leHQpID0+IChwcmV2KCkub3JkZXIgfHwgMCkgLSAobmV4dCgpLm9yZGVyIHx8IDApKSk7XG4gICAgdGhpcy5kaXNwbGF5TW9yZUl0ZW0uc2V0KGRpc3BsYXlNb3JlSXRlbSk7XG4gICAgdGhpcy5vdXREaXNwbGF5TW9yZUl0ZW0uZW1pdCh0aGlzLmRpc3BsYXlNb3JlSXRlbSgpKTtcbiAgICB0aGlzLml0ZW1zRGlzcGxheS5zZXQoXG4gICAgICB0aGlzLnRhYnMoKVxuICAgICAgICAuaXRlbXMoKVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuc3BlY2lmaWNEaXNwbGF5KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxpYnMtdWktdGFiXCI+XG4gIDxkaXZcbiAgICAjaGVhZGVyRWxcbiAgICBjbGFzcz1cImxpYnMtdWktdGFiLWhlYWRlciB6LVsxXSB7eyBjb25maWdDc3MoKT8uaGVhZGVyIHx8ICcnIH19IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXIgfHwgJycgfX1cIlxuICAgIFtzdHlsZS5taW5IZWlnaHQucHhdPVwiaGVpZ2h0VGFiSXRlbSgpXCI+XG4gICAgPGRpdlxuICAgICAgI2hlYWRlckxlZnRFbFxuICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItbGVmdFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFiLWhlYWRlci1sZWZ0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItY2VudGVyIHt7IGNvbmZpZ0NzcygpPy5oZWFkZXJDZW50ZXIgfHwgJycgfX0ge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlckNlbnRlciB8fCAnJyB9fVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIiFmbGV4IHctZnVsbFwiXG4gICAgICAgICNlbGVtZW50Q29udGFpbmVyRWxcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmVcbiAgICAgICAgW3N0eWxlc092ZXJyaWRlXT1cInN0eWxlc0RyYWdEcm9wT3ZlcnJpZGVDb21wdXRlZCgpXCJcbiAgICAgICAgW2dyb3VwTmFtZV09XCJncm91cE5hbWUoKVwiXG4gICAgICAgIFsoaXRlbXMpXT1cIml0ZW1zRGlzcGxheVwiXG4gICAgICAgIFtkaXJlY3Rpb25EcmFnXT1cIidob3Jpem9udGFsJ1wiXG4gICAgICAgIFtkaXNhYmxlRHJhZ0NvbnRhaW5lcl09XCIhYWxsb3dEcmFnRHJvcFBvc2l0aW9uKClcIlxuICAgICAgICBbYWNjZXB0RHJhZ1NhbWVHcm91cF09XCJhbGxvd0RyYWdEcm9wUG9zaXRpb24oKVwiXG4gICAgICAgIChvdXREcm9wcGVkQ29udGFpbmVyKT1cImhhbmRsZXJEcm9wQ29udGFpbmVyKCRldmVudClcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtc0Rpc3BsYXkoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgIWFsbG93RHJhZ0Ryb3BQb3NpdGlvbigpXCJcbiAgICAgICAgICAgIFtlbGVtZW50Q29udGFpbmVyXT1cImVsZW1lbnRDb250YWluZXJFbFwiXG4gICAgICAgICAgICBbZHJhZ0JvdW5kYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2RyYWdCb3VuZGFyeUFjY2VwdE1vdXNlTGVhdmVDb250YWluZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGxpYnMtdWktdGFiLWl0ZW0tY29udGFpbmVyXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtb2RlKCkgPT09ICdzcGFjZS1iZXR3ZWVuJyA/IGVsZW1lbnRDb250YWluZXJFbC5jbGllbnRXaWR0aCAvIChpdGVtc0Rpc3BsYXkoKS5sZW5ndGggfHwgMSkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZSgpID09PSAnY2VudGVyLWhhcy1saW5lJ1wiXG4gICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGUoKSA9PT0gJ2NlbnRlci1oYXMtbGluZSdcIj5cbiAgICAgICAgICAgIEBpZiAoYWxsb3dEcmFnRHJvcFBvc2l0aW9uKCkgJiYgIWRpc2FibGUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktaWNvbi1hcnJhbmdlIHRleHQtWyM5Y2EyYWRdIGFic29sdXRlIHRvcC1bMTRweF0gbGVmdC1bNHB4XVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFicy1pdGVtXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbCAge3sgdGFicygpLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJycgfX1cIlxuICAgICAgICAgICAgICBbdGFic109XCJ0YWJzKClcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJzaXplKClcIlxuICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1cIlxuICAgICAgICAgICAgICBbc3RlcF09XCIkaW5kZXggKyAxXCJcbiAgICAgICAgICAgICAgW2NsYXNzLiFwb2ludGVyLWV2ZW50cy1ub25lXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlTGFiZWxdPVwiZGlzYWJsZUxhYmVsKClcIlxuICAgICAgICAgICAgICBba2V5U2VsZWN0ZWRdPVwia2V5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgW2Nzc0RlZmF1bHRdPVwiKCRmaXJzdCA/IGNvbmZpZ0NzcygpPy5maXJzdCA6IGNvbmZpZ0NzcygpPy5vdGhlcikgfHwgJydcIlxuICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwibW9kZSgpXCJcbiAgICAgICAgICAgICAgW2lnbm9yZUNhbGN1bGF0b3JUYWJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjaGFuZ2VWaWV3VGFiXT1cImNoYW5nZVZpZXdUYWJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrSXRlbShpdGVtKVwiXG4gICAgICAgICAgICAgIChvdXRBY3Rpb24pPVwiaGFuZGxlckFjdGlvbigkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnY2VudGVyLWhhcy1saW5lJyAmJiAhJGxhc3QpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctWzQwcHhdIGgtWzFweF0gYmctWyNlNmU3ZWFdXCI+PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLm1sLWF1dG9dPVwiZGlzcGxheU1vcmVJdGVtKCkgJiYgIXRhYnMoKS52aWV3TW9yZUlnbm9yZU1hcmdpbkxlZnRcIj5cbiAgICAgIEBpZiAoZGlzcGxheU1vcmVJdGVtKCkpIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICBbbW9kZV09XCInY2xpY2stdG9nZ2xlJ1wiXG4gICAgICAgICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICB6SW5kZXg6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy56SW5kZXggfHwgMTAwMCxcbiAgICAgICAgICAgIG1heEhlaWdodDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/Lm1heEhlaWdodCB8fCAyODcsXG4gICAgICAgICAgICBtYXhXaWR0aDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/Lm1heFdpZHRoIHx8IDIwNDgsXG4gICAgICAgICAgICB3aWR0aDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/LndpZHRoIHx8IDI3NyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/LmRpcmVjdGlvbiB8fCAnYm90dG9tJyxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3BvdmVyU2hvd01vcmVUYWJJdGVtKCk/LmNvbmZpZz8udGVtcGxhdGUgfHwgbWVudUVsLFxuICAgICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICAgICAgcG9zaXRpb246IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5wb3NpdGlvbiB8fCB7IG1vZGU6ICdlbmQnLCBkaXN0YW5jZTogMCB9LFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzhweF0nXCJcbiAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vcmUtdmVydGljYWwgcm90YXRlLTkwIHRleHQtWzE2cHhdIG1yLTAnXCJcbiAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5jb250ZW50IHx8ICdpMThuX3ZpZXdfbW9yZScgfSB9XCJcbiAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAjaGVhZGVyUmlnaHRFbFxuICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItcmlnaHQge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlclJpZ2h0IHx8ICcnIH19XCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWItaGVhZGVyLXJpZ2h0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFic29sdXRlIHRvcC0wIHotMCB3LWZ1bGxcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImxpYnMtdWktdGFiLWhlYWRlciB7eyBjb25maWdDc3MoKT8uaGVhZGVyIHx8ICcnIH19IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXIgfHwgJycgfX1cIlxuICAgICAgW3N0eWxlLm1pbkhlaWdodC5weF09XCJoZWlnaHRUYWJJdGVtKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItY2VudGVyIHt7IGNvbmZpZ0NzcygpPy5oZWFkZXJDZW50ZXIgfHwgJycgfX0ge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlckNlbnRlciB8fCAnJyB9fVwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIHRhYnMoKS5pdGVtcygpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJzLWl0ZW1cbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbCB7eyB0YWJzKCkuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJyB9fVwiXG4gICAgICAgICAgICBbdGFic109XCJ0YWJzKClcIlxuICAgICAgICAgICAgW3NpemVdPVwic2l6ZSgpXCJcbiAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICBbc3RlcF09XCIkaW5kZXggKyAxXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZUxhYmVsXT1cImRpc2FibGVMYWJlbCgpXCJcbiAgICAgICAgICAgIFtrZXlTZWxlY3RlZF09XCJrZXlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICBbY3NzRGVmYXVsdF09XCIoJGZpcnN0ID8gY29uZmlnQ3NzKCk/LmZpcnN0IDogY29uZmlnQ3NzKCk/Lm90aGVyKSB8fCAnJ1wiXG4gICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgIFttb2RlXT1cIm1vZGUoKVwiXG4gICAgICAgICAgICBbY2hhbmdlVmlld1RhYl09XCJjaGFuZ2VWaWV3VGFiXCJcbiAgICAgICAgICAgIFtpZ25vcmVDYWxjdWxhdG9yVGFiXT1cImlnbm9yZUNhbGN1bGF0b3JUYWIoKVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNtZW51RWw+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICAgIFtjb25maWddPVwidGFiTW9yZUxpc3RDb25maWcoKVwiXG4gICAgW21heEl0ZW1TaG93XT1cIjVcIlxuICAgIFtoaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICBbcGFkZGluZ0xlZnRJdGVtXT1cInRydWVcIlxuICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkS2V5KCRldmVudClcIiAvPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,80 @@
1
+ import { signal } from '@angular/core';
2
+ import { returnListObject } from '@libs-ui/services-http-request';
3
+ import { convertObjectToSignal, escapeHtml, isNil } from '@libs-ui/utils';
4
+ import { of } from 'rxjs';
5
+ export const tabMoreListConfig = (translate, fieldKey, fieldLabel, tabs, disable) => {
6
+ return {
7
+ type: 'text',
8
+ httpRequestData: signal({
9
+ objectInstance: returnListObject(tabs
10
+ .items()
11
+ .filter((item) => !item().specificDisplay)
12
+ .map((item) => item())),
13
+ functionName: 'listObservable',
14
+ argumentsValue: [],
15
+ }),
16
+ configTemplateText: signal({
17
+ fieldKey: fieldKey || 'key',
18
+ getClassItem: () => '!py-[12px]',
19
+ classRows: 'w-full',
20
+ notUseVirtualScroll: true,
21
+ rows: convertObjectToSignal([
22
+ {
23
+ classCols: 'flex items-center',
24
+ cols: [
25
+ {
26
+ getPopover: (item) => {
27
+ if (!tabs.hasStep) {
28
+ return;
29
+ }
30
+ const step = (item.order || 0) + 1;
31
+ let classStep = 'bg-[#f8f9fa] text-[#9ca2ad]';
32
+ if (item.invalid) {
33
+ classStep = '!text-[#f15767] !bg-[#fdeaec]';
34
+ }
35
+ if (item.disable || disable) {
36
+ classStep = 'bg-[#f8f9fa] text-[#cdd0d6]';
37
+ }
38
+ return {
39
+ classInclude: 'flex',
40
+ dataView: `
41
+ <div class="libs-ui-font-h6m rounded-full min-w-[24px] min-h-[24px] flex items-center justify-center mr-[8px] ${classStep}">
42
+ ${step <= (tabs.stepCompleted || -1) ? `<i class="libs-ui-icon-check text-[#ffffff]"></i>` : `${step}`}
43
+ </div>
44
+ `,
45
+ };
46
+ },
47
+ },
48
+ {
49
+ getPopover: (item) => (item.iconLeft ? { classInclude: 'flex', dataView: `<i class="${item.iconLeft} text-[16px] mr-[8px]"></i>` } : undefined),
50
+ },
51
+ {
52
+ getClassCol: (item) => `libs-ui-font-h6m ${item.invalid ? '!text-[#f15767]' : 'text-[#6a7383]'}`,
53
+ getValue: (data) => of(escapeHtml(translate.instant(data.item[fieldLabel] || ' '))),
54
+ },
55
+ {
56
+ getPopover: (item) => (item.popover ? { config: item.popover } : undefined),
57
+ },
58
+ {
59
+ getPopover: (item) => (item.iconRight ? { classInclude: 'flex', dataView: `<i class="${item.iconRight} text-[16px] ml-[8px]"></i>` } : undefined),
60
+ },
61
+ {
62
+ getConfigBadge: (item) => {
63
+ if (isNil(item.count)) {
64
+ return;
65
+ }
66
+ return {
67
+ mode: item.modeCount || 'x+',
68
+ count: item.count,
69
+ maxCount: item.maxCount || 99,
70
+ classCircle: (item.classCircle || 'libs-ui-font-h5r') + (item.invalid ? ' !text-[#f15767] !bg-[#fdeaec]' : ''),
71
+ };
72
+ },
73
+ },
74
+ ],
75
+ },
76
+ ]),
77
+ }),
78
+ };
79
+ };
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy90YWJzL3NyYy91dGlscy90YWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFNBQTJCLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLElBQVcsRUFBRSxPQUE0QixFQUFtQixFQUFFO0lBQ2pLLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTTtRQUNaLGVBQWUsRUFBRSxNQUFNLENBQXFCO1lBQzFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FDOUIsSUFBSTtpQkFDRCxLQUFLLEVBQUU7aUJBQ1AsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQztpQkFDekMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUN6QjtZQUNELFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztRQUNGLGtCQUFrQixFQUFFLE1BQU0sQ0FBQztZQUN6QixRQUFRLEVBQUUsUUFBUSxJQUFJLEtBQUs7WUFDM0IsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVk7WUFDaEMsU0FBUyxFQUFFLFFBQVE7WUFDbkIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixJQUFJLEVBQUUscUJBQXFCLENBQUM7Z0JBQzFC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RjtpQkFDRjthQUNGLENBQUM7U0FDSCxDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSURhdGFGdW5jdGlvbkNhbGxJbkNvbmZpZywgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZywgcmV0dXJuTGlzdE9iamVjdCB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGVzY2FwZUh0bWwsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElUYWJzLCBJVGFic0l0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3RhYi5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgdGFiTW9yZUxpc3RDb25maWcgPSAodHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBmaWVsZEtleTogc3RyaW5nLCBmaWVsZExhYmVsOiBzdHJpbmcsIHRhYnM6IElUYWJzLCBkaXNhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkKTogSUxpc3RDb25maWdJdGVtID0+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndGV4dCcsXG4gICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPih7XG4gICAgICBvYmplY3RJbnN0YW5jZTogcmV0dXJuTGlzdE9iamVjdChcbiAgICAgICAgdGFic1xuICAgICAgICAgIC5pdGVtcygpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0oKS5zcGVjaWZpY0Rpc3BsYXkpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbSgpKVxuICAgICAgKSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3RPYnNlcnZhYmxlJyxcbiAgICAgIGFyZ3VtZW50c1ZhbHVlOiBbXSxcbiAgICB9KSxcbiAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHNpZ25hbCh7XG4gICAgICBmaWVsZEtleTogZmllbGRLZXkgfHwgJ2tleScsXG4gICAgICBnZXRDbGFzc0l0ZW06ICgpID0+ICchcHktWzEycHhdJyxcbiAgICAgIGNsYXNzUm93czogJ3ctZnVsbCcsXG4gICAgICBub3RVc2VWaXJ0dWFsU2Nyb2xsOiB0cnVlLFxuICAgICAgcm93czogY29udmVydE9iamVjdFRvU2lnbmFsKFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzQ29sczogJ2ZsZXggaXRlbXMtY2VudGVyJyxcbiAgICAgICAgICBjb2xzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGdldFBvcG92ZXI6IChpdGVtOiBJVGFic0l0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhYnMuaGFzU3RlcCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gKGl0ZW0ub3JkZXIgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc1N0ZXAgPSAnYmctWyNmOGY5ZmFdIHRleHQtWyM5Y2EyYWRdJztcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICBjbGFzc1N0ZXAgPSAnIXRleHQtWyNmMTU3NjddICFiZy1bI2ZkZWFlY10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kaXNhYmxlIHx8IGRpc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzU3RlcCA9ICdiZy1bI2Y4ZjlmYV0gdGV4dC1bI2NkZDBkNl0nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICBkYXRhVmlldzogYFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gcm91bmRlZC1mdWxsIG1pbi13LVsyNHB4XSBtaW4taC1bMjRweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXItWzhweF0gJHtjbGFzc1N0ZXB9XCI+XG4gICAgICAgICAgICAgICAgICAgICR7c3RlcCA8PSAodGFicy5zdGVwQ29tcGxldGVkIHx8IC0xKSA/IGA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGVjayB0ZXh0LVsjZmZmZmZmXVwiPjwvaT5gIDogYCR7c3RlcH1gfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICBgLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBnZXRQb3BvdmVyOiAoaXRlbTogSVRhYnNJdGVtKSA9PiAoaXRlbS5pY29uTGVmdCA/IHsgY2xhc3NJbmNsdWRlOiAnZmxleCcsIGRhdGFWaWV3OiBgPGkgY2xhc3M9XCIke2l0ZW0uaWNvbkxlZnR9IHRleHQtWzE2cHhdIG1yLVs4cHhdXCI+PC9pPmAgfSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBnZXRDbGFzc0NvbDogKGl0ZW06IElUYWJzSXRlbSkgPT4gYGxpYnMtdWktZm9udC1oNm0gJHtpdGVtLmludmFsaWQgPyAnIXRleHQtWyNmMTU3NjddJyA6ICd0ZXh0LVsjNmE3MzgzXSd9YCxcbiAgICAgICAgICAgICAgZ2V0VmFsdWU6IChkYXRhOiBJRGF0YUZ1bmN0aW9uQ2FsbEluQ29uZmlnKSA9PiBvZihlc2NhcGVIdG1sKHRyYW5zbGF0ZS5pbnN0YW50KGRhdGEuaXRlbVtmaWVsZExhYmVsXSB8fCAnICcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBnZXRQb3BvdmVyOiAoaXRlbTogSVRhYnNJdGVtKSA9PiAoaXRlbS5wb3BvdmVyID8geyBjb25maWc6IGl0ZW0ucG9wb3ZlciB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGdldFBvcG92ZXI6IChpdGVtOiBJVGFic0l0ZW0pID0+IChpdGVtLmljb25SaWdodCA/IHsgY2xhc3NJbmNsdWRlOiAnZmxleCcsIGRhdGFWaWV3OiBgPGkgY2xhc3M9XCIke2l0ZW0uaWNvblJpZ2h0fSB0ZXh0LVsxNnB4XSBtbC1bOHB4XVwiPjwvaT5gIH0gOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZ2V0Q29uZmlnQmFkZ2U6IChpdGVtOiBJVGFic0l0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOaWwoaXRlbS5jb3VudCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6IGl0ZW0ubW9kZUNvdW50IHx8ICd4KycsXG4gICAgICAgICAgICAgICAgICBjb3VudDogaXRlbS5jb3VudCxcbiAgICAgICAgICAgICAgICAgIG1heENvdW50OiBpdGVtLm1heENvdW50IHx8IDk5LFxuICAgICAgICAgICAgICAgICAgY2xhc3NDaXJjbGU6IChpdGVtLmNsYXNzQ2lyY2xlIHx8ICdsaWJzLXVpLWZvbnQtaDVyJykgKyAoaXRlbS5pbnZhbGlkID8gJyAhdGV4dC1bI2YxNTc2N10gIWJnLVsjZmRlYWVjXScgOiAnJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0pLFxuICAgIH0pLFxuICB9O1xufTtcbiJdfQ==