UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

69 lines 21.8 kB
import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, inject, Input, TemplateRef, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { EMPTY_QUERY } from '@taiga-ui/cdk/constants'; import { TuiItem } from '@taiga-ui/cdk/directives/item'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiDataList } from '@taiga-ui/core/components/data-list'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { tuiLinkOptionsProvider } from '@taiga-ui/core/components/link'; import { TuiDropdown } from '@taiga-ui/core/directives/dropdown'; import { tuiHintOptionsProvider } from '@taiga-ui/core/directives/hint'; import { TUI_COMMON_ICONS } from '@taiga-ui/core/tokens'; import { TuiItemsWithMore } from '@taiga-ui/kit/components/items-with-more'; import { TUI_MORE_WORD } from '@taiga-ui/kit/tokens'; import { TUI_BREADCRUMBS_OPTIONS } from './breadcrumbs.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/data-list"; import * as i2 from "@taiga-ui/core/directives/dropdown"; import * as i3 from "@taiga-ui/kit/components/items-with-more"; import * as i4 from "@taiga-ui/cdk/directives/item"; class TuiBreadcrumbs { constructor() { this.items = EMPTY_QUERY; this.options = inject(TUI_BREADCRUMBS_OPTIONS); this.icons = inject(TUI_COMMON_ICONS); this.more = toSignal(inject(TUI_MORE_WORD), { initialValue: '' }); this.size = this.options.size; this.itemsLimit = this.options.itemsLimit; } get limit() { return this.itemsLimit ? this.itemsLimit - 2 : Infinity; } get offset() { return this.itemsLimit === 2 ? 1 : 0; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiBreadcrumbs, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiBreadcrumbs, isStandalone: true, selector: "tui-breadcrumbs", inputs: { size: "size", itemsLimit: "itemsLimit" }, host: { properties: { "attr.data-size": "size" } }, providers: [ tuiLinkOptionsProvider({ appearance: 'action-grayscale' }), tuiHintOptionsProvider({ direction: 'bottom' }), ], queries: [{ propertyName: "items", predicate: TuiItem, read: TemplateRef }], ngImport: i0, template: "<ng-container *ngIf=\"items.changes | async\" />\n<ng-container *ngIf=\"itemsLimit > 1; else plain\">\n <ng-container *ngIf=\"itemsLimit !== 2\">\n <ng-container [ngTemplateOutlet]=\"items.first\" />\n <ng-container [ngTemplateOutlet]=\"separator\" />\n </ng-container>\n <tui-items-with-more\n side=\"start\"\n [itemsLimit]=\"itemsLimit - 2\"\n [required]=\"items.length + offset - 2\"\n >\n <ng-container *ngFor=\"let item of items; let last = last\">\n <ng-container *ngIf=\"item !== items.first || itemsLimit === 2\">\n <ng-container *tuiItem>\n <ng-container [ngTemplateOutlet]=\"item\" />\n <ng-container\n *ngIf=\"!last\"\n [ngTemplateOutlet]=\"separator\"\n />\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template\n let-index\n tuiMore\n >\n <span class=\"t-more\">\n <button\n appearance=\"flat\"\n size=\"xs\"\n tuiDropdownOpen\n tuiIconButton\n type=\"button\"\n [iconStart]=\"icons.ellipsis\"\n [tuiDropdown]=\"dropdown\"\n >\n {{ more() }}\n </button>\n <ng-container [ngTemplateOutlet]=\"separator\" />\n </span>\n <ng-template #dropdown>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items; let i = index\">\n <span\n *ngIf=\"i + offset && i <= index && item !== items.last\"\n tuiOption\n class=\"t-option\"\n >\n <ng-container [ngTemplateOutlet]=\"item\" />\n </span>\n </ng-container>\n </tui-data-list>\n </ng-template>\n </ng-template>\n </tui-items-with-more>\n</ng-container>\n<ng-template #separator>\n <tui-icon\n *ngIf=\"options.icon.length > 1; else char\"\n class=\"t-icon\"\n [icon]=\"options.icon\"\n />\n <ng-template #char>\n <span class=\"t-char\">{{ options.icon }}</span>\n </ng-template>\n</ng-template>\n<ng-template #plain>\n <ng-container *ngFor=\"let item of items; let last = last\">\n <ng-container [ngTemplateOutlet]=\"item\" />\n <ng-container\n *ngIf=\"!last\"\n [ngTemplateOutlet]=\"separator\"\n />\n </ng-container>\n</ng-template>\n", styles: [":host{display:flex;align-items:center;white-space:nowrap;color:var(--tui-text-secondary)}:host[data-size=m]{font:var(--tui-font-text-s);line-height:1.5rem;block-size:1.5rem}:host[data-size=l]{font:var(--tui-font-text-m);line-height:2.5rem;block-size:2.5rem}.t-more{display:flex;align-items:center}.t-option ::ng-deep>*{color:var(--tui-text-primary)!important;background:transparent!important}.t-icon{margin:0 .5rem;font-size:1rem}.t-char{margin:0 .375rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { 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: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i2.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i2.TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "component", type: i3.TuiItemsWithMoreComponent, selector: "tui-items-with-more" }, { kind: "directive", type: i3.TuiMore, selector: "[tuiMore]" }, { kind: "directive", type: i4.TuiItem, selector: "[tuiItem]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiBreadcrumbs }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiBreadcrumbs, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-breadcrumbs', imports: [ AsyncPipe, NgForOf, NgIf, NgTemplateOutlet, TuiButton, TuiDataList, TuiDropdown, TuiIcon, TuiItemsWithMore, ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ tuiLinkOptionsProvider({ appearance: 'action-grayscale' }), tuiHintOptionsProvider({ direction: 'bottom' }), ], host: { '[attr.data-size]': 'size', }, template: "<ng-container *ngIf=\"items.changes | async\" />\n<ng-container *ngIf=\"itemsLimit > 1; else plain\">\n <ng-container *ngIf=\"itemsLimit !== 2\">\n <ng-container [ngTemplateOutlet]=\"items.first\" />\n <ng-container [ngTemplateOutlet]=\"separator\" />\n </ng-container>\n <tui-items-with-more\n side=\"start\"\n [itemsLimit]=\"itemsLimit - 2\"\n [required]=\"items.length + offset - 2\"\n >\n <ng-container *ngFor=\"let item of items; let last = last\">\n <ng-container *ngIf=\"item !== items.first || itemsLimit === 2\">\n <ng-container *tuiItem>\n <ng-container [ngTemplateOutlet]=\"item\" />\n <ng-container\n *ngIf=\"!last\"\n [ngTemplateOutlet]=\"separator\"\n />\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template\n let-index\n tuiMore\n >\n <span class=\"t-more\">\n <button\n appearance=\"flat\"\n size=\"xs\"\n tuiDropdownOpen\n tuiIconButton\n type=\"button\"\n [iconStart]=\"icons.ellipsis\"\n [tuiDropdown]=\"dropdown\"\n >\n {{ more() }}\n </button>\n <ng-container [ngTemplateOutlet]=\"separator\" />\n </span>\n <ng-template #dropdown>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items; let i = index\">\n <span\n *ngIf=\"i + offset && i <= index && item !== items.last\"\n tuiOption\n class=\"t-option\"\n >\n <ng-container [ngTemplateOutlet]=\"item\" />\n </span>\n </ng-container>\n </tui-data-list>\n </ng-template>\n </ng-template>\n </tui-items-with-more>\n</ng-container>\n<ng-template #separator>\n <tui-icon\n *ngIf=\"options.icon.length > 1; else char\"\n class=\"t-icon\"\n [icon]=\"options.icon\"\n />\n <ng-template #char>\n <span class=\"t-char\">{{ options.icon }}</span>\n </ng-template>\n</ng-template>\n<ng-template #plain>\n <ng-container *ngFor=\"let item of items; let last = last\">\n <ng-container [ngTemplateOutlet]=\"item\" />\n <ng-container\n *ngIf=\"!last\"\n [ngTemplateOutlet]=\"separator\"\n />\n </ng-container>\n</ng-template>\n", styles: [":host{display:flex;align-items:center;white-space:nowrap;color:var(--tui-text-secondary)}:host[data-size=m]{font:var(--tui-font-text-s);line-height:1.5rem;block-size:1.5rem}:host[data-size=l]{font:var(--tui-font-text-m);line-height:2.5rem;block-size:2.5rem}.t-more{display:flex;align-items:center}.t-option ::ng-deep>*{color:var(--tui-text-primary)!important;background:transparent!important}.t-icon{margin:0 .5rem;font-size:1rem}.t-char{margin:0 .375rem}\n"] }] }], propDecorators: { items: [{ type: ContentChildren, args: [TuiItem, { read: TemplateRef }] }], size: [{ type: Input }], itemsLimit: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvYnJlYWRjcnVtYnMvYnJlYWRjcnVtYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvYnJlYWRjcnVtYnMvYnJlYWRjcnVtYnMudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsTUFBTSxFQUNOLEtBQUssRUFDTCxXQUFXLEdBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7O0FBRTlELE1BeUJhLGNBQWM7SUF6QjNCO1FBMkJ1QixVQUFLLEdBQ3BCLFdBQVcsQ0FBQztRQUVHLFlBQU8sR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMxQyxVQUFLLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakMsU0FBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBQyxZQUFZLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUd2RSxTQUFJLEdBQWtDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBR3hELGVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztLQVMvQztJQVBHLElBQWMsS0FBSztRQUNmLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBYyxNQUFNO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7K0dBckJRLGNBQWM7bUdBQWQsY0FBYyxzS0FSWjtZQUNQLHNCQUFzQixDQUFDLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLENBQUM7WUFDeEQsc0JBQXNCLENBQUMsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUM7U0FDaEQsZ0RBTWdCLE9BQU8sUUFBUyxXQUFXLDZCQ3BEaEQsa3RGQTJFQSw4ZkQ3Q1EsU0FBUyw4Q0FDVCxPQUFPLG1IQUNQLElBQUksNkZBQ0osZ0JBQWdCLG9KQUNoQixTQUFTLHduQkFHVCxPQUFPOztTQWNGLGNBQWM7NEZBQWQsY0FBYztrQkF6QjFCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLGlCQUFpQixXQUNsQjt3QkFDTCxTQUFTO3dCQUNULE9BQU87d0JBQ1AsSUFBSTt3QkFDSixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsV0FBVzt3QkFDWCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsZ0JBQWdCO3FCQUNuQixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCxzQkFBc0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxDQUFDO3dCQUN4RCxzQkFBc0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQztxQkFDaEQsUUFDSzt3QkFDRixrQkFBa0IsRUFBRSxNQUFNO3FCQUM3Qjs4QkFJa0IsS0FBSztzQkFEdkIsZUFBZTt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDO2dCQVN0QyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHR5cGUge1F1ZXJ5TGlzdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7RU1QVFlfUVVFUll9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7VHVpSXRlbX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9kaXJlY3RpdmVzL2l0ZW0nO1xuaW1wb3J0IHtUdWlCdXR0b259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7VHVpRGF0YUxpc3R9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7VHVpSWNvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7dHVpTGlua09wdGlvbnNQcm92aWRlcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9saW5rJztcbmltcG9ydCB7VHVpRHJvcGRvd259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvZHJvcGRvd24nO1xuaW1wb3J0IHt0dWlIaW50T3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2hpbnQnO1xuaW1wb3J0IHtUVUlfQ09NTU9OX0lDT05TfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtUdWlJdGVtc1dpdGhNb3JlfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvaXRlbXMtd2l0aC1tb3JlJztcbmltcG9ydCB7VFVJX01PUkVfV09SRH0gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuXG5pbXBvcnQgdHlwZSB7VHVpQnJlYWRjcnVtYnNPcHRpb25zfSBmcm9tICcuL2JyZWFkY3J1bWJzLm9wdGlvbnMnO1xuaW1wb3J0IHtUVUlfQlJFQURDUlVNQlNfT1BUSU9OU30gZnJvbSAnLi9icmVhZGNydW1icy5vcHRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1icmVhZGNydW1icycsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIE5nRm9yT2YsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFR1aUJ1dHRvbixcbiAgICAgICAgVHVpRGF0YUxpc3QsXG4gICAgICAgIFR1aURyb3Bkb3duLFxuICAgICAgICBUdWlJY29uLFxuICAgICAgICBUdWlJdGVtc1dpdGhNb3JlLFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JyZWFkY3J1bWJzLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2JyZWFkY3J1bWJzLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpTGlua09wdGlvbnNQcm92aWRlcih7YXBwZWFyYW5jZTogJ2FjdGlvbi1ncmF5c2NhbGUnfSksXG4gICAgICAgIHR1aUhpbnRPcHRpb25zUHJvdmlkZXIoe2RpcmVjdGlvbjogJ2JvdHRvbSd9KSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLmRhdGEtc2l6ZV0nOiAnc2l6ZScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQnJlYWRjcnVtYnMge1xuICAgIEBDb250ZW50Q2hpbGRyZW4oVHVpSXRlbSwge3JlYWQ6IFRlbXBsYXRlUmVmfSlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+ID1cbiAgICAgICAgRU1QVFlfUVVFUlk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfQlJFQURDUlVNQlNfT1BUSU9OUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtb3JlID0gdG9TaWduYWwoaW5qZWN0KFRVSV9NT1JFX1dPUkQpLCB7aW5pdGlhbFZhbHVlOiAnJ30pO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2l6ZTogVHVpQnJlYWRjcnVtYnNPcHRpb25zWydzaXplJ10gPSB0aGlzLm9wdGlvbnMuc2l6ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zTGltaXQgPSB0aGlzLm9wdGlvbnMuaXRlbXNMaW1pdDtcblxuICAgIHByb3RlY3RlZCBnZXQgbGltaXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNMaW1pdCA/IHRoaXMuaXRlbXNMaW1pdCAtIDIgOiBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IG9mZnNldCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc0xpbWl0ID09PSAyID8gMSA6IDA7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1zLmNoYW5nZXMgfCBhc3luY1wiIC8+XG48bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXNMaW1pdCA+IDE7IGVsc2UgcGxhaW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXNMaW1pdCAhPT0gMlwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1zLmZpcnN0XCIgLz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZXBhcmF0b3JcIiAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx0dWktaXRlbXMtd2l0aC1tb3JlXG4gICAgICAgIHNpZGU9XCJzdGFydFwiXG4gICAgICAgIFtpdGVtc0xpbWl0XT1cIml0ZW1zTGltaXQgLSAyXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cIml0ZW1zLmxlbmd0aCArIG9mZnNldCAtIDJcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSAhPT0gaXRlbXMuZmlyc3QgfHwgaXRlbXNMaW1pdCA9PT0gMlwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnR1aUl0ZW0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWxhc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBsZXQtaW5kZXhcbiAgICAgICAgICAgIHR1aU1vcmVcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0LW1vcmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICAgICAgdHVpRHJvcGRvd25PcGVuXG4gICAgICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uU3RhcnRdPVwiaWNvbnMuZWxsaXBzaXNcIlxuICAgICAgICAgICAgICAgICAgICBbdHVpRHJvcGRvd25dPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgbW9yZSgpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZXBhcmF0b3JcIiAvPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCBzaXplPVwic1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSArIG9mZnNldCAmJiBpIDw9IGluZGV4ICYmIGl0ZW0gIT09IGl0ZW1zLmxhc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90dWktaXRlbXMtd2l0aC1tb3JlPlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI3NlcGFyYXRvcj5cbiAgICA8dHVpLWljb25cbiAgICAgICAgKm5nSWY9XCJvcHRpb25zLmljb24ubGVuZ3RoID4gMTsgZWxzZSBjaGFyXCJcbiAgICAgICAgY2xhc3M9XCJ0LWljb25cIlxuICAgICAgICBbaWNvbl09XCJvcHRpb25zLmljb25cIlxuICAgIC8+XG4gICAgPG5nLXRlbXBsYXRlICNjaGFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInQtY2hhclwiPnt7IG9wdGlvbnMuaWNvbiB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcGxhaW4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVwiIC8+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIWxhc3RcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VwYXJhdG9yXCJcbiAgICAgICAgLz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=