UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

170 lines 29.8 kB
import { Component, ViewChildren } from '@angular/core'; import { SortType } from '@nakedobjects/view-models'; import { safeUnsubscribe } from '../helpers-components'; import { PaneComponent } from '../pane/pane'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@nakedobjects/services"; import * as i3 from "@nakedobjects/view-models"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/drag-drop"; import * as i6 from "../action-bar/action-bar.component"; import * as i7 from "../row/row.component"; export class RecentComponent extends PaneComponent { viewModelFactory; dragAndDrop; constructor(activatedRoute, urlManager, context, viewModelFactory, dragAndDrop) { super(activatedRoute, urlManager, context); this.viewModelFactory = viewModelFactory; this.dragAndDrop = dragAndDrop; } clearButton = { value: 'Clear All', doClick: () => this.clear(), show: () => true, disabled: () => this.clearDisabled(), tempDisabled: () => null, title: () => this.getMessage(this.clearDisabled(), 'clearAll'), accesskey: 'c', presentationHint: '', showDialog: () => false }; clearSelectedButton = { value: 'Clear Selected', doClick: () => this.clearSelected(), show: () => true, disabled: () => this.clearSelectedDisabled(), tempDisabled: () => null, title: () => this.getMessage(this.clearSelectedDisabled(), 'clearSelected'), accesskey: null, presentationHint: '', showDialog: () => false }; sortByUsageButton = { value: 'Sort by Usage', doClick: () => this.sortByUsage(), show: () => true, disabled: () => this.sortByUsageDisabled(), tempDisabled: () => null, title: () => this.getMessage(this.sortByUsageDisabled(), 'sortUsage'), accesskey: null, presentationHint: '', showDialog: () => false }; sortByTypeButton = { value: 'Sort by Type', doClick: () => this.sortByType(), show: () => true, disabled: () => this.sortByTypeDisabled(), tempDisabled: () => null, title: () => this.getMessage(this.sortByTypeDisabled(), 'sortType'), accesskey: null, presentationHint: '', showDialog: () => false }; sortByTitleButton = { value: 'Sort by Title', doClick: () => this.sortByTitle(), show: () => true, disabled: () => this.sortByTitleDisabled(), tempDisabled: () => null, title: () => this.getMessage(this.sortByTitleDisabled(), 'sortTitle'), accesskey: null, presentationHint: '', showDialog: () => false }; actionChildren; sub; ddSub; dropZones = []; recent; paneRouteData; // template API title = ''; items = () => this.recent?.items || []; get actionHolders() { return [this.sortByUsageButton, this.sortByTypeButton, this.sortByTitleButton, this.clearSelectedButton, this.clearButton]; } hasItems() { return this.recent && this.recent.items.length > 0; } clear() { this.recent?.clear(); } clearDisabled() { return this.recent?.items.length === 0 ? true : null; } clearSelected() { this.recent?.clearSelected(this.paneRouteData); } clearSelectedDisabled() { return !this.paneRouteData?.selectedCollectionItems?.['']?.reduce((p, c) => p || c); } sortByUsage() { this.recent?.sort(SortType.ByUsage); } sortByUsageDisabled() { return this.recent?.currentSortType === SortType.ByUsage; } sortByType() { this.recent?.sort(SortType.ByType); } sortByTypeDisabled() { return this.recent?.currentSortType === SortType.ByType; } sortByTitle() { this.recent?.sort(SortType.ByTitle); } sortByTitleDisabled() { return this.recent?.currentSortType === SortType.ByTitle; } getMessage(disabled, holder) { switch (holder) { case 'clearAll': return this.recent?.getRecentMessage(!!disabled) || ''; case 'clearSelected': return disabled ? 'Nothing selected' : 'Clear selected items'; case 'sortType': return disabled ? 'Currently sorted by Type' : 'Sort by Type'; case 'sortTitle': return disabled ? 'Currently sorted by Title' : 'Sort by Title'; case 'sortUsage': return disabled ? 'Currently sorted by when last used' : 'Sort by when last used'; } return ''; } setup(routeData) { this.paneRouteData = routeData; if (!this.recent) { this.recent = this.viewModelFactory.recentItemsViewModel(this.paneId); this.title = this.recent.title; } } focusOnFirstRow(rows) { if (rows && rows.first) { // until first element returns true rows.first.focus(); } } ngAfterViewInit() { this.focusOnFirstRow(this.actionChildren); this.sub = this.actionChildren?.changes.subscribe((ql) => this.focusOnFirstRow(ql)); } setDropZones(ids) { setTimeout(() => this.dropZones = ids); } ngOnInit() { this.ddSub = this.dragAndDrop.dropZoneIds$.subscribe(ids => this.setDropZones(ids || [])); super.ngOnInit(); } ngOnDestroy() { safeUnsubscribe(this.sub); safeUnsubscribe(this.ddSub); super.ngOnDestroy(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RecentComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UrlManagerService }, { token: i2.ContextService }, { token: i3.ViewModelFactoryService }, { token: i3.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RecentComponent, selector: "nof-recent", viewQueries: [{ propertyName: "actionChildren", predicate: ["row"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n <div class=\"recent\">\n <div class=\"header\">\n <div class=\"title\">{{title}}</div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n <ng-container *ngIf=\"hasItems()\">\n <div class=\"collection\">\n <table>\n <tbody cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr #row *ngFor=\"let item of items(); let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"true\" [isTable]=\"true\"></tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n </div>\n</div>\n<router-outlet (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n", styles: [".recent{padding-left:var(--space-5);height:100%;overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);font-size:var(--font-size-4);font-weight:var(--font-weight-2);background-color:var(--header-background-color)}.title{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.collection{display:block}table{font-size:var(--font-size-2);font-weight:var(--font-weight-2)}tr{cursor:pointer}th,td{font-weight:var(--font-weight-1);text-align:left;padding-left:var(--space-3);padding-right:var(--space-3);vertical-align:top}tbody .number{text-align:right}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i6.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }, { kind: "component", type: i7.RowComponent, selector: "[nof-row]", inputs: ["item", "row", "withCheckbox", "isTable"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RecentComponent, decorators: [{ type: Component, args: [{ selector: 'nof-recent', template: "<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n <div class=\"recent\">\n <div class=\"header\">\n <div class=\"title\">{{title}}</div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n <ng-container *ngIf=\"hasItems()\">\n <div class=\"collection\">\n <table>\n <tbody cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr #row *ngFor=\"let item of items(); let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"true\" [isTable]=\"true\"></tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n </div>\n</div>\n<router-outlet (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n", styles: [".recent{padding-left:var(--space-5);height:100%;overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);font-size:var(--font-size-4);font-weight:var(--font-weight-2);background-color:var(--header-background-color)}.title{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.collection{display:block}table{font-size:var(--font-size-2);font-weight:var(--font-weight-2)}tr{cursor:pointer}th,td{font-weight:var(--font-weight-1);text-align:left;padding-left:var(--space-3);padding-right:var(--space-3);vertical-align:top}tbody .number{text-align:right}\n"] }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.UrlManagerService }, { type: i2.ContextService }, { type: i3.ViewModelFactoryService }, { type: i3.DragAndDropService }], propDecorators: { actionChildren: [{ type: ViewChildren, args: ['row'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2dlbWluaS9zcmMvcmVjZW50L3JlY2VudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL3JlY2VudC9yZWNlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQXdCLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUdyRyxPQUFPLEVBQTBGLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7QUFRN0MsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQVF6QjtJQUNBO0lBTHJCLFlBQ0ksY0FBOEIsRUFDOUIsVUFBNkIsRUFDN0IsT0FBdUIsRUFDTixnQkFBeUMsRUFDekMsV0FBK0I7UUFFaEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFIMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUN6QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFHcEQsQ0FBQztJQUVPLFdBQVcsR0FBa0I7UUFDakMsS0FBSyxFQUFFLFdBQVc7UUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDM0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7UUFDaEIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDcEMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7UUFDeEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxF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VztRQUNoQixlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7dUdBdExRLGVBQWU7MkZBQWYsZUFBZSxtS0NmNUIsZzRCQWtCQTs7MkZESGEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDSSxZQUFZO3VOQWdGdEIsY0FBYztzQkFEYixZQUFZO3VCQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE9uRGVzdHJveSwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4sIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29udGV4dFNlcnZpY2UsIFBhbmVSb3V0ZURhdGEsIFVybE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnQG5ha2Vkb2JqZWN0cy9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWNlbnRJdGVtc1ZpZXdNb2RlbCwgUmVjZW50SXRlbVZpZXdNb2RlbCwgVmlld01vZGVsRmFjdG9yeVNlcnZpY2UsIERyYWdBbmREcm9wU2VydmljZSwgU29ydFR5cGUgfSBmcm9tICdAbmFrZWRvYmplY3RzL3ZpZXctbW9kZWxzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbkxpa2UgYXMgSVN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUFjdGlvbkhvbGRlciB9IGZyb20gJy4uL2FjdGlvbi9hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IHNhZmVVbnN1YnNjcmliZSB9IGZyb20gJy4uL2hlbHBlcnMtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFuZS9wYW5lJztcbmltcG9ydCB7IFJvd0NvbXBvbmVudCB9IGZyb20gJy4uL3Jvdy9yb3cuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdub2YtcmVjZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3JlY2VudC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ3JlY2VudC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVjZW50Q29tcG9uZW50IGV4dGVuZHMgUGFuZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgIFxuXG4gICBcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICB1cmxNYW5hZ2VyOiBVcmxNYW5hZ2VyU2VydmljZSxcbiAgICAgICAgY29udGV4dDogQ29udGV4dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld01vZGVsRmFjdG9yeTogVmlld01vZGVsRmFjdG9yeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0FuZERyb3A6IERyYWdBbmREcm9wU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihhY3RpdmF0ZWRSb3V0ZSwgdXJsTWFuYWdlciwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdDbGVhciBBbGwnLFxuICAgICAgICBkb0NsaWNrOiAoKSA9PiB0aGlzLmNsZWFyKCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmNsZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgdGVtcERpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0aXRsZTogKCkgPT4gdGhpcy5nZXRNZXNzYWdlKHRoaXMuY2xlYXJEaXNhYmxlZCgpLCAnY2xlYXJBbGwnKSxcbiAgICAgICAgYWNjZXNza2V5OiAnYycsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNsZWFyU2VsZWN0ZWRCdXR0b246IElBY3Rpb25Ib2xkZXIgPSB7XG4gICAgICAgIHZhbHVlOiAnQ2xlYXIgU2VsZWN0ZWQnLFxuICAgICAgICBkb0NsaWNrOiAoKSA9PiB0aGlzLmNsZWFyU2VsZWN0ZWQoKSxcbiAgICAgICAgc2hvdzogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMuY2xlYXJTZWxlY3RlZERpc2FibGVkKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+IHRoaXMuZ2V0TWVzc2FnZSh0aGlzLmNsZWFyU2VsZWN0ZWREaXNhYmxlZCgpLCAnY2xlYXJTZWxlY3RlZCcpLFxuICAgICAgICBhY2Nlc3NrZXk6IG51bGwsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIHNvcnRCeVVzYWdlQnV0dG9uOiBJQWN0aW9uSG9sZGVyID0ge1xuICAgICAgICB2YWx1ZTogJ1NvcnQgYnkgVXNhZ2UnLFxuICAgICAgICBkb0NsaWNrOiAoKSA9PiB0aGlzLnNvcnRCeVVzYWdlKCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLnNvcnRCeVVzYWdlRGlzYWJsZWQoKSxcbiAgICAgICAgdGVtcERpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0aXRsZTogKCkgPT4gdGhpcy5nZXRNZXNzYWdlKHRoaXMuc29ydEJ5VXNhZ2VEaXNhYmxlZCgpLCAnc29ydFVzYWdlJyksXG4gICAgICAgIGFjY2Vzc2tleTogbnVsbCxcbiAgICAgICAgcHJlc2VudGF0aW9uSGludDogJycsXG4gICAgICAgIHNob3dEaWFsb2c6ICgpID0+IGZhbHNlXG4gICAgfTtcblxuICAgIHByaXZhdGUgc29ydEJ5VHlwZUJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdTb3J0IGJ5IFR5cGUnLFxuICAgICAgICBkb0NsaWNrOiAoKSA9PiB0aGlzLnNvcnRCeVR5cGUoKSxcbiAgICAgICAgc2hvdzogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMuc29ydEJ5VHlwZURpc2FibGVkKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+IHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnNvcnRCeVR5cGVEaXNhYmxlZCgpLCAnc29ydFR5cGUnKSxcbiAgICAgICAgYWNjZXNza2V5OiBudWxsLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzb3J0QnlUaXRsZUJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdTb3J0IGJ5IFRpdGxlJyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy5zb3J0QnlUaXRsZSgpLFxuICAgICAgICBzaG93OiAoKSA9PiB0cnVlLFxuICAgICAgICBkaXNhYmxlZDogKCkgPT4gdGhpcy5zb3J0QnlUaXRsZURpc2FibGVkKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+IHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnNvcnRCeVRpdGxlRGlzYWJsZWQoKSwgJ3NvcnRUaXRsZScpLFxuICAgICAgICBhY2Nlc3NrZXk6IG51bGwsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3JvdycpXG4gICAgYWN0aW9uQ2hpbGRyZW4/OiBRdWVyeUxpc3Q8Um93Q29tcG9uZW50PjtcblxuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGRkU3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBkcm9wWm9uZXM6IHN0cmluZ1tdID0gW107XG4gICAgcmVjZW50PzogUmVjZW50SXRlbXNWaWV3TW9kZWw7XG4gICAgcGFuZVJvdXRlRGF0YT86IFBhbmVSb3V0ZURhdGE7XG5cbiAgICAvLyB0ZW1wbGF0ZSBBUElcblxuICAgIHRpdGxlID0gJyc7XG4gICAgaXRlbXMgPSAoKTogUmVjZW50SXRlbVZpZXdNb2RlbFtdID0+IHRoaXMucmVjZW50Py5pdGVtcyB8fCBbXTtcblxuICAgIGdldCBhY3Rpb25Ib2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuc29ydEJ5VXNhZ2VCdXR0b24sIHRoaXMuc29ydEJ5VHlwZUJ1dHRvbiwgdGhpcy5zb3J0QnlUaXRsZUJ1dHRvbiwgdGhpcy5jbGVhclNlbGVjdGVkQnV0dG9uLCB0aGlzLmNsZWFyQnV0dG9uXTtcbiAgICB9XG5cbiAgICBoYXNJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjZW50ICYmIHRoaXMucmVjZW50Lml0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5yZWNlbnQ/LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlbnQ/Lml0ZW1zLmxlbmd0aCA9PT0gMCA/IHRydWUgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJTZWxlY3RlZCgpIHtcbiAgICAgICAgdGhpcy5yZWNlbnQ/LmNsZWFyU2VsZWN0ZWQodGhpcy5wYW5lUm91dGVEYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU2VsZWN0ZWREaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhbmVSb3V0ZURhdGE/LnNlbGVjdGVkQ29sbGVjdGlvbkl0ZW1zPy5bJyddPy5yZWR1Y2UoKHAsIGMpID0+IHAgfHwgYyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0QnlVc2FnZSgpIHtcbiAgICAgICAgdGhpcy5yZWNlbnQ/LnNvcnQoU29ydFR5cGUuQnlVc2FnZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0QnlVc2FnZURpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlbnQ/LmN1cnJlbnRTb3J0VHlwZSA9PT0gU29ydFR5cGUuQnlVc2FnZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNvcnRCeVR5cGUoKSB7XG4gICAgICAgIHRoaXMucmVjZW50Py5zb3J0KFNvcnRUeXBlLkJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0QnlUeXBlRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY2VudD8uY3VycmVudFNvcnRUeXBlID09PSBTb3J0VHlwZS5CeVR5cGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0QnlUaXRsZSgpIHtcbiAgICAgICAgdGhpcy5yZWNlbnQ/LnNvcnQoU29ydFR5cGUuQnlUaXRsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0QnlUaXRsZURpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlbnQ/LmN1cnJlbnRTb3J0VHlwZSA9PT0gU29ydFR5cGUuQnlUaXRsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1lc3NhZ2UoZGlzYWJsZWQ6IGJvb2xlYW4gfCBudWxsLCBob2xkZXI6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKGhvbGRlcikge1xuICAgICAgICAgICAgY2FzZSAnY2xlYXJBbGwnOiByZXR1cm4gdGhpcy5yZWNlbnQ/LmdldFJlY2VudE1lc3NhZ2UoISFkaXNhYmxlZCkgfHwgJyc7XG4gICAgICAgICAgICBjYXNlICdjbGVhclNlbGVjdGVkJzogcmV0dXJuIGRpc2FibGVkID8gJ05vdGhpbmcgc2VsZWN0ZWQnIDogJ0NsZWFyIHNlbGVjdGVkIGl0ZW1zJztcbiAgICAgICAgICAgIGNhc2UgJ3NvcnRUeXBlJzogcmV0dXJuIGRpc2FibGVkID8gJ0N1cnJlbnRseSBzb3J0ZWQgYnkgVHlwZScgOiAnU29ydCBieSBUeXBlJztcbiAgICAgICAgICAgIGNhc2UgJ3NvcnRUaXRsZSc6IHJldHVybiBkaXNhYmxlZCA/ICdDdXJyZW50bHkgc29ydGVkIGJ5IFRpdGxlJyA6ICdTb3J0IGJ5IFRpdGxlJztcbiAgICAgICAgICAgIGNhc2UgJ3NvcnRVc2FnZSc6IHJldHVybiBkaXNhYmxlZCA/ICdDdXJyZW50bHkgc29ydGVkIGJ5IHdoZW4gbGFzdCB1c2VkJyA6ICdTb3J0IGJ5IHdoZW4gbGFzdCB1c2VkJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0dXAocm91dGVEYXRhOiBQYW5lUm91dGVEYXRhKSB7XG4gICAgICAgIHRoaXMucGFuZVJvdXRlRGF0YSA9IHJvdXRlRGF0YTtcbiAgICAgICAgaWYgKCF0aGlzLnJlY2VudCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlbnQgPSB0aGlzLnZpZXdNb2RlbEZhY3RvcnkucmVjZW50SXRlbXNWaWV3TW9kZWwodGhpcy5wYW5lSWQhKTtcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLnJlY2VudC50aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzT25GaXJzdFJvdyhyb3dzPzogUXVlcnlMaXN0PFJvd0NvbXBvbmVudD4pIHtcbiAgICAgICAgaWYgKHJvd3MgJiYgcm93cy5maXJzdCkge1xuICAgICAgICAgICAgLy8gdW50aWwgZmlyc3QgZWxlbWVudCByZXR1cm5zIHRydWVcbiAgICAgICAgICAgIHJvd3MuZmlyc3QuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c09uRmlyc3RSb3codGhpcy5hY3Rpb25DaGlsZHJlbik7XG4gICAgICAgIHRoaXMuc3ViID0gdGhpcy5hY3Rpb25DaGlsZHJlbj8uY2hhbmdlcy5zdWJzY3JpYmUoKHFsOiBRdWVyeUxpc3Q8Um93Q29tcG9uZW50PikgPT4gdGhpcy5mb2N1c09uRmlyc3RSb3cocWwpKTtcbiAgICB9XG5cbiAgICBzZXREcm9wWm9uZXMoaWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZHJvcFpvbmVzID0gaWRzKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kZFN1YiA9IHRoaXMuZHJhZ0FuZERyb3AuZHJvcFpvbmVJZHMkLnN1YnNjcmliZShpZHMgPT4gdGhpcy5zZXREcm9wWm9uZXMoaWRzIHx8IFtdKSk7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHNhZmVVbnN1YnNjcmliZSh0aGlzLnN1Yik7XG4gICAgICAgIHNhZmVVbnN1YnNjcmliZSh0aGlzLmRkU3ViKTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IFthdHRyLmlkXT1cInBhbmVJZE5hbWVcIiBbbmdDbGFzc109XCJwYW5lVHlwZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJyZWNlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3t0aXRsZX19PC9kaXY+XG4gICAgICAgICAgICA8bm9mLWFjdGlvbi1iYXIgW2FjdGlvbnNdPVwiYWN0aW9uSG9sZGVyc1wiPjwvbm9mLWFjdGlvbi1iYXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzSXRlbXMoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbGxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjZGtEcm9wTGlzdCBbY2RrRHJvcExpc3RDb25uZWN0ZWRUb109XCJkcm9wWm9uZXNcIiBbY2RrRHJvcExpc3RPcmllbnRhdGlvbl09XCInaG9yaXpvbnRhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAjcm93ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zKCk7IGxldCBpID0gaW5kZXhcIiBjZGtEcmFnIFtjZGtEcmFnRGF0YV09XCJpdGVtXCIgbm9mLXJvdyBbaXRlbV09XCJpdGVtXCIgW3Jvd109XCJpXCIgW3dpdGhDaGVja2JveF09XCJ0cnVlXCIgW2lzVGFibGVdPVwidHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPHJvdXRlci1vdXRsZXQgKGFjdGl2YXRlKT1cIm9uQ2hpbGQoKVwiIChkZWFjdGl2YXRlKT1cIm9uQ2hpbGRsZXNzKClcIj48L3JvdXRlci1vdXRsZXQ+XG4iXX0=