@falcon-ng/tailwind 0.0.6 → 0.0.7
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/esm2022/lib/component/auto-complete/auto-complete.component.mjs +34 -0
- package/esm2022/lib/component/bottom-sheet/bottom-sheet.component.mjs +30 -0
- package/esm2022/lib/component/button/button.component.mjs +28 -0
- package/esm2022/lib/component/button-toggle/button-toggle.component.mjs +33 -0
- package/{esm2020 → esm2022}/lib/component/checkbox/checkbox.component.mjs +6 -5
- package/esm2022/lib/component/chips/chip.component.mjs +110 -0
- package/esm2022/lib/component/date-picker/date-picker.component.mjs +18 -0
- package/esm2022/lib/component/dialog/dialog.component.mjs +22 -0
- package/esm2022/lib/component/pagination/pagination.component.mjs +96 -0
- package/esm2022/lib/component/progress-bar/progress-bar.component.mjs +21 -0
- package/esm2022/lib/component/progress-spinner/progress-spinner.component.mjs +27 -0
- package/esm2022/lib/component/radio/radio.component.mjs +32 -0
- package/esm2022/lib/component/rich-text-editor/rich-text-editor.component.mjs +16 -0
- package/esm2022/lib/component/select/select.component.mjs +36 -0
- package/esm2022/lib/component/slide-toggle/slide-toggle.component.mjs +15 -0
- package/esm2022/lib/component/slider/slider.component.mjs +16 -0
- package/esm2022/lib/component/snack-bar/snack-bar.component.mjs +12 -0
- package/esm2022/lib/component/table/table.component.mjs +75 -0
- package/esm2022/lib/component/textarea/textarea.component.mjs +17 -0
- package/esm2022/lib/component/textbox/textbox.component.mjs +18 -0
- package/esm2022/lib/control-builder/control-builder.component.mjs +19 -0
- package/esm2022/lib/falcon-core.module.mjs +231 -0
- package/esm2022/lib/model/constant.mjs +33 -0
- package/esm2022/lib/module/angularmaterial.module.mjs +190 -0
- package/esm2022/lib/reactive-field.directive.mjs +29 -0
- package/esm2022/lib/service/appsetting.service.mjs +56 -0
- package/esm2022/lib/service/http/generic-http-client.mjs +198 -0
- package/esm2022/lib/service/http/igeneric-http-client.mjs +11 -0
- package/esm2022/lib/service/logger.service.mjs +79 -0
- package/esm2022/lib/service/open-id/TokenHelperService.mjs +72 -0
- package/esm2022/lib/service/open-id/auth-guard.service.mjs +31 -0
- package/esm2022/lib/service/open-id/auth.service.mjs +155 -0
- package/{fesm2020 → fesm2022}/falcon-ng-tailwind.mjs +287 -287
- package/fesm2022/falcon-ng-tailwind.mjs.map +1 -0
- package/lib/component/button/button.component.d.ts +1 -1
- package/lib/component/chips/chip.component.d.ts +1 -1
- package/lib/component/pagination/pagination.component.d.ts +1 -1
- package/lib/component/progress-bar/progress-bar.component.d.ts +1 -1
- package/lib/component/progress-spinner/progress-spinner.component.d.ts +1 -1
- package/lib/component/table/table.component.d.ts +1 -1
- package/lib/control-builder/control-builder.component.d.ts +1 -1
- package/lib/reactive-field.directive.d.ts +1 -1
- package/lib/service/open-id/auth-guard.service.d.ts +2 -2
- package/package.json +7 -13
- package/esm2020/lib/component/auto-complete/auto-complete.component.mjs +0 -33
- package/esm2020/lib/component/bottom-sheet/bottom-sheet.component.mjs +0 -29
- package/esm2020/lib/component/button/button.component.mjs +0 -27
- package/esm2020/lib/component/button-toggle/button-toggle.component.mjs +0 -32
- package/esm2020/lib/component/chips/chip.component.mjs +0 -109
- package/esm2020/lib/component/date-picker/date-picker.component.mjs +0 -17
- package/esm2020/lib/component/dialog/dialog.component.mjs +0 -21
- package/esm2020/lib/component/pagination/pagination.component.mjs +0 -95
- package/esm2020/lib/component/progress-bar/progress-bar.component.mjs +0 -20
- package/esm2020/lib/component/progress-spinner/progress-spinner.component.mjs +0 -26
- package/esm2020/lib/component/radio/radio.component.mjs +0 -31
- package/esm2020/lib/component/rich-text-editor/rich-text-editor.component.mjs +0 -15
- package/esm2020/lib/component/select/select.component.mjs +0 -35
- package/esm2020/lib/component/slide-toggle/slide-toggle.component.mjs +0 -14
- package/esm2020/lib/component/slider/slider.component.mjs +0 -15
- package/esm2020/lib/component/snack-bar/snack-bar.component.mjs +0 -11
- package/esm2020/lib/component/table/table.component.mjs +0 -74
- package/esm2020/lib/component/textarea/textarea.component.mjs +0 -16
- package/esm2020/lib/component/textbox/textbox.component.mjs +0 -17
- package/esm2020/lib/control-builder/control-builder.component.mjs +0 -18
- package/esm2020/lib/falcon-core.module.mjs +0 -230
- package/esm2020/lib/model/constant.mjs +0 -32
- package/esm2020/lib/module/angularmaterial.module.mjs +0 -189
- package/esm2020/lib/reactive-field.directive.mjs +0 -28
- package/esm2020/lib/service/appsetting.service.mjs +0 -55
- package/esm2020/lib/service/http/generic-http-client.mjs +0 -197
- package/esm2020/lib/service/http/igeneric-http-client.mjs +0 -10
- package/esm2020/lib/service/logger.service.mjs +0 -78
- package/esm2020/lib/service/open-id/TokenHelperService.mjs +0 -71
- package/esm2020/lib/service/open-id/auth-guard.service.mjs +0 -30
- package/esm2020/lib/service/open-id/auth.service.mjs +0 -154
- package/fesm2015/falcon-ng-tailwind.mjs +0 -1988
- package/fesm2015/falcon-ng-tailwind.mjs.map +0 -1
- package/fesm2020/falcon-ng-tailwind.mjs.map +0 -1
- /package/{esm2020 → esm2022}/falcon-ng-tailwind.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/base-control.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/base-form-component.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/AutoComplete.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Button.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/ButtonToggle.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/CheckBox.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Chip.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/DatePicker.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Divider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Editor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Radio.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/RichTextEditor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/SlideToggle.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Slider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Textarea.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/Textbox.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/control-type/select.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/environments.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/ivalidator.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { HttpRequest, HttpEventType } from '@angular/common/http';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common/http";
|
|
6
|
+
import * as i2 from "../../model/environments";
|
|
7
|
+
import * as i3 from "@angular/material/snack-bar";
|
|
8
|
+
import * as i4 from "../logger.service";
|
|
9
|
+
class GenericHttpClient {
|
|
10
|
+
constructor(httpClient, environment, _snackBar, logger) {
|
|
11
|
+
this.httpClient = httpClient;
|
|
12
|
+
this.environment = environment;
|
|
13
|
+
this._snackBar = _snackBar;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
this.snackBarViewModel = {};
|
|
16
|
+
this.isHttpError = false;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* @description
|
|
20
|
+
* Generic Http GET method to Get the response and bind to the view model
|
|
21
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
22
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
23
|
+
* @returns {Observable<T>}
|
|
24
|
+
* @usageNotes
|
|
25
|
+
* The following snippet shows how to use this method
|
|
26
|
+
* ```ts
|
|
27
|
+
* this.genericHttpService.Get("get_url").subscribe(data => {
|
|
28
|
+
* console.log('success');
|
|
29
|
+
* }, error => {
|
|
30
|
+
* console.log(error);
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
get(destinationUrl, options) {
|
|
35
|
+
return this.request("GET" /* HttpMethod.Get */, destinationUrl, options);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @description
|
|
39
|
+
* Generic Http post method to post the view model and bind the return view model
|
|
40
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
41
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
42
|
+
* @returns {Observable<T>}
|
|
43
|
+
* @usageNotes
|
|
44
|
+
* The following snippet shows how to use this method
|
|
45
|
+
* ```ts
|
|
46
|
+
* this.genericHttpClientService.Post(post-url,post-view-model).subscribe(item => {
|
|
47
|
+
* console.log(item);
|
|
48
|
+
* },
|
|
49
|
+
* err => {
|
|
50
|
+
* console.log(err);
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
post(destinationUrl, options) {
|
|
55
|
+
return this.request("POST" /* HttpMethod.Post */, destinationUrl, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* @description
|
|
59
|
+
* Generic Http Put method to post the view model and bind the return view model
|
|
60
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
61
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
62
|
+
* @returns {Observable<T>}
|
|
63
|
+
* @usageNotes
|
|
64
|
+
* The following snippet shows how to use this method
|
|
65
|
+
* ```ts
|
|
66
|
+
* this.genericHttpClientService.Put(post-url, post-view-model).subscribe(item => {
|
|
67
|
+
* console.log(item);
|
|
68
|
+
* },
|
|
69
|
+
* err => {
|
|
70
|
+
* console.log(err);
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
put(destinationUrl, options) {
|
|
75
|
+
return this.request("PUT" /* HttpMethod.Put */, destinationUrl, options);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @description
|
|
79
|
+
* Generic Http post method to post the view model and bind the return view model
|
|
80
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
81
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
82
|
+
* @returns {Observable<T>}
|
|
83
|
+
* @usageNotes
|
|
84
|
+
* The following snippet shows how to use this method
|
|
85
|
+
* ```ts
|
|
86
|
+
* this.genericHttpClientService.Post(post-url,post-view-model).subscribe(item => {
|
|
87
|
+
* console.log(item);
|
|
88
|
+
* },
|
|
89
|
+
* err => {
|
|
90
|
+
* console.log(err);
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
patch(destinationUrl, options) {
|
|
95
|
+
return this.request("PATCH" /* HttpMethod.Patch */, destinationUrl, options);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @description
|
|
99
|
+
* Generic Http Delete method to Delete the item and bind the return view model
|
|
100
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
101
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
102
|
+
* @returns {Observable<T>}
|
|
103
|
+
* @usageNotes
|
|
104
|
+
* The following snippet shows how to use this method
|
|
105
|
+
* ```ts
|
|
106
|
+
* this.genericHttpClientService.Delete(this.deleteUserUrl).subscribe(item => {
|
|
107
|
+
* console.log('success');
|
|
108
|
+
* }, error => {
|
|
109
|
+
* console.log(error);
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
delete(destinationUrl, options) {
|
|
114
|
+
return this.request("DELETE" /* HttpMethod.Delete */, destinationUrl, options);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @description
|
|
118
|
+
* Http request method to accept different method type and params
|
|
119
|
+
* @param {string} method Http methods - GET, POST, PUT, DELETE.
|
|
120
|
+
* @param {string} destinationUrl endPoint it doesn't need / in front of the end point.
|
|
121
|
+
* @param {IRequestOptions} options options of the request like headers, body, etc.
|
|
122
|
+
* @returns {Observable<T>}
|
|
123
|
+
* @usageNotes
|
|
124
|
+
* The following snippet shows how to use this method
|
|
125
|
+
* ```ts
|
|
126
|
+
* this.request<T>(HttpMethod.Delete, destinationUrl, options);
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
request(method, url, options) {
|
|
130
|
+
return Observable.create((observer) => {
|
|
131
|
+
let destinationUrl = '';
|
|
132
|
+
if (this.environment.baseUrl != undefined)
|
|
133
|
+
destinationUrl = (this.environment.baseUrl) + url;
|
|
134
|
+
else
|
|
135
|
+
destinationUrl = url;
|
|
136
|
+
this.httpClient.request(new HttpRequest(method, destinationUrl, options)).subscribe((response) => {
|
|
137
|
+
const responsTye = response;
|
|
138
|
+
switch (responsTye.type) {
|
|
139
|
+
case HttpEventType.Sent:
|
|
140
|
+
this.logger.info('Http Client : Sent ->', 'Request sent!');
|
|
141
|
+
break;
|
|
142
|
+
case HttpEventType.ResponseHeader:
|
|
143
|
+
this.logger.info('Http Client : ResponseHeader ->', 'Response header received!');
|
|
144
|
+
break;
|
|
145
|
+
case HttpEventType.DownloadProgress:
|
|
146
|
+
const kbLoaded = Math.round(responsTye.loaded / 1024);
|
|
147
|
+
this.logger.info('Http Client : DownloadProgress ->', `Download in progress! ${kbLoaded}Kb loaded`);
|
|
148
|
+
break;
|
|
149
|
+
case HttpEventType.Response:
|
|
150
|
+
observer.next(response.body);
|
|
151
|
+
this.logger.info('Http Client : Response -> 😺 Done!', responsTye.body);
|
|
152
|
+
}
|
|
153
|
+
}, (error) => {
|
|
154
|
+
switch (error.status) {
|
|
155
|
+
case 403 /* HttpStatusCode.Forbidden */:
|
|
156
|
+
// observer.complete();
|
|
157
|
+
this.snackBarViewModel.messageText = 'Access to the requested resource is forbidden.';
|
|
158
|
+
this.snackBarViewModel.actionText = 'Forbidden';
|
|
159
|
+
this.isHttpError = true;
|
|
160
|
+
break;
|
|
161
|
+
case 400 /* HttpStatusCode.BadRequest */:
|
|
162
|
+
this.snackBarViewModel.messageText = 'Server cannot or will not process the request.';
|
|
163
|
+
this.snackBarViewModel.actionText = 'Bad Request';
|
|
164
|
+
this.isHttpError = true;
|
|
165
|
+
break;
|
|
166
|
+
case 401 /* HttpStatusCode.Unauthorized */:
|
|
167
|
+
this.snackBarViewModel.messageText = 'Request has not been applied because it lacks valid authentication credentials.';
|
|
168
|
+
this.snackBarViewModel.actionText = 'Unauthorized';
|
|
169
|
+
this.isHttpError = true;
|
|
170
|
+
break;
|
|
171
|
+
case 500 /* HttpStatusCode.InternalServerError */:
|
|
172
|
+
this.snackBarViewModel.messageText = 'Server encountered an unexpected condition.';
|
|
173
|
+
this.snackBarViewModel.actionText = 'Internal server error';
|
|
174
|
+
this.isHttpError = true;
|
|
175
|
+
break;
|
|
176
|
+
case 0:
|
|
177
|
+
this.snackBarViewModel.messageText = 'Not connected to the service.';
|
|
178
|
+
this.snackBarViewModel.actionText = 'Service not available';
|
|
179
|
+
this.isHttpError = true;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
observer.error(error);
|
|
183
|
+
if ((this.environment.snackBarEnable != undefined && this.environment.snackBarEnable) && this.isHttpError)
|
|
184
|
+
this._snackBar.open(this.snackBarViewModel.messageText, this.snackBarViewModel.actionText);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: GenericHttpClient, deps: [{ token: i1.HttpClient }, { token: i2.EnvironmentViewModel }, { token: i3.MatSnackBar }, { token: i4.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
189
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: GenericHttpClient, providedIn: 'root' }); }
|
|
190
|
+
}
|
|
191
|
+
export { GenericHttpClient };
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: GenericHttpClient, decorators: [{
|
|
193
|
+
type: Injectable,
|
|
194
|
+
args: [{
|
|
195
|
+
providedIn: 'root'
|
|
196
|
+
}]
|
|
197
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EnvironmentViewModel }, { type: i3.MatSnackBar }, { type: i4.LoggerService }]; } });
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1odHRwLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZhbGNvbi1uZy90YWlsd2luZC9zcmMvbGliL3NlcnZpY2UvaHR0cC9nZW5lcmljLWh0dHAtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxXQUFXLEVBQ1gsYUFBYSxFQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLE1BQU0sQ0FBQztBQUV4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFNM0MsTUFHYSxpQkFBaUI7SUFJNUIsWUFBb0IsVUFBc0IsRUFBVSxXQUFpQyxFQUMzRSxTQUFzQixFQUFVLE1BQXFCO1FBRDNDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFDM0UsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWU7UUFKdkQsc0JBQWlCLEdBQWtCLEVBQW1CLENBQUM7UUFDdkQsZ0JBQVcsR0FBWSxLQUFLLENBQUM7SUFHOEIsQ0FBQztJQUdwRTs7Ozs7Ozs7Ozs7Ozs7O0lBZUE7SUFDTyxHQUFHLENBQUMsY0FBc0IsRUFBRSxPQUErQjtRQUNoRSxPQUFPLElBQUksQ0FBQyxPQUFPLDZCQUFvQixjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O01BZ0JFO0lBQ0ssSUFBSSxDQUFDLGNBQXNCLEVBQUUsT0FBK0I7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTywrQkFBcUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztNQWdCRTtJQUNLLEdBQUcsQ0FBQyxjQUFzQixFQUFFLE9BQStCO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLE9BQU8sNkJBQW9CLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7UUFnQkk7SUFDRyxLQUFLLENBQUMsY0FBc0IsRUFBRSxPQUErQjtRQUNsRSxPQUFPLElBQUksQ0FBQyxPQUFPLGlDQUFzQixjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7TUFlRTtJQUNLLE1BQU0sQ0FBQyxjQUFzQixFQUFFLE9BQStCO1FBQ25FLE9BQU8sSUFBSSxDQUFDLE9BQU8sbUNBQXVCLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztRQVlJO0lBQ0ksT0FBTyxDQUFJLE1BQWMsRUFBRSxHQUFXLEVBQUUsT0FBeUI7UUFDdkUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDekMsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksU0FBUztnQkFDdkMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUE7O2dCQUVqRCxjQUFjLEdBQUcsR0FBRyxDQUFBO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3BGLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ2hCLE1BQU0sVUFBVSxHQUFHLFFBQTBCLENBQUE7Z0JBQzdDLFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtvQkFDdkIsS0FBSyxhQUFhLENBQUMsSUFBSTt3QkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxDQUFDLENBQUM7d0JBQzNELE1BQU07b0JBQ1IsS0FBSyxhQUFhLENBQUMsY0FBYzt3QkFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzt3QkFDakYsTUFBTTtvQkFDUixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7d0JBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUUseUJBQXlCLFFBQVEsV0FBVyxDQUFDLENBQUM7d0JBQ3BHLE1BQU07b0JBQ1IsS0FBSyxhQUFhLENBQUMsUUFBUTt3QkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDM0U7WUFDSCxDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDUixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3BCO3dCQUNFLHVCQUF1Qjt3QkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxnREFBZ0QsQ0FBQzt3QkFDdEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7d0JBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUN4QixNQUFNO29CQUNSO3dCQUNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsZ0RBQWdELENBQUM7d0JBQ3RGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO3dCQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDeEIsTUFBTTtvQkFDUjt3QkFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLGlGQUFpRixDQUFDO3dCQUN2SCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7d0JBQ3hCLE1BQU07b0JBQ1I7d0JBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyw2Q0FBNkMsQ0FBQzt3QkFDbkYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQzt3QkFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7d0JBQ3hCLE1BQU07b0JBQ1IsS0FBSyxDQUFDO3dCQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsK0JBQStCLENBQUM7d0JBQ3JFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsdUJBQXVCLENBQUM7d0JBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUN4QixNQUFNO2lCQUNUO2dCQUNELFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVztvQkFDdkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBekxVLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07O1NBRVAsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSHR0cENsaWVudCxcbiAgSHR0cFJlcXVlc3QsXG4gIEh0dHBFdmVudFR5cGUsXG4gIEh0dHBFdmVudCxcbiAgSHR0cFN0YXR1c0NvZGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUdlbmVyaWNIdHRwQ2xpZW50IH0gZnJvbSAnLi9pZ2VuZXJpYy1odHRwLWNsaWVudCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lSZXF1ZXN0T3B0aW9ucywgU25hY2tiYXJNb2RlbH0gZnJvbSAnLi4vLi4vbW9kZWwvaW50ZXJmYWNlJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0Vudmlyb25tZW50Vmlld01vZGVsfSBmcm9tIFwiLi4vLi4vbW9kZWwvZW52aXJvbm1lbnRzXCI7XG5pbXBvcnQge0h0dHBNZXRob2R9IGZyb20gXCIuLi8uLi9tb2RlbC9lbnVtXCI7XG5pbXBvcnQge01hdFNuYWNrQmFyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyXCI7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljSHR0cENsaWVudDxUPiBpbXBsZW1lbnRzIElHZW5lcmljSHR0cENsaWVudDxUPntcbiAgcHJpdmF0ZSBzbmFja0JhclZpZXdNb2RlbDogU25hY2tiYXJNb2RlbCA9IHt9IGFzIFNuYWNrYmFyTW9kZWw7XG4gIHByaXZhdGUgaXNIdHRwRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50Vmlld01vZGVsLFxuICAgIHByaXZhdGUgX3NuYWNrQmFyOiBNYXRTbmFja0JhciwgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHsgfVxuXG5cbiAgLyoqXG4gICogQGRlc2NyaXB0aW9uXG4gICogR2VuZXJpYyBIdHRwIEdFVCBtZXRob2QgdG8gR2V0IHRoZSByZXNwb25zZSBhbmQgYmluZCB0byB0aGUgdmlldyBtb2RlbFxuICAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvblVybCBlbmRQb2ludCBpdCBkb2Vzbid0IG5lZWQgLyBpbiBmcm9udCBvZiB0aGUgZW5kIHBvaW50LlxuICAqIEBwYXJhbSB7SVJlcXVlc3RPcHRpb25zfSBvcHRpb25zIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QgbGlrZSBoZWFkZXJzLCBib2R5LCBldGMuXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59XG4gICogQHVzYWdlTm90ZXNcbiAgKiBUaGUgZm9sbG93aW5nIHNuaXBwZXQgc2hvd3MgaG93IHRvIHVzZSB0aGlzIG1ldGhvZFxuICAqIGBgYHRzXG4gICogICAgdGhpcy5nZW5lcmljSHR0cFNlcnZpY2UuR2V0KFwiZ2V0X3VybFwiKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICogICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG4gICogICAgICB9LCBlcnJvciA9PiB7XG4gICogICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICogICAgICB9KTtcbiAgKiBgYGBcbiovXG4gIHB1YmxpYyBnZXQoZGVzdGluYXRpb25Vcmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyB8IGFueSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oSHR0cE1ldGhvZC5HZXQsIGRlc3RpbmF0aW9uVXJsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgICogQGRlc2NyaXB0aW9uXG4gICAgKiBHZW5lcmljIEh0dHAgcG9zdCBtZXRob2QgdG8gcG9zdCB0aGUgdmlldyBtb2RlbCBhbmQgYmluZCB0aGUgcmV0dXJuIHZpZXcgbW9kZWxcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvblVybCBlbmRQb2ludCBpdCBkb2Vzbid0IG5lZWQgLyBpbiBmcm9udCBvZiB0aGUgZW5kIHBvaW50LlxuICAgICogQHBhcmFtIHtJUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgb3B0aW9ucyBvZiB0aGUgcmVxdWVzdCBsaWtlIGhlYWRlcnMsIGJvZHksIGV0Yy5cbiAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fVxuICAgICogQHVzYWdlTm90ZXNcbiAgICAqIFRoZSBmb2xsb3dpbmcgc25pcHBldCBzaG93cyBob3cgdG8gdXNlIHRoaXMgbWV0aG9kXG4gICAgKiBgYGB0c1xuICAgICogICAgdGhpcy5nZW5lcmljSHR0cENsaWVudFNlcnZpY2UuUG9zdChwb3N0LXVybCxwb3N0LXZpZXctbW9kZWwpLnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAqICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICAqICAgICAgfSxcbiAgICAqICAgICAgZXJyID0+IHtcbiAgICAqICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICogICAgICB9KTtcbiAgICAqIGBgYFxuICAqL1xuICBwdWJsaWMgcG9zdChkZXN0aW5hdGlvblVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zIHwgYW55KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihIdHRwTWV0aG9kLlBvc3QsIGRlc3RpbmF0aW9uVXJsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgICogQGRlc2NyaXB0aW9uXG4gICAgKiBHZW5lcmljIEh0dHAgUHV0IG1ldGhvZCB0byBwb3N0IHRoZSB2aWV3IG1vZGVsIGFuZCBiaW5kIHRoZSByZXR1cm4gdmlldyBtb2RlbFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uVXJsIGVuZFBvaW50IGl0IGRvZXNuJ3QgbmVlZCAvIGluIGZyb250IG9mIHRoZSBlbmQgcG9pbnQuXG4gICAgKiBAcGFyYW0ge0lSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyBvcHRpb25zIG9mIHRoZSByZXF1ZXN0IGxpa2UgaGVhZGVycywgYm9keSwgZXRjLlxuICAgICogQHJldHVybnMge09ic2VydmFibGU8VD59XG4gICAgKiBAdXNhZ2VOb3Rlc1xuICAgICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGhvdyB0byB1c2UgdGhpcyBtZXRob2RcbiAgICAqIGBgYHRzXG4gICAgKiAgICB0aGlzLmdlbmVyaWNIdHRwQ2xpZW50U2VydmljZS5QdXQocG9zdC11cmwsIHBvc3Qtdmlldy1tb2RlbCkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICogICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICogICAgICB9LFxuICAgICogICAgICBlcnIgPT4ge1xuICAgICogICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgKiAgICAgIH0pO1xuICAgICogYGBgXG4gICovXG4gIHB1YmxpYyBwdXQoZGVzdGluYXRpb25Vcmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyB8IGFueSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oSHR0cE1ldGhvZC5QdXQsIGRlc3RpbmF0aW9uVXJsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICogR2VuZXJpYyBIdHRwIHBvc3QgbWV0aG9kIHRvIHBvc3QgdGhlIHZpZXcgbW9kZWwgYW5kIGJpbmQgdGhlIHJldHVybiB2aWV3IG1vZGVsXG4gICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvblVybCBlbmRQb2ludCBpdCBkb2Vzbid0IG5lZWQgLyBpbiBmcm9udCBvZiB0aGUgZW5kIHBvaW50LlxuICAgICAgKiBAcGFyYW0ge0lSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyBvcHRpb25zIG9mIHRoZSByZXF1ZXN0IGxpa2UgaGVhZGVycywgYm9keSwgZXRjLlxuICAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn1cbiAgICAgICogQHVzYWdlTm90ZXNcbiAgICAgICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGhvdyB0byB1c2UgdGhpcyBtZXRob2RcbiAgICAgICogYGBgdHNcbiAgICAgICogICAgdGhpcy5nZW5lcmljSHR0cENsaWVudFNlcnZpY2UuUG9zdChwb3N0LXVybCxwb3N0LXZpZXctbW9kZWwpLnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAgICogICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgKiAgICAgIH0sXG4gICAgICAqICAgICAgZXJyID0+IHtcbiAgICAgICogICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAqICAgICAgfSk7XG4gICAgICAqIGBgYFxuICAgICovXG4gIHB1YmxpYyBwYXRjaChkZXN0aW5hdGlvblVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zIHwgYW55KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihIdHRwTWV0aG9kLlBhdGNoLCBkZXN0aW5hdGlvblVybCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICAqIEBkZXNjcmlwdGlvblxuICAgICogR2VuZXJpYyBIdHRwIERlbGV0ZSBtZXRob2QgdG8gRGVsZXRlIHRoZSBpdGVtIGFuZCBiaW5kIHRoZSByZXR1cm4gdmlldyBtb2RlbFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uVXJsIGVuZFBvaW50IGl0IGRvZXNuJ3QgbmVlZCAvIGluIGZyb250IG9mIHRoZSBlbmQgcG9pbnQuXG4gICAgKiBAcGFyYW0ge0lSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyBvcHRpb25zIG9mIHRoZSByZXF1ZXN0IGxpa2UgaGVhZGVycywgYm9keSwgZXRjLlxuICAgICogQHJldHVybnMge09ic2VydmFibGU8VD59XG4gICAgKiBAdXNhZ2VOb3Rlc1xuICAgICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGhvdyB0byB1c2UgdGhpcyBtZXRob2RcbiAgICAqIGBgYHRzXG4gICAgKiAgICB0aGlzLmdlbmVyaWNIdHRwQ2xpZW50U2VydmljZS5EZWxldGUodGhpcy5kZWxldGVVc2VyVXJsKS5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgKiAgICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG4gICAgKiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAqICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgKiAgICAgIH0pO1xuICAgICogYGBgXG4gICovXG4gIHB1YmxpYyBkZWxldGUoZGVzdGluYXRpb25Vcmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyB8IGFueSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oSHR0cE1ldGhvZC5EZWxldGUsIGRlc3RpbmF0aW9uVXJsLCBvcHRpb25zKTtcbiAgfVxuICBcbiAgLyoqXG4gICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgKiBIdHRwIHJlcXVlc3QgbWV0aG9kIHRvIGFjY2VwdCBkaWZmZXJlbnQgbWV0aG9kIHR5cGUgYW5kIHBhcmFtc1xuICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIEh0dHAgbWV0aG9kcyAtIEdFVCwgUE9TVCwgUFVULCBERUxFVEUuXG4gICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvblVybCBlbmRQb2ludCBpdCBkb2Vzbid0IG5lZWQgLyBpbiBmcm9udCBvZiB0aGUgZW5kIHBvaW50LlxuICAgICAgKiBAcGFyYW0ge0lSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyBvcHRpb25zIG9mIHRoZSByZXF1ZXN0IGxpa2UgaGVhZGVycywgYm9keSwgZXRjLlxuICAgICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn1cbiAgICAgICogQHVzYWdlTm90ZXNcbiAgICAgICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGhvdyB0byB1c2UgdGhpcyBtZXRob2RcbiAgICAgICogYGBgdHNcbiAgICAgICogICAgdGhpcy5yZXF1ZXN0PFQ+KEh0dHBNZXRob2QuRGVsZXRlLCBkZXN0aW5hdGlvblVybCwgb3B0aW9ucyk7XG4gICAgICAqIGBgYFxuICAgICovXG4gIHByaXZhdGUgcmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgIGxldCBkZXN0aW5hdGlvblVybCA9ICcnO1xuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCAhPSB1bmRlZmluZWQpXG4gICAgICAgIGRlc3RpbmF0aW9uVXJsID0gKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCkgKyB1cmxcbiAgICAgIGVsc2VcbiAgICAgICAgZGVzdGluYXRpb25VcmwgPSB1cmxcbiAgICAgIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFQ+KG5ldyBIdHRwUmVxdWVzdChtZXRob2QsIGRlc3RpbmF0aW9uVXJsLCBvcHRpb25zKSkuc3Vic2NyaWJlKFxuICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNUeWUgPSByZXNwb25zZSBhcyBIdHRwRXZlbnQ8YW55PlxuICAgICAgICAgIHN3aXRjaCAocmVzcG9uc1R5ZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuU2VudDpcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnSHR0cCBDbGllbnQgOiBTZW50IC0+JywgJ1JlcXVlc3Qgc2VudCEnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuUmVzcG9uc2VIZWFkZXI6XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ0h0dHAgQ2xpZW50IDogUmVzcG9uc2VIZWFkZXIgLT4nLCAnUmVzcG9uc2UgaGVhZGVyIHJlY2VpdmVkIScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzOlxuICAgICAgICAgICAgICBjb25zdCBrYkxvYWRlZCA9IE1hdGgucm91bmQocmVzcG9uc1R5ZS5sb2FkZWQgLyAxMDI0KTtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnSHR0cCBDbGllbnQgOiBEb3dubG9hZFByb2dyZXNzIC0+JywgYERvd25sb2FkIGluIHByb2dyZXNzISAke2tiTG9hZGVkfUtiIGxvYWRlZGApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZS5ib2R5KTtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnSHR0cCBDbGllbnQgOiBSZXNwb25zZSAtPiDwn5i6IERvbmUhJywgcmVzcG9uc1R5ZS5ib2R5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLkZvcmJpZGRlbjpcbiAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclZpZXdNb2RlbC5tZXNzYWdlVGV4dCA9ICdBY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBmb3JiaWRkZW4uJztcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclZpZXdNb2RlbC5hY3Rpb25UZXh0ID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgICAgIHRoaXMuaXNIdHRwRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSHR0cFN0YXR1c0NvZGUuQmFkUmVxdWVzdDpcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclZpZXdNb2RlbC5tZXNzYWdlVGV4dCA9ICdTZXJ2ZXIgY2Fubm90IG9yIHdpbGwgbm90IHByb2Nlc3MgdGhlIHJlcXVlc3QuJztcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclZpZXdNb2RlbC5hY3Rpb25UZXh0ID0gJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgICAgdGhpcy5pc0h0dHBFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIdHRwU3RhdHVzQ29kZS5VbmF1dGhvcml6ZWQ6XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJWaWV3TW9kZWwubWVzc2FnZVRleHQgPSAnUmVxdWVzdCBoYXMgbm90IGJlZW4gYXBwbGllZCBiZWNhdXNlIGl0IGxhY2tzIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLic7XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJWaWV3TW9kZWwuYWN0aW9uVGV4dCA9ICdVbmF1dGhvcml6ZWQnO1xuICAgICAgICAgICAgICB0aGlzLmlzSHR0cEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEh0dHBTdGF0dXNDb2RlLkludGVybmFsU2VydmVyRXJyb3I6XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJWaWV3TW9kZWwubWVzc2FnZVRleHQgPSAnU2VydmVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uLic7XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJWaWV3TW9kZWwuYWN0aW9uVGV4dCA9ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICAgICAgICAgICAgICB0aGlzLmlzSHR0cEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJWaWV3TW9kZWwubWVzc2FnZVRleHQgPSAnTm90IGNvbm5lY3RlZCB0byB0aGUgc2VydmljZS4nO1xuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyVmlld01vZGVsLmFjdGlvblRleHQgPSAnU2VydmljZSBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgICAgICAgdGhpcy5pc0h0dHBFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgaWYgKCh0aGlzLmVudmlyb25tZW50LnNuYWNrQmFyRW5hYmxlICE9IHVuZGVmaW5lZCAmJiB0aGlzLmVudmlyb25tZW50LnNuYWNrQmFyRW5hYmxlKSAmJiB0aGlzLmlzSHR0cEVycm9yKVxuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3Blbih0aGlzLnNuYWNrQmFyVmlld01vZGVsLm1lc3NhZ2VUZXh0LCB0aGlzLnNuYWNrQmFyVmlld01vZGVsLmFjdGlvblRleHQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
class IGenericHttpClient {
|
|
4
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: IGenericHttpClient, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: IGenericHttpClient }); }
|
|
6
|
+
}
|
|
7
|
+
export { IGenericHttpClient };
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: IGenericHttpClient, decorators: [{
|
|
9
|
+
type: Injectable
|
|
10
|
+
}] });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWdlbmVyaWMtaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mYWxjb24tbmcvdGFpbHdpbmQvc3JjL2xpYi9zZXJ2aWNlL2h0dHAvaWdlbmVyaWMtaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0MsTUFDc0Isa0JBQWtCOzhHQUFsQixrQkFBa0I7a0hBQWxCLGtCQUFrQjs7U0FBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbC9pbnRlcmZhY2UnO1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElHZW5lcmljSHR0cENsaWVudDxUPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2VuZXJpYyBIdHRwIEdFVCBtZXRob2QgdG8gR2V0IHRoZSByZXNwb25zZSBhbmQgYmluZCB0byB0aGUgdmlldyBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb25VcmwgZW5kUG9pbnQgaXQgZG9lc24ndCBuZWVkIC8gaW4gZnJvbnQgb2YgdGhlIGVuZCBwb2ludC5cbiAgICogQHBhcmFtIHtJUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgb3B0aW9ucyBvZiB0aGUgcmVxdWVzdCBsaWtlIGhlYWRlcnMsIGJvZHksIGV0Yy5cbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59XG4gICAqIEB1c2FnZU5vdGVzXG4gICAqIFRoZSBmb2xsb3dpbmcgc25pcHBldCBzaG93cyBob3cgdG8gdXNlIHRoaXMgbWV0aG9kXG4gICAqIGBgYHRzXG4gICAqICAgIHRoaXMuZ2VuZXJpY0h0dHBTZXJ2aWNlLkh0dHBHZXQoXCJnZXRfdXJsXCIpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICogICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG4gICAqICAgICAgfSwgZXJyb3IgPT4ge1xuICAgKiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICogICAgICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBnZXQoXG4gICAgZGVzdGluYXRpb25Vcmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zIHwgYW55XG4gICk6IE9ic2VydmFibGU8VD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZW5lcmljIEh0dHAgcG9zdCBtZXRob2QgdG8gcG9zdCB0aGUgdmlldyBtb2RlbCBhbmQgYmluZCB0aGUgcmV0dXJuIHZpZXcgbW9kZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uVXJsIGVuZFBvaW50IGl0IGRvZXNuJ3QgbmVlZCAvIGluIGZyb250IG9mIHRoZSBlbmQgcG9pbnQuXG4gICAqIEBwYXJhbSB7SVJlcXVlc3RPcHRpb25zfSBvcHRpb25zIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QgbGlrZSBoZWFkZXJzLCBib2R5LCBldGMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fVxuICAgKiBAdXNhZ2VOb3Rlc1xuICAgKiBUaGUgZm9sbG93aW5nIHNuaXBwZXQgc2hvd3MgaG93IHRvIHVzZSB0aGlzIG1ldGhvZFxuICAgKiBgYGB0c1xuICAgKiAgICB0aGlzLmdlbmVyaWNIdHRwU2VydmljZS5Qb3N0KHBvc3RfdXJsLHBvc3Qtdmlldy1tb2RlbFwiKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAqICAgICAgICBjb25zb2xlLmxvZygnZGF0YSBpcyBub3Qgc3VjY2VzcycpO1xuICAgKiAgICAgIH0sIGVycm9yID0+IHtcbiAgICogICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgcG9zdChcbiAgICBkZXN0aW5hdGlvblVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMgfCBhbnlcbiAgKTogT2JzZXJ2YWJsZTxUPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdlbmVyaWMgSHR0cCBwdXQgbWV0aG9kIHRvIHBvc3QgdGhlIHZpZXcgbW9kZWwgYW5kIGJpbmQgdGhlIHJldHVybiB2aWV3IG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvblVybCBlbmRQb2ludCBpdCBkb2Vzbid0IG5lZWQgLyBpbiBmcm9udCBvZiB0aGUgZW5kIHBvaW50LlxuICAgKiBAcGFyYW0ge0lSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyBvcHRpb25zIG9mIHRoZSByZXF1ZXN0IGxpa2UgaGVhZGVycywgYm9keSwgZXRjLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn1cbiAgICogQHVzYWdlTm90ZXNcbiAgICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGhvdyB0byB1c2UgdGhpcyBtZXRob2RcbiAgICogYGBgdHNcbiAgICogICAgdGhpcy5nZW5lcmljSHR0cFNlcnZpY2UuUHV0KHB1dF91cmwscG9zdC12aWV3LW1vZGVsKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAqICAgICAgICBjb25zb2xlLmxvZygnZGF0YSBpcyBub3Qgc3VjY2VzcycpO1xuICAgKiAgICAgIH0sIGVycm9yID0+IHtcbiAgICogICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgcHV0KFxuICAgIGRlc3RpbmF0aW9uVXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyB8IGFueVxuICApOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2VuZXJpYyBIdHRwIHBhdGNoIG1ldGhvZCB0byBwYXRjaCB0aGUgdmlldyBtb2RlbCBhbmQgYmluZCB0aGUgcmV0dXJuIHZpZXcgbW9kZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uVXJsIGVuZFBvaW50IGl0IGRvZXNuJ3QgbmVlZCAvIGluIGZyb250IG9mIHRoZSBlbmQgcG9pbnQuXG4gICAqIEBwYXJhbSB7SVJlcXVlc3RPcHRpb25zfSBvcHRpb25zIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QgbGlrZSBoZWFkZXJzLCBib2R5LCBldGMuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fVxuICAgKiBAdXNhZ2VOb3Rlc1xuICAgKiBUaGUgZm9sbG93aW5nIHNuaXBwZXQgc2hvd3MgaG93IHRvIHVzZSB0aGlzIG1ldGhvZFxuICAgKiBgYGB0c1xuICAgKiAgICB0aGlzLmdlbmVyaWNIdHRwU2VydmljZS5QYXRjaChwdXRfdXJsLHBvc3Qtdmlldy1tb2RlbCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgKiAgICAgICAgY29uc29sZS5sb2coJ2RhdGEgaXMgbm90IHN1Y2Nlc3MnKTtcbiAgICogICAgICB9LCBlcnJvciA9PiB7XG4gICAqICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgKiAgICAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFic3RyYWN0IHBhdGNoKFxuICAgIGRlc3RpbmF0aW9uVXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyB8IGFueVxuICApOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2VuZXJpYyBIdHRwIERlbGV0ZSBtZXRob2QgdG8gRGVsZXRlIHRoZSBpdGVtIGFuZCBiaW5kIHRoZSByZXR1cm4gdmlldyBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb25VcmwgZW5kUG9pbnQgaXQgZG9lc24ndCBuZWVkIC8gaW4gZnJvbnQgb2YgdGhlIGVuZCBwb2ludC5cbiAgICogQHBhcmFtIHtJUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgb3B0aW9ucyBvZiB0aGUgcmVxdWVzdCBsaWtlIGhlYWRlcnMsIGJvZHksIGV0Yy5cbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59XG4gICAqIEB1c2FnZU5vdGVzXG4gICAqIFRoZSBmb2xsb3dpbmcgc25pcHBldCBzaG93cyBob3cgdG8gdXNlIHRoaXMgbWV0aG9kXG4gICAqIGBgYHRzXG4gICAqICAgIHRoaXMuZ2VuZXJpY0h0dHBDbGllbnRTZXJ2aWNlLkRlbGV0ZSh0aGlzLmRlbGV0ZVVzZXJVcmwpLnN1YnNjcmliZShpdGVtID0+IHtcbiAgICogICAgICAgICBjb25zb2xlLmxvZygnc3VjY2VzcycpO1xuICAgKiAgICAgIH0sIGVycm9yID0+IHtcbiAgICogICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICogICAgICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGUoXG4gICAgZGVzdGluYXRpb25Vcmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zIHwgYW55XG4gICk6IE9ic2VydmFibGU8VD47XG59XG4iXX0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
class LoggerService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.initialized = false;
|
|
6
|
+
this._level = "Warnings" /* LoggingLevel.Warnings */;
|
|
7
|
+
}
|
|
8
|
+
async initialize(appSettings) {
|
|
9
|
+
if (this.initialized)
|
|
10
|
+
return;
|
|
11
|
+
this._level = appSettings.loggingLevel;
|
|
12
|
+
this.initialized = true;
|
|
13
|
+
}
|
|
14
|
+
log(message, level = "Warnings" /* LoggingLevel.Warnings */, ...optionalParams) {
|
|
15
|
+
if (this.shouldLog(level)) {
|
|
16
|
+
switch (level) {
|
|
17
|
+
case "Errors" /* LoggingLevel.Errors */:
|
|
18
|
+
console.error(message, optionalParams);
|
|
19
|
+
break;
|
|
20
|
+
case "Warnings" /* LoggingLevel.Warnings */:
|
|
21
|
+
console.warn(message, optionalParams);
|
|
22
|
+
break;
|
|
23
|
+
case "Info" /* LoggingLevel.Info */:
|
|
24
|
+
console.info(message, optionalParams);
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
console.debug(message, optionalParams);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
shouldLog(level) {
|
|
32
|
+
if (this._level === "None" /* LoggingLevel.None */) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
else if (this._level === "Errors" /* LoggingLevel.Errors */) {
|
|
36
|
+
return level === "Errors" /* LoggingLevel.Errors */;
|
|
37
|
+
}
|
|
38
|
+
else if (this._level === "Warnings" /* LoggingLevel.Warnings */) {
|
|
39
|
+
return level === "Errors" /* LoggingLevel.Errors */ || level === "Warnings" /* LoggingLevel.Warnings */;
|
|
40
|
+
}
|
|
41
|
+
else if (this._level === "Info" /* LoggingLevel.Info */) {
|
|
42
|
+
return level === "Errors" /* LoggingLevel.Errors */ || level === "Warnings" /* LoggingLevel.Warnings */ || level === "Info" /* LoggingLevel.Info */;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
error(message, ...optionalParams) {
|
|
49
|
+
this.log(message, "Errors" /* LoggingLevel.Errors */, optionalParams);
|
|
50
|
+
}
|
|
51
|
+
warning(message, ...optionalParams) {
|
|
52
|
+
this.log(message, "Warnings" /* LoggingLevel.Warnings */, optionalParams);
|
|
53
|
+
}
|
|
54
|
+
info(message, ...optionalParams) {
|
|
55
|
+
this.log(message, "Info" /* LoggingLevel.Info */, optionalParams);
|
|
56
|
+
}
|
|
57
|
+
verbose(message, ...optionalParams) {
|
|
58
|
+
this.log(message, "Verbose" /* LoggingLevel.Verbose */, optionalParams);
|
|
59
|
+
}
|
|
60
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: LoggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
61
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: LoggerService, providedIn: 'root' }); }
|
|
62
|
+
}
|
|
63
|
+
export { LoggerService };
|
|
64
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: LoggerService, decorators: [{
|
|
65
|
+
type: Injectable,
|
|
66
|
+
args: [{
|
|
67
|
+
providedIn: 'root'
|
|
68
|
+
}]
|
|
69
|
+
}], ctorParameters: function () { return []; } });
|
|
70
|
+
export function loggerServiceFactory(loggerService, appSettings) {
|
|
71
|
+
return async () => {
|
|
72
|
+
appSettings.isServiceReady.subscribe(item => {
|
|
73
|
+
if (item)
|
|
74
|
+
loggerService.initialize(appSettings.getAppsettingValue());
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mYWxjb24tbmcvdGFpbHdpbmQvc3JjL2xpYi9zZXJ2aWNlL2xvZ2dlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BR2EsYUFBYTtJQUd4QjtRQUZRLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLFdBQU0sMENBQXVDO0lBQ3JDLENBQUM7SUFFakIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFpQztRQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxZQUE0QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxHQUFHLENBQUMsT0FBWSxFQUFFLEtBQUsseUNBQXdCLEVBQUUsR0FBRyxjQUFxQjtRQUMvRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxLQUFLLEVBQUU7Z0JBQ2I7b0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1I7b0JBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3RDLE1BQU07Z0JBQ1I7b0JBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3RDLE1BQU07Z0JBQ1I7b0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDMUM7U0FDRjtJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsS0FBbUI7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxtQ0FBc0IsRUFBRTtZQUNyQyxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSx1Q0FBd0IsRUFBRTtZQUM5QyxPQUFPLEtBQUssdUNBQXdCLENBQUM7U0FDdEM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLDJDQUEwQixFQUFFO1lBQ2hELE9BQU8sS0FBSyx1Q0FBd0IsSUFBSSxLQUFLLDJDQUEwQixDQUFDO1NBQ3pFO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxtQ0FBc0IsRUFBRTtZQUM1QyxPQUFPLEtBQUssdUNBQXdCLElBQUksS0FBSywyQ0FBMEIsSUFBSSxLQUFLLG1DQUFzQixDQUFDO1NBQ3hHO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFZLEVBQUUsR0FBRyxjQUFxQjtRQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sc0NBQXVCLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxPQUFPLENBQUMsT0FBWSxFQUFFLEdBQUcsY0FBcUI7UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLDBDQUF5QixjQUFjLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQVksRUFBRSxHQUFHLGNBQXFCO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxrQ0FBcUIsY0FBYyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFZLEVBQUUsR0FBRyxjQUFxQjtRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sd0NBQXdCLGNBQWMsQ0FBQyxDQUFDO0lBQzFELENBQUM7OEdBekRVLGFBQWE7a0hBQWIsYUFBYSxjQUZaLE1BQU07O1NBRVAsYUFBYTsyRkFBYixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUE0REQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGFBQTRCLEVBQUUsV0FBOEI7SUFDL0YsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNoQixXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQyxJQUFJLElBQUk7Z0JBQ04sYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQTBCLENBQUMsQ0FBQztRQUN2RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQTtBQUNILENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwU2V0dGluZ1NlcnZpY2UgfSBmcm9tICcuL2FwcHNldHRpbmcuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dpbmdMZXZlbH0gZnJvbSBcIi4uL21vZGVsL2VudW1cIjtcbmltcG9ydCB7SUFwcFNldHRpbmdWaWV3TW9kZWx9IGZyb20gXCIuLi9tb2RlbC9pbnRlcmZhY2VcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGV2ZWw6IExvZ2dpbmdMZXZlbCA9IExvZ2dpbmdMZXZlbC5XYXJuaW5ncztcbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBhc3luYyBpbml0aWFsaXplKGFwcFNldHRpbmdzOiBJQXBwU2V0dGluZ1ZpZXdNb2RlbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgdGhpcy5fbGV2ZWwgPSBhcHBTZXR0aW5ncy5sb2dnaW5nTGV2ZWwgYXMgTG9nZ2luZ0xldmVsO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogYW55LCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5XYXJuaW5ncywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkTG9nKGxldmVsKSkge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlIExvZ2dpbmdMZXZlbC5FcnJvcnM6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9nZ2luZ0xldmVsLldhcm5pbmdzOlxuICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9nZ2luZ0xldmVsLkluZm86XG4gICAgICAgICAgY29uc29sZS5pbmZvKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nZ2luZ0xldmVsKSB7XG4gICAgaWYgKHRoaXMuX2xldmVsID09PSBMb2dnaW5nTGV2ZWwuTm9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbGV2ZWwgPT09IExvZ2dpbmdMZXZlbC5FcnJvcnMpIHtcbiAgICAgIHJldHVybiBsZXZlbCA9PT0gTG9nZ2luZ0xldmVsLkVycm9ycztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xldmVsID09PSBMb2dnaW5nTGV2ZWwuV2FybmluZ3MpIHtcbiAgICAgIHJldHVybiBsZXZlbCA9PT0gTG9nZ2luZ0xldmVsLkVycm9ycyB8fCBsZXZlbCA9PT0gTG9nZ2luZ0xldmVsLldhcm5pbmdzO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbGV2ZWwgPT09IExvZ2dpbmdMZXZlbC5JbmZvKSB7XG4gICAgICByZXR1cm4gbGV2ZWwgPT09IExvZ2dpbmdMZXZlbC5FcnJvcnMgfHwgbGV2ZWwgPT09IExvZ2dpbmdMZXZlbC5XYXJuaW5ncyB8fCBsZXZlbCA9PT0gTG9nZ2luZ0xldmVsLkluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nZ2luZ0xldmVsLkVycm9ycywgb3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgd2FybmluZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ2dpbmdMZXZlbC5XYXJuaW5ncywgb3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIHRoaXMubG9nKG1lc3NhZ2UsIExvZ2dpbmdMZXZlbC5JbmZvLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICB2ZXJib3NlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgdGhpcy5sb2cobWVzc2FnZSwgTG9nZ2luZ0xldmVsLlZlcmJvc2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlclNlcnZpY2VGYWN0b3J5KGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2UsIGFwcFNldHRpbmdzOiBBcHBTZXR0aW5nU2VydmljZSkge1xuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGFwcFNldHRpbmdzLmlzU2VydmljZVJlYWR5LnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKVxuICAgICAgICBsb2dnZXJTZXJ2aWNlLmluaXRpYWxpemUoYXBwU2V0dGluZ3MuZ2V0QXBwc2V0dGluZ1ZhbHVlKCkgYXMgSUFwcFNldHRpbmdWaWV3TW9kZWwpO1xuICAgIH0pO1xuICB9XG59OyJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
class TokenHelperService {
|
|
4
|
+
constructor() { }
|
|
5
|
+
getTokenExpirationDate(dataIdToken) {
|
|
6
|
+
if (!dataIdToken.hasOwnProperty('exp')) {
|
|
7
|
+
return new Date();
|
|
8
|
+
}
|
|
9
|
+
const date = new Date(0); // The 0 here is the key, which sets the date to the epoch
|
|
10
|
+
date.setUTCSeconds(dataIdToken.exp);
|
|
11
|
+
return date;
|
|
12
|
+
}
|
|
13
|
+
getPayloadFromToken(token, encode) {
|
|
14
|
+
let data = {};
|
|
15
|
+
if (typeof token !== 'undefined') {
|
|
16
|
+
const encoded = token.split('.')[1];
|
|
17
|
+
if (encode) {
|
|
18
|
+
return encoded;
|
|
19
|
+
}
|
|
20
|
+
data = JSON.parse(this.urlBase64Decode(encoded));
|
|
21
|
+
}
|
|
22
|
+
return data;
|
|
23
|
+
}
|
|
24
|
+
getHeaderFromToken(token, encode) {
|
|
25
|
+
let data = {};
|
|
26
|
+
if (typeof token !== 'undefined') {
|
|
27
|
+
const encoded = token.split('.')[0];
|
|
28
|
+
if (encode) {
|
|
29
|
+
return encoded;
|
|
30
|
+
}
|
|
31
|
+
data = JSON.parse(this.urlBase64Decode(encoded));
|
|
32
|
+
}
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
getSignatureFromToken(token, encode) {
|
|
36
|
+
let data = {};
|
|
37
|
+
if (typeof token !== 'undefined') {
|
|
38
|
+
const encoded = token.split('.')[2];
|
|
39
|
+
if (encode) {
|
|
40
|
+
return encoded;
|
|
41
|
+
}
|
|
42
|
+
data = JSON.parse(this.urlBase64Decode(encoded));
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
urlBase64Decode(str) {
|
|
47
|
+
let output = str.replace('-', '+').replace('_', '/');
|
|
48
|
+
switch (output.length % 4) {
|
|
49
|
+
case 0:
|
|
50
|
+
break;
|
|
51
|
+
case 2:
|
|
52
|
+
output += '==';
|
|
53
|
+
break;
|
|
54
|
+
case 3:
|
|
55
|
+
output += '=';
|
|
56
|
+
break;
|
|
57
|
+
default:
|
|
58
|
+
throw Error('Illegal base64url string!');
|
|
59
|
+
}
|
|
60
|
+
return window.atob(output);
|
|
61
|
+
}
|
|
62
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: TokenHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
63
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: TokenHelperService, providedIn: 'root' }); }
|
|
64
|
+
}
|
|
65
|
+
export { TokenHelperService };
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: TokenHelperService, decorators: [{
|
|
67
|
+
type: Injectable,
|
|
68
|
+
args: [{
|
|
69
|
+
providedIn: 'root'
|
|
70
|
+
}]
|
|
71
|
+
}], ctorParameters: function () { return []; } });
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9rZW5IZWxwZXJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmFsY29uLW5nL3RhaWx3aW5kL3NyYy9saWIvc2VydmljZS9vcGVuLWlkL1Rva2VuSGVscGVyU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQyxNQUdhLGtCQUFrQjtJQUM3QixnQkFBZ0IsQ0FBQztJQUVqQixzQkFBc0IsQ0FBQyxXQUFnQjtRQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7U0FDbkI7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBEQUEwRDtRQUNwRixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVLEVBQUUsTUFBZTtRQUM3QyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBVSxFQUFFLE1BQWU7UUFDNUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLE1BQU0sRUFBRTtnQkFDVixPQUFPLE9BQU8sQ0FBQzthQUNoQjtZQUNELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNsRDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQVUsRUFBRSxNQUFlO1FBQy9DLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsT0FBTyxPQUFPLENBQUM7YUFDaEI7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBVztRQUN6QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELFFBQVEsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsS0FBSyxDQUFDO2dCQUNKLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osTUFBTSxJQUFJLElBQUksQ0FBQztnQkFDZixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ2QsTUFBTTtZQUNSO2dCQUNFLE1BQU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDMUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs4R0FyRVUsa0JBQWtCO2tIQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7U0FFUCxrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRva2VuSGVscGVyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgZ2V0VG9rZW5FeHBpcmF0aW9uRGF0ZShkYXRhSWRUb2tlbjogYW55KTogRGF0ZSB7XG4gICAgaWYgKCFkYXRhSWRUb2tlbi5oYXNPd25Qcm9wZXJ0eSgnZXhwJykpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTsgLy8gVGhlIDAgaGVyZSBpcyB0aGUga2V5LCB3aGljaCBzZXRzIHRoZSBkYXRlIHRvIHRoZSBlcG9jaFxuICAgIGRhdGUuc2V0VVRDU2Vjb25kcyhkYXRhSWRUb2tlbi5leHApO1xuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBnZXRQYXlsb2FkRnJvbVRva2VuKHRva2VuOiBhbnksIGVuY29kZTogYm9vbGVhbikge1xuICAgIGxldCBkYXRhID0ge307XG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSB0b2tlbi5zcGxpdCgnLicpWzFdO1xuICAgICAgaWYgKGVuY29kZSkge1xuICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgIH1cbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHRoaXMudXJsQmFzZTY0RGVjb2RlKGVuY29kZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldEhlYWRlckZyb21Ub2tlbih0b2tlbjogYW55LCBlbmNvZGU6IGJvb2xlYW4pIHtcbiAgICBsZXQgZGF0YSA9IHt9O1xuICAgIGlmICh0eXBlb2YgdG9rZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkID0gdG9rZW4uc3BsaXQoJy4nKVswXTtcbiAgICAgIGlmIChlbmNvZGUpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICB9XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnVybEJhc2U2NERlY29kZShlbmNvZGVkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBnZXRTaWduYXR1cmVGcm9tVG9rZW4odG9rZW46IGFueSwgZW5jb2RlOiBib29sZWFuKSB7XG4gICAgbGV0IGRhdGEgPSB7fTtcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IHRva2VuLnNwbGl0KCcuJylbMl07XG4gICAgICBpZiAoZW5jb2RlKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgfVxuICAgICAgZGF0YSA9IEpTT04ucGFyc2UodGhpcy51cmxCYXNlNjREZWNvZGUoZW5jb2RlZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdXJsQmFzZTY0RGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgbGV0IG91dHB1dCA9IHN0ci5yZXBsYWNlKCctJywgJysnKS5yZXBsYWNlKCdfJywgJy8nKTtcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XG4gICAgY2FzZSAwOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgb3V0cHV0ICs9ICc9PSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBvdXRwdXQgKz0gJz0nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IEVycm9yKCdJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5hdG9iKG91dHB1dCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./auth.service";
|
|
4
|
+
class AuthGuardService {
|
|
5
|
+
constructor(authService) {
|
|
6
|
+
this.authService = authService;
|
|
7
|
+
}
|
|
8
|
+
canActivate(route, state) {
|
|
9
|
+
return new Promise(resolve => {
|
|
10
|
+
this.authService.isServiceReady().then(() => {
|
|
11
|
+
if (this.authService.isLoggedIn()) {
|
|
12
|
+
resolve(true);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this.authService.startAuthentication(state.url);
|
|
16
|
+
resolve(false);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthGuardService, deps: [{ token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
22
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthGuardService, providedIn: 'root' }); }
|
|
23
|
+
}
|
|
24
|
+
export { AuthGuardService };
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthGuardService, decorators: [{
|
|
26
|
+
type: Injectable,
|
|
27
|
+
args: [{
|
|
28
|
+
providedIn: 'root'
|
|
29
|
+
}]
|
|
30
|
+
}], ctorParameters: function () { return [{ type: i1.AuthService }]; } });
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1ndWFyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmFsY29uLW5nL3RhaWx3aW5kL3NyYy9saWIvc2VydmljZS9vcGVuLWlkL2F1dGgtZ3VhcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsTUFHYSxnQkFBZ0I7SUFFM0IsWUFBb0IsV0FBeUI7UUFBekIsZ0JBQVcsR0FBWCxXQUFXLENBQWM7SUFBSSxDQUFDO0lBRWxELFdBQVcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ25FLE9BQU8sSUFBSSxPQUFPLENBQVUsT0FBTyxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDZjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoQjtZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQWZVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7U0FFUCxnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlclN0YXRlU25hcHNob3QsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBdXRoR3VhcmRTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlIDogQXV0aFNlcnZpY2UpIHsgfVxuXG4gIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkgOiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNTZXJ2aWNlUmVhZHkoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNMb2dnZWRJbigpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnN0YXJ0QXV0aGVudGljYXRpb24oc3RhdGUudXJsKTtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { UserManager } from 'oidc-client';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../logger.service";
|
|
5
|
+
import * as i2 from "./TokenHelperService";
|
|
6
|
+
class AuthService {
|
|
7
|
+
static { this.USER_LOADED_EVENT = "USER_LOADED"; }
|
|
8
|
+
static { this.USER_UNLOADED_EVENT = "USER_UNLOADED"; }
|
|
9
|
+
constructor(logger, tokenHelperService) {
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
this.tokenHelperService = tokenHelperService;
|
|
12
|
+
this.initialized = false;
|
|
13
|
+
this.signingOut = false;
|
|
14
|
+
}
|
|
15
|
+
async initialize(environment) {
|
|
16
|
+
if (this.initialized)
|
|
17
|
+
return;
|
|
18
|
+
this.settings = this.getClientSettings(environment);
|
|
19
|
+
this.userManager = new UserManager(this.settings);
|
|
20
|
+
this.userManager.events.addUserLoaded(user => {
|
|
21
|
+
this.user = user;
|
|
22
|
+
});
|
|
23
|
+
this.userManager.events.addAccessTokenExpiring(() => {
|
|
24
|
+
this.logger.info("IdSvr token expiring " + new Date().toLocaleString());
|
|
25
|
+
});
|
|
26
|
+
this.userManager.events.addAccessTokenExpired(() => {
|
|
27
|
+
this.logger.info("IdSvr token expired " + new Date().toLocaleString());
|
|
28
|
+
this.logout(false);
|
|
29
|
+
});
|
|
30
|
+
this.userManager.events.addSilentRenewError(e => {
|
|
31
|
+
this.logger.error("IdSvr silent renew error " + e.message + new Date().toLocaleString());
|
|
32
|
+
this.logout(false);
|
|
33
|
+
});
|
|
34
|
+
this.userManager.events.addUserLoaded(user => {
|
|
35
|
+
this.logger.info("IdSvr user session is ready " + new Date().toLocaleString());
|
|
36
|
+
this.accessToken = this.tokenHelperService.getPayloadFromToken(user.access_token, false);
|
|
37
|
+
this.user = user;
|
|
38
|
+
});
|
|
39
|
+
this.userManager.events.addUserUnloaded(() => {
|
|
40
|
+
this.logger.info("IdSvr user session has ended " + new Date().toLocaleString());
|
|
41
|
+
if (!this.signingOut) {
|
|
42
|
+
this.startAuthentication(window.location.pathname + window.location.search);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
this.userManager.events.addUserSignedOut(() => {
|
|
46
|
+
this.logger.info("IdSvr user signed out " + new Date().toLocaleString());
|
|
47
|
+
this.logout(false);
|
|
48
|
+
});
|
|
49
|
+
this.user = await this.userManager.getUser();
|
|
50
|
+
this.initialized = true;
|
|
51
|
+
}
|
|
52
|
+
isLoggedIn() {
|
|
53
|
+
return this.user != null && !this.user.expired;
|
|
54
|
+
}
|
|
55
|
+
getUser() {
|
|
56
|
+
return this.userManager.getUser();
|
|
57
|
+
}
|
|
58
|
+
getProfile() {
|
|
59
|
+
return this.user.profile;
|
|
60
|
+
}
|
|
61
|
+
getClaims() {
|
|
62
|
+
return this.user.profile;
|
|
63
|
+
}
|
|
64
|
+
getAuthorizationHeaderValue() {
|
|
65
|
+
if (this.user != null)
|
|
66
|
+
return `${this.user.token_type} ${this.user.access_token}`;
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
getAccessToken() {
|
|
70
|
+
return this.accessToken || this.tokenHelperService.getPayloadFromToken(this.user.access_token, false);
|
|
71
|
+
;
|
|
72
|
+
}
|
|
73
|
+
async startAuthentication(returnUrl) {
|
|
74
|
+
this.logger.info("[AuthService] startAuthentication", returnUrl);
|
|
75
|
+
await this.userManager.clearStaleState();
|
|
76
|
+
await this.userManager.signinRedirect({ data: { returnUrl: returnUrl } }).catch(err => {
|
|
77
|
+
//this.$log.debug("IdSvr sign in failed", err);
|
|
78
|
+
return err;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async completeAuthentication() {
|
|
82
|
+
this.logger.info("[AuthService] completeAuthentication");
|
|
83
|
+
let user = await new Promise((resolve, reject) => {
|
|
84
|
+
this.userManager.signinRedirectCallback().then(user => {
|
|
85
|
+
resolve(user);
|
|
86
|
+
}).catch(error => {
|
|
87
|
+
reject(error);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
this.user = user;
|
|
91
|
+
return this.user;
|
|
92
|
+
}
|
|
93
|
+
login() {
|
|
94
|
+
return this.userManager.signinRedirect();
|
|
95
|
+
}
|
|
96
|
+
renewToken() {
|
|
97
|
+
return this.userManager.signinSilent();
|
|
98
|
+
}
|
|
99
|
+
logout(signoutRedirect) {
|
|
100
|
+
if (signoutRedirect === undefined || signoutRedirect !== false) {
|
|
101
|
+
this.signingOut = true;
|
|
102
|
+
signoutRedirect = true;
|
|
103
|
+
}
|
|
104
|
+
return this.userManager.signoutRedirect();
|
|
105
|
+
}
|
|
106
|
+
getClientSettings(environment) {
|
|
107
|
+
return {
|
|
108
|
+
authority: environment?.openID?.authority,
|
|
109
|
+
client_id: environment?.openID?.client_id,
|
|
110
|
+
redirect_uri: environment?.openID?.redirect_uri,
|
|
111
|
+
post_logout_redirect_uri: environment?.openID?.post_logout_redirect_uri,
|
|
112
|
+
response_type: environment?.openID?.response_type,
|
|
113
|
+
scope: environment?.openID?.scope,
|
|
114
|
+
filterProtocolClaims: environment?.openID?.filterProtocolClaims,
|
|
115
|
+
loadUserInfo: true,
|
|
116
|
+
monitorSession: true,
|
|
117
|
+
silent_redirect_uri: environment?.openID?.silent_redirect_uri,
|
|
118
|
+
automaticSilentRenew: environment?.openID?.automaticSilentRenew,
|
|
119
|
+
accessTokenExpiringNotificationTime: 20,
|
|
120
|
+
checkSessionInterval: 2000,
|
|
121
|
+
silentRequestTimeout: 20000,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async isServiceReady() {
|
|
125
|
+
return new Promise(async (resolve, reject) => {
|
|
126
|
+
if (this.initialized) {
|
|
127
|
+
this.logger.info("[AuthService] isServiceReady", true);
|
|
128
|
+
resolve(true);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.logger.info("[AuthService] isServiceReady", false);
|
|
132
|
+
reject(false);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthService, deps: [{ token: i1.LoggerService }, { token: i2.TokenHelperService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
137
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthService, providedIn: 'root' }); }
|
|
138
|
+
}
|
|
139
|
+
export { AuthService };
|
|
140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: AuthService, decorators: [{
|
|
141
|
+
type: Injectable,
|
|
142
|
+
args: [{
|
|
143
|
+
providedIn: 'root'
|
|
144
|
+
}]
|
|
145
|
+
}], ctorParameters: function () { return [{ type: i1.LoggerService }, { type: i2.TokenHelperService }]; } });
|
|
146
|
+
export function authServiceFactory(authService, appSettings, environment) {
|
|
147
|
+
return async () => {
|
|
148
|
+
appSettings.isServiceReady.subscribe(item => {
|
|
149
|
+
if (item)
|
|
150
|
+
authService.initialize(environment);
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
;
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmFsY29uLW5nL3RhaWx3aW5kL3NyYy9saWIvc2VydmljZS9vcGVuLWlkL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBZ0IsV0FBVyxFQUFzQixNQUFNLGFBQWEsQ0FBQzs7OztBQU01RSxNQUdhLFdBQVc7YUFDZixzQkFBaUIsR0FBRyxhQUFhLEFBQWhCLENBQWlCO2FBQ2xDLHdCQUFtQixHQUFHLGVBQWUsQUFBbEIsQ0FBbUI7SUFVN0MsWUFBb0IsTUFBcUIsRUFBVSxrQkFBc0M7UUFBckUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFSakYsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFNN0IsZUFBVSxHQUFZLEtBQUssQ0FBQztJQUlwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFpQztRQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFHSCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJ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O1lBQ3ZDLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsb0JBQW9CLEVBQUUsS0FBSztTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBOUpVLFdBQVc7a0hBQVgsV0FBVyxjQUZWLE1BQU07O1NBRVAsV0FBVzsyRkFBWCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFrS0QsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFdBQXdCLEVBQUUsV0FBOEIsRUFBRSxXQUFpQztJQUM1SCxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2hCLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFDLElBQUksSUFBSTtnQkFDTixXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQcm9maWxlLCBVc2VyLCBVc2VyTWFuYWdlciwgVXNlck1hbmFnZXJTZXR0aW5nc30gZnJvbSAnb2lkYy1jbGllbnQnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rva2VuSGVscGVyU2VydmljZX0gZnJvbSAnLi9Ub2tlbkhlbHBlclNlcnZpY2UnO1xuaW1wb3J0IHtFbnZpcm9ubWVudFZpZXdNb2RlbH0gZnJvbSBcIi4uLy4uL21vZGVsL2Vudmlyb25tZW50c1wiO1xuaW1wb3J0IHtBcHBTZXR0aW5nU2VydmljZX0gZnJvbSBcIi4uL2FwcHNldHRpbmcuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHN0YXRpYyBVU0VSX0xPQURFRF9FVkVOVCA9IFwiVVNFUl9MT0FERURcIjtcbiAgc3RhdGljIFVTRVJfVU5MT0FERURfRVZFTlQgPSBcIlVTRVJfVU5MT0FERURcIjtcblxuICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdXNlck1hbmFnZXIhOiBVc2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSB1c2VyOiBhbnk7XG4gIHB1YmxpYyBzZXR0aW5ncyE6IFVzZXJNYW5hZ2VyU2V0dGluZ3M7XG5cbiAgcHJpdmF0ZSBhY2Nlc3NUb2tlbiE6IE9iamVjdDtcbiAgcHJpdmF0ZSBzaWduaW5nT3V0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsIHByaXZhdGUgdG9rZW5IZWxwZXJTZXJ2aWNlOiBUb2tlbkhlbHBlclNlcnZpY2UpIHtcblxuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZShlbnZpcm9ubWVudDogRW52aXJvbm1lbnRWaWV3TW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmdldENsaWVudFNldHRpbmdzKGVudmlyb25tZW50KTtcbiAgICB0aGlzLnVzZXJNYW5hZ2VyID0gbmV3IFVzZXJNYW5hZ2VyKHRoaXMuc2V0dGluZ3MpO1xuICAgIHRoaXMudXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJMb2FkZWQodXNlciA9PiB7XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG5cbiAgICB0aGlzLnVzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKCgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJJZFN2ciB0b2tlbiBleHBpcmluZyBcIiArIG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyZWQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIklkU3ZyIHRva2VuIGV4cGlyZWQgXCIgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCkpO1xuICAgICAgdGhpcy5sb2dvdXQoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51c2VyTWFuYWdlci5ldmVudHMuYWRkU2lsZW50UmVuZXdFcnJvcihlID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiSWRTdnIgc2lsZW50IHJlbmV3IGVycm9yIFwiICsgZS5tZXNzYWdlICsgbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgIHRoaXMubG9nb3V0KGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJMb2FkZWQodXNlciA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiSWRTdnIgdXNlciBzZXNzaW9uIGlzIHJlYWR5IFwiICsgbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0aGlzLnRva2VuSGVscGVyU2VydmljZS5nZXRQYXlsb2FkRnJvbVRva2VuKHVzZXIuYWNjZXNzX3Rva2VuLCBmYWxzZSk7XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy51c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlclVubG9hZGVkKCgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJJZFN2ciB1c2VyIHNlc3Npb24gaGFzIGVuZGVkIFwiICsgbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgICAgaWYgKCF0aGlzLnNpZ25pbmdPdXQpIHtcbiAgICAgICAgdGhpcy5zdGFydEF1dGhlbnRpY2F0aW9uKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlclNpZ25lZE91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiSWRTdnIgdXNlciBzaWduZWQgb3V0IFwiICsgbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgIHRoaXMubG9nb3V0KGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXNlciA9IGF3YWl0IHRoaXMudXNlck1hbmFnZXIuZ2V0VXNlcigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlciAhPSBudWxsICYmICF0aGlzLnVzZXIuZXhwaXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyKCk6IFByb21pc2U8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy51c2VyTWFuYWdlci5nZXRVc2VyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvZmlsZSgpOiBQcm9maWxlIHtcbiAgICByZXR1cm4gdGhpcy51c2VyLnByb2ZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xhaW1zKCk6IFByb2ZpbGUge1xuICAgIHJldHVybiB0aGlzLnVzZXIucHJvZmlsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy51c2VyICE9IG51bGwpXG4gICAgICByZXR1cm4gYCR7dGhpcy51c2VyLnRva2VuX3R5cGV9ICR7dGhpcy51c2VyLmFjY2Vzc190b2tlbn1gO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldEFjY2Vzc1Rva2VuKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW4gfHwgdGhpcy50b2tlbkhlbHBlclNlcnZpY2UuZ2V0UGF5bG9hZEZyb21Ub2tlbih0aGlzLnVzZXIuYWNjZXNzX3Rva2VuLCBmYWxzZSk7XG4gICAgO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRBdXRoZW50aWNhdGlvbihyZXR1cm5Vcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJbQXV0aFNlcnZpY2VdIHN0YXJ0QXV0aGVudGljYXRpb25cIiwgcmV0dXJuVXJsKTtcbiAgICBhd2FpdCB0aGlzLnVzZXJNYW5hZ2VyLmNsZWFyU3RhbGVTdGF0ZSgpO1xuICAgIGF3YWl0IHRoaXMudXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3Qoe2RhdGE6IHtyZXR1cm5Vcmw6IHJldHVyblVybH19KS5jYXRjaChlcnIgPT4ge1xuICAgICAgLy90aGlzLiRsb2cuZGVidWcoXCJJZFN2ciBzaWduIGluIGZhaWxlZFwiLCBlcnIpO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlQXV0aGVudGljYXRpb24oKTogUHJvbWlzZTxPaWRjLlVzZXI+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwiW0F1dGhTZXJ2aWNlXSBjb21wbGV0ZUF1dGhlbnRpY2F0aW9uXCIpO1xuICAgIGxldCB1c2VyID0gYXdhaXQgbmV3IFByb21pc2U8T2lkYy5Vc2VyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2soKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICByZXNvbHZlKHVzZXIpXG4gICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwdWJsaWMgbG9naW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMudXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3QoKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5ld1Rva2VuKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpO1xuICB9XG5cbiAgcHVibGljIGxvZ291dChzaWdub3V0UmVkaXJlY3Q/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBpZiAoc2lnbm91dFJlZGlyZWN0ID09PSB1bmRlZmluZWQgfHwgc2lnbm91dFJlZGlyZWN0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zaWduaW5nT3V0ID0gdHJ1ZTtcbiAgICAgIHNpZ25vdXRSZWRpcmVjdCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNldHRpbmdzKGVudmlyb25tZW50OiBFbnZpcm9ubWVudFZpZXdNb2RlbCk6IFVzZXJNYW5hZ2VyU2V0dGluZ3Mge1xuICAgIHJldHVybiB7XG4gICAgICBhdXRob3JpdHk6IGVudmlyb25tZW50Py5vcGVuSUQ/LmF1dGhvcml0eSxcbiAgICAgIGNsaWVudF9pZDogZW52aXJvbm1lbnQ/Lm9wZW5JRD8uY2xpZW50X2lkLFxuICAgICAgcmVkaXJlY3RfdXJpOiBlbnZpcm9ubWVudD8ub3BlbklEPy5yZWRpcmVjdF91cmksXG4gICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk6IGVudmlyb25tZW50Py5vcGVuSUQ/LnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcbiAgICAgIHJlc3BvbnNlX3R5cGU6IGVudmlyb25tZW50Py5vcGVuSUQ/LnJlc3BvbnNlX3R5cGUsXG4gICAgICBzY29wZTogZW52aXJvbm1lbnQ/Lm9wZW5JRD8uc2NvcGUsXG4gICAgICBmaWx0ZXJQcm90b2NvbENsYWltczogZW52aXJvbm1lbnQ/Lm9wZW5JRD8uZmlsdGVyUHJvdG9jb2xDbGFpbXMsXG4gICAgICBsb2FkVXNlckluZm86IHRydWUsXG4gICAgICBtb25pdG9yU2Vzc2lvbjogdHJ1ZSxcbiAgICAgIHNpbGVudF9yZWRpcmVjdF91cmk6IGVudmlyb25tZW50Py5vcGVuSUQ/LnNpbGVudF9yZWRpcmVjdF91cmksXG4gICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldzogZW52aXJvbm1lbnQ/Lm9wZW5JRD8uYXV0b21hdGljU2lsZW50UmVuZXcsXG4gICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTogMjAsIC8vZGVmYXVsdCA2MFxuICAgICAgY2hlY2tTZXNzaW9uSW50ZXJ2YWw6IDIwMDAsIC8vZGVmYXVsdCAyMDAwXG4gICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogMjAwMDAsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGlzU2VydmljZVJlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiW0F1dGhTZXJ2aWNlXSBpc1NlcnZpY2VSZWFkeVwiLCB0cnVlKTtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJbQXV0aFNlcnZpY2VdIGlzU2VydmljZVJlYWR5XCIsIGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0aFNlcnZpY2VGYWN0b3J5KGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgYXBwU2V0dGluZ3M6IEFwcFNldHRpbmdTZXJ2aWNlLCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRWaWV3TW9kZWwpIHtcbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBhcHBTZXR0aW5ncy5pc1NlcnZpY2VSZWFkeS5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSlcbiAgICAgICAgYXV0aFNlcnZpY2UuaW5pdGlhbGl6ZShlbnZpcm9ubWVudCk7XG4gICAgfSk7XG4gIH1cbn07Il19
|