@myrmidon/auth-jwt-admin 5.1.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/myrmidon-auth-jwt-admin.mjs +248 -268
- package/fesm2022/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +8 -9
- package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +4 -5
- package/lib/components/state/user-list.repository.d.ts +2 -2
- package/lib/components/user-editor/user-editor.component.d.ts +28 -20
- package/lib/components/user-filter/user-filter.component.d.ts +15 -8
- package/lib/components/user-list/user-list.component.d.ts +7 -6
- package/lib/services/auth-jwt-account.service.d.ts +4 -3
- package/lib/validators/password.validators.d.ts +3 -0
- package/package.json +8 -10
- package/public-api.d.ts +0 -1
- package/esm2022/lib/auth-jwt-admin.module.mjs +0 -112
- package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +0 -169
- package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +0 -80
- package/esm2022/lib/components/state/user-list.repository.mjs +0 -126
- package/esm2022/lib/components/user-editor/user-editor.component.mjs +0 -111
- package/esm2022/lib/components/user-filter/user-filter.component.mjs +0 -64
- package/esm2022/lib/components/user-list/user-list.component.mjs +0 -67
- package/esm2022/lib/services/auth-jwt-account.service.mjs +0 -203
- package/esm2022/lib/validators/password.validators.mjs +0 -49
- package/esm2022/myrmidon-auth-jwt-admin.mjs +0 -5
- package/esm2022/public-api.mjs +0 -12
- package/lib/auth-jwt-admin.module.d.ts +0 -28
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
|
|
1
|
+
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
2
|
import { UserFilter } from '../../services/auth-jwt-account.service';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Users filter.
|
|
6
|
+
*/
|
|
5
7
|
export declare class UserFilterComponent {
|
|
6
8
|
private _filter?;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* The filter.
|
|
11
|
+
*/
|
|
12
|
+
readonly filter: import("@angular/core").InputSignal<UserFilter | null | undefined>;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the filter is disabled.
|
|
15
|
+
*/
|
|
16
|
+
readonly disabled: import("@angular/core").InputSignal<boolean | undefined>;
|
|
10
17
|
/**
|
|
11
18
|
* Event emitted when the filter changes.
|
|
12
19
|
*/
|
|
13
|
-
filterChange:
|
|
20
|
+
filterChange: import("@angular/core").OutputEmitterRef<UserFilter>;
|
|
14
21
|
name: FormControl<string | null>;
|
|
15
22
|
form: FormGroup;
|
|
16
|
-
constructor(
|
|
23
|
+
constructor();
|
|
17
24
|
private updateForm;
|
|
18
25
|
private getFilter;
|
|
19
26
|
reset(): void;
|
|
20
27
|
apply(): void;
|
|
21
28
|
static ɵfac: i0.ɵɵFactoryDeclaration<UserFilterComponent, never>;
|
|
22
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<UserFilterComponent, "auth-jwt-user-filter", never, { "filter": { "alias": "filter"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "filterChange": "filterChange"; }, never, never,
|
|
29
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UserFilterComponent, "auth-jwt-user-filter", never, { "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "filterChange": "filterChange"; }, never, never, true, never>;
|
|
23
30
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { PageEvent } from '@angular/material/paginator';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import '@angular/localize/init';
|
|
4
|
-
import { GravatarOptions,
|
|
4
|
+
import { GravatarOptions, User } from '@myrmidon/auth-jwt-login';
|
|
5
5
|
import { DataPage } from '@myrmidon/ng-tools';
|
|
6
|
-
import { DialogService } from '@myrmidon/ng-mat-tools';
|
|
7
|
-
import { UserListRepository } from '../state/user-list.repository';
|
|
8
6
|
import { UserFilter } from '../../services/auth-jwt-account.service';
|
|
9
7
|
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* List of users.
|
|
10
|
+
*/
|
|
10
11
|
export declare class UserListComponent {
|
|
11
12
|
private _repository;
|
|
12
13
|
private _dialogService;
|
|
@@ -15,16 +16,16 @@ export declare class UserListComponent {
|
|
|
15
16
|
loading$: Observable<boolean>;
|
|
16
17
|
filter$: Observable<UserFilter>;
|
|
17
18
|
page$: Observable<DataPage<User>>;
|
|
18
|
-
constructor(
|
|
19
|
+
constructor();
|
|
19
20
|
reset(): void;
|
|
20
21
|
onFilterChange(filter: UserFilter): void;
|
|
21
22
|
onPageChange(event: PageEvent): void;
|
|
22
23
|
deleteUser(user: User): void;
|
|
23
24
|
setActiveUser(user: User | null): void;
|
|
24
25
|
resetActiveUser(): void;
|
|
25
|
-
saveActiveUser(user: User): void;
|
|
26
|
+
saveActiveUser(user: User | undefined): void;
|
|
26
27
|
onUserEditorClose(): void;
|
|
27
28
|
getGravatarUrl(email: string, options?: GravatarOptions): string | null;
|
|
28
29
|
static ɵfac: i0.ɵɵFactoryDeclaration<UserListComponent, never>;
|
|
29
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<UserListComponent, "auth-jwt-user-list", never, {}, {}, never, never,
|
|
30
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UserListComponent, "auth-jwt-user-list", never, {}, {}, never, never, true, never>;
|
|
30
31
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
import { DataPage
|
|
2
|
+
import { DataPage } from '@myrmidon/ng-tools';
|
|
4
3
|
import { User } from '@myrmidon/auth-jwt-login';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
/**
|
|
@@ -35,11 +34,13 @@ export interface PasswordChange {
|
|
|
35
34
|
export interface UserFilter {
|
|
36
35
|
name?: string;
|
|
37
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Service for managing user accounts with JWT authentication.
|
|
39
|
+
*/
|
|
38
40
|
export declare class AuthJwtAccountService {
|
|
39
41
|
private _http;
|
|
40
42
|
private _error;
|
|
41
43
|
private _env;
|
|
42
|
-
constructor(_http: HttpClient, _error: ErrorService, _env: EnvService);
|
|
43
44
|
/**
|
|
44
45
|
* Checks if the specified email address is registered on the server.
|
|
45
46
|
* @param email email address to test.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myrmidon/auth-jwt-admin",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "JWT-based auth services accounts admin component.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"JWT",
|
|
@@ -15,15 +15,15 @@
|
|
|
15
15
|
"name": "Daniele Fusi"
|
|
16
16
|
},
|
|
17
17
|
"peerDependencies": {
|
|
18
|
-
"@angular/common": "^
|
|
19
|
-
"@angular/core": "^
|
|
20
|
-
"@angular/material": "^
|
|
21
|
-
"@myrmidon/auth-jwt-login": "^
|
|
22
|
-
"@myrmidon/
|
|
23
|
-
"@myrmidon/
|
|
18
|
+
"@angular/common": "^19.0.0",
|
|
19
|
+
"@angular/core": "^19.0.0",
|
|
20
|
+
"@angular/material": "^19.0.0",
|
|
21
|
+
"@myrmidon/auth-jwt-login": "^6.0.0",
|
|
22
|
+
"@myrmidon/ngx-tools": "^0.0.1",
|
|
23
|
+
"@myrmidon/ngx-mat-tools": "^0.0.1"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"tslib": "^2.
|
|
26
|
+
"tslib": "^2.3.0"
|
|
27
27
|
},
|
|
28
28
|
"module": "fesm2022/myrmidon-auth-jwt-admin.mjs",
|
|
29
29
|
"typings": "index.d.ts",
|
|
@@ -33,8 +33,6 @@
|
|
|
33
33
|
},
|
|
34
34
|
".": {
|
|
35
35
|
"types": "./index.d.ts",
|
|
36
|
-
"esm2022": "./esm2022/myrmidon-auth-jwt-admin.mjs",
|
|
37
|
-
"esm": "./esm2022/myrmidon-auth-jwt-admin.mjs",
|
|
38
36
|
"default": "./fesm2022/myrmidon-auth-jwt-admin.mjs"
|
|
39
37
|
}
|
|
40
38
|
},
|
package/public-api.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export * from './lib/components/user-list/user-list.component';
|
|
|
5
5
|
export * from './lib/components/state/user-list.repository';
|
|
6
6
|
export * from './lib/services/auth-jwt-account.service';
|
|
7
7
|
export * from './lib/validators/password.validators';
|
|
8
|
-
export * from './lib/auth-jwt-admin.module';
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { RouterModule } from '@angular/router';
|
|
4
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { MatCardModule } from '@angular/material/card';
|
|
6
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
-
import { MatInputModule } from '@angular/material/input';
|
|
8
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
10
|
-
import { MatExpansionModule } from '@angular/material/expansion';
|
|
11
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
|
-
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
13
|
-
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
14
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
15
|
-
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
16
|
-
import { MatDialogModule } from '@angular/material/dialog';
|
|
17
|
-
import { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';
|
|
18
|
-
import { NgToolsModule } from '@myrmidon/ng-tools';
|
|
19
|
-
import { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';
|
|
20
|
-
import { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';
|
|
21
|
-
import { UserFilterComponent } from './components/user-filter/user-filter.component';
|
|
22
|
-
import { UserListComponent } from './components/user-list/user-list.component';
|
|
23
|
-
import { UserEditorComponent } from './components/user-editor/user-editor.component';
|
|
24
|
-
import * as i0 from "@angular/core";
|
|
25
|
-
export class AuthJwtAdminModule {
|
|
26
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtAdminModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
27
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtAdminModule, declarations: [AuthJwtRegistrationComponent,
|
|
28
|
-
PasswordStrengthBarComponent,
|
|
29
|
-
UserFilterComponent,
|
|
30
|
-
UserListComponent,
|
|
31
|
-
UserEditorComponent], imports: [CommonModule,
|
|
32
|
-
FormsModule,
|
|
33
|
-
RouterModule,
|
|
34
|
-
ReactiveFormsModule,
|
|
35
|
-
// material
|
|
36
|
-
MatButtonModule,
|
|
37
|
-
MatCardModule,
|
|
38
|
-
MatCheckboxModule,
|
|
39
|
-
MatDialogModule,
|
|
40
|
-
MatExpansionModule,
|
|
41
|
-
MatIconModule,
|
|
42
|
-
MatInputModule,
|
|
43
|
-
MatPaginatorModule,
|
|
44
|
-
MatProgressBarModule,
|
|
45
|
-
MatProgressSpinnerModule,
|
|
46
|
-
MatSnackBarModule,
|
|
47
|
-
MatTooltipModule,
|
|
48
|
-
AuthJwtLoginModule,
|
|
49
|
-
NgToolsModule], exports: [AuthJwtRegistrationComponent,
|
|
50
|
-
PasswordStrengthBarComponent,
|
|
51
|
-
UserFilterComponent,
|
|
52
|
-
UserListComponent] }); }
|
|
53
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtAdminModule, imports: [CommonModule,
|
|
54
|
-
FormsModule,
|
|
55
|
-
RouterModule,
|
|
56
|
-
ReactiveFormsModule,
|
|
57
|
-
// material
|
|
58
|
-
MatButtonModule,
|
|
59
|
-
MatCardModule,
|
|
60
|
-
MatCheckboxModule,
|
|
61
|
-
MatDialogModule,
|
|
62
|
-
MatExpansionModule,
|
|
63
|
-
MatIconModule,
|
|
64
|
-
MatInputModule,
|
|
65
|
-
MatPaginatorModule,
|
|
66
|
-
MatProgressBarModule,
|
|
67
|
-
MatProgressSpinnerModule,
|
|
68
|
-
MatSnackBarModule,
|
|
69
|
-
MatTooltipModule,
|
|
70
|
-
AuthJwtLoginModule,
|
|
71
|
-
NgToolsModule] }); }
|
|
72
|
-
}
|
|
73
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtAdminModule, decorators: [{
|
|
74
|
-
type: NgModule,
|
|
75
|
-
args: [{
|
|
76
|
-
declarations: [
|
|
77
|
-
AuthJwtRegistrationComponent,
|
|
78
|
-
PasswordStrengthBarComponent,
|
|
79
|
-
UserFilterComponent,
|
|
80
|
-
UserListComponent,
|
|
81
|
-
UserEditorComponent,
|
|
82
|
-
],
|
|
83
|
-
exports: [
|
|
84
|
-
AuthJwtRegistrationComponent,
|
|
85
|
-
PasswordStrengthBarComponent,
|
|
86
|
-
UserFilterComponent,
|
|
87
|
-
UserListComponent,
|
|
88
|
-
],
|
|
89
|
-
imports: [
|
|
90
|
-
CommonModule,
|
|
91
|
-
FormsModule,
|
|
92
|
-
RouterModule,
|
|
93
|
-
ReactiveFormsModule,
|
|
94
|
-
// material
|
|
95
|
-
MatButtonModule,
|
|
96
|
-
MatCardModule,
|
|
97
|
-
MatCheckboxModule,
|
|
98
|
-
MatDialogModule,
|
|
99
|
-
MatExpansionModule,
|
|
100
|
-
MatIconModule,
|
|
101
|
-
MatInputModule,
|
|
102
|
-
MatPaginatorModule,
|
|
103
|
-
MatProgressBarModule,
|
|
104
|
-
MatProgressSpinnerModule,
|
|
105
|
-
MatSnackBarModule,
|
|
106
|
-
MatTooltipModule,
|
|
107
|
-
AuthJwtLoginModule,
|
|
108
|
-
NgToolsModule,
|
|
109
|
-
],
|
|
110
|
-
}]
|
|
111
|
-
}] });
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtYWRtaW4ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9hdXRoLWp3dC1hZG1pbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7QUFzQ3JGLE1BQU0sT0FBTyxrQkFBa0I7OEdBQWxCLGtCQUFrQjsrR0FBbEIsa0JBQWtCLGlCQWxDM0IsNEJBQTRCO1lBQzVCLDRCQUE0QjtZQUM1QixtQkFBbUI7WUFDbkIsaUJBQWlCO1lBQ2pCLG1CQUFtQixhQVNuQixZQUFZO1lBQ1osV0FBVztZQUNYLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsV0FBVztZQUNYLGVBQWU7WUFDZixhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLHdCQUF3QjtZQUN4QixpQkFBaUI7WUFDakIsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixhQUFhLGFBeEJiLDRCQUE0QjtZQUM1Qiw0QkFBNEI7WUFDNUIsbUJBQW1CO1lBQ25CLGlCQUFpQjsrR0F3QlIsa0JBQWtCLFlBckIzQixZQUFZO1lBQ1osV0FBVztZQUNYLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsV0FBVztZQUNYLGVBQWU7WUFDZixhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLHdCQUF3QjtZQUN4QixpQkFBaUI7WUFDakIsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixhQUFhOzsyRkFHSixrQkFBa0I7a0JBcEM5QixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWiw0QkFBNEI7d0JBQzVCLDRCQUE0Qjt3QkFDNUIsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLG1CQUFtQjtxQkFDcEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDRCQUE0Qjt3QkFDNUIsNEJBQTRCO3dCQUM1QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQix3QkFBd0I7d0JBQ3hCLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixrQkFBa0I7d0JBQ2xCLGFBQWE7cUJBQ2Q7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0Q2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0U25hY2tCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgQXV0aEp3dExvZ2luTW9kdWxlIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xuXG5pbXBvcnQgeyBBdXRoSnd0UmVnaXN0cmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1dGgtand0LXJlZ2lzdHJhdGlvbi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhc3N3b3JkU3RyZW5ndGhCYXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGFzc3dvcmQtc3RyZW5ndGgtYmFyL3Bhc3N3b3JkLXN0cmVuZ3RoLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlckZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlckxpc3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdXNlci1saXN0L3VzZXItbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlckVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBBdXRoSnd0UmVnaXN0cmF0aW9uQ29tcG9uZW50LFxuICAgIFBhc3N3b3JkU3RyZW5ndGhCYXJDb21wb25lbnQsXG4gICAgVXNlckZpbHRlckNvbXBvbmVudCxcbiAgICBVc2VyTGlzdENvbXBvbmVudCxcbiAgICBVc2VyRWRpdG9yQ29tcG9uZW50LFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQXV0aEp3dFJlZ2lzdHJhdGlvbkNvbXBvbmVudCxcbiAgICBQYXNzd29yZFN0cmVuZ3RoQmFyQ29tcG9uZW50LFxuICAgIFVzZXJGaWx0ZXJDb21wb25lbnQsXG4gICAgVXNlckxpc3RDb21wb25lbnQsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgLy8gbWF0ZXJpYWxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2FyZE1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBNYXRTbmFja0Jhck1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIEF1dGhKd3RMb2dpbk1vZHVsZSxcbiAgICBOZ1Rvb2xzTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoSnd0QWRtaW5Nb2R1bGUge31cbiJdfQ==
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { Validators, } from '@angular/forms';
|
|
3
|
-
import { take } from 'rxjs/operators';
|
|
4
|
-
import { PasswordValidators } from '../../validators/password.validators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
8
|
-
import * as i3 from "../../services/auth-jwt-account.service";
|
|
9
|
-
import * as i4 from "../state/user-list.repository";
|
|
10
|
-
import * as i5 from "@angular/material/button";
|
|
11
|
-
import * as i6 from "@angular/material/icon";
|
|
12
|
-
import * as i7 from "@angular/material/input";
|
|
13
|
-
import * as i8 from "@angular/material/form-field";
|
|
14
|
-
import * as i9 from "@angular/material/progress-spinner";
|
|
15
|
-
import * as i10 from "../password-strength-bar/password-strength-bar.component";
|
|
16
|
-
export class AuthJwtRegistrationComponent {
|
|
17
|
-
constructor(formBuilder, _snackbar, _accountService, _userRepository) {
|
|
18
|
-
this._snackbar = _snackbar;
|
|
19
|
-
this._accountService = _accountService;
|
|
20
|
-
this._userRepository = _userRepository;
|
|
21
|
-
this.hide = true;
|
|
22
|
-
this.registered = new EventEmitter();
|
|
23
|
-
// form
|
|
24
|
-
this.email = formBuilder.control('', {
|
|
25
|
-
validators: [Validators.required, Validators.email],
|
|
26
|
-
asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(this),
|
|
27
|
-
nonNullable: true,
|
|
28
|
-
});
|
|
29
|
-
this.name = formBuilder.control('', {
|
|
30
|
-
validators: Validators.required,
|
|
31
|
-
asyncValidators: this.getUniqueNameValidator(this._accountService).bind(this),
|
|
32
|
-
nonNullable: true,
|
|
33
|
-
});
|
|
34
|
-
this.firstName = formBuilder.control('', {
|
|
35
|
-
validators: [Validators.required, Validators.maxLength(50)],
|
|
36
|
-
nonNullable: true,
|
|
37
|
-
});
|
|
38
|
-
this.lastName = formBuilder.control('', {
|
|
39
|
-
validators: [Validators.required, Validators.maxLength(50)],
|
|
40
|
-
nonNullable: true,
|
|
41
|
-
});
|
|
42
|
-
// http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password
|
|
43
|
-
this.password = formBuilder.control('', {
|
|
44
|
-
validators: [Validators.required, PasswordValidators.standard()],
|
|
45
|
-
nonNullable: true,
|
|
46
|
-
});
|
|
47
|
-
this.confirmPassword = formBuilder.control('', {
|
|
48
|
-
validators: Validators.required,
|
|
49
|
-
nonNullable: true,
|
|
50
|
-
});
|
|
51
|
-
this.form = formBuilder.group({
|
|
52
|
-
email: this.email,
|
|
53
|
-
name: this.name,
|
|
54
|
-
firstName: this.firstName,
|
|
55
|
-
lastName: this.lastName,
|
|
56
|
-
password: this.password,
|
|
57
|
-
confirmPassword: this.confirmPassword,
|
|
58
|
-
}, {
|
|
59
|
-
validators: [
|
|
60
|
-
PasswordValidators.areEqual('password', 'confirmPassword'),
|
|
61
|
-
],
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Creates a unique name validator. There is no dependency injection at this level,
|
|
66
|
-
* but we can use closures. As a matter of fact, we have access to the service instance
|
|
67
|
-
* from the component where we register validators. So we will implement a function
|
|
68
|
-
* that will accept the service as parameter, and create the actual validation function.
|
|
69
|
-
* This function will have access to the service when called during the validation process.
|
|
70
|
-
* See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.
|
|
71
|
-
*/
|
|
72
|
-
getUniqueNameValidator(service) {
|
|
73
|
-
return (control) => {
|
|
74
|
-
return new Promise((resolve, reject) => {
|
|
75
|
-
// avoid checking if empty
|
|
76
|
-
if (!control.value) {
|
|
77
|
-
resolve(null);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
service.isNameRegistered(control.value).subscribe({
|
|
81
|
-
next: (data) => {
|
|
82
|
-
if (!data.isExisting) {
|
|
83
|
-
resolve(null);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
resolve({ uniqueName: true });
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
error: (error) => {
|
|
90
|
-
console.error('Unique name validator error' +
|
|
91
|
-
(error ? JSON.stringify(error) : ''));
|
|
92
|
-
resolve({ uniqueName: true });
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
getUniqueEmailValidator(service) {
|
|
100
|
-
return (control) => {
|
|
101
|
-
return new Promise((resolve, reject) => {
|
|
102
|
-
// avoid checking if empty
|
|
103
|
-
if (!control.value) {
|
|
104
|
-
resolve(null);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
service.isEmailRegistered(control.value).subscribe({
|
|
108
|
-
next: (data) => {
|
|
109
|
-
if (!data.isExisting) {
|
|
110
|
-
resolve(null);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
resolve({ uniqueEmail: true });
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
error: (error) => {
|
|
117
|
-
console.error('Unique email validator error' +
|
|
118
|
-
(error ? JSON.stringify(error) : ''));
|
|
119
|
-
resolve({ uniqueEmail: true });
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
onSubmit() {
|
|
127
|
-
if (!this.form.valid ||
|
|
128
|
-
this.busy ||
|
|
129
|
-
this.name.pending ||
|
|
130
|
-
this.email.pending) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const model = {
|
|
134
|
-
email: this.email.value,
|
|
135
|
-
name: this.name.value,
|
|
136
|
-
firstName: this.firstName.value,
|
|
137
|
-
lastName: this.lastName.value,
|
|
138
|
-
password: this.password.value,
|
|
139
|
-
};
|
|
140
|
-
this.busy = true;
|
|
141
|
-
this._accountService
|
|
142
|
-
.register(model, this.autoConfirm)
|
|
143
|
-
.pipe(take(1))
|
|
144
|
-
.subscribe({
|
|
145
|
-
next: () => {
|
|
146
|
-
this.busy = false;
|
|
147
|
-
this._snackbar.open($localize `:auth-jwt-admin:Registration succeeded`, 'OK');
|
|
148
|
-
this._userRepository.reset();
|
|
149
|
-
this.registered.emit();
|
|
150
|
-
},
|
|
151
|
-
error: (error) => {
|
|
152
|
-
this.busy = false;
|
|
153
|
-
console.error('Registration error' + (error ? JSON.stringify(error) : ''));
|
|
154
|
-
this._snackbar.open($localize `:auth-jwt-admin:Registration error`, 'OK');
|
|
155
|
-
},
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtRegistrationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatSnackBar }, { token: i3.AuthJwtAccountService }, { token: i4.UserListRepository }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
159
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AuthJwtRegistrationComponent, selector: "auth-jwt-registration", inputs: { autoConfirm: "autoConfirm" }, outputs: { registered: "registered" }, ngImport: i0, template: "<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}details{margin:8px}.info{column-width:600px}\n"], dependencies: [{ 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.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i10.PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: ["passwordToCheck"], outputs: ["strengthChange"] }] }); }
|
|
160
|
-
}
|
|
161
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AuthJwtRegistrationComponent, decorators: [{
|
|
162
|
-
type: Component,
|
|
163
|
-
args: [{ selector: 'auth-jwt-registration', template: "<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}details{margin:8px}.info{column-width:600px}\n"] }]
|
|
164
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatSnackBar }, { type: i3.AuthJwtAccountService }, { type: i4.UserListRepository }], propDecorators: { autoConfirm: [{
|
|
165
|
-
type: Input
|
|
166
|
-
}], registered: [{
|
|
167
|
-
type: Output
|
|
168
|
-
}] } });
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUNMLFVBQVUsR0FNWCxNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU90QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7Ozs7Ozs7O0FBUTFFLE1BQU0sT0FBTyw0QkFBNEI7SUEyQnZDLFlBQ0UsV0FBd0IsRUFDaEIsU0FBc0IsRUFDdEIsZUFBc0MsRUFDdEMsZUFBbUM7UUFGbkMsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDdEMsb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBTnRDLFNBQUksR0FBRyxJQUFJLENBQUM7UUFRakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzFDLE9BQU87UUFDUCxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ25DLFVBQVUsRUFBRSxD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Q2pCLFNBQVMsQ0FBQSx3Q0FBd0MsRUFDakQsSUFBSSxDQUNMLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQ1gscUJBQXFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUM3RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNqQixTQUFTLENBQUEsb0NBQW9DLEVBQzdDLElBQUksQ0FDTCxDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBMU1VLDRCQUE0QjtrR0FBNUIsNEJBQTRCLDRJQzFCekMscXpQQWdPQTs7MkZEdE1hLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx1QkFBdUI7K0tBbUIxQixXQUFXO3NCQURqQixLQUFLO2dCQVNDLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgVmFsaWRhdG9ycyxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgVmFsaWRhdGlvbkVycm9ycyxcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQXV0aEp3dEFjY291bnRTZXJ2aWNlLFxyXG4gIEV4aXN0UmVzdWx0LFxyXG4gIFJlZ2lzdHJhdGlvbk1vZGVsLFxyXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGgtand0LWFjY291bnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvcGFzc3dvcmQudmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IFVzZXJMaXN0UmVwb3NpdG9yeSB9IGZyb20gJy4uL3N0YXRlL3VzZXItbGlzdC5yZXBvc2l0b3J5JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtcmVnaXN0cmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aEp3dFJlZ2lzdHJhdGlvbkNvbXBvbmVudCB7XHJcbiAgcHVibGljIGJ1c3k6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZm9ybVxyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGVtYWlsOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBuYW1lOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBmaXJzdE5hbWU6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIGxhc3ROYW1lOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBwYXNzd29yZDogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICBwdWJsaWMgY29uZmlybVBhc3N3b3JkOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG5cclxuICAvKipcclxuICAgKiBUcnVlIGlmIHRoZSByZWdpc3RyYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGF1dG9Db25maXJtPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIGEgdXNlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQuIFVzdWFsbHlcclxuICAgKiB5b3Ugc2hvdWxkIGhhbmRsZSB0aGlzIHRvIG1vdmUgYXdheSBmcm9tIHRoZSByZWdpc3RyYXRpb25cclxuICAgKiBwYWdlLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWdpc3RlcmVkOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHVibGljIGhpZGUgPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcclxuICAgIHByaXZhdGUgX2FjY291bnRTZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF91c2VyUmVwb3NpdG9yeTogVXNlckxpc3RSZXBvc2l0b3J5XHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuZW1haWwgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSxcclxuICAgICAgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmdldFVuaXF1ZUVtYWlsVmFsaWRhdG9yKHRoaXMuX2FjY291bnRTZXJ2aWNlKS5iaW5kKFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIGFzeW5jVmFsaWRhdG9yczogdGhpcy5nZXRVbmlxdWVOYW1lVmFsaWRhdG9yKHRoaXMuX2FjY291bnRTZXJ2aWNlKS5iaW5kKFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpcnN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIHtcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV0sXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxhc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NDc0OTkxL2FuZ3VsYXItMi1mb3JtLXZhbGlkYXRpbmctZm9yLXJlcGVhdC1wYXNzd29yZFxyXG4gICAgdGhpcy5wYXNzd29yZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIHtcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFBhc3N3b3JkVmFsaWRhdG9ycy5zdGFuZGFyZCgpXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKFxyXG4gICAgICB7XHJcbiAgICAgICAgZW1haWw6IHRoaXMuZW1haWwsXHJcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUsXHJcbiAgICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUsXHJcbiAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXHJcbiAgICAgICAgY29uZmlybVBhc3N3b3JkOiB0aGlzLmNvbmZpcm1QYXNzd29yZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbGlkYXRvcnM6IFtcclxuICAgICAgICAgIFBhc3N3b3JkVmFsaWRhdG9ycy5hcmVFcXVhbCgncGFzc3dvcmQnLCAnY29uZmlybVBhc3N3b3JkJyksXHJcbiAgICAgICAgXSxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSB2YWxpZGF0b3IuIFRoZXJlIGlzIG5vIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGF0IHRoaXMgbGV2ZWwsXHJcbiAgICogYnV0IHdlIGNhbiB1c2UgY2xvc3VyZXMuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlXHJcbiAgICogZnJvbSB0aGUgY29tcG9uZW50IHdoZXJlIHdlIHJlZ2lzdGVyIHZhbGlkYXRvcnMuIFNvIHdlIHdpbGwgaW1wbGVtZW50IGEgZnVuY3Rpb25cclxuICAgKiB0aGF0IHdpbGwgYWNjZXB0IHRoZSBzZXJ2aWNlIGFzIHBhcmFtZXRlciwgYW5kIGNyZWF0ZSB0aGUgYWN0dWFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIHdoZW4gY2FsbGVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLlxyXG4gICAqIFNlZSBodHRwOi8vcmVzdGxldC5jb20vYmxvZy8yMDE2LzAyLzE3L2ltcGxlbWVudGluZy1hbmd1bGFyMi1mb3Jtcy1iZXlvbmQtYmFzaWNzLXBhcnQtMi8uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRVbmlxdWVOYW1lVmFsaWRhdG9yKHNlcnZpY2U6IEF1dGhKd3RBY2NvdW50U2VydmljZSkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXHJcbiAgICApOlxyXG4gICAgICB8IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+XHJcbiAgICAgIHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIC8vIGF2b2lkIGNoZWNraW5nIGlmIGVtcHR5XHJcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXJ2aWNlLmlzTmFtZVJlZ2lzdGVyZWQoY29udHJvbC52YWx1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKGRhdGE6IEV4aXN0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmlzRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVOYW1lOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5pcXVlIG5hbWUgdmFsaWRhdG9yIGVycm9yJyArXHJcbiAgICAgICAgICAgICAgICAgIChlcnJvciA/IEpTT04uc3RyaW5naWZ5KGVycm9yKSA6ICcnKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZU5hbWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VW5pcXVlRW1haWxWYWxpZGF0b3Ioc2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcclxuICAgICk6XHJcbiAgICAgIHwgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD5cclxuICAgICAgfCBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gYXZvaWQgY2hlY2tpbmcgaWYgZW1wdHlcclxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlcnZpY2UuaXNFbWFpbFJlZ2lzdGVyZWQoY29udHJvbC52YWx1ZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKGRhdGE6IEV4aXN0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmlzRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVFbWFpbDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgJ1VuaXF1ZSBlbWFpbCB2YWxpZGF0b3IgZXJyb3InICtcclxuICAgICAgICAgICAgICAgICAgKGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpIDogJycpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlRW1haWw6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuZm9ybS52YWxpZCB8fFxyXG4gICAgICB0aGlzLmJ1c3kgfHxcclxuICAgICAgdGhpcy5uYW1lLnBlbmRpbmcgfHxcclxuICAgICAgdGhpcy5lbWFpbC5wZW5kaW5nXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vZGVsOiBSZWdpc3RyYXRpb25Nb2RlbCA9IHtcclxuICAgICAgZW1haWw6IHRoaXMuZW1haWwudmFsdWUsXHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZS52YWx1ZSxcclxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZS52YWx1ZSxcclxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUudmFsdWUsXHJcbiAgICAgIHBhc3N3b3JkOiB0aGlzLnBhc3N3b3JkLnZhbHVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5fYWNjb3VudFNlcnZpY2VcclxuICAgICAgLnJlZ2lzdGVyKG1vZGVsLCB0aGlzLmF1dG9Db25maXJtKVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oXHJcbiAgICAgICAgICAgICRsb2NhbGl6ZWA6YXV0aC1qd3QtYWRtaW46UmVnaXN0cmF0aW9uIHN1Y2NlZWRlZGAsXHJcbiAgICAgICAgICAgICdPSydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLl91c2VyUmVwb3NpdG9yeS5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkLmVtaXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgJ1JlZ2lzdHJhdGlvbiAgZXJyb3InICsgKGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpIDogJycpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbihcclxuICAgICAgICAgICAgJGxvY2FsaXplYDphdXRoLWp3dC1hZG1pbjpSZWdpc3RyYXRpb24gZXJyb3JgLFxyXG4gICAgICAgICAgICAnT0snXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxuICA8Zm9ybSByb2xlPVwiZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwib25TdWJtaXQoKVwiPlxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQgaTE4bj1cImF1dGgtand0LWFkbWluXCI+cmVnaXN0cmF0aW9uPC9sZWdlbmQ+XG4gICAgICA8IS0tIGVtYWlsIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWxhYmVsIGkxOG4+ZW1haWw8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgaWQ9XCJlbWFpbFwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCIyNTZcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJlbWFpbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICBAaWYgKCAkYW55KGVtYWlsKS5lcnJvcnM/LnJlcXVpcmVkICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKSApXG4gICAgICAgICAge1xuICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+ZW1haWwgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9IEBpZiAoJGFueShlbWFpbCkuZXJyb3JzPy5lbWFpbCAmJiAoZW1haWwuZGlydHkgfHwgZW1haWwudG91Y2hlZCkpIHtcbiAgICAgICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPmludmFsaWQgZW1haWw8L21hdC1lcnJvcj5cbiAgICAgICAgICB9IEBpZiAoICRhbnkoZW1haWwpLmVycm9ycz8udW5pcXVlRW1haWwgJiYgKGVtYWlsLmRpcnR5IHx8XG4gICAgICAgICAgZW1haWwudG91Y2hlZCkgKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5lbWFpbCBhbHJlYWR5IHJlZ2lzdGVyZWQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIEBpZiAoZW1haWwucGVuZGluZykge1xuICAgICAgICA8bWF0LWljb24+aG91cmdsYXNzPC9tYXQtaWNvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbmFtZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj51c2VybmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwibmFtZVwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16QS1aXVthLXpBLVowLTldezIsNDl9JFwiXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm5hbWVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGlmICgkYW55KG5hbWUpLmVycm9ycz8ucmVxdWlyZWQgJiYgKG5hbWUuZGlydHkgfHwgbmFtZS50b3VjaGVkKSkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+dXNlcm5hbWUgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9IEBpZiAoJGFueShuYW1lKS5lcnJvcnM/LnBhdHRlcm4gJiYgKG5hbWUuZGlydHkgfHwgbmFtZS50b3VjaGVkKSkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+aW52YWxpZCB1c2VybmFtZTwvbWF0LWVycm9yPlxuICAgICAgICAgIH0gQGlmICggJGFueShuYW1lKS5lcnJvcnM/LnVuaXF1ZU5hbWUgJiYgKG5hbWUuZGlydHkgfHwgbmFtZS50b3VjaGVkKVxuICAgICAgICAgICkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCJcbiAgICAgICAgICAgID51c2VybmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ8L21hdC1lcnJvclxuICAgICAgICAgID5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIEBpZiAobmFtZS5wZW5kaW5nKSB7XG4gICAgICAgIDxtYXQtaWNvbj5ob3VyZ2xhc3M8L21hdC1pY29uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBmaXJzdCBuYW1lIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+Zmlyc3QgbmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwiZmlyc3ROYW1lXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICBAaWYgKCBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgKGZpcnN0TmFtZS5kaXJ0eSB8fFxuICAgICAgICAgIGZpcnN0TmFtZS50b3VjaGVkKSApIHtcbiAgICAgICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiIGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGxcIj5cbiAgICAgICAgICAgIGZpcnN0IG5hbWUgcmVxdWlyZWRcbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBsYXN0IG5hbWUgLS0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5sYXN0IG5hbWU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cImxhc3ROYW1lXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImxhc3ROYW1lXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBpZiAoIGxhc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChsYXN0TmFtZS5kaXJ0eSB8fFxuICAgICAgICAgIGxhc3ROYW1lLnRvdWNoZWQpICkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBzbWFsbFwiPlxuICAgICAgICAgICAgbGFzdCBuYW1lIHJlcXVpcmVkXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gPGRpdiBbZm9ybUdyb3VwXT1cInBhc3N3b3Jkc1wiPiAtLT5cbiAgICAgIDwhLS0gcGFzc3dvcmQgLS0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5wYXNzd29yZDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFt0eXBlXT1cImhpZGUgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGFzc3dvcmRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUgPSAhaGlkZVwiXG4gICAgICAgICAgICBpMThuLWFyaWEtbGFiZWw9XCJhdXRoLWp3dC1sb2dpblwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiSGlkZSBwYXNzd29yZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaGlkZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IGhpZGUgPyBcInZpc2liaWxpdHlfb2ZmXCIgOiBcInZpc2liaWxpdHlcIiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGF1dGgtand0LXBhc3N3b3JkLXN0cmVuZ3RoLWJhciBbcGFzc3dvcmRUb0NoZWNrXT1cInBhc3N3b3JkLnZhbHVlXCI+XG4gICAgICAgICAgPC9hdXRoLWp3dC1wYXNzd29yZC1zdHJlbmd0aC1iYXI+XG4gICAgICAgICAgQGlmICggJGFueShwYXNzd29yZCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAocGFzc3dvcmQuZGlydHkgfHxcbiAgICAgICAgICBwYXNzd29yZC50b3VjaGVkKSApIHtcbiAgICAgICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPnBhc3N3b3JkIHJlcXVpcmVkPC9tYXQtZXJyb3I+XG4gICAgICAgICAgfSBAaWYgKCAkYW55KHBhc3N3b3JkKS5lcnJvcnM/LnBhc3N3b3JkdG9vc2hvcnQgJiYgKHBhc3N3b3JkLmRpcnR5IHx8XG4gICAgICAgICAgcGFzc3dvcmQudG91Y2hlZCkgKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5hdCBsZWFzdCA4IGNoYXJhY3RlcnM8L21hdC1lcnJvcj5cbiAgICAgICAgICB9IEBpZiAoICRhbnkocGFzc3dvcmQpLmVycm9ycz8ubm91cHBlcmlucGFzc3dvcmQgJiYgKHBhc3N3b3JkLmRpcnR5IHx8XG4gICAgICAgICAgcGFzc3dvcmQudG91Y2hlZCkgKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIlxuICAgICAgICAgICAgPmF0IGxlYXN0IDEgdXBwZXJjYXNlIGxldHRlcjwvbWF0LWVycm9yXG4gICAgICAgICAgPlxuICAgICAgICAgIH0gQGlmICggJGFueShwYXNzd29yZCkuZXJyb3JzPy5ub2xvd2VyaW5wYXNzd29yZCAmJiAocGFzc3dvcmQuZGlydHkgfHxcbiAgICAgICAgICBwYXNzd29yZC50b3VjaGVkKSApIHtcbiAgICAgICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgICA+YXQgbGVhc3QgMSBsb3dlcmNhc2UgbGV0dGVyPC9tYXQtZXJyb3JcbiAgICAgICAgICA+XG4gICAgICAgICAgfSBAaWYgKCAkYW55KHBhc3N3b3JkKS5lcnJvcnM/Lm5vc3ltYm9saW5wYXNzd29yZCAmJiAocGFzc3dvcmQuZGlydHlcbiAgICAgICAgICB8fCBwYXNzd29yZC50b3VjaGVkKSApIHtcbiAgICAgICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgICA+YXQgbGVhc3QgMSBwdW5jdHVhdGlvbi9zeW1ib2w8L21hdC1lcnJvclxuICAgICAgICAgID5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBjb25maXJtIHBhc3N3b3JkIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+Y29uZmlybSBwYXNzd29yZDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFt0eXBlXT1cImhpZGUgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29uZmlybVBhc3N3b3JkXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKGZvcm0uZXJyb3JzPy5hcmVlcXVhbCAmJiBjb25maXJtUGFzc3dvcmQudG91Y2hlZCkge1xuICAgICAgPGRpdiBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIiBzdHlsZT1cImNvbG9yOiByZWRcIj5cbiAgICAgICAgcGFzc3dvcmQgZGlmZmVycyBmcm9tIGNvbmZpcm1hdGlvbiBwYXNzd29yZFxuICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgaTE4bj1cImF1dGgtand0LWFkbWluXCJcbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIGZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lIHx8IGJ1c3kgfHwgbmFtZS5wZW5kaW5nIHx8IGVtYWlsLnBlbmRpbmdcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgcmVnaXN0ZXJcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgQGlmIChidXN5KSB7XG4gICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICB9XG4gICAgPC9maWVsZHNldD5cbiAgPC9mb3JtPlxuXG4gIDxkZXRhaWxzPlxuICAgIDxzdW1tYXJ5IGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPkhpbnRzPC9zdW1tYXJ5PlxuICAgIDxkaXYgY2xhc3M9XCJpbmZvXCI+XG4gICAgICA8cCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5cbiAgICAgICAgVG8gcmVnaXN0ZXIgYSBuZXcgdXNlciwgeW91IG11c3QgcHJvdmlkZSBoaXMgZW1haWwgYWRkcmVzcywgY2hvb3NlIGFcbiAgICAgICAgcGFzc3dvcmQsIGFuZCBjaG9vc2UgYSB1c2VybmFtZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgKHlvdSB3aWxsIGJlXG4gICAgICAgIG5vdGlmaWVkIGlmIGFub3RoZXIgdXNlciBoYXMgYWxyZWFkeSB0YWtlbiB0aGF0IG5hbWUpLiBUaGUgdXNlcm5hbWUgbXVzdFxuICAgICAgICBpbmNsdWRlIG9ubHkgbGV0dGVycy9kaWdpdHMsIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBiZSBubyBzaG9ydGVyIHRoYW5cbiAgICAgICAgMyBjaGFyYWN0ZXJzLCBub3IgbG9uZ2VyIHRoYW4gNTAuXG4gICAgICA8L3A+XG4gICAgICA8cCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5cbiAgICAgICAgVG8gcHJvbW90ZSBhIGRlY2VudCBzZWN1cml0eSBsZXZlbCwgdGhlIHBhc3N3b3JkIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA4XG4gICAgICAgIGNoYXJhY3RlcnMsIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cywgYW5kIHB1bmN0dWF0aW9uXG4gICAgICAgIChsaWtlIGRhc2hlcywgc3RvcHMsIHBhcmVudGhlc2VzLCBldGMuKS5cbiAgICAgIDwvcD5cbiAgICAgIDxwIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPlxuICAgICAgICBPbmNlIHJlZ2lzdGVyZWQsIGlmIG1lc3NhZ2luZyBpcyBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0aGUgdXNlclxuICAgICAgICB3aWxsIHJlY2VpdmUgYW4gZW1haWwgbWVzc2FnZSB0byB0aGUgZW1haWwgYWRkcmVzcyB5b3Ugc3BlY2lmaWVkOyBoZVxuICAgICAgICB3aWxsIGhhdmUgdG8gY2xpY2sgb24gdGhlIHByb3ZpZGVkIGxpbmsgdG8gY29tcGxldGUgdGhlIHJlZ2lzdHJhdGlvblxuICAgICAgICBwcm9jZXNzLiBPdGhlcndpc2UsIHlvdSBzaG91bGQgZWRpdCB0aGUgbmV3bHkgY3JlYXRlZCB1c2VyIGFuZCBjb25maXJtXG4gICAgICAgIHRoZSBlbWFpbCByZWdpc3RyYXRpb24uXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIDwvZGV0YWlscz5cbjwvZGl2PlxuIl19
|