UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

30 lines 24.5 kB
import { Component, Inject, Optional } from '@angular/core'; import { AbstractForgottenPasswordComponent, NAE_MIN_PASSWORD_LENGTH } from '@netgrif/components-core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@netgrif/components-core"; import * as i3 from "@ngx-translate/core"; import * as i4 from "@angular/common"; import * as i5 from "@ngbracket/ngx-layout"; import * as i6 from "@angular/material/button"; import * as i7 from "@angular/material/icon"; import * as i8 from "@angular/material/input"; import * as i9 from "@angular/material/form-field"; import * as i10 from "@angular/material/progress-spinner"; export class ForgottenPasswordFormComponent extends AbstractForgottenPasswordComponent { constructor(formBuilder, signupService, log, translate, minPasswordLength) { super(formBuilder, signupService, log, translate, minPasswordLength); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ForgottenPasswordFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SignUpService }, { token: i2.LoggerService }, { token: i3.TranslateService }, { token: NAE_MIN_PASSWORD_LENGTH, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ForgottenPasswordFormComponent, selector: "nc-forgotten-password-form", usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"24px\" *ngIf=\"tokenVerified && (loadingToken | async) === false\">\n <form [formGroup]=\"rootFormGroup\" (ngSubmit)=\"onSubmit()\" class=\"full-width netgrif-input\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">email</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.register.email' | translate}}</mat-label>\n <input matInput disabled [value]=\"userEmail\"\n autocomplete=\"username\">\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.forgottenPass.enterNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hidePassword = !hidePassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hidePassword\">\n <mat-icon\n [color]=\"hidePassword ? undefined : 'accent'\">{{hidePassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.forgottenPass.repeatNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hideRepeatPassword ? 'password' : 'text'\"\n formControlName=\"confirmPassword\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideRepeatPassword = !hideRepeatPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideRepeatPassword\">\n <mat-icon\n [color]=\"hideRepeatPassword ? undefined : 'accent'\">{{hideRepeatPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('confirmPassword')\">{{getErrorMessage('confirmPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxLayoutAlign.xs=\"center\" class=\"margin-top-4\">\n <button fxFlexOffset=\"8px\" fxFlexOffset.xs=\"0\" mat-raised-button class=\"register-button\" color=\"primary\">\n <mat-spinner *ngIf=\"loadingSubmit | async\"\n mode=\"indeterminate\"\n diameter=\"36\"\n color=\"accent\"\n fxFlex></mat-spinner>\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{ 'forms.forgottenPass.recover' | translate }}</span>\n </button>\n </div>\n </form>\n</div>\n\n<div *ngIf=\"!tokenVerified && (loadingToken | async) === false\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex>\n <mat-icon color=\"accent\">unpublished</mat-icon>\n <span class=\"font-size-20\">{{ 'forms.register.notVerified' | translate}}</span>\n</div>\n\n<div *ngIf=\"loadingToken | async\">\n <mat-progress-spinner></mat-progress-spinner>\n</div>\n", styles: [".font-size-20{font-size:20px}.margin-top-4{margin-top:4px}.full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexOffsetDirective, selector: " [fxFlexOffset], [fxFlexOffset.xs], [fxFlexOffset.sm], [fxFlexOffset.md], [fxFlexOffset.lg], [fxFlexOffset.xl], [fxFlexOffset.lt-sm], [fxFlexOffset.lt-md], [fxFlexOffset.lt-lg], [fxFlexOffset.lt-xl], [fxFlexOffset.gt-xs], [fxFlexOffset.gt-sm], [fxFlexOffset.gt-md], [fxFlexOffset.gt-lg]", inputs: ["fxFlexOffset", "fxFlexOffset.xs", "fxFlexOffset.sm", "fxFlexOffset.md", "fxFlexOffset.lg", "fxFlexOffset.xl", "fxFlexOffset.lt-sm", "fxFlexOffset.lt-md", "fxFlexOffset.lt-lg", "fxFlexOffset.lt-xl", "fxFlexOffset.gt-xs", "fxFlexOffset.gt-sm", "fxFlexOffset.gt-md", "fxFlexOffset.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.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"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ForgottenPasswordFormComponent, decorators: [{ type: Component, args: [{ selector: 'nc-forgotten-password-form', template: "<div fxLayout=\"column\" fxLayoutGap=\"24px\" *ngIf=\"tokenVerified && (loadingToken | async) === false\">\n <form [formGroup]=\"rootFormGroup\" (ngSubmit)=\"onSubmit()\" class=\"full-width netgrif-input\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">email</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.register.email' | translate}}</mat-label>\n <input matInput disabled [value]=\"userEmail\"\n autocomplete=\"username\">\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.forgottenPass.enterNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hidePassword = !hidePassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hidePassword\">\n <mat-icon\n [color]=\"hidePassword ? undefined : 'accent'\">{{hidePassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.forgottenPass.repeatNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hideRepeatPassword ? 'password' : 'text'\"\n formControlName=\"confirmPassword\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideRepeatPassword = !hideRepeatPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideRepeatPassword\">\n <mat-icon\n [color]=\"hideRepeatPassword ? undefined : 'accent'\">{{hideRepeatPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('confirmPassword')\">{{getErrorMessage('confirmPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxLayoutAlign.xs=\"center\" class=\"margin-top-4\">\n <button fxFlexOffset=\"8px\" fxFlexOffset.xs=\"0\" mat-raised-button class=\"register-button\" color=\"primary\">\n <mat-spinner *ngIf=\"loadingSubmit | async\"\n mode=\"indeterminate\"\n diameter=\"36\"\n color=\"accent\"\n fxFlex></mat-spinner>\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{ 'forms.forgottenPass.recover' | translate }}</span>\n </button>\n </div>\n </form>\n</div>\n\n<div *ngIf=\"!tokenVerified && (loadingToken | async) === false\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex>\n <mat-icon color=\"accent\">unpublished</mat-icon>\n <span class=\"font-size-20\">{{ 'forms.register.notVerified' | translate}}</span>\n</div>\n\n<div *ngIf=\"loadingToken | async\">\n <mat-progress-spinner></mat-progress-spinner>\n</div>\n", styles: [".font-size-20{font-size:20px}.margin-top-4{margin-top:4px}.full-width{width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.SignUpService }, { type: i2.LoggerService }, { type: i3.TranslateService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_MIN_PASSWORD_LENGTH] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZ290dGVuLXBhc3N3b3JkLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9yZ290dGVuLXBhc3N3b3JkL2ZvcmdvdHRlbi1wYXNzd29yZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2ZvcmdvdHRlbi1wYXNzd29yZC9mb3Jnb3R0ZW4tcGFzc3dvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFDLGtDQUFrQyxFQUFnQyx1QkFBdUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7QUFTbkksTUFBTSxPQUFPLDhCQUErQixTQUFRLGtDQUFrQztJQUNsRixZQUFZLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLEdBQWtCLEVBQ2xCLFNBQTJCLEVBQ2tCLGlCQUFpQjtRQUN0RSxLQUFLLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDekUsQ0FBQzt3R0FQUSw4QkFBOEIsdUlBS1AsdUJBQXVCOzRGQUw5Qyw4QkFBOEIseUZDVjNDLHlsSUFvRUE7OzRGRDFEYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0ksNEJBQTRCOzswQkFTekIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Rm9yZ290dGVuUGFzc3dvcmRDb21wb25lbnQsIExvZ2dlclNlcnZpY2UsIFNpZ25VcFNlcnZpY2UsIE5BRV9NSU5fUEFTU1dPUkRfTEVOR1RIfSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlcn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy1mb3Jnb3R0ZW4tcGFzc3dvcmQtZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZvcmdvdHRlbi1wYXNzd29yZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb3Jnb3R0ZW4tcGFzc3dvcmQtZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZvcmdvdHRlblBhc3N3b3JkRm9ybUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Rm9yZ290dGVuUGFzc3dvcmRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgICBzaWdudXBTZXJ2aWNlOiBTaWduVXBTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGxvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfTUlOX1BBU1NXT1JEX0xFTkdUSCkgbWluUGFzc3dvcmRMZW5ndGgpIHtcbiAgICAgICAgc3VwZXIoZm9ybUJ1aWxkZXIsIHNpZ251cFNlcnZpY2UsIGxvZywgdHJhbnNsYXRlLCBtaW5QYXNzd29yZExlbmd0aCk7XG4gICAgfVxufVxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMjRweFwiICpuZ0lmPVwidG9rZW5WZXJpZmllZCAmJiAobG9hZGluZ1Rva2VuIHwgYXN5bmMpID09PSBmYWxzZVwiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwicm9vdEZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgY2xhc3M9XCJmdWxsLXdpZHRoIG5ldGdyaWYtaW5wdXRcIj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwibmV0Z3JpZi1pY29uLWZpeFwiPmVtYWlsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2Zvcm1zLnJlZ2lzdGVyLmVtYWlsJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGRpc2FibGVkIFt2YWx1ZV09XCJ1c2VyRW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJ1c2VybmFtZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwibmV0Z3JpZi1pbnB1dFwiID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm5ldGdyaWYtaWNvbi1maXhcIj52cG5fa2V5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2Zvcm1zLmZvcmdvdHRlblBhc3MuZW50ZXJOZXdQYXNzJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJoaWRlUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZVBhc3N3b3JkID0gIWhpZGVQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGlkZSBwYXNzd29yZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImhpZGVQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJoaWRlUGFzc3dvcmQgPyB1bmRlZmluZWQgOiAnYWNjZW50J1wiPnt7aGlkZVBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5J319PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWlzRmllbGRWYWxpZCgncGFzc3dvcmQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdwYXNzd29yZCcpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBjbGFzcz1cIm5ldGdyaWYtaW5wdXRcIiA+XG4gICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJuZXRncmlmLWljb24tZml4XCI+dnBuX2tleTwvbWF0LWljb24+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdmb3Jtcy5mb3Jnb3R0ZW5QYXNzLnJlcGVhdE5ld1Bhc3MnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImhpZGVSZXBlYXRQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb25maXJtUGFzc3dvcmRcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZVJlcGVhdFBhc3N3b3JkID0gIWhpZGVSZXBlYXRQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGlkZSBwYXNzd29yZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImhpZGVSZXBlYXRQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJoaWRlUmVwZWF0UGFzc3dvcmQgPyB1bmRlZmluZWQgOiAnYWNjZW50J1wiPnt7aGlkZVJlcGVhdFBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5J319PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWlzRmllbGRWYWxpZCgnY29uZmlybVBhc3N3b3JkJylcIj57e2dldEVycm9yTWVzc2FnZSgnY29uZmlybVBhc3N3b3JkJyl9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCIgZnhMYXlvdXRBbGlnbi54cz1cImNlbnRlclwiIGNsYXNzPVwibWFyZ2luLXRvcC00XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGZ4RmxleE9mZnNldD1cIjhweFwiIGZ4RmxleE9mZnNldC54cz1cIjBcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cInJlZ2lzdGVyLWJ1dHRvblwiIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImxvYWRpbmdTdWJtaXQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbWV0ZXI9XCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIobG9hZGluZ1N1Ym1pdCB8IGFzeW5jKSA9PT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD57eyAnZm9ybXMuZm9yZ290dGVuUGFzcy5yZWNvdmVyJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cIiF0b2tlblZlcmlmaWVkICYmIChsb2FkaW5nVG9rZW4gfCBhc3luYykgPT09IGZhbHNlXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGZ4RmxleD5cbiAgICA8bWF0LWljb24gY29sb3I9XCJhY2NlbnRcIj51bnB1Ymxpc2hlZDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJmb250LXNpemUtMjBcIj57eyAnZm9ybXMucmVnaXN0ZXIubm90VmVyaWZpZWQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImxvYWRpbmdUb2tlbiB8IGFzeW5jXCI+XG4gICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG48L2Rpdj5cbiJdfQ==