@igo2/auth 1.15.5 → 1.15.6

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 (53) hide show
  1. package/esm2020/igo2-auth.mjs +4 -4
  2. package/esm2020/lib/auth-form/auth-facebook.component.mjs +60 -60
  3. package/esm2020/lib/auth-form/auth-form.component.mjs +276 -276
  4. package/esm2020/lib/auth-form/auth-google.component.mjs +98 -98
  5. package/esm2020/lib/auth-form/auth-intern.component.mjs +118 -118
  6. package/esm2020/lib/auth-form/auth-microsoft.component.mjs +93 -93
  7. package/esm2020/lib/auth-form/auth-microsoftb2c.component.mjs +92 -92
  8. package/esm2020/lib/auth-form/index.mjs +4 -4
  9. package/esm2020/lib/auth-routing.module.mjs +23 -23
  10. package/esm2020/lib/auth.module.mjs +90 -90
  11. package/esm2020/lib/shared/admin.guard.mjs +32 -32
  12. package/esm2020/lib/shared/auth-microsoft.provider.mjs +83 -83
  13. package/esm2020/lib/shared/auth-msalBroadcastServiceb2c.service.mjs +37 -37
  14. package/esm2020/lib/shared/auth-msalServiceb2c.service..mjs +79 -79
  15. package/esm2020/lib/shared/auth.guard.mjs +31 -31
  16. package/esm2020/lib/shared/auth.interceptor.mjs +154 -154
  17. package/esm2020/lib/shared/auth.interface.mjs +1 -1
  18. package/esm2020/lib/shared/auth.service.mjs +157 -157
  19. package/esm2020/lib/shared/logged.guard.mjs +31 -31
  20. package/esm2020/lib/shared/profils.guard.mjs +36 -36
  21. package/esm2020/lib/shared/protected.directive.mjs +18 -18
  22. package/esm2020/lib/shared/storage.interface.mjs +1 -1
  23. package/esm2020/lib/shared/storage.service.mjs +90 -90
  24. package/esm2020/lib/shared/token.service.mjs +46 -46
  25. package/esm2020/public_api.mjs +18 -18
  26. package/fesm2015/igo2-auth.mjs +1577 -1577
  27. package/fesm2020/igo2-auth.mjs +1475 -1475
  28. package/index.d.ts +5 -5
  29. package/lib/auth-form/auth-facebook.component.d.ts +18 -18
  30. package/lib/auth-form/auth-form.component.d.ts +42 -42
  31. package/lib/auth-form/auth-google.component.d.ts +24 -24
  32. package/lib/auth-form/auth-intern.component.d.ts +21 -21
  33. package/lib/auth-form/auth-microsoft.component.d.ts +23 -23
  34. package/lib/auth-form/auth-microsoftb2c.component.d.ts +23 -23
  35. package/lib/auth-form/index.d.ts +4 -4
  36. package/lib/auth-routing.module.d.ts +7 -7
  37. package/lib/auth.module.d.ts +23 -23
  38. package/lib/shared/admin.guard.d.ts +13 -13
  39. package/lib/shared/auth-microsoft.provider.d.ts +30 -30
  40. package/lib/shared/auth-msalBroadcastServiceb2c.service.d.ts +15 -15
  41. package/lib/shared/auth-msalServiceb2c.service..d.ts +33 -33
  42. package/lib/shared/auth.guard.d.ts +13 -13
  43. package/lib/shared/auth.interceptor.d.ts +24 -24
  44. package/lib/shared/auth.interface.d.ts +99 -99
  45. package/lib/shared/auth.service.d.ts +44 -44
  46. package/lib/shared/logged.guard.d.ts +13 -13
  47. package/lib/shared/profils.guard.d.ts +13 -13
  48. package/lib/shared/protected.directive.d.ts +8 -8
  49. package/lib/shared/storage.interface.d.ts +4 -4
  50. package/lib/shared/storage.service.d.ts +18 -18
  51. package/lib/shared/token.service.d.ts +15 -15
  52. package/package.json +3 -3
  53. package/public_api.d.ts +15 -15
@@ -1,277 +1,277 @@
1
- import { Component, ChangeDetectionStrategy, Input, Optional, Output, EventEmitter } from '@angular/core';
2
- import { NavigationStart } from '@angular/router';
3
- import { filter } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../shared/auth.service";
6
- import * as i2 from "@igo2/core";
7
- import * as i3 from "@angular/router";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "@angular/material/button";
10
- import * as i6 from "./auth-google.component";
11
- import * as i7 from "./auth-intern.component";
12
- import * as i8 from "./auth-facebook.component";
13
- import * as i9 from "./auth-microsoft.component";
14
- import * as i10 from "./auth-microsoftb2c.component";
15
- import * as i11 from "@ngx-translate/core";
16
- function AuthFormComponent_div_0_div_1_Template(rf, ctx) { if (rf & 1) {
17
- i0.ɵɵelement(0, "div", 3);
18
- } }
19
- function AuthFormComponent_div_0_div_2_igo_auth_google_4_Template(rf, ctx) { if (rf & 1) {
20
- const _r11 = i0.ɵɵgetCurrentView();
21
- i0.ɵɵelementStart(0, "igo-auth-google", 7);
22
- i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_google_4_Template_igo_auth_google_login_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r10.onLogin()); });
23
- i0.ɵɵelementEnd();
24
- } }
25
- function AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template(rf, ctx) { if (rf & 1) {
26
- const _r13 = i0.ɵɵgetCurrentView();
27
- i0.ɵɵelementStart(0, "igo-auth-microsoft", 7);
28
- i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template_igo_auth_microsoft_login_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r12.onLogin()); });
29
- i0.ɵɵelementEnd();
30
- } }
31
- function AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template(rf, ctx) { if (rf & 1) {
32
- const _r15 = i0.ɵɵgetCurrentView();
33
- i0.ɵɵelementStart(0, "igo-auth-microsoftb2c", 7);
34
- i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template_igo_auth_microsoftb2c_login_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r14.onLogin()); });
35
- i0.ɵɵelementEnd();
36
- } }
37
- function AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template(rf, ctx) { if (rf & 1) {
38
- const _r17 = i0.ɵɵgetCurrentView();
39
- i0.ɵɵelementStart(0, "igo-auth-facebook", 7);
40
- i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template_igo_auth_facebook_login_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r16 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r16.onLogin()); });
41
- i0.ɵɵelementEnd();
42
- } }
43
- function AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template(rf, ctx) { if (rf & 1) {
44
- const _r19 = i0.ɵɵgetCurrentView();
45
- i0.ɵɵelementStart(0, "igo-auth-intern", 8);
46
- i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template_igo_auth_intern_login_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r18 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r18.onLogin()); });
47
- i0.ɵɵelementEnd();
48
- } if (rf & 2) {
49
- const ctx_r9 = i0.ɵɵnextContext(3);
50
- i0.ɵɵproperty("allowAnonymous", ctx_r9.options.allowAnonymous);
51
- } }
52
- function AuthFormComponent_div_0_div_2_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "div", 4)(1, "h1");
54
- i0.ɵɵtext(2);
55
- i0.ɵɵpipe(3, "translate");
56
- i0.ɵɵelementEnd();
57
- i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_2_igo_auth_google_4_Template, 1, 0, "igo-auth-google", 5);
58
- i0.ɵɵtemplate(5, AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template, 1, 0, "igo-auth-microsoft", 5);
59
- i0.ɵɵtemplate(6, AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template, 1, 0, "igo-auth-microsoftb2c", 5);
60
- i0.ɵɵtemplate(7, AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template, 1, 0, "igo-auth-facebook", 5);
61
- i0.ɵɵtemplate(8, AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template, 1, 1, "igo-auth-intern", 6);
62
- i0.ɵɵelementEnd();
63
- } if (rf & 2) {
64
- const ctx_r2 = i0.ɵɵnextContext(2);
65
- i0.ɵɵadvance(2);
66
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "igo.auth.connection"));
67
- i0.ɵɵadvance(2);
68
- i0.ɵɵproperty("ngIf", ctx_r2.options.google && ctx_r2.options.google.enabled !== false);
69
- i0.ɵɵadvance(1);
70
- i0.ɵɵproperty("ngIf", ctx_r2.options.microsoft && ctx_r2.options.microsoft.enabled !== false);
71
- i0.ɵɵadvance(1);
72
- i0.ɵɵproperty("ngIf", ctx_r2.options.microsoftb2c && ctx_r2.options.microsoftb2c.enabled !== false);
73
- i0.ɵɵadvance(1);
74
- i0.ɵɵproperty("ngIf", ctx_r2.options.facebook && ctx_r2.options.facebook.enabled !== false);
75
- i0.ɵɵadvance(1);
76
- i0.ɵɵproperty("ngIf", !ctx_r2.options.intern || ctx_r2.options.intern.enabled !== false);
77
- } }
78
- function AuthFormComponent_div_0_div_3_Template(rf, ctx) { if (rf & 1) {
79
- const _r21 = i0.ɵɵgetCurrentView();
80
- i0.ɵɵelementStart(0, "div", 4)(1, "p");
81
- i0.ɵɵtext(2);
82
- i0.ɵɵpipe(3, "translate");
83
- i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(4, "button", 9);
85
- i0.ɵɵlistener("click", function AuthFormComponent_div_0_div_3_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r20.logout()); });
86
- i0.ɵɵtext(5);
87
- i0.ɵɵpipe(6, "translate");
88
- i0.ɵɵelementEnd()();
89
- } if (rf & 2) {
90
- const ctx_r3 = i0.ɵɵnextContext(2);
91
- i0.ɵɵadvance(2);
92
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 2, "igo.auth.welcome", ctx_r3.user));
93
- i0.ɵɵadvance(3);
94
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 5, "igo.auth.signOut"));
95
- } }
96
- function AuthFormComponent_div_0_div_4_button_4_Template(rf, ctx) { if (rf & 1) {
97
- const _r24 = i0.ɵɵgetCurrentView();
98
- i0.ɵɵelementStart(0, "button", 9);
99
- i0.ɵɵlistener("click", function AuthFormComponent_div_0_div_4_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r23.home()); });
100
- i0.ɵɵtext(1);
101
- i0.ɵɵpipe(2, "translate");
102
- i0.ɵɵelementEnd();
103
- } if (rf & 2) {
104
- i0.ɵɵadvance(1);
105
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "igo.auth.home"));
106
- } }
107
- function AuthFormComponent_div_0_div_4_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 4)(1, "p");
109
- i0.ɵɵtext(2);
110
- i0.ɵɵpipe(3, "translate");
111
- i0.ɵɵelementEnd();
112
- i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_4_button_4_Template, 3, 3, "button", 10);
113
- i0.ɵɵelementEnd();
114
- } if (rf & 2) {
115
- const ctx_r4 = i0.ɵɵnextContext(2);
116
- i0.ɵɵadvance(2);
117
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "igo.auth.deconnection"));
118
- i0.ɵɵadvance(2);
119
- i0.ɵɵproperty("ngIf", ctx_r4.options.homeRoute);
120
- } }
121
- function AuthFormComponent_div_0_Template(rf, ctx) { if (rf & 1) {
122
- i0.ɵɵelementStart(0, "div");
123
- i0.ɵɵtemplate(1, AuthFormComponent_div_0_div_1_Template, 1, 0, "div", 1);
124
- i0.ɵɵtemplate(2, AuthFormComponent_div_0_div_2_Template, 9, 8, "div", 2);
125
- i0.ɵɵtemplate(3, AuthFormComponent_div_0_div_3_Template, 7, 7, "div", 2);
126
- i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_4_Template, 5, 4, "div", 2);
127
- i0.ɵɵelementEnd();
128
- } if (rf & 2) {
129
- const ctx_r0 = i0.ɵɵnextContext();
130
- i0.ɵɵadvance(1);
131
- i0.ɵɵproperty("ngIf", !ctx_r0.auth.logged && ctx_r0.backgroundDisable);
132
- i0.ɵɵadvance(1);
133
- i0.ɵɵproperty("ngIf", !ctx_r0.auth.logged && ctx_r0.showLoginDiv);
134
- i0.ɵɵadvance(1);
135
- i0.ɵɵproperty("ngIf", ctx_r0.auth.logged && ctx_r0.showAlreadyConnectedDiv);
136
- i0.ɵɵadvance(1);
137
- i0.ɵɵproperty("ngIf", ctx_r0.showLogoutDiv);
138
- } }
139
- export class AuthFormComponent {
140
- constructor(auth, config, router) {
141
- this.auth = auth;
142
- this.config = config;
143
- this.router = router;
144
- this._backgroundDisable = true;
145
- this._hasAlreadyConnectedDiv = true;
146
- this._hasLogoutDiv = true;
147
- this._showAlreadyConnectedDiv = false;
148
- this._showLogoutDiv = false;
149
- this.login = new EventEmitter();
150
- this.visible = true;
151
- this.options = this.config.getConfig('auth') || {};
152
- this.visible = Object.getOwnPropertyNames(this.options).length !== 0;
153
- }
154
- get backgroundDisable() {
155
- if (this.isLogoutRoute || this.isLogoutRoute) {
156
- return false;
157
- }
158
- return this._backgroundDisable;
159
- }
160
- set backgroundDisable(value) {
161
- this._backgroundDisable = value.toString() === 'true';
162
- }
163
- get hasAlreadyConnectedDiv() {
164
- return this._hasAlreadyConnectedDiv;
165
- }
166
- set hasAlreadyConnectedDiv(value) {
167
- this._hasAlreadyConnectedDiv = value.toString() === 'true';
168
- }
169
- get hasLogoutDiv() {
170
- return this._hasLogoutDiv;
171
- }
172
- set hasLogoutDiv(value) {
173
- this._hasLogoutDiv = value.toString() === 'true';
174
- }
175
- get showAlreadyConnectedDiv() {
176
- if (this.isLogoutRoute) {
177
- return this.hasAlreadyConnectedDiv;
178
- }
179
- return this._showAlreadyConnectedDiv;
180
- }
181
- set showAlreadyConnectedDiv(value) {
182
- this._showAlreadyConnectedDiv = value.toString() === 'true';
183
- }
184
- get showLogoutDiv() {
185
- if (this.isLogoutRoute) {
186
- return this.hasLogoutDiv;
187
- }
188
- return this._showLogoutDiv;
189
- }
190
- set showLogoutDiv(value) {
191
- this._showLogoutDiv = value.toString() === 'true';
192
- }
193
- get showLoginDiv() {
194
- if (!this.isLogoutRoute) {
195
- return true;
196
- }
197
- }
198
- ngOnInit() {
199
- this.analyzeRoute();
200
- this.getName();
201
- }
202
- onLogin() {
203
- this.auth.goToRedirectUrl();
204
- this.getName();
205
- this.login.emit(true);
206
- }
207
- logout() {
208
- this.auth.logout().subscribe(() => {
209
- this.user = undefined;
210
- if (this.router) {
211
- if (this.options.logoutRoute) {
212
- this.router.navigate([this.options.logoutRoute]);
213
- }
214
- else if (this.options.homeRoute) {
215
- this.router.navigate([this.options.homeRoute]);
216
- }
217
- }
218
- });
219
- }
220
- home() {
221
- if (this.router && this.options.homeRoute) {
222
- this.router.navigate([this.options.homeRoute]);
223
- }
224
- }
225
- getName() {
226
- const tokenDecoded = this.auth.decodeToken();
227
- if (tokenDecoded) {
228
- this.user = {
229
- name: tokenDecoded.user.firstName || tokenDecoded.user.sourceId
230
- };
231
- }
232
- }
233
- analyzeRoute() {
234
- if (!this.router) {
235
- return;
236
- }
237
- this.router.events
238
- .pipe(filter((event) => event instanceof NavigationStart))
239
- .subscribe((changeEvent) => {
240
- if (changeEvent.url) {
241
- const currentRoute = changeEvent.url;
242
- const logoutRoute = this.options.logoutRoute;
243
- const loginRoute = this.options.loginRoute;
244
- this.isLogoutRoute = currentRoute === logoutRoute;
245
- this.isLoginRoute = currentRoute === loginRoute;
246
- if (this.isLogoutRoute) {
247
- this.auth.logout();
248
- }
249
- }
250
- });
251
- }
252
- }
253
- AuthFormComponent.ɵfac = function AuthFormComponent_Factory(t) { return new (t || AuthFormComponent)(i0.ɵɵdirectiveInject(i1.AuthService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.Router, 8)); };
254
- AuthFormComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AuthFormComponent, selectors: [["igo-auth-form"]], inputs: { backgroundDisable: "backgroundDisable", hasAlreadyConnectedDiv: "hasAlreadyConnectedDiv", hasLogoutDiv: "hasLogoutDiv", showAlreadyConnectedDiv: "showAlreadyConnectedDiv", showLogoutDiv: "showLogoutDiv" }, outputs: { login: "login" }, decls: 1, vars: 1, consts: [[4, "ngIf"], ["class", "backgroundDisable", 4, "ngIf"], ["class", "login center-block", 4, "ngIf"], [1, "backgroundDisable"], [1, "login", "center-block"], [3, "login", 4, "ngIf"], [3, "allowAnonymous", "login", 4, "ngIf"], [3, "login"], [3, "allowAnonymous", "login"], ["mat-raised-button", "", "type", "button", 3, "click"], ["mat-raised-button", "", "type", "button", 3, "click", 4, "ngIf"]], template: function AuthFormComponent_Template(rf, ctx) { if (rf & 1) {
255
- i0.ɵɵtemplate(0, AuthFormComponent_div_0_Template, 5, 4, "div", 0);
256
- } if (rf & 2) {
257
- i0.ɵɵproperty("ngIf", ctx.visible);
258
- } }, dependencies: [i4.NgIf, i5.MatButton, i6.AuthGoogleComponent, i7.AuthInternComponent, i8.AuthFacebookComponent, i9.AuthMicrosoftComponent, i10.AuthMicrosoftb2cComponent, i11.TranslatePipe], styles: ["[_nghost-%COMP%]{z-index:999}div.login[_ngcontent-%COMP%]{z-index:200;width:90%;min-width:360px;max-width:600px;padding:25px 50px;border:1px solid;background-color:#fff;border-color:#888}.center-block[_ngcontent-%COMP%]{position:fixed;top:20%;left:50%;transform:translate(-50%)}.backgroundDisable[_ngcontent-%COMP%]{position:fixed;top:0;left:0;background:#000;opacity:.8;z-index:100;height:100%;width:100%}"] });
259
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthFormComponent, [{
260
- type: Component,
261
- args: [{ selector: 'igo-auth-form', changeDetection: ChangeDetectionStrategy.Default, template: "<div *ngIf=\"visible\">\n <div *ngIf=\"!auth.logged && backgroundDisable\" class=\"backgroundDisable\"></div>\n\n <div *ngIf=\"!auth.logged && showLoginDiv\" class=\"login center-block\">\n <h1>{{'igo.auth.connection' | translate}}</h1>\n\n <igo-auth-google\n *ngIf=\"options.google && options.google.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-google>\n <igo-auth-microsoft\n *ngIf=\"options.microsoft && options.microsoft.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-microsoft>\n <igo-auth-microsoftb2c\n *ngIf=\"options.microsoftb2c && options.microsoftb2c.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-microsoftb2c>\n <igo-auth-facebook\n *ngIf=\"options.facebook && options.facebook.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-facebook>\n <igo-auth-intern\n *ngIf=\"!options.intern || options.intern.enabled !== false\"\n [allowAnonymous]=\"options.allowAnonymous\"\n (login)=\"onLogin()\">\n </igo-auth-intern>\n </div>\n\n <div *ngIf=\"auth.logged && showAlreadyConnectedDiv\" class=\"login center-block\">\n <p>{{'igo.auth.welcome' |\u00A0translate: user}}</p>\n <button mat-raised-button type=\"button\" (click)=\"logout()\">{{'igo.auth.signOut' |\u00A0translate}}</button>\n </div>\n\n <div *ngIf=\"showLogoutDiv\" class=\"login center-block\">\n <p>{{'igo.auth.deconnection' |\u00A0translate}}</p>\n <button *ngIf=\"options.homeRoute\" mat-raised-button type=\"button\" (click)=\"home()\">{{'igo.auth.home' |\u00A0translate}}</button>\n </div>\n\n</div>\n", styles: [":host{z-index:999}div.login{z-index:200;width:90%;min-width:360px;max-width:600px;padding:25px 50px;border:1px solid;background-color:#fff;border-color:#888}.center-block{position:fixed;top:20%;left:50%;transform:translate(-50%)}.backgroundDisable{position:fixed;top:0;left:0;background:#000;opacity:.8;z-index:100;height:100%;width:100%}\n"] }]
262
- }], function () { return [{ type: i1.AuthService }, { type: i2.ConfigService }, { type: i3.Router, decorators: [{
263
- type: Optional
264
- }] }]; }, { backgroundDisable: [{
265
- type: Input
266
- }], hasAlreadyConnectedDiv: [{
267
- type: Input
268
- }], hasLogoutDiv: [{
269
- type: Input
270
- }], showAlreadyConnectedDiv: [{
271
- type: Input
272
- }], showLogoutDiv: [{
273
- type: Input
274
- }], login: [{
275
- type: Output
276
- }] }); })();
1
+ import { Component, ChangeDetectionStrategy, Input, Optional, Output, EventEmitter } from '@angular/core';
2
+ import { NavigationStart } from '@angular/router';
3
+ import { filter } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../shared/auth.service";
6
+ import * as i2 from "@igo2/core";
7
+ import * as i3 from "@angular/router";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "@angular/material/button";
10
+ import * as i6 from "./auth-google.component";
11
+ import * as i7 from "./auth-intern.component";
12
+ import * as i8 from "./auth-facebook.component";
13
+ import * as i9 from "./auth-microsoft.component";
14
+ import * as i10 from "./auth-microsoftb2c.component";
15
+ import * as i11 from "@ngx-translate/core";
16
+ function AuthFormComponent_div_0_div_1_Template(rf, ctx) { if (rf & 1) {
17
+ i0.ɵɵelement(0, "div", 3);
18
+ } }
19
+ function AuthFormComponent_div_0_div_2_igo_auth_google_4_Template(rf, ctx) { if (rf & 1) {
20
+ const _r11 = i0.ɵɵgetCurrentView();
21
+ i0.ɵɵelementStart(0, "igo-auth-google", 7);
22
+ i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_google_4_Template_igo_auth_google_login_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r10.onLogin()); });
23
+ i0.ɵɵelementEnd();
24
+ } }
25
+ function AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template(rf, ctx) { if (rf & 1) {
26
+ const _r13 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "igo-auth-microsoft", 7);
28
+ i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template_igo_auth_microsoft_login_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r12.onLogin()); });
29
+ i0.ɵɵelementEnd();
30
+ } }
31
+ function AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template(rf, ctx) { if (rf & 1) {
32
+ const _r15 = i0.ɵɵgetCurrentView();
33
+ i0.ɵɵelementStart(0, "igo-auth-microsoftb2c", 7);
34
+ i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template_igo_auth_microsoftb2c_login_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r14.onLogin()); });
35
+ i0.ɵɵelementEnd();
36
+ } }
37
+ function AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template(rf, ctx) { if (rf & 1) {
38
+ const _r17 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "igo-auth-facebook", 7);
40
+ i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template_igo_auth_facebook_login_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r16 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r16.onLogin()); });
41
+ i0.ɵɵelementEnd();
42
+ } }
43
+ function AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template(rf, ctx) { if (rf & 1) {
44
+ const _r19 = i0.ɵɵgetCurrentView();
45
+ i0.ɵɵelementStart(0, "igo-auth-intern", 8);
46
+ i0.ɵɵlistener("login", function AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template_igo_auth_intern_login_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r18 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r18.onLogin()); });
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const ctx_r9 = i0.ɵɵnextContext(3);
50
+ i0.ɵɵproperty("allowAnonymous", ctx_r9.options.allowAnonymous);
51
+ } }
52
+ function AuthFormComponent_div_0_div_2_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "div", 4)(1, "h1");
54
+ i0.ɵɵtext(2);
55
+ i0.ɵɵpipe(3, "translate");
56
+ i0.ɵɵelementEnd();
57
+ i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_2_igo_auth_google_4_Template, 1, 0, "igo-auth-google", 5);
58
+ i0.ɵɵtemplate(5, AuthFormComponent_div_0_div_2_igo_auth_microsoft_5_Template, 1, 0, "igo-auth-microsoft", 5);
59
+ i0.ɵɵtemplate(6, AuthFormComponent_div_0_div_2_igo_auth_microsoftb2c_6_Template, 1, 0, "igo-auth-microsoftb2c", 5);
60
+ i0.ɵɵtemplate(7, AuthFormComponent_div_0_div_2_igo_auth_facebook_7_Template, 1, 0, "igo-auth-facebook", 5);
61
+ i0.ɵɵtemplate(8, AuthFormComponent_div_0_div_2_igo_auth_intern_8_Template, 1, 1, "igo-auth-intern", 6);
62
+ i0.ɵɵelementEnd();
63
+ } if (rf & 2) {
64
+ const ctx_r2 = i0.ɵɵnextContext(2);
65
+ i0.ɵɵadvance(2);
66
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "igo.auth.connection"));
67
+ i0.ɵɵadvance(2);
68
+ i0.ɵɵproperty("ngIf", ctx_r2.options.google && ctx_r2.options.google.enabled !== false);
69
+ i0.ɵɵadvance(1);
70
+ i0.ɵɵproperty("ngIf", ctx_r2.options.microsoft && ctx_r2.options.microsoft.enabled !== false);
71
+ i0.ɵɵadvance(1);
72
+ i0.ɵɵproperty("ngIf", ctx_r2.options.microsoftb2c && ctx_r2.options.microsoftb2c.enabled !== false);
73
+ i0.ɵɵadvance(1);
74
+ i0.ɵɵproperty("ngIf", ctx_r2.options.facebook && ctx_r2.options.facebook.enabled !== false);
75
+ i0.ɵɵadvance(1);
76
+ i0.ɵɵproperty("ngIf", !ctx_r2.options.intern || ctx_r2.options.intern.enabled !== false);
77
+ } }
78
+ function AuthFormComponent_div_0_div_3_Template(rf, ctx) { if (rf & 1) {
79
+ const _r21 = i0.ɵɵgetCurrentView();
80
+ i0.ɵɵelementStart(0, "div", 4)(1, "p");
81
+ i0.ɵɵtext(2);
82
+ i0.ɵɵpipe(3, "translate");
83
+ i0.ɵɵelementEnd();
84
+ i0.ɵɵelementStart(4, "button", 9);
85
+ i0.ɵɵlistener("click", function AuthFormComponent_div_0_div_3_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r20.logout()); });
86
+ i0.ɵɵtext(5);
87
+ i0.ɵɵpipe(6, "translate");
88
+ i0.ɵɵelementEnd()();
89
+ } if (rf & 2) {
90
+ const ctx_r3 = i0.ɵɵnextContext(2);
91
+ i0.ɵɵadvance(2);
92
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 2, "igo.auth.welcome", ctx_r3.user));
93
+ i0.ɵɵadvance(3);
94
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 5, "igo.auth.signOut"));
95
+ } }
96
+ function AuthFormComponent_div_0_div_4_button_4_Template(rf, ctx) { if (rf & 1) {
97
+ const _r24 = i0.ɵɵgetCurrentView();
98
+ i0.ɵɵelementStart(0, "button", 9);
99
+ i0.ɵɵlistener("click", function AuthFormComponent_div_0_div_4_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r23.home()); });
100
+ i0.ɵɵtext(1);
101
+ i0.ɵɵpipe(2, "translate");
102
+ i0.ɵɵelementEnd();
103
+ } if (rf & 2) {
104
+ i0.ɵɵadvance(1);
105
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "igo.auth.home"));
106
+ } }
107
+ function AuthFormComponent_div_0_div_4_Template(rf, ctx) { if (rf & 1) {
108
+ i0.ɵɵelementStart(0, "div", 4)(1, "p");
109
+ i0.ɵɵtext(2);
110
+ i0.ɵɵpipe(3, "translate");
111
+ i0.ɵɵelementEnd();
112
+ i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_4_button_4_Template, 3, 3, "button", 10);
113
+ i0.ɵɵelementEnd();
114
+ } if (rf & 2) {
115
+ const ctx_r4 = i0.ɵɵnextContext(2);
116
+ i0.ɵɵadvance(2);
117
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "igo.auth.deconnection"));
118
+ i0.ɵɵadvance(2);
119
+ i0.ɵɵproperty("ngIf", ctx_r4.options.homeRoute);
120
+ } }
121
+ function AuthFormComponent_div_0_Template(rf, ctx) { if (rf & 1) {
122
+ i0.ɵɵelementStart(0, "div");
123
+ i0.ɵɵtemplate(1, AuthFormComponent_div_0_div_1_Template, 1, 0, "div", 1);
124
+ i0.ɵɵtemplate(2, AuthFormComponent_div_0_div_2_Template, 9, 8, "div", 2);
125
+ i0.ɵɵtemplate(3, AuthFormComponent_div_0_div_3_Template, 7, 7, "div", 2);
126
+ i0.ɵɵtemplate(4, AuthFormComponent_div_0_div_4_Template, 5, 4, "div", 2);
127
+ i0.ɵɵelementEnd();
128
+ } if (rf & 2) {
129
+ const ctx_r0 = i0.ɵɵnextContext();
130
+ i0.ɵɵadvance(1);
131
+ i0.ɵɵproperty("ngIf", !ctx_r0.auth.logged && ctx_r0.backgroundDisable);
132
+ i0.ɵɵadvance(1);
133
+ i0.ɵɵproperty("ngIf", !ctx_r0.auth.logged && ctx_r0.showLoginDiv);
134
+ i0.ɵɵadvance(1);
135
+ i0.ɵɵproperty("ngIf", ctx_r0.auth.logged && ctx_r0.showAlreadyConnectedDiv);
136
+ i0.ɵɵadvance(1);
137
+ i0.ɵɵproperty("ngIf", ctx_r0.showLogoutDiv);
138
+ } }
139
+ export class AuthFormComponent {
140
+ constructor(auth, config, router) {
141
+ this.auth = auth;
142
+ this.config = config;
143
+ this.router = router;
144
+ this._backgroundDisable = true;
145
+ this._hasAlreadyConnectedDiv = true;
146
+ this._hasLogoutDiv = true;
147
+ this._showAlreadyConnectedDiv = false;
148
+ this._showLogoutDiv = false;
149
+ this.login = new EventEmitter();
150
+ this.visible = true;
151
+ this.options = this.config.getConfig('auth') || {};
152
+ this.visible = Object.getOwnPropertyNames(this.options).length !== 0;
153
+ }
154
+ get backgroundDisable() {
155
+ if (this.isLogoutRoute || this.isLogoutRoute) {
156
+ return false;
157
+ }
158
+ return this._backgroundDisable;
159
+ }
160
+ set backgroundDisable(value) {
161
+ this._backgroundDisable = value.toString() === 'true';
162
+ }
163
+ get hasAlreadyConnectedDiv() {
164
+ return this._hasAlreadyConnectedDiv;
165
+ }
166
+ set hasAlreadyConnectedDiv(value) {
167
+ this._hasAlreadyConnectedDiv = value.toString() === 'true';
168
+ }
169
+ get hasLogoutDiv() {
170
+ return this._hasLogoutDiv;
171
+ }
172
+ set hasLogoutDiv(value) {
173
+ this._hasLogoutDiv = value.toString() === 'true';
174
+ }
175
+ get showAlreadyConnectedDiv() {
176
+ if (this.isLogoutRoute) {
177
+ return this.hasAlreadyConnectedDiv;
178
+ }
179
+ return this._showAlreadyConnectedDiv;
180
+ }
181
+ set showAlreadyConnectedDiv(value) {
182
+ this._showAlreadyConnectedDiv = value.toString() === 'true';
183
+ }
184
+ get showLogoutDiv() {
185
+ if (this.isLogoutRoute) {
186
+ return this.hasLogoutDiv;
187
+ }
188
+ return this._showLogoutDiv;
189
+ }
190
+ set showLogoutDiv(value) {
191
+ this._showLogoutDiv = value.toString() === 'true';
192
+ }
193
+ get showLoginDiv() {
194
+ if (!this.isLogoutRoute) {
195
+ return true;
196
+ }
197
+ }
198
+ ngOnInit() {
199
+ this.analyzeRoute();
200
+ this.getName();
201
+ }
202
+ onLogin() {
203
+ this.auth.goToRedirectUrl();
204
+ this.getName();
205
+ this.login.emit(true);
206
+ }
207
+ logout() {
208
+ this.auth.logout().subscribe(() => {
209
+ this.user = undefined;
210
+ if (this.router) {
211
+ if (this.options.logoutRoute) {
212
+ this.router.navigate([this.options.logoutRoute]);
213
+ }
214
+ else if (this.options.homeRoute) {
215
+ this.router.navigate([this.options.homeRoute]);
216
+ }
217
+ }
218
+ });
219
+ }
220
+ home() {
221
+ if (this.router && this.options.homeRoute) {
222
+ this.router.navigate([this.options.homeRoute]);
223
+ }
224
+ }
225
+ getName() {
226
+ const tokenDecoded = this.auth.decodeToken();
227
+ if (tokenDecoded) {
228
+ this.user = {
229
+ name: tokenDecoded.user.firstName || tokenDecoded.user.sourceId
230
+ };
231
+ }
232
+ }
233
+ analyzeRoute() {
234
+ if (!this.router) {
235
+ return;
236
+ }
237
+ this.router.events
238
+ .pipe(filter((event) => event instanceof NavigationStart))
239
+ .subscribe((changeEvent) => {
240
+ if (changeEvent.url) {
241
+ const currentRoute = changeEvent.url;
242
+ const logoutRoute = this.options.logoutRoute;
243
+ const loginRoute = this.options.loginRoute;
244
+ this.isLogoutRoute = currentRoute === logoutRoute;
245
+ this.isLoginRoute = currentRoute === loginRoute;
246
+ if (this.isLogoutRoute) {
247
+ this.auth.logout();
248
+ }
249
+ }
250
+ });
251
+ }
252
+ }
253
+ AuthFormComponent.ɵfac = function AuthFormComponent_Factory(t) { return new (t || AuthFormComponent)(i0.ɵɵdirectiveInject(i1.AuthService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.Router, 8)); };
254
+ AuthFormComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AuthFormComponent, selectors: [["igo-auth-form"]], inputs: { backgroundDisable: "backgroundDisable", hasAlreadyConnectedDiv: "hasAlreadyConnectedDiv", hasLogoutDiv: "hasLogoutDiv", showAlreadyConnectedDiv: "showAlreadyConnectedDiv", showLogoutDiv: "showLogoutDiv" }, outputs: { login: "login" }, decls: 1, vars: 1, consts: [[4, "ngIf"], ["class", "backgroundDisable", 4, "ngIf"], ["class", "login center-block", 4, "ngIf"], [1, "backgroundDisable"], [1, "login", "center-block"], [3, "login", 4, "ngIf"], [3, "allowAnonymous", "login", 4, "ngIf"], [3, "login"], [3, "allowAnonymous", "login"], ["mat-raised-button", "", "type", "button", 3, "click"], ["mat-raised-button", "", "type", "button", 3, "click", 4, "ngIf"]], template: function AuthFormComponent_Template(rf, ctx) { if (rf & 1) {
255
+ i0.ɵɵtemplate(0, AuthFormComponent_div_0_Template, 5, 4, "div", 0);
256
+ } if (rf & 2) {
257
+ i0.ɵɵproperty("ngIf", ctx.visible);
258
+ } }, dependencies: [i4.NgIf, i5.MatButton, i6.AuthGoogleComponent, i7.AuthInternComponent, i8.AuthFacebookComponent, i9.AuthMicrosoftComponent, i10.AuthMicrosoftb2cComponent, i11.TranslatePipe], styles: ["[_nghost-%COMP%]{z-index:999}div.login[_ngcontent-%COMP%]{z-index:200;width:90%;min-width:360px;max-width:600px;padding:25px 50px;border:1px solid;background-color:#fff;border-color:#888}.center-block[_ngcontent-%COMP%]{position:fixed;top:20%;left:50%;transform:translate(-50%)}.backgroundDisable[_ngcontent-%COMP%]{position:fixed;top:0;left:0;background:#000;opacity:.8;z-index:100;height:100%;width:100%}"] });
259
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthFormComponent, [{
260
+ type: Component,
261
+ args: [{ selector: 'igo-auth-form', changeDetection: ChangeDetectionStrategy.Default, template: "<div *ngIf=\"visible\">\n <div *ngIf=\"!auth.logged && backgroundDisable\" class=\"backgroundDisable\"></div>\n\n <div *ngIf=\"!auth.logged && showLoginDiv\" class=\"login center-block\">\n <h1>{{'igo.auth.connection' | translate}}</h1>\n\n <igo-auth-google\n *ngIf=\"options.google && options.google.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-google>\n <igo-auth-microsoft\n *ngIf=\"options.microsoft && options.microsoft.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-microsoft>\n <igo-auth-microsoftb2c\n *ngIf=\"options.microsoftb2c && options.microsoftb2c.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-microsoftb2c>\n <igo-auth-facebook\n *ngIf=\"options.facebook && options.facebook.enabled !== false\"\n (login)=\"onLogin()\">\n </igo-auth-facebook>\n <igo-auth-intern\n *ngIf=\"!options.intern || options.intern.enabled !== false\"\n [allowAnonymous]=\"options.allowAnonymous\"\n (login)=\"onLogin()\">\n </igo-auth-intern>\n </div>\n\n <div *ngIf=\"auth.logged && showAlreadyConnectedDiv\" class=\"login center-block\">\n <p>{{'igo.auth.welcome' |\u00A0translate: user}}</p>\n <button mat-raised-button type=\"button\" (click)=\"logout()\">{{'igo.auth.signOut' |\u00A0translate}}</button>\n </div>\n\n <div *ngIf=\"showLogoutDiv\" class=\"login center-block\">\n <p>{{'igo.auth.deconnection' |\u00A0translate}}</p>\n <button *ngIf=\"options.homeRoute\" mat-raised-button type=\"button\" (click)=\"home()\">{{'igo.auth.home' |\u00A0translate}}</button>\n </div>\n\n</div>\n", styles: [":host{z-index:999}div.login{z-index:200;width:90%;min-width:360px;max-width:600px;padding:25px 50px;border:1px solid;background-color:#fff;border-color:#888}.center-block{position:fixed;top:20%;left:50%;transform:translate(-50%)}.backgroundDisable{position:fixed;top:0;left:0;background:#000;opacity:.8;z-index:100;height:100%;width:100%}\n"] }]
262
+ }], function () { return [{ type: i1.AuthService }, { type: i2.ConfigService }, { type: i3.Router, decorators: [{
263
+ type: Optional
264
+ }] }]; }, { backgroundDisable: [{
265
+ type: Input
266
+ }], hasAlreadyConnectedDiv: [{
267
+ type: Input
268
+ }], hasLogoutDiv: [{
269
+ type: Input
270
+ }], showAlreadyConnectedDiv: [{
271
+ type: Input
272
+ }], showLogoutDiv: [{
273
+ type: Input
274
+ }], login: [{
275
+ type: Output
276
+ }] }); })();
277
277
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvc3JjL2xpYi9hdXRoLWZvcm0vYXV0aC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvc3JjL2xpYi9hdXRoLWZvcm0vYXV0aC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBRXZCLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQVUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztJQ1R0Qyx5QkFBK0U7Ozs7SUFLN0UsMENBRXNCO0lBQXBCLGtNQUFTLGVBQUEsaUJBQVMsQ0FBQSxJQUFDO0lBQ3JCLGlCQUFrQjs7OztJQUNsQiw2Q0FFc0I7SUFBcEIsd01BQVMsZUFBQSxpQkFBUyxDQUFBLElBQUM7SUFDckIsaUJBQXFCOzs7O0lBQ3JCLGdEQUVzQjtJQUFwQiw4TUFBUyxlQUFBLGlCQUFTLENBQUEsSUFBQztJQUNyQixpQkFBd0I7Ozs7SUFDeEIsNENBRXNCO0lBQXBCLHNNQUFTLGVBQUEsaUJBQVMsQ0FBQSxJQUFDO0lBQ3JCLGlCQUFvQjs7OztJQUNwQiwwQ0FHc0I7SUFBcEIsa01BQVMsZUFBQSxpQkFBUyxDQUFBLElBQUM7SUFDckIsaUJBQWtCOzs7SUFGaEIsOERBQXlDOzs7SUFyQjdDLDhCQUFxRSxTQUFBO0lBQy9ELFlBQXFDOztJQUFBLGlCQUFLO0lBRTlDLHNHQUdrQjtJQUNsQiw0R0FHcUI7SUFDckIsa0hBR3dCO0lBQ3hCLDBHQUdvQjtJQUNwQixzR0FJa0I7SUFDcEIsaUJBQU07OztJQXZC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QkFDbkIsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFDckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUUzQyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksS0FBSyxXQUFXLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxLQUFLLFVBQVUsQ0FBQztnQkFFaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUNwQjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztrRkE1SVUsaUJBQWlCO29FQUFqQixpQkFBaUI7UUN0QjlCLGtFQXVDTTs7UUF2Q0Esa0NBQWE7O3VGRHNCTixpQkFBaUI7Y0FON0IsU0FBUzsyQkFDRSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE9BQU87O3NCQTRFN0MsUUFBUTt3QkF4RVAsaUJBQWlCO2tCQURwQixLQUFLO1lBYUYsc0JBQXNCO2tCQUR6QixLQUFLO1lBVUYsWUFBWTtrQkFEZixLQUFLO1lBVUYsdUJBQXVCO2tCQUQxQixLQUFLO1lBYUYsYUFBYTtrQkFEaEIsS0FBSztZQWtCSSxLQUFLO2tCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25TdGFydCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IEF1dGhPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL2F1dGguaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2F1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1hdXRoLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0aC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIGdldCBiYWNrZ3JvdW5kRGlzYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xvZ291dFJvdXRlIHx8IHRoaXMuaXNMb2dvdXRSb3V0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZERpc2FibGU7XG4gIH1cbiAgc2V0IGJhY2tncm91bmREaXNhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZERpc2FibGUgPSB2YWx1ZS50b1N0cmluZygpID09PSAndHJ1ZSc7XG4gIH1cbiAgcHJpdmF0ZSBfYmFja2dyb3VuZERpc2FibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBoYXNBbHJlYWR5Q29ubmVjdGVkRGl2KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNBbHJlYWR5Q29ubmVjdGVkRGl2O1xuICB9XG4gIHNldCBoYXNBbHJlYWR5Q29ubmVjdGVkRGl2KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGFzQWxyZWFkeUNvbm5lY3RlZERpdiA9IHZhbHVlLnRvU3RyaW5nKCkgPT09ICd0cnVlJztcbiAgfVxuICBwcml2YXRlIF9oYXNBbHJlYWR5Q29ubmVjdGVkRGl2ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBnZXQgaGFzTG9nb3V0RGl2KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNMb2dvdXREaXY7XG4gIH1cbiAgc2V0IGhhc0xvZ291dERpdih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hhc0xvZ291dERpdiA9IHZhbHVlLnRvU3RyaW5nKCkgPT09ICd0cnVlJztcbiAgfVxuICBwcml2YXRlIF9oYXNMb2dvdXREaXYgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBzaG93QWxyZWFkeUNvbm5lY3RlZERpdigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xvZ291dFJvdXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBbHJlYWR5Q29ubmVjdGVkRGl2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2hvd0FscmVhZHlDb25uZWN0ZWREaXY7XG4gIH1cbiAgc2V0IHNob3dBbHJlYWR5Q29ubmVjdGVkRGl2KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0FscmVhZHlDb25uZWN0ZWREaXYgPSB2YWx1ZS50b1N0cmluZygpID09PSAndHJ1ZSc7XG4gIH1cbiAgcHJpdmF0ZSBfc2hvd0FscmVhZHlDb25uZWN0ZWREaXYgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBnZXQgc2hvd0xvZ291dERpdigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xvZ291dFJvdXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNMb2dvdXREaXY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zaG93TG9nb3V0RGl2O1xuICB9XG4gIHNldCBzaG93TG9nb3V0RGl2KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0xvZ291dERpdiA9IHZhbHVlLnRvU3RyaW5nKCkgPT09ICd0cnVlJztcbiAgfVxuICBwcml2YXRlIF9zaG93TG9nb3V0RGl2ID0gZmFsc2U7XG5cbiAgZ2V0IHNob3dMb2dpbkRpdigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNMb2dvdXRSb3V0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGxvZ2luOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHVibGljIG9wdGlvbnM6IEF1dGhPcHRpb25zO1xuICBwdWJsaWMgdXNlcjtcblxuICBwdWJsaWMgdmlzaWJsZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBpc0xvZ2luUm91dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgaXNMb2dvdXRSb3V0ZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYXV0aDogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ2F1dGgnKSB8fCB7fTtcbiAgICB0aGlzLnZpc2libGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLm9wdGlvbnMpLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFuYWx5emVSb3V0ZSgpO1xuICAgIHRoaXMuZ2V0TmFtZSgpO1xuICB9XG5cbiAgcHVibGljIG9uTG9naW4oKSB7XG4gICAgdGhpcy5hdXRoLmdvVG9SZWRpcmVjdFVybCgpO1xuICAgIHRoaXMuZ2V0TmFtZSgpO1xuICAgIHRoaXMubG9naW4uZW1pdCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dvdXQoKSB7XG4gICAgdGhpcy5hdXRoLmxvZ291dCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVzZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5yb3V0ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2dvdXRSb3V0ZSkge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLm9wdGlvbnMubG9nb3V0Um91dGVdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuaG9tZVJvdXRlKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMub3B0aW9ucy5ob21lUm91dGVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhvbWUoKSB7XG4gICAgaWYgKHRoaXMucm91dGVyICYmIHRoaXMub3B0aW9ucy5ob21lUm91dGUpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLm9wdGlvbnMuaG9tZVJvdXRlXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXROYW1lKCkge1xuICAgIGNvbnN0IHRva2VuRGVjb2RlZCA9IHRoaXMuYXV0aC5kZWNvZGVUb2tlbigpO1xuICAgIGlmICh0b2tlbkRlY29kZWQpIHtcbiAgICAgIHRoaXMudXNlciA9IHtcbiAgICAgICAgbmFtZTogdG9rZW5EZWNvZGVkLnVzZXIuZmlyc3ROYW1lIHx8IHRva2VuRGVjb2RlZC51c2VyLnNvdXJjZUlkXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYW5hbHl6ZVJvdXRlKCkge1xuICAgIGlmICghdGhpcy5yb3V0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSlcbiAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZUV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZUV2ZW50LnVybCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IGNoYW5nZUV2ZW50LnVybDtcbiAgICAgICAgICBjb25zdCBsb2dvdXRSb3V0ZSA9IHRoaXMub3B0aW9ucy5sb2dvdXRSb3V0ZTtcbiAgICAgICAgICBjb25zdCBsb2dpblJvdXRlID0gdGhpcy5vcHRpb25zLmxvZ2luUm91dGU7XG5cbiAgICAgICAgICB0aGlzLmlzTG9nb3V0Um91dGUgPSBjdXJyZW50Um91dGUgPT09IGxvZ291dFJvdXRlO1xuICAgICAgICAgIHRoaXMuaXNMb2dpblJvdXRlID0gY3VycmVudFJvdXRlID09PSBsb2dpblJvdXRlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNMb2dvdXRSb3V0ZSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoLmxvZ291dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJ2aXNpYmxlXCI+XG4gIDxkaXYgKm5nSWY9XCIhYXV0aC5sb2dnZWQgJiYgYmFja2dyb3VuZERpc2FibGVcIiBjbGFzcz1cImJhY2tncm91bmREaXNhYmxlXCI+PC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cIiFhdXRoLmxvZ2dlZCAmJiBzaG93TG9naW5EaXZcIiBjbGFzcz1cImxvZ2luIGNlbnRlci1ibG9ja1wiPlxuICAgIDxoMT57eydpZ28uYXV0aC5jb25uZWN0aW9uJyB8IHRyYW5zbGF0ZX19PC9oMT5cblxuICAgIDxpZ28tYXV0aC1nb29nbGVcbiAgICAgICpuZ0lmPVwib3B0aW9ucy5nb29nbGUgJiYgb3B0aW9ucy5nb29nbGUuZW5hYmxlZCAhPT0gZmFsc2VcIlxuICAgICAgKGxvZ2luKT1cIm9uTG9naW4oKVwiPlxuICAgIDwvaWdvLWF1dGgtZ29vZ2xlPlxuICAgIDxpZ28tYXV0aC1taWNyb3NvZnRcbiAgICAgICpuZ0lmPVwib3B0aW9ucy5taWNyb3NvZnQgJiYgb3B0aW9ucy5taWNyb3NvZnQuZW5hYmxlZCAhPT0gZmFsc2VcIlxuICAgICAgKGxvZ2luKT1cIm9uTG9naW4oKVwiPlxuICAgIDwvaWdvLWF1dGgtbWljcm9zb2Z0PlxuICAgIDxpZ28tYXV0aC1taWNyb3NvZnRiMmNcbiAgICAgICpuZ0lmPVwib3B0aW9ucy5taWNyb3NvZnRiMmMgJiYgb3B0aW9ucy5taWNyb3NvZnRiMmMuZW5hYmxlZCAhPT0gZmFsc2VcIlxuICAgICAgKGxvZ2luKT1cIm9uTG9naW4oKVwiPlxuICAgIDwvaWdvLWF1dGgtbWljcm9zb2Z0YjJjPlxuICAgIDxpZ28tYXV0aC1mYWNlYm9va1xuICAgICAgKm5nSWY9XCJvcHRpb25zLmZhY2Vib29rICYmIG9wdGlvbnMuZmFjZWJvb2suZW5hYmxlZCAhPT0gZmFsc2VcIlxuICAgICAgKGxvZ2luKT1cIm9uTG9naW4oKVwiPlxuICAgIDwvaWdvLWF1dGgtZmFjZWJvb2s+XG4gICAgPGlnby1hdXRoLWludGVyblxuICAgICAgKm5nSWY9XCIhb3B0aW9ucy5pbnRlcm4gfHwgb3B0aW9ucy5pbnRlcm4uZW5hYmxlZCAhPT0gZmFsc2VcIlxuICAgICAgW2FsbG93QW5vbnltb3VzXT1cIm9wdGlvbnMuYWxsb3dBbm9ueW1vdXNcIlxuICAgICAgKGxvZ2luKT1cIm9uTG9naW4oKVwiPlxuICAgIDwvaWdvLWF1dGgtaW50ZXJuPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiYXV0aC5sb2dnZWQgJiYgc2hvd0FscmVhZHlDb25uZWN0ZWREaXZcIiBjbGFzcz1cImxvZ2luIGNlbnRlci1ibG9ja1wiPlxuICAgIDxwPnt7J2lnby5hdXRoLndlbGNvbWUnIHzCoHRyYW5zbGF0ZTogdXNlcn19PC9wPlxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJsb2dvdXQoKVwiPnt7J2lnby5hdXRoLnNpZ25PdXQnIHzCoHRyYW5zbGF0ZX19PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93TG9nb3V0RGl2XCIgY2xhc3M9XCJsb2dpbiBjZW50ZXItYmxvY2tcIj5cbiAgICA8cD57eydpZ28uYXV0aC5kZWNvbm5lY3Rpb24nIHzCoHRyYW5zbGF0ZX19PC9wPlxuICAgIDxidXR0b24gKm5nSWY9XCJvcHRpb25zLmhvbWVSb3V0ZVwiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaG9tZSgpXCI+e3snaWdvLmF1dGguaG9tZScgfMKgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19