@memberjunction/ng-bootstrap 0.0.1 → 3.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/README.md +223 -28
- package/dist/README.md +240 -0
- package/dist/esm2022/lib/bootstrap.component.mjs +38 -0
- package/dist/esm2022/lib/bootstrap.module.mjs +98 -0
- package/dist/esm2022/lib/bootstrap.types.mjs +13 -0
- package/dist/esm2022/lib/components/auth-shell.component.mjs +148 -0
- package/dist/esm2022/lib/services/initialization.service.mjs +186 -0
- package/dist/esm2022/memberjunction-ng-bootstrap.mjs +5 -0
- package/dist/esm2022/public-api.mjs +9 -0
- package/dist/fesm2022/memberjunction-ng-bootstrap.mjs +474 -0
- package/dist/fesm2022/memberjunction-ng-bootstrap.mjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/lib/bootstrap.component.d.ts +16 -0
- package/dist/lib/bootstrap.module.d.ts +63 -0
- package/dist/lib/bootstrap.types.d.ts +72 -0
- package/dist/lib/components/auth-shell.component.d.ts +36 -0
- package/dist/lib/services/initialization.service.d.ts +52 -0
- package/dist/public-api.d.ts +8 -0
- package/package.json +42 -5
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemberJunction 3.0 Auth Shell Component
|
|
3
|
+
*
|
|
4
|
+
* Handles authentication flow and initialization for MJ applications.
|
|
5
|
+
* This component encapsulates all the auth logic that was previously in app.component.ts
|
|
6
|
+
*/
|
|
7
|
+
import { Component, Inject } from '@angular/core';
|
|
8
|
+
import { DOCUMENT } from '@angular/common';
|
|
9
|
+
import { take } from 'rxjs/operators';
|
|
10
|
+
import { SetProductionStatus, LogError } from '@memberjunction/core';
|
|
11
|
+
import { MJ_ENVIRONMENT } from '../bootstrap.types';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/router";
|
|
14
|
+
import * as i2 from "@memberjunction/ng-auth-services";
|
|
15
|
+
import * as i3 from "../services/initialization.service";
|
|
16
|
+
import * as i4 from "@angular/common";
|
|
17
|
+
export class MJAuthShellComponent {
|
|
18
|
+
router;
|
|
19
|
+
document;
|
|
20
|
+
authBase;
|
|
21
|
+
initService;
|
|
22
|
+
environment;
|
|
23
|
+
HasError = false;
|
|
24
|
+
ErrorMessage = '';
|
|
25
|
+
showValidationOnly = false;
|
|
26
|
+
subHeaderText = "Welcome back! Please log in to your account.";
|
|
27
|
+
initialPath = '/';
|
|
28
|
+
constructor(router, document, authBase, initService, environment) {
|
|
29
|
+
this.router = router;
|
|
30
|
+
this.document = document;
|
|
31
|
+
this.authBase = authBase;
|
|
32
|
+
this.initService = initService;
|
|
33
|
+
this.environment = environment;
|
|
34
|
+
}
|
|
35
|
+
async ngOnInit() {
|
|
36
|
+
console.log('🚀 MemberJunction 3.0 - Auth Shell Initializing');
|
|
37
|
+
SetProductionStatus(this.environment.production);
|
|
38
|
+
this.initialPath = window.location.pathname + (window.location.search ? window.location.search : '');
|
|
39
|
+
await this.setupAuth();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle successful login and initialize the application
|
|
43
|
+
*/
|
|
44
|
+
async handleLogin(token, userInfo) {
|
|
45
|
+
if (!token)
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
// Initialize GraphQL client
|
|
49
|
+
await this.initService.initializeGraphQL(token, this.environment);
|
|
50
|
+
// Validate user access and refresh data
|
|
51
|
+
const validationResult = await this.initService.validateUserAccess();
|
|
52
|
+
if (!validationResult.success) {
|
|
53
|
+
this.HasError = true;
|
|
54
|
+
this.ErrorMessage = validationResult.error.message;
|
|
55
|
+
throw new Error(this.ErrorMessage);
|
|
56
|
+
}
|
|
57
|
+
// Run startup validation checks
|
|
58
|
+
this.initService.runValidationChecks();
|
|
59
|
+
// Navigate to initial route
|
|
60
|
+
this.initService.navigateToInitialRoute(this.initialPath, this.document);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
// Check for no roles error
|
|
64
|
+
if (this.initService.isNoUserRolesError(err)) {
|
|
65
|
+
this.showValidationOnly = true;
|
|
66
|
+
this.HasError = true;
|
|
67
|
+
const result = this.initService.handleNoRolesError();
|
|
68
|
+
return; // Don't throw, allow UI to show validation banner
|
|
69
|
+
}
|
|
70
|
+
// Try auth retry if applicable
|
|
71
|
+
const retried = await this.initService.handleAuthRetry(err);
|
|
72
|
+
if (retried) {
|
|
73
|
+
return; // Retry initiated
|
|
74
|
+
}
|
|
75
|
+
// Show error
|
|
76
|
+
this.HasError = true;
|
|
77
|
+
this.ErrorMessage = err;
|
|
78
|
+
LogError('Error Logging In: ' + err);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Setup authentication and handle auth state changes
|
|
84
|
+
*/
|
|
85
|
+
async setupAuth() {
|
|
86
|
+
// Auth provider already initialized by APP_INITIALIZER
|
|
87
|
+
// Listen for user info changes
|
|
88
|
+
this.authBase.getUserInfo()
|
|
89
|
+
.pipe(take(1))
|
|
90
|
+
.subscribe({
|
|
91
|
+
next: async (userInfo) => {
|
|
92
|
+
if (userInfo) {
|
|
93
|
+
const token = await this.authBase.getIdToken();
|
|
94
|
+
if (token) {
|
|
95
|
+
await this.handleLogin(token, userInfo);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.error('User info available but no token found');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
error: (err) => {
|
|
103
|
+
LogError('Error Logging In: ' + err);
|
|
104
|
+
this.subHeaderText = this.initService.getAuthErrorMessage(err);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Check if user is authenticated
|
|
108
|
+
this.authBase.isAuthenticated()
|
|
109
|
+
.pipe(take(1))
|
|
110
|
+
.subscribe((loggedIn) => {
|
|
111
|
+
if (!loggedIn) {
|
|
112
|
+
// Display login screen - auth state is managed by provider
|
|
113
|
+
console.log('User not authenticated, showing login screen');
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJAuthShellComponent, deps: [{ token: i1.Router }, { token: DOCUMENT }, { token: i2.MJAuthBase }, { token: i3.MJInitializationService }, { token: MJ_ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
118
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MJAuthShellComponent, selector: "mj-auth-shell", ngImport: i0, template: `
|
|
119
|
+
<div class="mj-auth-shell">
|
|
120
|
+
<ng-content *ngIf="!HasError || showValidationOnly"></ng-content>
|
|
121
|
+
|
|
122
|
+
<div *ngIf="HasError && !showValidationOnly" class="error-container">
|
|
123
|
+
<h2>Error</h2>
|
|
124
|
+
<p>{{ ErrorMessage }}</p>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
`, isInline: true, styles: [".mj-auth-shell{width:100%;height:100%;display:block}.error-container{padding:20px;text-align:center}.error-container h2{color:#d32f2f;margin-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
128
|
+
}
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJAuthShellComponent, decorators: [{
|
|
130
|
+
type: Component,
|
|
131
|
+
args: [{ selector: 'mj-auth-shell', template: `
|
|
132
|
+
<div class="mj-auth-shell">
|
|
133
|
+
<ng-content *ngIf="!HasError || showValidationOnly"></ng-content>
|
|
134
|
+
|
|
135
|
+
<div *ngIf="HasError && !showValidationOnly" class="error-container">
|
|
136
|
+
<h2>Error</h2>
|
|
137
|
+
<p>{{ ErrorMessage }}</p>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
`, styles: [".mj-auth-shell{width:100%;height:100%;display:block}.error-container{padding:20px;text-align:center}.error-container h2{color:#d32f2f;margin-bottom:10px}\n"] }]
|
|
141
|
+
}], ctorParameters: () => [{ type: i1.Router }, { type: Document, decorators: [{
|
|
142
|
+
type: Inject,
|
|
143
|
+
args: [DOCUMENT]
|
|
144
|
+
}] }, { type: i2.MJAuthBase }, { type: i3.MJInitializationService }, { type: undefined, decorators: [{
|
|
145
|
+
type: Inject,
|
|
146
|
+
args: [MJ_ENVIRONMENT]
|
|
147
|
+
}] }] });
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zaGVsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQWEsTUFBTSxzQkFBc0IsQ0FBQztBQUdoRixPQUFPLEVBQXVCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7QUFnQ3pFLE1BQU0sT0FBTyxvQkFBb0I7SUFTckI7SUFDaUI7SUFDbEI7SUFDQztJQUN3QjtJQVozQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFlBQVksR0FBUSxFQUFFLENBQUM7SUFDdkIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLGFBQWEsR0FBVyw4Q0FBOEMsQ0FBQztJQUV0RSxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBRTFCLFlBQ1UsTUFBYyxFQUNHLFFBQWtCLEVBQ3BDLFFBQW9CLEVBQ25CLFdBQW9DLEVBQ1osV0FBZ0M7UUFKeEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNHLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDWixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFDL0QsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBRS9ELG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMs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QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztvQkFDMUQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUN0QixRQUFRLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUwsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO2FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxRQUFpQixFQUFFLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLDJEQUEyRDtnQkFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBN0dVLG9CQUFvQix3Q0FVckIsUUFBUSw4RUFHUixjQUFjOzRGQWJiLG9CQUFvQixxREE1QnJCOzs7Ozs7Ozs7R0FTVDs7NEZBbUJVLG9CQUFvQjtrQkE5QmhDLFNBQVM7K0JBQ0UsZUFBZSxZQUNmOzs7Ozs7Ozs7R0FTVDs7MEJBNkJFLE1BQU07MkJBQUMsUUFBUTs7MEJBR2YsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1iZXJKdW5jdGlvbiAzLjAgQXV0aCBTaGVsbCBDb21wb25lbnRcbiAqXG4gKiBIYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGZsb3cgYW5kIGluaXRpYWxpemF0aW9uIGZvciBNSiBhcHBsaWNhdGlvbnMuXG4gKiBUaGlzIGNvbXBvbmVudCBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBhdXRoIGxvZ2ljIHRoYXQgd2FzIHByZXZpb3VzbHkgaW4gYXBwLmNvbXBvbmVudC50c1xuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2V0UHJvZHVjdGlvblN0YXR1cywgTG9nRXJyb3IsIExvZ1N0YXR1cyB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9jb3JlJztcbmltcG9ydCB7IE1KQXV0aEJhc2UsIFN0YW5kYXJkVXNlckluZm8sIEF1dGhFcnJvclR5cGUgfSBmcm9tICdAbWVtYmVyanVuY3Rpb24vbmctYXV0aC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2luaXRpYWxpemF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTUpFbnZpcm9ubWVudENvbmZpZywgTUpfRU5WSVJPTk1FTlQgfSBmcm9tICcuLi9ib290c3RyYXAudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtai1hdXRoLXNoZWxsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibWotYXV0aC1zaGVsbFwiPlxuICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhSGFzRXJyb3IgfHwgc2hvd1ZhbGlkYXRpb25Pbmx5XCI+PC9uZy1jb250ZW50PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiSGFzRXJyb3IgJiYgIXNob3dWYWxpZGF0aW9uT25seVwiIGNsYXNzPVwiZXJyb3ItY29udGFpbmVyXCI+XG4gICAgICAgIDxoMj5FcnJvcjwvaDI+XG4gICAgICAgIDxwPnt7IEVycm9yTWVzc2FnZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLm1qLWF1dGgtc2hlbGwge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG5cbiAgICAuZXJyb3ItY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmVycm9yLWNvbnRhaW5lciBoMiB7XG4gICAgICBjb2xvcjogI2QzMmYyZjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBNSkF1dGhTaGVsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBIYXNFcnJvciA9IGZhbHNlO1xuICBwdWJsaWMgRXJyb3JNZXNzYWdlOiBhbnkgPSAnJztcbiAgcHVibGljIHNob3dWYWxpZGF0aW9uT25seSA9IGZhbHNlO1xuICBwdWJsaWMgc3ViSGVhZGVyVGV4dDogc3RyaW5nID0gXCJXZWxjb21lIGJhY2shIFBsZWFzZSBsb2cgaW4gdG8geW91ciBhY2NvdW50LlwiO1xuXG4gIHByaXZhdGUgaW5pdGlhbFBhdGggPSAnLyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwdWJsaWMgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHB1YmxpYyBhdXRoQmFzZTogTUpBdXRoQmFzZSxcbiAgICBwcml2YXRlIGluaXRTZXJ2aWNlOiBNSkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICBASW5qZWN0KE1KX0VOVklST05NRU5UKSBwcml2YXRlIGVudmlyb25tZW50OiBNSkVudmlyb25tZW50Q29uZmlnXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zb2xlLmxvZygn8J+agCBNZW1iZXJKdW5jdGlvbiAzLjAgLSBBdXRoIFNoZWxsIEluaXRpYWxpemluZycpO1xuXG4gICAgU2V0UHJvZHVjdGlvblN0YXR1cyh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pO1xuICAgIHRoaXMuaW5pdGlhbFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAod2luZG93LmxvY2F0aW9uLnNlYXJjaCA/IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggOiAnJyk7XG5cbiAgICBhd2FpdCB0aGlzLnNldHVwQXV0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWNjZXNzZnVsIGxvZ2luIGFuZCBpbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgaGFuZGxlTG9naW4odG9rZW46IHN0cmluZywgdXNlckluZm86IFN0YW5kYXJkVXNlckluZm8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRva2VuKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBHcmFwaFFMIGNsaWVudFxuICAgICAgYXdhaXQgdGhpcy5pbml0U2VydmljZS5pbml0aWFsaXplR3JhcGhRTCh0b2tlbiwgdGhpcy5lbnZpcm9ubWVudCk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHVzZXIgYWNjZXNzIGFuZCByZWZyZXNoIGRhdGFcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLnZhbGlkYXRlVXNlckFjY2VzcygpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLkhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yIS5tZXNzYWdlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5FcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBSdW4gc3RhcnR1cCB2YWxpZGF0aW9uIGNoZWNrc1xuICAgICAgdGhpcy5pbml0U2VydmljZS5ydW5WYWxpZGF0aW9uQ2hlY2tzKCk7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIGluaXRpYWwgcm91dGVcbiAgICAgIHRoaXMuaW5pdFNlcnZpY2UubmF2aWdhdGVUb0luaXRpYWxSb3V0ZSh0aGlzLmluaXRpYWxQYXRoLCB0aGlzLmRvY3VtZW50KTtcblxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBDaGVjayBmb3Igbm8gcm9sZXMgZXJyb3JcbiAgICAgIGlmICh0aGlzLmluaXRTZXJ2aWNlLmlzTm9Vc2VyUm9sZXNFcnJvcihlcnIpKSB7XG4gICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25Pbmx5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5IYXNFcnJvciA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaW5pdFNlcnZpY2UuaGFuZGxlTm9Sb2xlc0Vycm9yKCk7XG4gICAgICAgIHJldHVybjsgLy8gRG9uJ3QgdGhyb3csIGFsbG93IFVJIHRvIHNob3cgdmFsaWRhdGlvbiBiYW5uZXJcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGF1dGggcmV0cnkgaWYgYXBwbGljYWJsZVxuICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IHRoaXMuaW5pdFNlcnZpY2UuaGFuZGxlQXV0aFJldHJ5KGVycik7XG4gICAgICBpZiAocmV0cmllZCkge1xuICAgICAgICByZXR1cm47IC8vIFJldHJ5IGluaXRpYXRlZFxuICAgICAgfVxuXG4gICAgICAvLyBTaG93IGVycm9yXG4gICAgICB0aGlzLkhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgTG9nRXJyb3IoJ0Vycm9yIExvZ2dpbmcgSW46ICcgKyBlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBhdXRoZW50aWNhdGlvbiBhbmQgaGFuZGxlIGF1dGggc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgYXN5bmMgc2V0dXBBdXRoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEF1dGggcHJvdmlkZXIgYWxyZWFkeSBpbml0aWFsaXplZCBieSBBUFBfSU5JVElBTElaRVJcblxuICAgIC8vIExpc3RlbiBmb3IgdXNlciBpbmZvIGNoYW5nZXNcbiAgICB0aGlzLmF1dGhCYXNlLmdldFVzZXJJbmZvKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKHVzZXJJbmZvKSA9PiB7XG4gICAgICAgICAgaWYgKHVzZXJJbmZvKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aEJhc2UuZ2V0SWRUb2tlbigpO1xuXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVMb2dpbih0b2tlbiwgdXNlckluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXNlciBpbmZvIGF2YWlsYWJsZSBidXQgbm8gdG9rZW4gZm91bmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgTG9nRXJyb3IoJ0Vycm9yIExvZ2dpbmcgSW46ICcgKyBlcnIpO1xuICAgICAgICAgIHRoaXMuc3ViSGVhZGVyVGV4dCA9IHRoaXMuaW5pdFNlcnZpY2UuZ2V0QXV0aEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgaXMgYXV0aGVudGljYXRlZFxuICAgIHRoaXMuYXV0aEJhc2UuaXNBdXRoZW50aWNhdGVkKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChsb2dnZWRJbjogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIWxvZ2dlZEluKSB7XG4gICAgICAgICAgLy8gRGlzcGxheSBsb2dpbiBzY3JlZW4gLSBhdXRoIHN0YXRlIGlzIG1hbmFnZWQgYnkgcHJvdmlkZXJcbiAgICAgICAgICBjb25zb2xlLmxvZygnVXNlciBub3QgYXV0aGVudGljYXRlZCwgc2hvd2luZyBsb2dpbiBzY3JlZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemberJunction 3.0 Initialization Service
|
|
3
|
+
*
|
|
4
|
+
* Handles all core initialization tasks:
|
|
5
|
+
* - Generated entities loading
|
|
6
|
+
* - GraphQL client setup
|
|
7
|
+
* - Token refresh configuration
|
|
8
|
+
* - System validation
|
|
9
|
+
*/
|
|
10
|
+
import { Injectable, Inject } from '@angular/core';
|
|
11
|
+
import { Metadata } from '@memberjunction/core';
|
|
12
|
+
import { setupGraphQLClient, GraphQLProviderConfigData } from '@memberjunction/graphql-dataprovider';
|
|
13
|
+
import { AuthErrorType } from '@memberjunction/ng-auth-services';
|
|
14
|
+
import { SharedService } from '@memberjunction/ng-shared';
|
|
15
|
+
import { MJ_STARTUP_VALIDATION } from '../bootstrap.types';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@angular/router";
|
|
18
|
+
import * as i2 from "@memberjunction/ng-auth-services";
|
|
19
|
+
export class MJInitializationService {
|
|
20
|
+
router;
|
|
21
|
+
authBase;
|
|
22
|
+
startupValidationService;
|
|
23
|
+
constructor(router, authBase, startupValidationService) {
|
|
24
|
+
this.router = router;
|
|
25
|
+
this.authBase = authBase;
|
|
26
|
+
this.startupValidationService = startupValidationService;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize GraphQL client with authentication token and refresh callback
|
|
30
|
+
*/
|
|
31
|
+
async initializeGraphQL(token, environment) {
|
|
32
|
+
const url = environment.GRAPHQL_URI;
|
|
33
|
+
const wsurl = environment.GRAPHQL_WS_URI;
|
|
34
|
+
const start = Date.now();
|
|
35
|
+
const config = new GraphQLProviderConfigData(token, url, wsurl, async () => {
|
|
36
|
+
// Token refresh callback - refreshToken() returns StandardAuthToken directly or throws
|
|
37
|
+
const token = await this.authBase.refreshToken();
|
|
38
|
+
return token.idToken;
|
|
39
|
+
}, environment.MJ_CORE_SCHEMA_NAME);
|
|
40
|
+
await setupGraphQLClient(config);
|
|
41
|
+
const end = Date.now();
|
|
42
|
+
console.log(`✓ GraphQL Client Setup Complete: ${end - start}ms`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Refresh shared data and validate user access
|
|
46
|
+
*/
|
|
47
|
+
async validateUserAccess() {
|
|
48
|
+
await SharedService.RefreshData(true);
|
|
49
|
+
const md = new Metadata();
|
|
50
|
+
if (!md.CurrentUser) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: {
|
|
54
|
+
message: "You don't have access to the application, contact your system administrator.",
|
|
55
|
+
type: 'no_access'
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { success: true };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Run startup validation checks (if validation service is provided)
|
|
63
|
+
*/
|
|
64
|
+
runValidationChecks() {
|
|
65
|
+
if (!this.startupValidationService) {
|
|
66
|
+
return; // No validation service provided
|
|
67
|
+
}
|
|
68
|
+
// Small delay to ensure everything is initialized
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
this.startupValidationService?.validateSystemSetup();
|
|
71
|
+
}, 500);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Navigate to initial route after successful login
|
|
75
|
+
*/
|
|
76
|
+
navigateToInitialRoute(initialPath, document) {
|
|
77
|
+
localStorage.removeItem('jwt-retry-ts');
|
|
78
|
+
if (initialPath === '/') {
|
|
79
|
+
// Use first nav item instead
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
// Find the KendoDrawer element and simulate a click for the first item
|
|
82
|
+
const drawerElement = document.querySelector('li.k-drawer-item.k-level-0');
|
|
83
|
+
if (drawerElement)
|
|
84
|
+
drawerElement.click();
|
|
85
|
+
}, 10); // Wait for the drawer to finish render
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.router.navigateByUrl(initialPath, { replaceUrl: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if error is related to missing user roles
|
|
93
|
+
*/
|
|
94
|
+
isNoUserRolesError(err) {
|
|
95
|
+
try {
|
|
96
|
+
if (!err || typeof err !== 'object')
|
|
97
|
+
return false;
|
|
98
|
+
// Check for GraphQL-style errors
|
|
99
|
+
if (err.response && Array.isArray(err.response.errors)) {
|
|
100
|
+
return err.response.errors.some((e) => e && e.message && typeof e.message === 'string' &&
|
|
101
|
+
e.message.includes('does not have read permissions on User Roles'));
|
|
102
|
+
}
|
|
103
|
+
// Check for specific "ResourceTypes" error
|
|
104
|
+
if (err.toString && typeof err.toString === 'function') {
|
|
105
|
+
const errorString = err.toString();
|
|
106
|
+
if (errorString.includes("Cannot read properties of undefined (reading 'ResourceTypes')")) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Check for error message directly on the error object
|
|
111
|
+
if (err.message && typeof err.message === 'string') {
|
|
112
|
+
const message = err.message;
|
|
113
|
+
return message.includes('does not have read permissions on User Roles') ||
|
|
114
|
+
message.includes("Cannot read properties of undefined (reading 'ResourceTypes')");
|
|
115
|
+
}
|
|
116
|
+
// Check for nested error object
|
|
117
|
+
if (err.error && typeof err.error === 'object') {
|
|
118
|
+
return this.isNoUserRolesError(err.error);
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
console.error('Error while checking for user roles error:', e);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Handle no roles error by showing validation banner (if validation service is provided)
|
|
129
|
+
*/
|
|
130
|
+
handleNoRolesError() {
|
|
131
|
+
this.startupValidationService?.addNoRolesValidationIssue();
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: {
|
|
135
|
+
message: 'User has no roles assigned',
|
|
136
|
+
type: 'no_roles',
|
|
137
|
+
showValidationOnly: true
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Handle authentication retry logic
|
|
143
|
+
*/
|
|
144
|
+
async handleAuthRetry(err) {
|
|
145
|
+
const retryKey = 'auth-retry-dt';
|
|
146
|
+
const lastRetryDateTime = localStorage.getItem(retryKey);
|
|
147
|
+
const yesterday = +new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);
|
|
148
|
+
const retriedRecently = lastRetryDateTime && +new Date(lastRetryDateTime) > yesterday;
|
|
149
|
+
const authError = this.authBase.classifyError(err);
|
|
150
|
+
const isTokenExpired = authError.type === AuthErrorType.TOKEN_EXPIRED;
|
|
151
|
+
if (!retriedRecently && isTokenExpired) {
|
|
152
|
+
console.log('JWT Expired, retrying once: ' + err);
|
|
153
|
+
localStorage.setItem(retryKey, new Date().toISOString());
|
|
154
|
+
await this.authBase.login({ appState: { target: window.location.pathname } }).toPromise();
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get auth error message for display
|
|
161
|
+
*/
|
|
162
|
+
getAuthErrorMessage(err) {
|
|
163
|
+
const authError = this.authBase.classifyError(err);
|
|
164
|
+
switch (authError.type) {
|
|
165
|
+
case AuthErrorType.NO_ACTIVE_SESSION:
|
|
166
|
+
return "Welcome back! Please log in to your account.";
|
|
167
|
+
case AuthErrorType.INTERACTION_REQUIRED:
|
|
168
|
+
case AuthErrorType.TOKEN_EXPIRED:
|
|
169
|
+
return "Your session has expired. Please log in to your account.";
|
|
170
|
+
default:
|
|
171
|
+
return authError.userMessage || "Welcome back! Please log in to your account.";
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, deps: [{ token: i1.Router }, { token: i2.MJAuthBase }, { token: MJ_STARTUP_VALIDATION }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
175
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, providedIn: 'root' });
|
|
176
|
+
}
|
|
177
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJInitializationService, decorators: [{
|
|
178
|
+
type: Injectable,
|
|
179
|
+
args: [{
|
|
180
|
+
providedIn: 'root'
|
|
181
|
+
}]
|
|
182
|
+
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.MJAuthBase }, { type: undefined, decorators: [{
|
|
183
|
+
type: Inject,
|
|
184
|
+
args: [MJ_STARTUP_VALIDATION]
|
|
185
|
+
}] }] });
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6YXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRyxPQUFPLEVBQWdDLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQW1FLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFjNUgsTUFBTSxPQUFPLHVCQUF1QjtJQUV4QjtJQUNBO0lBQytCO0lBSHpDLFlBQ1UsTUFBYyxFQUNkLFFBQW9CLEVBQ1csd0JBQTJEO1FBRjFGLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ1csNkJBQXdCLEdBQXhCLHdCQUF3QixDQUFtQztJQUNqRyxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFdBQWdDO1FBQ3JFLE1BQU0sR0FBRyxHQUFXLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQVcsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSx5QkFBeUIsQ0FDMUMsS0FBSyxFQUNMLEdBQUcsRUFDSCxLQUFLLEVBQ0wsS0FBSyxJQUFJLEVBQUU7WUFDVCx1RkFBdUY7WUFDdkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN2QixDQUFDLEVBQ0QsV0FBVyxDQUFDLG1CQUFtQixDQUNoQyxDQUFDO1FBRUYsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFO29CQUNMLE9BQU8sRUFBRSw4RUFBOEU7b0JBQ3ZGLElBQUksRUFBRSxXQUFXO2lCQUNsQjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxpQ0FBaUM7UUFDM0MsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLG1CQUFtQixFQUFFLENBQUM7UUFDdkQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCLENBQUMsV0FBbUIsRUFBRSxRQUFrQjtRQUM1RCxZQUFZLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXhDLElBQUksV0FBVyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLDZCQUE2QjtZQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLHVFQUF1RTtnQkFDdkUsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBUSxDQUFDO2dCQUNsRixJQUFJLGFBQWE7b0JBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxHQUFRO1FBQ3pCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUVsRCxpQ0FBaUM7WUFDakMsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ3pDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRO29CQUMvQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUNuRSxDQUFDO1lBQ0osQ0FBQztZQUVELDJDQUEyQztZQUMzQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25DLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQywrREFBK0QsQ0FBQyxFQUFFLENBQUM7b0JBQzFGLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBRUQsdURBQXVEO1lBQ3ZELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQztvQkFDaEUsT0FBTyxDQUFDLFFBQVEsQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQzNGLENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLENBQUM7UUFFM0QsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLO1lBQ2QsS0FBSyxFQUFFO2dCQUNMLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLElBQUksRUFBRSxVQUFVO2dCQUNoQixrQkFBa0IsRUFBRSxJQUFJO2FBQ3pCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBUTtRQUM1QixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUM7UUFDakMsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsU0FBUyxDQUFDO1FBRXRGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUV0RSxJQUFJLENBQUMsZUFBZSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDbEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUYsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxHQUFZO1FBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEMsT0FBTyw4Q0FBOEMsQ0FBQztZQUN4RCxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxhQUFhO2dCQUM5QixPQUFPLDBEQUEwRCxDQUFDO1lBQ3BFO2dCQUNFLE9BQU8sU0FBUyxDQUFDLFdBQVcsSUFBSSw4Q0FBOEMsQ0FBQztRQUNuRixDQUFDO0lBQ0gsQ0FBQzt3R0FwTFUsdUJBQXVCLGtFQUl4QixxQkFBcUI7NEdBSnBCLHVCQUF1QixjQUZ0QixNQUFNOzs0RkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFLSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtYmVySnVuY3Rpb24gMy4wIEluaXRpYWxpemF0aW9uIFNlcnZpY2VcbiAqXG4gKiBIYW5kbGVzIGFsbCBjb3JlIGluaXRpYWxpemF0aW9uIHRhc2tzOlxuICogLSBHZW5lcmF0ZWQgZW50aXRpZXMgbG9hZGluZ1xuICogLSBHcmFwaFFMIGNsaWVudCBzZXR1cFxuICogLSBUb2tlbiByZWZyZXNoIGNvbmZpZ3VyYXRpb25cbiAqIC0gU3lzdGVtIHZhbGlkYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9jb3JlJztcbmltcG9ydCB7IHNldHVwR3JhcGhRTENsaWVudCwgR3JhcGhRTFByb3ZpZGVyQ29uZmlnRGF0YSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9ncmFwaHFsLWRhdGFwcm92aWRlcic7XG5pbXBvcnQgeyBNSkF1dGhCYXNlLCBTdGFuZGFyZFVzZXJJbmZvLCBBdXRoRXJyb3JUeXBlIH0gZnJvbSAnQG1lbWJlcmp1bmN0aW9uL25nLWF1dGgtc2VydmljZXMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ0BtZW1iZXJqdW5jdGlvbi9uZy1zaGFyZWQnO1xuaW1wb3J0IHsgTUpFbnZpcm9ubWVudENvbmZpZywgTUpfRU5WSVJPTk1FTlQsIE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlLCBNSl9TVEFSVFVQX1ZBTElEQVRJT04gfSBmcm9tICcuLi9ib290c3RyYXAudHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHR5cGU6ICdub19hY2Nlc3MnIHwgJ25vX3JvbGVzJyB8ICdhdXRoX2Vycm9yJyB8ICd1bmtub3duJztcbiAgICBzaG93VmFsaWRhdGlvbk9ubHk/OiBib29sZWFuO1xuICB9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRoQmFzZTogTUpBdXRoQmFzZSxcbiAgICBASW5qZWN0KE1KX1NUQVJUVVBfVkFMSURBVElPTikgcHJpdmF0ZSBzdGFydHVwVmFsaWRhdGlvblNlcnZpY2U6IE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlIHwgbnVsbFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgR3JhcGhRTCBjbGllbnQgd2l0aCBhdXRoZW50aWNhdGlvbiB0b2tlbiBhbmQgcmVmcmVzaCBjYWxsYmFja1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZUdyYXBoUUwodG9rZW46IHN0cmluZywgZW52aXJvbm1lbnQ6IE1KRW52aXJvbm1lbnRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IGVudmlyb25tZW50LkdSQVBIUUxfVVJJO1xuICAgIGNvbnN0IHdzdXJsOiBzdHJpbmcgPSBlbnZpcm9ubWVudC5HUkFQSFFMX1dTX1VSSTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBjb25maWcgPSBuZXcgR3JhcGhRTFByb3ZpZGVyQ29uZmlnRGF0YShcbiAgICAgIHRva2VuLFxuICAgICAgdXJsLFxuICAgICAgd3N1cmwsXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFRva2VuIHJlZnJlc2ggY2FsbGJhY2sgLSByZWZyZXNoVG9rZW4oKSByZXR1cm5zIFN0YW5kYXJkQXV0aFRva2VuIGRpcmVjdGx5IG9yIHRocm93c1xuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aEJhc2UucmVmcmVzaFRva2VuKCk7XG4gICAgICAgIHJldHVybiB0b2tlbi5pZFRva2VuO1xuICAgICAgfSxcbiAgICAgIGVudmlyb25tZW50Lk1KX0NPUkVfU0NIRU1BX05BTUVcbiAgICApO1xuXG4gICAgYXdhaXQgc2V0dXBHcmFwaFFMQ2xpZW50KGNvbmZpZyk7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEdyYXBoUUwgQ2xpZW50IFNldHVwIENvbXBsZXRlOiAke2VuZCAtIHN0YXJ0fW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCBzaGFyZWQgZGF0YSBhbmQgdmFsaWRhdGUgdXNlciBhY2Nlc3NcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlVXNlckFjY2VzcygpOiBQcm9taXNlPEluaXRpYWxpemF0aW9uUmVzdWx0PiB7XG4gICAgYXdhaXQgU2hhcmVkU2VydmljZS5SZWZyZXNoRGF0YSh0cnVlKTtcblxuICAgIGNvbnN0IG1kID0gbmV3IE1ldGFkYXRhKCk7XG5cbiAgICBpZiAoIW1kLkN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBtZXNzYWdlOiBcIllvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYXBwbGljYXRpb24sIGNvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvci5cIixcbiAgICAgICAgICB0eXBlOiAnbm9fYWNjZXNzJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gc3RhcnR1cCB2YWxpZGF0aW9uIGNoZWNrcyAoaWYgdmFsaWRhdGlvbiBzZXJ2aWNlIGlzIHByb3ZpZGVkKVxuICAgKi9cbiAgcnVuVmFsaWRhdGlvbkNoZWNrcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlKSB7XG4gICAgICByZXR1cm47IC8vIE5vIHZhbGlkYXRpb24gc2VydmljZSBwcm92aWRlZFxuICAgIH1cblxuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZT8udmFsaWRhdGVTeXN0ZW1TZXR1cCgpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgdG8gaW5pdGlhbCByb3V0ZSBhZnRlciBzdWNjZXNzZnVsIGxvZ2luXG4gICAqL1xuICBuYXZpZ2F0ZVRvSW5pdGlhbFJvdXRlKGluaXRpYWxQYXRoOiBzdHJpbmcsIGRvY3VtZW50OiBEb2N1bWVudCk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdqd3QtcmV0cnktdHMnKTtcblxuICAgIGlmIChpbml0aWFsUGF0aCA9PT0gJy8nKSB7XG4gICAgICAvLyBVc2UgZmlyc3QgbmF2IGl0ZW0gaW5zdGVhZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIEtlbmRvRHJhd2VyIGVsZW1lbnQgYW5kIHNpbXVsYXRlIGEgY2xpY2sgZm9yIHRoZSBmaXJzdCBpdGVtXG4gICAgICAgIGNvbnN0IGRyYXdlckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaS5rLWRyYXdlci1pdGVtLmstbGV2ZWwtMCcpIGFzIGFueTtcbiAgICAgICAgaWYgKGRyYXdlckVsZW1lbnQpIGRyYXdlckVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH0sIDEwKTsgLy8gV2FpdCBmb3IgdGhlIGRyYXdlciB0byBmaW5pc2ggcmVuZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoaW5pdGlhbFBhdGgsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXJyb3IgaXMgcmVsYXRlZCB0byBtaXNzaW5nIHVzZXIgcm9sZXNcbiAgICovXG4gIGlzTm9Vc2VyUm9sZXNFcnJvcihlcnI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWVyciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBmb3IgR3JhcGhRTC1zdHlsZSBlcnJvcnNcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgQXJyYXkuaXNBcnJheShlcnIucmVzcG9uc2UuZXJyb3JzKSkge1xuICAgICAgICByZXR1cm4gZXJyLnJlc3BvbnNlLmVycm9ycy5zb21lKChlOiBhbnkpID0+XG4gICAgICAgICAgZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBVc2VyIFJvbGVzJylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHNwZWNpZmljIFwiUmVzb3VyY2VUeXBlc1wiIGVycm9yXG4gICAgICBpZiAoZXJyLnRvU3RyaW5nICYmIHR5cGVvZiBlcnIudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgZXJyb3JTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGVycm9yU3RyaW5nLmluY2x1ZGVzKFwiQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ1Jlc291cmNlVHlwZXMnKVwiKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBlcnJvciBtZXNzYWdlIGRpcmVjdGx5IG9uIHRoZSBlcnJvciBvYmplY3RcbiAgICAgIGlmIChlcnIubWVzc2FnZSAmJiB0eXBlb2YgZXJyLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5jbHVkZXMoJ2RvZXMgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBVc2VyIFJvbGVzJykgfHxcbiAgICAgICAgICAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnUmVzb3VyY2VUeXBlcycpXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgbmVzdGVkIGVycm9yIG9iamVjdFxuICAgICAgaWYgKGVyci5lcnJvciAmJiB0eXBlb2YgZXJyLmVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc05vVXNlclJvbGVzRXJyb3IoZXJyLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGZvciB1c2VyIHJvbGVzIGVycm9yOicsIGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbm8gcm9sZXMgZXJyb3IgYnkgc2hvd2luZyB2YWxpZGF0aW9uIGJhbm5lciAoaWYgdmFsaWRhdGlvbiBzZXJ2aWNlIGlzIHByb3ZpZGVkKVxuICAgKi9cbiAgaGFuZGxlTm9Sb2xlc0Vycm9yKCk6IEluaXRpYWxpemF0aW9uUmVzdWx0IHtcbiAgICB0aGlzLnN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZT8uYWRkTm9Sb2xlc1ZhbGlkYXRpb25Jc3N1ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VzZXIgaGFzIG5vIHJvbGVzIGFzc2lnbmVkJyxcbiAgICAgICAgdHlwZTogJ25vX3JvbGVzJyxcbiAgICAgICAgc2hvd1ZhbGlkYXRpb25Pbmx5OiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYXV0aGVudGljYXRpb24gcmV0cnkgbG9naWNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUF1dGhSZXRyeShlcnI6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJldHJ5S2V5ID0gJ2F1dGgtcmV0cnktZHQnO1xuICAgIGNvbnN0IGxhc3RSZXRyeURhdGVUaW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocmV0cnlLZXkpO1xuICAgIGNvbnN0IHllc3RlcmRheSA9ICtuZXcgRGF0ZShEYXRlLm5vdygpIC0gMSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIGNvbnN0IHJldHJpZWRSZWNlbnRseSA9IGxhc3RSZXRyeURhdGVUaW1lICYmICtuZXcgRGF0ZShsYXN0UmV0cnlEYXRlVGltZSkgPiB5ZXN0ZXJkYXk7XG5cbiAgICBjb25zdCBhdXRoRXJyb3IgPSB0aGlzLmF1dGhCYXNlLmNsYXNzaWZ5RXJyb3IoZXJyKTtcbiAgICBjb25zdCBpc1Rva2VuRXhwaXJlZCA9IGF1dGhFcnJvci50eXBlID09PSBBdXRoRXJyb3JUeXBlLlRPS0VOX0VYUElSRUQ7XG5cbiAgICBpZiAoIXJldHJpZWRSZWNlbnRseSAmJiBpc1Rva2VuRXhwaXJlZCkge1xuICAgICAgY29uc29sZS5sb2coJ0pXVCBFeHBpcmVkLCByZXRyeWluZyBvbmNlOiAnICsgZXJyKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHJldHJ5S2V5LCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgYXdhaXQgdGhpcy5hdXRoQmFzZS5sb2dpbih7IGFwcFN0YXRlOiB7IHRhcmdldDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIH0gfSkudG9Qcm9taXNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1dGggZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheVxuICAgKi9cbiAgZ2V0QXV0aEVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGF1dGhFcnJvciA9IHRoaXMuYXV0aEJhc2UuY2xhc3NpZnlFcnJvcihlcnIpO1xuXG4gICAgc3dpdGNoIChhdXRoRXJyb3IudHlwZSkge1xuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLk5PX0FDVElWRV9TRVNTSU9OOlxuICAgICAgICByZXR1cm4gXCJXZWxjb21lIGJhY2shIFBsZWFzZSBsb2cgaW4gdG8geW91ciBhY2NvdW50LlwiO1xuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLklOVEVSQUNUSU9OX1JFUVVJUkVEOlxuICAgICAgY2FzZSBBdXRoRXJyb3JUeXBlLlRPS0VOX0VYUElSRUQ6XG4gICAgICAgIHJldHVybiBcIllvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIGxvZyBpbiB0byB5b3VyIGFjY291bnQuXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYXV0aEVycm9yLnVzZXJNZXNzYWdlIHx8IFwiV2VsY29tZSBiYWNrISBQbGVhc2UgbG9nIGluIHRvIHlvdXIgYWNjb3VudC5cIjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyanVuY3Rpb24tbmctYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbWJlcmp1bmN0aW9uLW5nLWJvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API Surface of @memberjunction/ng-bootstrap
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/bootstrap.module';
|
|
5
|
+
export * from './lib/bootstrap.component';
|
|
6
|
+
export * from './lib/bootstrap.types';
|
|
7
|
+
export * from './lib/services/initialization.service';
|
|
8
|
+
export * from './lib/components/auth-shell.component';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLHVDQUF1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQG1lbWJlcmp1bmN0aW9uL25nLWJvb3RzdHJhcFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2Jvb3RzdHJhcC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYm9vdHN0cmFwLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ib290c3RyYXAudHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2F1dGgtc2hlbGwuY29tcG9uZW50JztcbiJdfQ==
|