ngx-techlify-core 18.74.0 → 18.75.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.
Files changed (25) hide show
  1. package/esm2022/lib/base-model/index.mjs +3 -2
  2. package/esm2022/lib/base-model/techlify-form/contract/techlify-form.contract.mjs +191 -0
  3. package/esm2022/lib/base-model/techlify-form/techlify-form.component.mjs +134 -0
  4. package/esm2022/lib/base-model/techlify-list/techlify-list.component.mjs +17 -2
  5. package/esm2022/lib/role/permission/permissions-management.component.mjs +8 -5
  6. package/esm2022/lib/subscription/subscription-form/subscription-form.component.mjs +2 -2
  7. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.component.mjs +1 -2
  8. package/esm2022/lib/techlify-view/techlify-view-form/techlify-view-form.component.mjs +2 -2
  9. package/esm2022/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component.mjs +27 -0
  10. package/esm2022/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service.mjs +18 -0
  11. package/esm2022/public-api.mjs +4 -1
  12. package/fesm2022/ngx-techlify-core.mjs +252 -9
  13. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  14. package/lib/base-model/index.d.ts +2 -1
  15. package/lib/base-model/techlify-form/contract/techlify-form.contract.d.ts +18 -0
  16. package/lib/base-model/{techlify-form.component.d.ts → techlify-form/techlify-form.component.d.ts} +3 -3
  17. package/lib/base-model/techlify-list/techlify-list.component.d.ts +3 -1
  18. package/lib/subscription/subscription-form/subscription-form.component.d.ts +1 -1
  19. package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts +0 -1
  20. package/lib/techlify-view/techlify-view-form/techlify-view-form.component.d.ts +1 -1
  21. package/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component.d.ts +14 -0
  22. package/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service.d.ts +8 -0
  23. package/package.json +1 -1
  24. package/public-api.d.ts +2 -0
  25. package/esm2022/lib/base-model/techlify-form.component.mjs +0 -132
@@ -1,4 +1,5 @@
1
- export * from './techlify-form.component';
1
+ export * from './techlify-form/techlify-form.component';
2
+ export * from './techlify-form/contract/techlify-form.contract';
2
3
  export * from './techlify-list/techlify-list.component';
3
4
  export * from './techlify-list/contract/techlify-list.contract';
4
5
  export * from './techlify-service';
@@ -0,0 +1,18 @@
1
+ import { TechlifyFormComponent } from '../techlify-form.component';
2
+ export interface TechlifyFormContractOptions {
3
+ getComponent: () => TechlifyFormComponent;
4
+ getService: () => any;
5
+ }
6
+ /**
7
+ * Reusable test contract for components extending TechlifyFormComponent.
8
+ *
9
+ * Ensures all form components follow the same base behaviour:
10
+ * - Service injection
11
+ * - Default state initialization
12
+ * - Create/update submission flow
13
+ * - Form validation handling
14
+ * - Success event handling
15
+ * - Dialog handling
16
+ * - Field helper methods
17
+ */
18
+ export declare function techlifyFormContract(options: TechlifyFormContractOptions): void;
@@ -1,9 +1,9 @@
1
1
  import { UntypedFormGroup } from '@angular/forms';
2
- import { FormValidatorService } from '../core/form-validator.service';
2
+ import { FormValidatorService } from '../../core/form-validator.service';
3
3
  import { EventEmitter } from '@angular/core';
4
- import { TechlifyService } from './techlify-service';
4
+ import { TechlifyService } from '../techlify-service';
5
5
  import { MatDialogRef } from '@angular/material/dialog';
6
- import { AlertService } from '../core/alert.service';
6
+ import { AlertService } from '../../core/alert.service';
7
7
  import * as i0 from "@angular/core";
8
8
  /**
9
9
  * Interface used to ensure we have a consistent structure across our form components
@@ -21,10 +21,12 @@ export declare abstract class TechlifyListComponent {
21
21
  page: number;
22
22
  perPage: number;
23
23
  lastPage: number;
24
- isWorking: boolean;
25
24
  filterForm: any;
26
25
  isViewLoaded: boolean;
27
26
  columnConfigs: ColumnConfig[];
27
+ _isWorking: boolean;
28
+ get isWorking(): boolean;
29
+ set isWorking(value: boolean);
28
30
  filters: any;
29
31
  /**
30
32
  * Boolean to turn off, if we don't want to patch filters from route.
@@ -2,7 +2,7 @@ import { EventEmitter, OnInit, TemplateRef } from '@angular/core';
2
2
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
3
3
  import { UntypedFormBuilder } from '@angular/forms';
4
4
  import { SubscriptionService } from '../subscription.service';
5
- import { TechlifyFormComponent } from '../../base-model/techlify-form.component';
5
+ import { TechlifyFormComponent } from '../../base-model/techlify-form/techlify-form.component';
6
6
  import { FormValidatorService } from '../../core/form-validator.service';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class SubscriptionFormComponent extends TechlifyFormComponent implements OnInit {
@@ -14,7 +14,6 @@ export declare class SubscriptionPackageListingComponent extends TechlifyListCom
14
14
  private dialog;
15
15
  private fb;
16
16
  displayedColumns: string[];
17
- isWorking: boolean;
18
17
  filterFormGroup: UntypedFormGroup;
19
18
  constructor(subscriptionPackageService: SubscriptionPackageService, activatedRoute: ActivatedRoute, filterService: FilterService, router: Router, dialog: MatDialog, fb: UntypedFormBuilder);
20
19
  ngOnInit(): void;
@@ -2,7 +2,7 @@ import { EventEmitter, OnInit, TemplateRef } from '@angular/core';
2
2
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
3
3
  import { UntypedFormBuilder } from '@angular/forms';
4
4
  import { TechlifyViewService } from '../techlify-view.service';
5
- import { TechlifyFormComponent } from '../../base-model/techlify-form.component';
5
+ import { TechlifyFormComponent } from '../../base-model/techlify-form/techlify-form.component';
6
6
  import { FormValidatorService } from '../../core/form-validator.service';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class TechlifyViewFormComponent extends TechlifyFormComponent implements OnInit {
@@ -0,0 +1,14 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { UserTenantAcceptInvitationService } from './user-tenant-accept-invitation.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class UserTenantAcceptInvitationComponent implements OnInit {
6
+ private activatedRoute;
7
+ private userTenantAcceptInvitationService;
8
+ invitationCode?: string;
9
+ userTenant: any;
10
+ constructor(activatedRoute: ActivatedRoute, userTenantAcceptInvitationService: UserTenantAcceptInvitationService);
11
+ ngOnInit(): void;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserTenantAcceptInvitationComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserTenantAcceptInvitationComponent, "app-user-tenant-accept-invitation", never, {}, {}, never, never, true, never>;
14
+ }
@@ -0,0 +1,8 @@
1
+ import { TechlifyService } from '../base-model/techlify-service';
2
+ import { HttpService } from '../core/http.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class UserTenantAcceptInvitationService extends TechlifyService {
5
+ constructor(http: HttpService);
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserTenantAcceptInvitationService, never>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<UserTenantAcceptInvitationService>;
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-techlify-core",
3
- "version": "18.74.0",
3
+ "version": "18.75.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18",
6
6
  "@angular/core": ">=18",
package/public-api.d.ts CHANGED
@@ -202,3 +202,5 @@ export * from './lib/tag/techlify-tagger-tag-form/techlify-tagger-tag-form.compo
202
202
  export * from './lib/tag/tag.service';
203
203
  export * from './lib/techlify-auto-complete-select/techlify-auto-complete-select.component';
204
204
  export * from './lib/techlify-currency-pipe/techlify-currency-pipe.directive';
205
+ export * from './lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component';
206
+ export * from './lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service';
@@ -1,132 +0,0 @@
1
- import { Directive, EventEmitter, inject, Input, Optional, Output } from '@angular/core';
2
- import { finalize } from 'rxjs';
3
- import { AlertService } from '../core/alert.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../core/form-validator.service";
6
- import * as i2 from "./techlify-service";
7
- /**
8
- * Interface used to ensure we have a consistent structure across our form components
9
- *
10
- * It also provides some abstraction of repeated code to reduce our codebase size
11
- *
12
- * @todo This should be moved to ngx-techlify-core
13
- *
14
- * Advantages of this abstract class
15
- * - Less code, less maintenance, less bugs
16
- * - more consistent code
17
- * - comments on more code
18
- * - save time, save energy
19
- */
20
- export class TechlifyFormComponent {
21
- constructor(formValidatorService, service) {
22
- this.formValidatorService = formValidatorService;
23
- this.service = service;
24
- //Boolean to denote the form is in API progress
25
- this.isWorking = false;
26
- //Array of created multiple entries
27
- this.createdEntries = [];
28
- //Boolean to denote if form is in update mode
29
- this.isUpdate = false;
30
- //Boolean to denote if form has ability to create multiple entries
31
- this.isAllowCreateAnother = true;
32
- //Emits an event once form submit is success
33
- this.success = new EventEmitter();
34
- //Injected alert service
35
- this.alertService = inject(AlertService, { optional: true });
36
- }
37
- /**
38
- * Submits the form
39
- * @param model form model optional, if needed to be overriden
40
- * @returns
41
- */
42
- submit(model) {
43
- this.form.markAllAsTouched();
44
- if (!this.service) {
45
- throw new Error(`${this.constructor.name}: Service is required to submit the form`);
46
- }
47
- if (!this.form.valid) {
48
- return;
49
- }
50
- if (!model) {
51
- model = this.form.value;
52
- }
53
- this.isWorking = true;
54
- (this.isUpdate ?
55
- this.service.update(model) :
56
- this.service.store(model))
57
- .pipe(finalize(() => this.isWorking = false))
58
- .subscribe((res) => {
59
- this.createdEntries.unshift(res?.item);
60
- if (model?.is_create_another) {
61
- this.alertService.addAlert('Successfully Created', 'success');
62
- return;
63
- }
64
- if (this.isUpdate) {
65
- this.finalisedResponse(res?.item);
66
- }
67
- else {
68
- this.finalisedResponse((this.createdEntries.length == 1) ? this.createdEntries[0] : this.createdEntries);
69
- }
70
- });
71
- }
72
- //Send uniformed finalised response for both form button and dialog
73
- finalisedResponse(response) {
74
- this.success.emit(response);
75
- if (this.dialogRef) {
76
- this.dialogRef.close(response);
77
- }
78
- }
79
- /**
80
- * Close the active dialog
81
- */
82
- closeDialog() {
83
- if (this.createdEntries?.length > 0) {
84
- this.success.emit(this.createdEntries);
85
- }
86
- this.dialogRef.close();
87
- }
88
- /**
89
- * Resets the value of a field in the HTML form
90
- *
91
- * @param event
92
- * @param field
93
- */
94
- resetFieldValue(event, field) {
95
- this.form?.get(field)?.setValue('');
96
- }
97
- /**
98
- * Retrieves the value of a field from the HTML form
99
- *
100
- * @param field
101
- * @returns
102
- */
103
- getFieldValue(field) {
104
- return this.form?.get(field)?.value;
105
- }
106
- /**
107
- * Method to evaluate form fields
108
- * */
109
- isFieldValid(field) {
110
- return this.formValidatorService.isFieldValid(field, this.form);
111
- }
112
- /**
113
- * Method to find error in form fields
114
- * */
115
- getErrorMessage(field) {
116
- return this.formValidatorService.getErrorMessage(field, this.form, this.errorMessages);
117
- }
118
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.TechlifyService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
119
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyFormComponent, inputs: { isUpdate: "isUpdate", isAllowCreateAnother: "isAllowCreateAnother" }, outputs: { success: "success" }, ngImport: i0 }); }
120
- }
121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, decorators: [{
122
- type: Directive
123
- }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.TechlifyService, decorators: [{
124
- type: Optional
125
- }] }], propDecorators: { isUpdate: [{
126
- type: Input
127
- }], isAllowCreateAnother: [{
128
- type: Input
129
- }], success: [{
130
- type: Output
131
- }] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2Jhc2UtbW9kZWwvdGVjaGxpZnktZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBRXJEOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE1BQU0sT0FBZ0IscUJBQXFCO0lBNkJ6QyxZQUNZLG9CQUEwQyxFQUM5QixPQUF5QjtRQURyQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzlCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBdkJqRCwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUszQixtQ0FBbUM7UUFDbkMsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFFekIsNkNBQTZDO1FBQ3BDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkMsa0VBQWtFO1FBQ3pELHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUU5Qyw0Q0FBNEM7UUFDbEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFNUMsd0JBQXdCO1FBQ2QsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFNbEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBVztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLElB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QUM7SUFFRDs7U0FFSztJQUNMLGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekYsQ0FBQzsrR0E5SG1CLHFCQUFxQjttR0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUQxQyxTQUFTOzswQkFnQ0wsUUFBUTt5Q0FiRixRQUFRO3NCQUFoQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9mb3JtLXZhbGlkYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZWNobGlmeVNlcnZpY2UgfSBmcm9tICcuL3RlY2hsaWZ5LXNlcnZpY2UnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2FsZXJ0LnNlcnZpY2UnO1xuXG4vKipcbiAqIEludGVyZmFjZSB1c2VkIHRvIGVuc3VyZSB3ZSBoYXZlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgYWNyb3NzIG91ciBmb3JtIGNvbXBvbmVudHNcbiAqXG4gKiBJdCBhbHNvIHByb3ZpZGVzIHNvbWUgYWJzdHJhY3Rpb24gb2YgcmVwZWF0ZWQgY29kZSB0byByZWR1Y2Ugb3VyIGNvZGViYXNlIHNpemVcbiAqXG4gKiBAdG9kbyBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBuZ3gtdGVjaGxpZnktY29yZVxuICpcbiAqIEFkdmFudGFnZXMgb2YgdGhpcyBhYnN0cmFjdCBjbGFzc1xuICogLSBMZXNzIGNvZGUsIGxlc3MgbWFpbnRlbmFuY2UsIGxlc3MgYnVnc1xuICogLSBtb3JlIGNvbnNpc3RlbnQgY29kZVxuICogLSBjb21tZW50cyBvbiBtb3JlIGNvZGVcbiAqIC0gc2F2ZSB0aW1lLCBzYXZlIGVuZXJneVxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZWNobGlmeUZvcm1Db21wb25lbnQge1xuXG4gIC8vRm9ybSBidWlsZGVyIGluc3RhbmNlXG4gIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgLy9FcnJvciBtZXNzYWdlcyBjb25maWcgZm9yIHRoZSBmb3JtXG4gIGVycm9yTWVzc2FnZXM6IGFueTtcblxuICAvL0Jvb2xlYW4gdG8gZGVub3RlIHRoZSBmb3JtIGlzIGluIEFQSSBwcm9ncmVzc1xuICBpc1dvcmtpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvL0Zvcm0gZGlhbG9ncmVmIHJlZmVyZW5jZVxuICBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnksIGFueT47XG5cbiAgLy9BcnJheSBvZiBjcmVhdGVkIG11bHRpcGxlIGVudHJpZXNcbiAgY3JlYXRlZEVudHJpZXM6IGFueSA9IFtdO1xuXG4gIC8vQm9vbGVhbiB0byBkZW5vdGUgaWYgZm9ybSBpcyBpbiB1cGRhdGUgbW9kZVxuICBASW5wdXQoKSBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vQm9vbGVhbiB0byBkZW5vdGUgaWYgZm9ybSBoYXMgYWJpbGl0eSB0byBjcmVhdGUgbXVsdGlwbGUgZW50cmllc1xuICBASW5wdXQoKSBpc0FsbG93Q3JlYXRlQW5vdGhlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy9FbWl0cyBhbiBldmVudCBvbmNlIGZvcm0gc3VibWl0IGlzIHN1Y2Nlc3NcbiAgQE91dHB1dCgpIHN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvL0luamVjdGVkIGFsZXJ0IHNlcnZpY2VcbiAgcHJvdGVjdGVkIGFsZXJ0U2VydmljZSA9IGluamVjdChBbGVydFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgc2VydmljZT86IFRlY2hsaWZ5U2VydmljZSkge1xuXG4gIH1cbiAgLyoqXG4gICAqIFN1Ym1pdHMgdGhlIGZvcm1cbiAgICogQHBhcmFtIG1vZGVsIGZvcm0gbW9kZWwgb3B0aW9uYWwsIGlmIG5lZWRlZCB0byBiZSBvdmVycmlkZW5cbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdWJtaXQobW9kZWw/OiBhbnkpIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICghdGhpcy5zZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IFNlcnZpY2UgaXMgcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBmb3JtYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgbW9kZWwgPSB0aGlzLmZvcm0udmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICAoXG4gICAgICB0aGlzLmlzVXBkYXRlID9cbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZShtb2RlbCkgOlxuICAgICAgICB0aGlzLnNlcnZpY2Uuc3RvcmUobW9kZWwpXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRW50cmllcy51bnNoaWZ0KHJlcz8uaXRlbSk7XG4gICAgICAgIGlmIChtb2RlbD8uaXNfY3JlYXRlX2Fub3RoZXIpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnU3VjY2Vzc2Z1bGx5IENyZWF0ZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgICAgIHRoaXMuZmluYWxpc2VkUmVzcG9uc2UocmVzPy5pdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXNlZFJlc3BvbnNlKCh0aGlzLmNyZWF0ZWRFbnRyaWVzLmxlbmd0aCA9PSAxKSA/IHRoaXMuY3JlYXRlZEVudHJpZXNbMF0gOiB0aGlzLmNyZWF0ZWRFbnRyaWVzKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vU2VuZCB1bmlmb3JtZWQgZmluYWxpc2VkIHJlc3BvbnNlIGZvciBib3RoIGZvcm0gYnV0dG9uIGFuZCBkaWFsb2dcbiAgZmluYWxpc2VkUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgIHRoaXMuc3VjY2Vzcy5lbWl0KHJlc3BvbnNlKTtcbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGFjdGl2ZSBkaWFsb2dcbiAgICovXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIGlmICh0aGlzLmNyZWF0ZWRFbnRyaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN1Y2Nlc3MuZW1pdCh0aGlzLmNyZWF0ZWRFbnRyaWVzKTtcbiAgICB9XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gdGhlIEhUTUwgZm9ybVxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIGZpZWxkXG4gICAqL1xuICByZXNldEZpZWxkVmFsdWUoZXZlbnQ6IGFueSwgZmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybT8uZ2V0KGZpZWxkKT8uc2V0VmFsdWUoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBmcm9tIHRoZSBIVE1MIGZvcm1cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGaWVsZFZhbHVlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoZmllbGQpPy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZXZhbHVhdGUgZm9ybSBmaWVsZHNcbiAgICogKi9cbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGZpbmQgZXJyb3IgaW4gZm9ybSBmaWVsZHNcbiAgICogKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5nZXRFcnJvck1lc3NhZ2UoZmllbGQsIHRoaXMuZm9ybSwgdGhpcy5lcnJvck1lc3NhZ2VzKTtcbiAgfVxuXG59XG4iXX0=