@tangential/admin-console
Version:
A basic administration console
76 lines • 19.9 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { AuthPermission } from '@tangential/authorization-service';
import { Observable } from 'rxjs';
import { debounceTime, distinctUntilChanged, filter, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/button";
import * as i4 from "@angular/material/icon";
import * as i5 from "@angular/material/form-field";
import * as i6 from "@angular/material/input";
export class PermissionComponent {
constructor() {
this.remove = new EventEmitter(false);
this._focusDebouncer = new EventEmitter(false);
this.submitted = false;
this._changed = false;
let distinct = this._focusDebouncer.asObservable();
distinct = distinct.pipe(debounceTime(10), distinctUntilChanged());
this.focus = distinct.pipe(filter((v) => v === true), map(() => new Event('focus')));
this.change = distinct.pipe(filter((focused) => focused === false && this._changed), map(() => {
const change = {
previous: this._previous,
current: this.permission
};
if (!this.permission) {
throw "Missing Permission";
}
this._previous = AuthPermission.from(this.permission);
this._changed = false;
return change;
}));
this.blur = distinct.pipe(filter((v) => v === false), map(() => new Event('blur')));
}
ngOnChanges(changes) {
if (changes.permission) {
this._previous = AuthPermission.from(this.permission);
this._changed = false;
}
}
fireRemove() {
this.remove.emit(this.permission);
}
onChange(event) {
event.stopPropagation();
this._changed = true;
}
onBlur(event) {
event.stopPropagation();
this._focusDebouncer.emit(false);
}
onFocus(event) {
event.stopPropagation();
this._focusDebouncer.emit(true);
}
onSubmit() {
this.submitted = true;
}
}
PermissionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: PermissionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PermissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: PermissionComponent, selector: "tanj-permission", inputs: { permission: "permission" }, outputs: { change: "change", remove: "remove", focus: "focus", blur: "blur" }, usesOnChanges: true, ngImport: i0, template: "<div flex layout=\"column\" layout-align=\"start\">\n\n <div class=\"tanj-permission-form-wrapper\" flex layout=\"column\" layout-align=\"start\">\n\n\n <form *ngIf=\"permission != null\"\n (ngSubmit)=\"onSubmit($event)\"\n #permissionForm=\"ngForm\"\n flex\n layout=\"row\"\n layout-align=\"space-between\">\n\n <div class=\"tanj-permission-inputs-wrapper\" layout=\"row\" flex=\"80\" layout-align=\"space-between start\">\n <mat-form-field flex=\"40\">\n <input matInput [(ngModel)]=\"permission.$key\" name=\"name\" #fName=\"ngModel\"\n class=\"tanj-input\"\n dividerColor=\"accent\"\n [type]=\"'text'\"\n required minlength=\"2\"\n value=\"{{permission.$key}}\"\n placeholder=\"Name\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n </mat-form-field>\n <mat-form-field flex=\"60\">\n <input matInput [(ngModel)]=\"permission.description\" name=\"description\" #fDescription=\"ngModel\"\n class=\"tanj-description tanj-input\"\n dividerColor=\"accent\"\n\n [type]=\"'text'\"\n value=\"{{permission.description}}\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n placeholder=\"Description\"/>\n </mat-form-field>\n </div>\n <div class=\"tanj-delete-button\" flex layout=\"row\" layout-align=\"end center\">\n <button mat-mini-fab\n type=\"button\"\n aria-label=\"Delete Permission\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (click)=\"fireRemove()\"\n [disabled]=\"false\">\n <mat-icon class=\"mat-24\">delete</mat-icon>\n </button>\n </div>\n </form>\n </div>\n\n\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: PermissionComponent, decorators: [{
type: Component,
args: [{ selector: 'tanj-permission', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div flex layout=\"column\" layout-align=\"start\">\n\n <div class=\"tanj-permission-form-wrapper\" flex layout=\"column\" layout-align=\"start\">\n\n\n <form *ngIf=\"permission != null\"\n (ngSubmit)=\"onSubmit($event)\"\n #permissionForm=\"ngForm\"\n flex\n layout=\"row\"\n layout-align=\"space-between\">\n\n <div class=\"tanj-permission-inputs-wrapper\" layout=\"row\" flex=\"80\" layout-align=\"space-between start\">\n <mat-form-field flex=\"40\">\n <input matInput [(ngModel)]=\"permission.$key\" name=\"name\" #fName=\"ngModel\"\n class=\"tanj-input\"\n dividerColor=\"accent\"\n [type]=\"'text'\"\n required minlength=\"2\"\n value=\"{{permission.$key}}\"\n placeholder=\"Name\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n </mat-form-field>\n <mat-form-field flex=\"60\">\n <input matInput [(ngModel)]=\"permission.description\" name=\"description\" #fDescription=\"ngModel\"\n class=\"tanj-description tanj-input\"\n dividerColor=\"accent\"\n\n [type]=\"'text'\"\n value=\"{{permission.description}}\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n placeholder=\"Description\"/>\n </mat-form-field>\n </div>\n <div class=\"tanj-delete-button\" flex layout=\"row\" layout-align=\"end center\">\n <button mat-mini-fab\n type=\"button\"\n aria-label=\"Delete Permission\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (click)=\"fireRemove()\"\n [disabled]=\"false\">\n <mat-icon class=\"mat-24\">delete</mat-icon>\n </button>\n </div>\n </form>\n </div>\n\n\n</div>\n" }]
}], ctorParameters: function () { return []; }, propDecorators: { permission: [{
type: Input
}], change: [{
type: Output
}], remove: [{
type: Output
}], focus: [{
type: Output
}], blur: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2FkbWluLWNvbnNvbGUvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb24vcGVybWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2FkbWluLWNvbnNvbGUvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb24vcGVybWlzc2lvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFnQixpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7Ozs7QUFTOUUsTUFBTSxPQUFPLG1CQUFtQjtJQWtCOUI7UUFiVSxXQUFNLEdBQWlDLElBQUksWUFBWSxDQUFpQixLQUFLLENBQUMsQ0FBQTtRQUVoRixvQkFBZSxHQUEwQixJQUFJLFlBQVksQ0FBVSxLQUFLLENBQUMsQ0FBQztRQU1sRixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ1YsYUFBUSxHQUFZLEtBQUssQ0FBQTtRQUsvQixJQUFJLFFBQVEsR0FBd0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUN2RSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUcsb0JBQW9CLEVBQUUsQ0FBQyxDQUFBO1FBRXBFLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQ3pCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUN6QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN2RCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDekIsQ0FBQTtZQUNELElBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDO2dCQUNsQixNQUFNLG9CQUFvQixDQUFBO2FBQzNCO1lBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtZQUNyQixPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFTCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUMxQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBcUM7UUFDL0MsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7U0FDdEI7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWTtRQUNqQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFZO1FBQ2xCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVqQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7O2lIQTNFVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixpTUNaaEMsc2pFQXVEQTs0RkQzQ2EsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNTLGlCQUFpQixtQkFFakIsdUJBQXVCLENBQUMsTUFBTSxpQkFDOUIsaUJBQWlCLENBQUMsSUFBSTswRUFJOUIsVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUlHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2UsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXV0aFBlcm1pc3Npb259IGZyb20gJ0B0YW5nZW50aWFsL2F1dGhvcml6YXRpb24tc2VydmljZSc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICAgJ3RhbmotcGVybWlzc2lvbicsXG4gIHRlbXBsYXRlVXJsOiAgICAgJy4vcGVybWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiAgIFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcGVybWlzc2lvbjogQXV0aFBlcm1pc3Npb24gfCB1bmRlZmluZWRcblxuICBAT3V0cHV0KCkgY2hhbmdlOiBPYnNlcnZhYmxlPHsgY3VycmVudDogQXV0aFBlcm1pc3Npb24sIHByZXZpb3VzOiBBdXRoUGVybWlzc2lvbiB9PlxuICBAT3V0cHV0KCkgcmVtb3ZlOiBFdmVudEVtaXR0ZXI8QXV0aFBlcm1pc3Npb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRoUGVybWlzc2lvbj4oZmFsc2UpXG5cbiAgcHJpdmF0ZSBfZm9jdXNEZWJvdW5jZXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIEBPdXRwdXQoKSBmb2N1czogT2JzZXJ2YWJsZTxFdmVudD5cbiAgQE91dHB1dCgpIGJsdXI6IE9ic2VydmFibGU8RXZlbnQ+XG5cblxuICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgX3ByZXZpb3VzOiBBdXRoUGVybWlzc2lvbiB8IHVuZGVmaW5lZFxuXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IGRpc3RpbmN0OiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fZm9jdXNEZWJvdW5jZXIuYXNPYnNlcnZhYmxlKClcbiAgICBkaXN0aW5jdCA9IGRpc3RpbmN0LnBpcGUoIGRlYm91bmNlVGltZSgxMCksICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuXG4gICAgdGhpcy5mb2N1cyA9IGRpc3RpbmN0LnBpcGUoXG4gICAgICBmaWx0ZXIoKHYpID0+IHYgPT09IHRydWUpLFxuICAgICAgbWFwKCgpID0+IG5ldyBFdmVudCgnZm9jdXMnKSkpXG5cbiAgICB0aGlzLmNoYW5nZSA9IGRpc3RpbmN0LnBpcGUoXG4gICAgICBmaWx0ZXIoKGZvY3VzZWQpID0+IGZvY3VzZWQgPT09IGZhbHNlICYmIHRoaXMuX2NoYW5nZWQpLFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0ge1xuICAgICAgICAgIHByZXZpb3VzOiB0aGlzLl9wcmV2aW91cyxcbiAgICAgICAgICBjdXJyZW50OiB0aGlzLnBlcm1pc3Npb25cbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5wZXJtaXNzaW9uKXtcbiAgICAgICAgICB0aHJvdyBcIk1pc3NpbmcgUGVybWlzc2lvblwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldmlvdXMgPSBBdXRoUGVybWlzc2lvbi5mcm9tKHRoaXMucGVybWlzc2lvbilcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pKVxuXG4gICAgdGhpcy5ibHVyID0gZGlzdGluY3QucGlwZShcbiAgICAgIGZpbHRlcigodikgPT4gdiA9PT0gZmFsc2UpLFxuICAgICAgbWFwKCgpID0+IG5ldyBFdmVudCgnYmx1cicpKSlcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgcGVybWlzc2lvbjogU2ltcGxlQ2hhbmdlIH0pIHtcbiAgICBpZiAoY2hhbmdlcy5wZXJtaXNzaW9uKSB7XG4gICAgICB0aGlzLl9wcmV2aW91cyA9IEF1dGhQZXJtaXNzaW9uLmZyb20odGhpcy5wZXJtaXNzaW9uKVxuICAgICAgdGhpcy5fY2hhbmdlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZmlyZVJlbW92ZSgpIHtcbiAgICB0aGlzLnJlbW92ZS5lbWl0KHRoaXMucGVybWlzc2lvbilcbiAgfVxuXG4gIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgdGhpcy5fY2hhbmdlZCA9IHRydWVcbiAgfVxuXG4gIG9uQmx1cihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHRoaXMuX2ZvY3VzRGVib3VuY2VyLmVtaXQoZmFsc2UpXG4gIH1cblxuICBvbkZvY3VzKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgdGhpcy5fZm9jdXNEZWJvdW5jZXIuZW1pdCh0cnVlKVxuXG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gIH1cblxufVxuIiwiPGRpdiBmbGV4IGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG5cbiAgPGRpdiBjbGFzcz1cInRhbmotcGVybWlzc2lvbi1mb3JtLXdyYXBwZXJcIiBmbGV4IGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG5cblxuICAgIDxmb3JtICpuZ0lmPVwicGVybWlzc2lvbiAhPSBudWxsXCJcbiAgICAgICAgICAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgI3Blcm1pc3Npb25Gb3JtPVwibmdGb3JtXCJcbiAgICAgICAgICBmbGV4XG4gICAgICAgICAgbGF5b3V0PVwicm93XCJcbiAgICAgICAgICBsYXlvdXQtYWxpZ249XCJzcGFjZS1iZXR3ZWVuXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YW5qLXBlcm1pc3Npb24taW5wdXRzLXdyYXBwZXJcIiBsYXlvdXQ9XCJyb3dcIiBmbGV4PVwiODBcIiBsYXlvdXQtYWxpZ249XCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbGV4PVwiNDBcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXJtaXNzaW9uLiRrZXlcIiBuYW1lPVwibmFtZVwiICNmTmFtZT1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgICBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgICByZXF1aXJlZCBtaW5sZW5ndGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e3Blcm1pc3Npb24uJGtleX19XCJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJOYW1lXCJcbiAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxleD1cIjYwXCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFsobmdNb2RlbCldPVwicGVybWlzc2lvbi5kZXNjcmlwdGlvblwiIG5hbWU9XCJkZXNjcmlwdGlvblwiICNmRGVzY3JpcHRpb249XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWRlc2NyaXB0aW9uIHRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgICBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIlxuXG4gICAgICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgIHZhbHVlPVwie3twZXJtaXNzaW9uLmRlc2NyaXB0aW9ufX1cIlxuICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRlc2NyaXB0aW9uXCIvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFuai1kZWxldGUtYnV0dG9uXCIgZmxleCBsYXlvdXQ9XCJyb3dcIiBsYXlvdXQtYWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpcmVSZW1vdmUoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LTI0XCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuXG5cbjwvZGl2PlxuIl19