@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
97 lines • 26.1 kB
JavaScript
import { Component, Input } from '@angular/core';
import { WizardModalService, gettext } from '@c8y/ngx-components';
import { EcosystemService } from '@c8y/ngx-components/ecosystem/shared';
import { ApplicationType } from '@c8y/client';
import { BsModalRef } from 'ngx-bootstrap/modal';
import { Subject, BehaviorSubject, combineLatest, of } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "ngx-bootstrap/modal";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@c8y/ngx-components/ecosystem/shared";
import * as i4 from "@angular/common";
import * as i5 from "./appState.pipe";
export class AppsToUpdateRemotesSelectComponent {
constructor(bsModalRef, wizardModalService, ecosystemService) {
this.bsModalRef = bsModalRef;
this.wizardModalService = wizardModalService;
this.ecosystemService = ecosystemService;
this.destroy$ = new Subject();
this.filterTerm$ = new BehaviorSubject('');
this.filteredApps$ = new BehaviorSubject([]);
this.appsToUpdateRemotes = [];
this.result = new Promise((resolve, reject) => {
this._update = resolve;
this._cancel = reject;
});
}
ngOnInit() {
this.filteredApps$ = combineLatest([of(this.apps), this.filterTerm$]).pipe(map(([apps, filterTerm]) => filterTerm.trim().length === 0
? apps
: apps.filter((application) => this.ecosystemService.filterContainString(application.name, filterTerm))));
this.textConfig =
this.updateType === 'install'
? {
header: gettext('Select applications to install the plugin to'),
applyButton: gettext('Install')
}
: {
header: gettext('Select applications to uninstall the plugin from'),
applyButton: gettext('Uninstall')
};
}
cancel() {
this.bsModalRef.hide();
this._cancel();
}
setSelectedApps(selected, app) {
selected
? this.appsToUpdateRemotes.push(app)
: (this.appsToUpdateRemotes = this.appsToUpdateRemotes.filter(application => app.key !== application.key));
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
async duplicateApp() {
const wizardConfig = {
headerText: gettext('Duplicate application'),
headerIcon: 'c8y-copy'
};
const initialState = {
wizardConfig,
componentInitialState: {
noBackButton: true
},
id: 'duplicateApplication'
};
const modalOptions = { initialState };
const modalRef = this.wizardModalService.show(modalOptions);
modalRef.content.onClose.pipe(takeUntil(this.destroy$)).subscribe(async () => {
this.apps = await this.getOwnedHostedApps();
this.ngOnInit();
});
}
async apply() {
this._update(this.appsToUpdateRemotes);
this.bsModalRef.hide();
}
async getOwnedHostedApps() {
return (await this.ecosystemService.getWebApplications()).filter(app => this.ecosystemService.isOwner(app) && app.type !== ApplicationType.EXTERNAL);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppsToUpdateRemotesSelectComponent, deps: [{ token: i1.BsModalRef }, { token: i2.WizardModalService }, { token: i3.EcosystemService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppsToUpdateRemotesSelectComponent, selector: "c8y-apps-to-update-remotes-select", inputs: { apps: "apps", updateType: "updateType", pluginName: "pluginName", appsDisabled: "appsDisabled" }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-modules'\"></i>\n <div class=\"modal-title h4\" id=\"modal-title\" translate>Custom applications</div>\n </div>\n <div class=\"inner-scroll\" id=\"modal-body\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium\">\n {{ textConfig.header | translate }}\n </p>\n <c8y-filter (onSearch)=\"filterTerm$.next($event)\"></c8y-filter>\n </div>\n <c8y-list-group *ngIf=\"apps.length; else emptyList\">\n <c8y-li\n [ngClass]=\"{ disabled: updateType === 'install' && appsDisabled.has(app.id) }\"\n *ngFor=\"let app of filteredApps$ | async\"\n data-cy=\"apps-to-update-remotes-select--applications-list\"\n >\n <c8y-li-checkbox (onSelect)=\"setSelectedApps($event, app)\" data-cy=\"apps-to-update-remotes-select--app-checkbox\"></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0 icon-32\">\n <c8y-app-icon\n class=\"list-group-icon\"\n [app]=\"app\"\n [contextPath]=\"app.contextPath\"\n [name]=\"app.name\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <div class=\"d-flex\">\n <div class=\"p-r-8\">\n <p class=\"text-medium\" [innerText]=\"app | humanizeAppName | async\"></p>\n <p class=\"small text-muted\">{{ app.description }}</p>\n </div>\n <span class=\"label m-l-auto a-s-start\" [ngClass]=\"app | appState: 'class'\">\n {{ app | appState: 'label' | translate }}\n </span>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ textConfig.applyButton | translate }}\"\n [disabled]=\"appsToUpdateRemotes.length === 0\"\n (click)=\"apply()\"\n >\n {{ textConfig.applyButton | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No custom applications available.' | translate\"\n *ngIf=\"updateType !== 'install'\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-container *ngIf=\"updateType === 'install'\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No custom applications available.' | translate\"\n [subtitle]=\"'Create a custom application by duplicating an existing one.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Duplicate' | translate }}\"\n (click)=\"duplicateApp()\"\n >\n {{ 'Duplicate' | translate }}\n </button>\n </c8y-ui-empty-state>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "component", type: i2.AppIconComponent, selector: "c8y-app-icon", inputs: ["contextPath", "name", "app"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { 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: "component", type: i2.FilterInputComponent, selector: "c8y-filter", inputs: ["icon", "filterTerm"], outputs: ["onSearch"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i5.AppStatePipe, name: "appState" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppsToUpdateRemotesSelectComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-apps-to-update-remotes-select', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-modules'\"></i>\n <div class=\"modal-title h4\" id=\"modal-title\" translate>Custom applications</div>\n </div>\n <div class=\"inner-scroll\" id=\"modal-body\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium\">\n {{ textConfig.header | translate }}\n </p>\n <c8y-filter (onSearch)=\"filterTerm$.next($event)\"></c8y-filter>\n </div>\n <c8y-list-group *ngIf=\"apps.length; else emptyList\">\n <c8y-li\n [ngClass]=\"{ disabled: updateType === 'install' && appsDisabled.has(app.id) }\"\n *ngFor=\"let app of filteredApps$ | async\"\n data-cy=\"apps-to-update-remotes-select--applications-list\"\n >\n <c8y-li-checkbox (onSelect)=\"setSelectedApps($event, app)\" data-cy=\"apps-to-update-remotes-select--app-checkbox\"></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0 icon-32\">\n <c8y-app-icon\n class=\"list-group-icon\"\n [app]=\"app\"\n [contextPath]=\"app.contextPath\"\n [name]=\"app.name\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <div class=\"d-flex\">\n <div class=\"p-r-8\">\n <p class=\"text-medium\" [innerText]=\"app | humanizeAppName | async\"></p>\n <p class=\"small text-muted\">{{ app.description }}</p>\n </div>\n <span class=\"label m-l-auto a-s-start\" [ngClass]=\"app | appState: 'class'\">\n {{ app | appState: 'label' | translate }}\n </span>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ textConfig.applyButton | translate }}\"\n [disabled]=\"appsToUpdateRemotes.length === 0\"\n (click)=\"apply()\"\n >\n {{ textConfig.applyButton | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No custom applications available.' | translate\"\n *ngIf=\"updateType !== 'install'\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-container *ngIf=\"updateType === 'install'\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No custom applications available.' | translate\"\n [subtitle]=\"'Create a custom application by duplicating an existing one.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Duplicate' | translate }}\"\n (click)=\"duplicateApp()\"\n >\n {{ 'Duplicate' | translate }}\n </button>\n </c8y-ui-empty-state>\n </ng-container>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.WizardModalService }, { type: i3.EcosystemService }], propDecorators: { apps: [{
type: Input
}], updateType: [{
type: Input
}], pluginName: [{
type: Input
}], appsDisabled: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTWhELE1BQU0sT0FBTyxrQ0FBa0M7SUFvQjdDLFlBQ1UsVUFBc0IsRUFDdEIsa0JBQXNDLEVBQ3RDLGdCQUFrQztRQUZsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWxCcEMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDdkMsZ0JBQVcsR0FBNEIsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7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QUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCO1FBQzlCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUM5RCxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsUUFBUSxDQUNuRixDQUFDO0lBQ0osQ0FBQzsrR0FsR1Usa0NBQWtDO21HQUFsQyxrQ0FBa0MscUxDZi9DLHk5RkFrRkE7OzRGRG5FYSxrQ0FBa0M7a0JBSjlDLFNBQVM7K0JBRUUsbUNBQW1DOytJQUdwQyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2l6YXJkQ29uZmlnLCBXaXphcmRNb2RhbFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEVjb3N5c3RlbVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Vjb3N5c3RlbS9zaGFyZWQnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgTW9kYWxPcHRpb25zIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBVcGRhdGVUeXBlIH0gZnJvbSAnLi9hcHBzLXRvLXVwZGF0ZS1yZW1vdGVzLXNlbGVjdC5tb2RlbCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBzLXRvLXVwZGF0ZS1yZW1vdGVzLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHNlbGVjdG9yOiAnYzh5LWFwcHMtdG8tdXBkYXRlLXJlbW90ZXMtc2VsZWN0J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBhcHBzOiBJQXBwbGljYXRpb25bXTtcbiAgQElucHV0KCkgdXBkYXRlVHlwZTogVXBkYXRlVHlwZTtcbiAgQElucHV0KCkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBhcHBzRGlzYWJsZWQ6IFNldDxJQXBwbGljYXRpb25bJ2lkJ10+O1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgZmlsdGVyVGVybSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIGZpbHRlcmVkQXBwcyQ6IE9ic2VydmFibGU8SUFwcGxpY2F0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHRleHRDb25maWc6IHtcbiAgICBoZWFkZXI6IHN0cmluZztcbiAgICBhcHBseUJ1dHRvbjogc3RyaW5nO1xuICB9O1xuICBhcHBzVG9VcGRhdGVSZW1vdGVzOiBJQXBwbGljYXRpb25bXSA9IFtdO1xuICByZXN1bHQ6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcbiAgcHJpdmF0ZSBfdXBkYXRlOiAoYXBwczogSUFwcGxpY2F0aW9uW10pID0+IHZvaWQ7XG4gIHByaXZhdGUgX2NhbmNlbDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSB3aXphcmRNb2RhbFNlcnZpY2U6IFdpemFyZE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGVjb3N5c3RlbVNlcnZpY2U6IEVjb3N5c3RlbVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRBcHBzJCA9IGNvbWJpbmVMYXRlc3QoW29mKHRoaXMuYXBwcyksIHRoaXMuZmlsdGVyVGVybSRdKS5waXBlKFxuICAgICAgbWFwKChbYXBwcywgZmlsdGVyVGVybV0pID0+XG4gICAgICAgIGZpbHRlclRlcm0udHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gYXBwc1xuICAgICAgICAgIDogYXBwcy5maWx0ZXIoKGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb24pID0+XG4gICAgICAgICAgICAgIHRoaXMuZWNvc3lzdGVtU2VydmljZS5maWx0ZXJDb250YWluU3RyaW5nKGFwcGxpY2F0aW9uLm5hbWUsIGZpbHRlclRlcm0pXG4gICAgICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnRleHRDb25maWcgPVxuICAgICAgdGhpcy51cGRhdGVUeXBlID09PSAnaW5zdGFsbCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoZWFkZXI6IGdldHRleHQoJ1NlbGVjdCBhcHBsaWNhdGlvbnMgdG8gaW5zdGFsbCB0aGUgcGx1Z2luIHRvJyksXG4gICAgICAgICAgICBhcHBseUJ1dHRvbjogZ2V0dGV4dCgnSW5zdGFsbCcpXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGhlYWRlcjogZ2V0dGV4dCgnU2VsZWN0IGFwcGxpY2F0aW9ucyB0byB1bmluc3RhbGwgdGhlIHBsdWdpbiBmcm9tJyksXG4gICAgICAgICAgICBhcHBseUJ1dHRvbjogZ2V0dGV4dCgnVW5pbnN0YWxsJylcbiAgICAgICAgICB9O1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgdGhpcy5fY2FuY2VsKCk7XG4gIH1cblxuICBzZXRTZWxlY3RlZEFwcHMoc2VsZWN0ZWQ6IGJvb2xlYW4sIGFwcDogSUFwcGxpY2F0aW9uKSB7XG4gICAgc2VsZWN0ZWRcbiAgICAgID8gdGhpcy5hcHBzVG9VcGRhdGVSZW1vdGVzLnB1c2goYXBwKVxuICAgICAgOiAodGhpcy5hcHBzVG9VcGRhdGVSZW1vdGVzID0gdGhpcy5hcHBzVG9VcGRhdGVSZW1vdGVzLmZpbHRlcihcbiAgICAgICAgICBhcHBsaWNhdGlvbiA9PiBhcHAua2V5ICE9PSBhcHBsaWNhdGlvbi5rZXlcbiAgICAgICAgKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBhc3luYyBkdXBsaWNhdGVBcHAoKSB7XG4gICAgY29uc3Qgd2l6YXJkQ29uZmlnOiBXaXphcmRDb25maWcgPSB7XG4gICAgICBoZWFkZXJUZXh0OiBnZXR0ZXh0KCdEdXBsaWNhdGUgYXBwbGljYXRpb24nKSxcbiAgICAgIGhlYWRlckljb246ICdjOHktY29weSdcbiAgICB9O1xuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHdpemFyZENvbmZpZyxcbiAgICAgIGNvbXBvbmVudEluaXRpYWxTdGF0ZToge1xuICAgICAgICBub0JhY2tCdXR0b246IHRydWVcbiAgICAgIH0sXG4gICAgICBpZDogJ2R1cGxpY2F0ZUFwcGxpY2F0aW9uJ1xuICAgIH07XG5cbiAgICBjb25zdCBtb2RhbE9wdGlvbnM6IE1vZGFsT3B0aW9ucyA9IHsgaW5pdGlhbFN0YXRlIH07XG5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMud2l6YXJkTW9kYWxTZXJ2aWNlLnNob3cobW9kYWxPcHRpb25zKTtcbiAgICBtb2RhbFJlZi5jb250ZW50Lm9uQ2xvc2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmFwcHMgPSBhd2FpdCB0aGlzLmdldE93bmVkSG9zdGVkQXBwcygpO1xuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYXBwbHkoKSB7XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuYXBwc1RvVXBkYXRlUmVtb3Rlcyk7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3duZWRIb3N0ZWRBcHBzKCk6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRXZWJBcHBsaWNhdGlvbnMoKSkuZmlsdGVyKFxuICAgICAgYXBwID0+IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc093bmVyKGFwcCkgJiYgYXBwLnR5cGUgIT09IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3cG9ydC1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXJcIj5cbiAgICA8aSBbYzh5SWNvbl09XCInYzh5LW1vZHVsZXMnXCI+PC9pPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC10aXRsZSBoNFwiIGlkPVwibW9kYWwtdGl0bGVcIiB0cmFuc2xhdGU+Q3VzdG9tIGFwcGxpY2F0aW9uczwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiIGlkPVwibW9kYWwtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b20gc3RpY2t5LXRvcCBiZy1jb21wb25lbnRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW1cIj5cbiAgICAgICAge3sgdGV4dENvbmZpZy5oZWFkZXIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICAgIDxjOHktZmlsdGVyIChvblNlYXJjaCk9XCJmaWx0ZXJUZXJtJC5uZXh0KCRldmVudClcIj48L2M4eS1maWx0ZXI+XG4gICAgPC9kaXY+XG4gICAgPGM4eS1saXN0LWdyb3VwICpuZ0lmPVwiYXBwcy5sZW5ndGg7IGVsc2UgZW1wdHlMaXN0XCI+XG4gICAgICA8Yzh5LWxpXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHVwZGF0ZVR5cGUgPT09ICdpbnN0YWxsJyAmJiBhcHBzRGlzYWJsZWQuaGFzKGFwcC5pZCkgfVwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhcHAgb2YgZmlsdGVyZWRBcHBzJCB8IGFzeW5jXCJcbiAgICAgICAgZGF0YS1jeT1cImFwcHMtdG8tdXBkYXRlLXJlbW90ZXMtc2VsZWN0LS1hcHBsaWNhdGlvbnMtbGlzdFwiXG4gICAgICA+XG4gICAgICAgIDxjOHktbGktY2hlY2tib3ggKG9uU2VsZWN0KT1cInNldFNlbGVjdGVkQXBwcygkZXZlbnQsIGFwcClcIiBkYXRhLWN5PVwiYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QtLWFwcC1jaGVja2JveFwiPjwvYzh5LWxpLWNoZWNrYm94PlxuICAgICAgICA8Yzh5LWxpLWljb24gY2xhc3M9XCJwLWwtMCBpY29uLTMyXCI+XG4gICAgICAgICAgPGM4eS1hcHAtaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWljb25cIlxuICAgICAgICAgICAgW2FwcF09XCJhcHBcIlxuICAgICAgICAgICAgW2NvbnRleHRQYXRoXT1cImFwcC5jb250ZXh0UGF0aFwiXG4gICAgICAgICAgICBbbmFtZV09XCJhcHAubmFtZVwiXG4gICAgICAgICAgPjwvYzh5LWFwcC1pY29uPlxuICAgICAgICA8L2M4eS1saS1pY29uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtci04XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtXCIgW2lubmVyVGV4dF09XCJhcHAgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luY1wiPjwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZFwiPnt7IGFwcC5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsIG0tbC1hdXRvIGEtcy1zdGFydFwiIFtuZ0NsYXNzXT1cImFwcCB8IGFwcFN0YXRlOiAnY2xhc3MnXCI+XG4gICAgICAgICAgICB7eyBhcHAgfCBhcHBTdGF0ZTogJ2xhYmVsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2M4eS1saT5cbiAgICA8L2M4eS1saXN0LWdyb3VwPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgID5cbiAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgdGl0bGU9XCJ7eyB0ZXh0Q29uZmlnLmFwcGx5QnV0dG9uIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIFtkaXNhYmxlZF09XCJhcHBzVG9VcGRhdGVSZW1vdGVzLmxlbmd0aCA9PT0gMFwiXG4gICAgICAoY2xpY2spPVwiYXBwbHkoKVwiXG4gICAgPlxuICAgICAge3sgdGV4dENvbmZpZy5hcHBseUJ1dHRvbiB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNlbXB0eUxpc3Q+XG4gIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICBbaWNvbl09XCInYzh5LW1vZHVsZXMnXCJcbiAgICBbdGl0bGVdPVwiJ05vIGN1c3RvbSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlLicgfCB0cmFuc2xhdGVcIlxuICAgICpuZ0lmPVwidXBkYXRlVHlwZSAhPT0gJ2luc3RhbGwnXCJcbiAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnXCI+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwiJ2M4eS1tb2R1bGVzJ1wiXG4gICAgICBbdGl0bGVdPVwiJ05vIGN1c3RvbSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgW3N1YnRpdGxlXT1cIidDcmVhdGUgYSBjdXN0b20gYXBwbGljYXRpb24gYnkgZHVwbGljYXRpbmcgYW4gZXhpc3Rpbmcgb25lLicgfCB0cmFuc2xhdGVcIlxuICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHQgbS10LThcIlxuICAgICAgICB0aXRsZT1cInt7ICdEdXBsaWNhdGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cImR1cGxpY2F0ZUFwcCgpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ0R1cGxpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=