@taiga-ui/kit
Version:
Taiga UI Angular main components kit
57 lines • 15.9 kB
JavaScript
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';
import { TuiControl } from '@taiga-ui/cdk/classes';
import { TUI_IS_ANDROID, TUI_IS_IOS } from '@taiga-ui/cdk/tokens';
import { tuiInjectElement, tuiIsPresent } from '@taiga-ui/cdk/utils';
import { tuiAsOptionContent } from '@taiga-ui/core/components/data-list';
import { TuiSelectLike, TuiTextfield, TuiTextfieldComponent, } from '@taiga-ui/core/components/textfield';
import { TUI_ITEMS_HANDLERS, } from '@taiga-ui/core/directives/items-handlers';
import { TuiDataListWrapper } from '@taiga-ui/kit/components/data-list-wrapper';
import { TuiInputChipDirective } from '@taiga-ui/kit/components/input-chip';
import { tuiIsFlat } from '@taiga-ui/kit/utils';
import { TuiMultiSelectOption } from '../multi-select-option/multi-select-option.component';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/kit/components/input-chip";
import * as i2 from "@taiga-ui/core/components/textfield";
import * as i3 from "@taiga-ui/kit/components/data-list-wrapper";
class TuiMultiSelectNative {
constructor() {
this.control = inject(TuiControl);
this.textfield = inject(TuiTextfieldComponent);
this.isFlat = tuiIsFlat;
this.handlers = inject(TUI_ITEMS_HANDLERS);
this.el = tuiInjectElement();
this.mobile = inject(TUI_IS_IOS) || (inject(TUI_IS_ANDROID) && 'showPicker' in this.el);
this.isSelected = computed((value = this.control.value()) => (x) => tuiIsPresent(value) &&
value.some((item) => this.handlers.identityMatcher()(x, item)));
this.items = [];
this.labels = [];
}
set placeholder(placeholder) {
this.textfield.fillerSetter = placeholder;
}
onInput() {
const items = this.items || [];
const options = Array.from(this.el.selectedOptions).map(({ index }) => index);
this.textfield.cva?.onChange(items.flat().filter((_, i) => options.includes(i)));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiMultiSelectNative, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiMultiSelectNative, isStandalone: true, selector: "select[tuiMultiSelect]", inputs: { items: "items", labels: "labels", placeholder: "placeholder" }, host: { attributes: { "multiple": "" }, listeners: { "click.stop.zoneless": "0", "input": "onInput()" }, properties: { "size": "mobile ? 1 : 2" } }, providers: [tuiAsOptionContent(TuiMultiSelectOption)], hostDirectives: [{ directive: i1.TuiInputChipDirective }, { directive: i2.TuiSelectLike }], ngImport: i0, template: "<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n <ng-container *ngIf=\"!mobile\">\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"items\"\n [labels]=\"labels\"\n />\n </ng-container>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n <ng-container *ngIf=\"!mobile\">\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"$any(items)\"\n />\n </ng-container>\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n [disabled]=\"handlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"handlers.stringify()(option)\"\n >\n {{ handlers.stringify()(option) }}\n </option>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: ["items", "disabledItemHandler", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "component", type: i3.TuiDataListGroupWrapperComponent, selector: "tui-data-list-wrapper[labels]", inputs: ["labels"] }, { kind: "directive", type: i2.TuiTextfieldDropdownDirective, selector: "ng-template[tuiTextfieldDropdown]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiMultiSelectNative };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiMultiSelectNative, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'select[tuiMultiSelect]', imports: [NgForOf, NgIf, NgTemplateOutlet, TuiDataListWrapper, TuiTextfield], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsOptionContent(TuiMultiSelectOption)], hostDirectives: [TuiInputChipDirective, TuiSelectLike], host: {
multiple: '',
'[size]': 'mobile ? 1 : 2',
'(click.stop.zoneless)': '0',
'(input)': 'onInput()',
}, template: "<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n <ng-container *ngIf=\"!mobile\">\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"items\"\n [labels]=\"labels\"\n />\n </ng-container>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n <ng-container *ngIf=\"!mobile\">\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"$any(items)\"\n />\n </ng-container>\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n [disabled]=\"handlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"handlers.stringify()(option)\"\n >\n {{ handlers.stringify()(option) }}\n </option>\n</ng-template>\n" }]
}], propDecorators: { items: [{
type: Input
}], labels: [{
type: Input
}], placeholder: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LW5hdGl2ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0LW5hdGl2ZS9tdWx0aS1zZWxlY3QtbmF0aXZlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QtbmF0aXZlL211bHRpLXNlbGVjdC1uYXRpdmUudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxhQUFhLEVBQ2IsWUFBWSxFQUNaLHFCQUFxQixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDSCxrQkFBa0IsR0FFckIsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sc0RBQXNELENBQUM7Ozs7O0FBRTFGLE1BZWEsb0JBQW9CO0lBZmpDO1FBZ0JxQixZQUFPLEdBQTZCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxjQUFTLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFeEMsV0FBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQixhQUFRLEdBQXdCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNELE9BQUUsR0FBRyxnQkFBZ0IsRUFBcUIsQ0FBQztRQUMzQyxXQUFNLEdBQ3JCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNELGVBQVUsR0FBRyxRQUFRLENBQ3BDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUksRUFBRSxFQUFFLENBQ0wsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6RSxDQUFDO1FBR0ssVUFBSyxHQUFzRCxFQUFFLENBQUM7UUFHOUQsV0FBTSxHQUFzQixFQUFFLENBQUM7S0FhekM7SUFYRyxJQUNXLFdBQVcsQ0FBQyxXQUFtQjtRQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVTLE9BQU87UUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDOytHQWpDUSxvQkFBb0I7bUdBQXBCLG9CQUFvQixvU0FUbEIsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLHNIQzNCekQsbXFDQXlDQSw0Q0RqQmMsT0FBTyxtSEFBRSxJQUFJLDZGQUFFLGdCQUFnQjs7U0FZaEMsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBZmhDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLHdCQUF3QixXQUN6QixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLG1CQUUzRCx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxrQkFDckMsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsUUFDaEQ7d0JBQ0YsUUFBUSxFQUFFLEVBQUU7d0JBQ1osUUFBUSxFQUFFLGdCQUFnQjt3QkFDMUIsdUJBQXVCLEVBQUUsR0FBRzt3QkFDNUIsU0FBUyxFQUFFLFdBQVc7cUJBQ3pCOzhCQW9CTSxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlLLFdBQVc7c0JBRHJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VHVpQ29udHJvbH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jbGFzc2VzJztcbmltcG9ydCB7VFVJX0lTX0FORFJPSUQsIFRVSV9JU19JT1N9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudCwgdHVpSXNQcmVzZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzJztcbmltcG9ydCB7dHVpQXNPcHRpb25Db250ZW50fSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2RhdGEtbGlzdCc7XG5pbXBvcnQge1xuICAgIFR1aVNlbGVjdExpa2UsXG4gICAgVHVpVGV4dGZpZWxkLFxuICAgIFR1aVRleHRmaWVsZENvbXBvbmVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHtcbiAgICBUVUlfSVRFTVNfSEFORExFUlMsXG4gICAgdHlwZSBUdWlJdGVtc0hhbmRsZXJzLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VHVpRGF0YUxpc3RXcmFwcGVyfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvZGF0YS1saXN0LXdyYXBwZXInO1xuaW1wb3J0IHtUdWlJbnB1dENoaXBEaXJlY3RpdmV9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9pbnB1dC1jaGlwJztcbmltcG9ydCB7dHVpSXNGbGF0fSBmcm9tICdAdGFpZ2EtdWkva2l0L3V0aWxzJztcblxuaW1wb3J0IHtUdWlNdWx0aVNlbGVjdE9wdGlvbn0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LW9wdGlvbi9tdWx0aS1zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzZWxlY3RbdHVpTXVsdGlTZWxlY3RdJyxcbiAgICBpbXBvcnRzOiBbTmdGb3JPZiwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgVHVpRGF0YUxpc3RXcmFwcGVyLCBUdWlUZXh0ZmllbGRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QtbmF0aXZlLnRlbXBsYXRlLmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW3R1aUFzT3B0aW9uQ29udGVudChUdWlNdWx0aVNlbGVjdE9wdGlvbildLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbVHVpSW5wdXRDaGlwRGlyZWN0aXZlLCBUdWlTZWxlY3RMaWtlXSxcbiAgICBob3N0OiB7XG4gICAgICAgIG11bHRpcGxlOiAnJyxcbiAgICAgICAgJ1tzaXplXSc6ICdtb2JpbGUgPyAxIDogMicsXG4gICAgICAgICcoY2xpY2suc3RvcC56b25lbGVzcyknOiAnMCcsXG4gICAgICAgICcoaW5wdXQpJzogJ29uSW5wdXQoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpTXVsdGlTZWxlY3ROYXRpdmU8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbDogVHVpQ29udHJvbDxyZWFkb25seSBUW10+ID0gaW5qZWN0KFR1aUNvbnRyb2wpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkID0gaW5qZWN0KFR1aVRleHRmaWVsZENvbXBvbmVudCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGbGF0ID0gdHVpSXNGbGF0O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBoYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQ8SFRNTFNlbGVjdEVsZW1lbnQ+KCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vYmlsZSA9XG4gICAgICAgIGluamVjdChUVUlfSVNfSU9TKSB8fCAoaW5qZWN0KFRVSV9JU19BTkRST0lEKSAmJiAnc2hvd1BpY2tlcicgaW4gdGhpcy5lbCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTZWxlY3RlZCA9IGNvbXB1dGVkKFxuICAgICAgICAodmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWUoKSkgPT5cbiAgICAgICAgICAgICh4OiBUKSA9PlxuICAgICAgICAgICAgICAgIHR1aUlzUHJlc2VudCh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5zb21lKChpdGVtKSA9PiB0aGlzLmhhbmRsZXJzLmlkZW50aXR5TWF0Y2hlcigpKHgsIGl0ZW0pKSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgVFtdPiB8IHJlYWRvbmx5IFRbXSB8IG51bGwgPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBwbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGV4dGZpZWxkLmZpbGxlclNldHRlciA9IHBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbklucHV0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuZWwuc2VsZWN0ZWRPcHRpb25zKS5tYXAoKHtpbmRleH0pID0+IGluZGV4KTtcblxuICAgICAgICB0aGlzLnRleHRmaWVsZC5jdmE/Lm9uQ2hhbmdlKGl0ZW1zLmZsYXQoKS5maWx0ZXIoKF8sIGkpID0+IG9wdGlvbnMuaW5jbHVkZXMoaSkpKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXMgJiYgIWlzRmxhdChpdGVtcyk7IGVsc2UgZmxhdEl0ZW1zXCI+XG4gICAgPG9wdGdyb3VwXG4gICAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBsYWJlbHM7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgW2xhYmVsXT1cImxhYmVsc1tpbmRleF1cIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wdGlvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW1zW2luZGV4XX1cIiAvPlxuICAgIDwvb3B0Z3JvdXA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGVcIj5cbiAgICAgICAgPHR1aS1kYXRhLWxpc3Qtd3JhcHBlclxuICAgICAgICAgICAgKnR1aVRleHRmaWVsZERyb3Bkb3duXG4gICAgICAgICAgICBuZXdcbiAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXG4gICAgICAgICAgICBbbGFiZWxzXT1cImxhYmVsc1wiXG4gICAgICAgIC8+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNmbGF0SXRlbXM+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wdGlvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW1zfVwiIC8+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGVcIj5cbiAgICAgICAgPHR1aS1kYXRhLWxpc3Qtd3JhcHBlclxuICAgICAgICAgICAgKnR1aVRleHRmaWVsZERyb3Bkb3duXG4gICAgICAgICAgICBuZXdcbiAgICAgICAgICAgIFtpdGVtc109XCIkYW55KGl0ZW1zKVwiXG4gICAgICAgIC8+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAjb3B0aW9uc1xuICAgIGxldC1pdGVtc1xuPlxuICAgIDxvcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBpdGVtc1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJoYW5kbGVycy5kaXNhYmxlZEl0ZW1IYW5kbGVyKCkob3B0aW9uKVwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKCkob3B0aW9uKVwiXG4gICAgICAgIFt2YWx1ZV09XCJoYW5kbGVycy5zdHJpbmdpZnkoKShvcHRpb24pXCJcbiAgICA+XG4gICAgICAgIHt7IGhhbmRsZXJzLnN0cmluZ2lmeSgpKG9wdGlvbikgfX1cbiAgICA8L29wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=