@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
65 lines • 27.3 kB
JavaScript
import { Component, Input } from '@angular/core';
import { TenantLoginOptionType } from '@c8y/client';
import { ControlContainer, NgForm } from '@angular/forms';
import { UserAgent, isBasic } from './basic-settings.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
import * as i3 from "@c8y/ngx-components";
export class BasicAuthSettingsComponent {
constructor(controlContainer) {
this.controlContainer = controlContainer;
this.preferredLoginOptionType = TenantLoginOptionType.BASIC;
this.tenantLoginOptionTypeEnum = TenantLoginOptionType;
}
ngOnChanges(changes) {
if (changes.authConfiguration && changes.authConfiguration.currentValue) {
this.preferredLoginOptionType =
changes.authConfiguration.currentValue.preferredLoginOptionType;
}
}
ngDoCheck() {
if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) {
this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType;
if (this.preferredLoginOptionType === TenantLoginOptionType.BASIC) {
this.forbiddenWebBrowsers = false;
}
}
}
get forbiddenWebBrowsers() {
return this.authenticationRestrictions.forbiddenClients.includes('WEB_BROWSERS');
}
set forbiddenWebBrowsers(value) {
this.authenticationRestrictions.forbiddenClients = value ? ['WEB_BROWSERS'] : [];
}
forbiddenUserAgentsRemove(id) {
this.authenticationRestrictions.forbiddenUserAgents = this.remove(this.authenticationRestrictions.forbiddenUserAgents, id);
this.controlContainer.control.markAsDirty();
}
trustedUserAgentsRemove(id) {
this.authenticationRestrictions.trustedUserAgents = this.remove(this.authenticationRestrictions.trustedUserAgents, id);
this.controlContainer.control.markAsDirty();
}
get authenticationRestrictions() {
return this.authConfiguration.loginOptions.find(isBasic).authenticationRestrictions;
}
add(collection) {
collection.push(new UserAgent(''));
}
remove(collection, id) {
const newArray = collection.filter(obj => obj.id !== id);
if (!newArray.length) {
newArray.push(new UserAgent(''));
}
return newArray;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BasicAuthSettingsComponent, deps: [{ token: i1.ControlContainer }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BasicAuthSettingsComponent, selector: "c8y-basic-auth-settings", inputs: { authConfiguration: "authConfiguration" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n data-cy=\"c8y-basic-auth--forbidden-agent\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n data-cy=\"c8y-basic-auth--trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BasicAuthSettingsComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-basic-auth-settings', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"authConfiguration.preferredLoginOptionType !== 'BASIC'\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Basic Auth restrictions' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-switch\" title=\"{{ 'Forbidden for web browsers' | translate }}\">\n <input type=\"checkbox\" name=\"forbiddenWebBrowsers\" [(ngModel)]=\"forbiddenWebBrowsers\" />\n <span></span>\n <span>{{ 'Forbidden for web browsers' | translate }}</span>\n </label>\n <div\n class=\"alert alert-warning\"\n *ngIf=\"\n preferredLoginOptionType === tenantLoginOptionTypeEnum.BASIC && forbiddenWebBrowsers\n \"\n >\n {{\n 'You are about to forbid browsers from using Basic authentication. This will prevent users from using web applications on your tenant because you are going to set Basic authentication as the preferred login mode.'\n | translate\n }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Forbidden user agents' | translate }}\">\n {{ 'Forbidden user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let forbiddenUserAgent of authenticationRestrictions.forbiddenUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'forbiddenUserAgent' + forbiddenUserAgent.id\"\n [(ngModel)]=\"forbiddenUserAgent.value\"\n class=\"form-control\"\n data-cy=\"c8y-basic-auth--forbidden-agent\"\n placeholder=\"{{ 'e.g.' | translate }} forbidden-agent\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && forbiddenUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'forbiddenUserAgentRemove' + forbiddenUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"forbiddenUserAgentsRemove(forbiddenUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle text-danger\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot text-primary\"\n (click)=\"add(authenticationRestrictions.forbiddenUserAgents)\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label title=\"{{ 'Trusted user agents' | translate }}\">\n {{ 'Trusted user agents' | translate }}\n </label>\n <div\n class=\"input-group m-t-8\"\n *ngFor=\"\n let trustedUserAgent of authenticationRestrictions.trustedUserAgents;\n last as isLast;\n first as isFirst\n \"\n >\n <input\n type=\"text\"\n [name]=\"'trustedUserAgent' + trustedUserAgent.id\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} trusted-agent\"\n data-cy=\"c8y-basic-auth--trusted-agent\"\n [(ngModel)]=\"trustedUserAgent.value\"\n />\n <div class=\"input-group-btn col-sm-2\">\n <button\n *ngIf=\"!(isFirst && isLast && trustedUserAgent.value === '')\"\n title=\"{{ 'Remove' | translate }}\"\n [name]=\"'trustedUserAgentRemove' + trustedUserAgent.id\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger text-primary\"\n (click)=\"trustedUserAgentsRemove(trustedUserAgent.id)\"\n >\n <i class=\"dlt-c8y-icon-minus-circle\"></i>\n </button>\n <button\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"add(authenticationRestrictions.trustedUserAgents)\"\n class=\"btn btn-dot text-primary\"\n *ngIf=\"isLast\"\n >\n <i class=\"dlt-c8y-icon-plus-circle\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.ControlContainer }], propDecorators: { authConfiguration: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hdXRoLWNvbmZpZ3VyYXRpb24vYmFzaWMtc2V0dGluZ3MvYmFzaWMtYXV0aC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUE4QixPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFPeEYsTUFBTSxPQUFPLDBCQUEwQjtJQVFyQyxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUp0RCw2QkFBd0IsR0FBMEIscUJBQXFCLENBQUMsS0FBSyxDQUFDO1FBRTlFLDhCQUF5QixHQUFHLHFCQUFxQixDQUFDO0lBRU8sQ0FBQztJQUUxRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzNCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQztZQUNoRixJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksb0JBQW9CLENBQUMsS0FBYztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkYsQ0FBQztJQUVELHlCQUF5QixDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQy9ELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxtQkFBbUIsRUFDbkQsRUFBRSxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUM3RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQ2pELEVBQUUsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSwwQkFBMEI7UUFDNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztJQUN0RixDQUFDO0lBRUQsR0FBRyxDQUFDLFVBQVU7UUFDWixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUMzQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzsrR0FoRVUsMEJBQTBCO21HQUExQiwwQkFBMEIsd0lDWHZDLGdwSkE0SEEsK3RDRG5IaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7OzRGQUV4RCwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UseUJBQXlCLGlCQUVwQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztxRkFJbkUsaUJBQWlCO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGVuYW50TG9naW5PcHRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXV0aENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2F1dGgtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVc2VyQWdlbnQsIEF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLCBpc0Jhc2ljIH0gZnJvbSAnLi9iYXNpYy1zZXR0aW5ncy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1iYXNpYy1hdXRoLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2ljLWF1dGgtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEJhc2ljQXV0aFNldHRpbmdzQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgYXV0aENvbmZpZ3VyYXRpb246IEF1dGhDb25maWd1cmF0aW9uO1xuXG4gIHByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTogVGVuYW50TG9naW5PcHRpb25UeXBlID0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDO1xuXG4gIHRlbmFudExvZ2luT3B0aW9uVHlwZUVudW0gPSBUZW5hbnRMb2dpbk9wdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5hdXRoQ29uZmlndXJhdGlvbiAmJiBjaGFuZ2VzLmF1dGhDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPVxuICAgICAgICBjaGFuZ2VzLmF1dGhDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZS5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGU7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSAhPT0gdGhpcy5hdXRoQ29uZmlndXJhdGlvbi5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUpIHtcbiAgICAgIHRoaXMucHJlZmVycmVkTG9naW5PcHRpb25UeXBlID0gdGhpcy5hdXRoQ29uZmlndXJhdGlvbi5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGU7XG4gICAgICBpZiAodGhpcy5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPT09IFRlbmFudExvZ2luT3B0aW9uVHlwZS5CQVNJQykge1xuICAgICAgICB0aGlzLmZvcmJpZGRlbldlYkJyb3dzZXJzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZvcmJpZGRlbldlYkJyb3dzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlbkNsaWVudHMuaW5jbHVkZXMoJ1dFQl9CUk9XU0VSUycpO1xuICB9XG5cbiAgc2V0IGZvcmJpZGRlbldlYkJyb3dzZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy5mb3JiaWRkZW5DbGllbnRzID0gdmFsdWUgPyBbJ1dFQl9CUk9XU0VSUyddIDogW107XG4gIH1cblxuICBmb3JiaWRkZW5Vc2VyQWdlbnRzUmVtb3ZlKGlkKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy5mb3JiaWRkZW5Vc2VyQWdlbnRzID0gdGhpcy5yZW1vdmUoXG4gICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlblVzZXJBZ2VudHMsXG4gICAgICBpZFxuICAgICk7XG4gICAgdGhpcy5jb250cm9sQ29udGFpbmVyLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIHRydXN0ZWRVc2VyQWdlbnRzUmVtb3ZlKGlkKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy50cnVzdGVkVXNlckFnZW50cyA9IHRoaXMucmVtb3ZlKFxuICAgICAgdGhpcy5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy50cnVzdGVkVXNlckFnZW50cyxcbiAgICAgIGlkXG4gICAgKTtcbiAgICB0aGlzLmNvbnRyb2xDb250YWluZXIuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgZ2V0IGF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zKCk6IEF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlndXJhdGlvbi5sb2dpbk9wdGlvbnMuZmluZChpc0Jhc2ljKS5hdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucztcbiAgfVxuXG4gIGFkZChjb2xsZWN0aW9uKSB7XG4gICAgY29sbGVjdGlvbi5wdXNoKG5ldyBVc2VyQWdlbnQoJycpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlKGNvbGxlY3Rpb24sIGlkKSB7XG4gICAgY29uc3QgbmV3QXJyYXkgPSBjb2xsZWN0aW9uLmZpbHRlcihvYmogPT4gb2JqLmlkICE9PSBpZCk7XG4gICAgaWYgKCFuZXdBcnJheS5sZW5ndGgpIHtcbiAgICAgIG5ld0FycmF5LnB1c2gobmV3IFVzZXJBZ2VudCgnJykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjYXJkLWJsb2NrIHNlcGFyYXRvci10b3BcIlxuICAqbmdJZj1cImF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSAhPT0gJ0JBU0lDJ1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJoNCB0ZXh0LW5vcm1hbCB0ZXh0LXJpZ2h0IHRleHQtbGVmdC14c1wiPlxuICAgICAge3sgJ0Jhc2ljIEF1dGggcmVzdHJpY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1zd2l0Y2hcIiB0aXRsZT1cInt7ICdGb3JiaWRkZW4gZm9yIHdlYiBicm93c2VycycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZm9yYmlkZGVuV2ViQnJvd3NlcnNcIiBbKG5nTW9kZWwpXT1cImZvcmJpZGRlbldlYkJyb3dzZXJzXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdGb3JiaWRkZW4gZm9yIHdlYiBicm93c2VycycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgcHJlZmVycmVkTG9naW5PcHRpb25UeXBlID09PSB0ZW5hbnRMb2dpbk9wdGlvblR5cGVFbnVtLkJBU0lDICYmIGZvcmJpZGRlbldlYkJyb3dzZXJzXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICdZb3UgYXJlIGFib3V0IHRvIGZvcmJpZCBicm93c2VycyBmcm9tIHVzaW5nIEJhc2ljIGF1dGhlbnRpY2F0aW9uLiBUaGlzIHdpbGwgcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIHdlYiBhcHBsaWNhdGlvbnMgb24geW91ciB0ZW5hbnQgYmVjYXVzZSB5b3UgYXJlIGdvaW5nIHRvIHNldCBCYXNpYyBhdXRoZW50aWNhdGlvbiBhcyB0aGUgcHJlZmVycmVkIGxvZ2luIG1vZGUuJ1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ0ZvcmJpZGRlbiB1c2VyIGFnZW50cycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICB7eyAnRm9yYmlkZGVuIHVzZXIgYWdlbnRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cCBtLXQtOFwiXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZm9yYmlkZGVuVXNlckFnZW50IG9mIGF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlblVzZXJBZ2VudHM7XG4gICAgICAgICAgICBsYXN0IGFzIGlzTGFzdDtcbiAgICAgICAgICAgIGZpcnN0IGFzIGlzRmlyc3RcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbbmFtZV09XCInZm9yYmlkZGVuVXNlckFnZW50JyArIGZvcmJpZGRlblVzZXJBZ2VudC5pZFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcmJpZGRlblVzZXJBZ2VudC52YWx1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWJhc2ljLWF1dGgtLWZvcmJpZGRlbi1hZ2VudFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBmb3JiaWRkZW4tYWdlbnRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0biBjb2wtc20tMlwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiEoaXNGaXJzdCAmJiBpc0xhc3QgJiYgZm9yYmlkZGVuVXNlckFnZW50LnZhbHVlID09PSAnJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ2ZvcmJpZGRlblVzZXJBZ2VudFJlbW92ZScgKyBmb3JiaWRkZW5Vc2VyQWdlbnQuaWRcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZm9yYmlkZGVuVXNlckFnZW50c1JlbW92ZShmb3JiaWRkZW5Vc2VyQWdlbnQuaWQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJkbHQtYzh5LWljb24tbWludXMtY2lyY2xlIHRleHQtZGFuZ2VyXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkKGF1dGhlbnRpY2F0aW9uUmVzdHJpY3Rpb25zLmZvcmJpZGRlblVzZXJBZ2VudHMpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0xhc3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImRsdC1jOHktaWNvbi1wbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgIDxsYWJlbCB0aXRsZT1cInt7ICdUcnVzdGVkIHVzZXIgYWdlbnRzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgIHt7ICdUcnVzdGVkIHVzZXIgYWdlbnRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cCBtLXQtOFwiXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgdHJ1c3RlZFVzZXJBZ2VudCBvZiBhdXRoZW50aWNhdGlvblJlc3RyaWN0aW9ucy50cnVzdGVkVXNlckFnZW50cztcbiAgICAgICAgICAgIGxhc3QgYXMgaXNMYXN0O1xuICAgICAgICAgICAgZmlyc3QgYXMgaXNGaXJzdFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtuYW1lXT1cIid0cnVzdGVkVXNlckFnZW50JyArIHRydXN0ZWRVc2VyQWdlbnQuaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gdHJ1c3RlZC1hZ2VudFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWJhc2ljLWF1dGgtLXRydXN0ZWQtYWdlbnRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkVXNlckFnZW50LnZhbHVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG4gY29sLXNtLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhKGlzRmlyc3QgJiYgaXNMYXN0ICYmIHRydXN0ZWRVc2VyQWdlbnQudmFsdWUgPT09ICcnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCIndHJ1c3RlZFVzZXJBZ2VudFJlbW92ZScgKyB0cnVzdGVkVXNlckFnZW50LmlkXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0cnVzdGVkVXNlckFnZW50c1JlbW92ZSh0cnVzdGVkVXNlckFnZW50LmlkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLW1pbnVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGQoYXV0aGVudGljYXRpb25SZXN0cmljdGlvbnMudHJ1c3RlZFVzZXJBZ2VudHMpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzTGFzdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZGx0LWM4eS1pY29uLXBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=