@c8y/ngx-components 1018.0.176 → 1018.0.183
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/core/bootstrap/cookie-banner/cookie-banner.service.d.ts +1 -1
- package/core/common/ApplicationOptions.d.ts +2 -0
- package/core/date-time-picker/close-date-picker.directive.d.ts +14 -0
- package/core/date-time-picker/date-time-picker.component.d.ts +7 -2
- package/core/date-time-picker/date-time-picker.module.d.ts +8 -7
- package/core/product-experience/gainsight.service.d.ts +86 -28
- package/core/product-experience/index.d.ts +1 -0
- package/core/product-experience/product-experience.module.d.ts +18 -5
- package/core/product-experience/user-engagements.service.d.ts +109 -0
- package/core/user/user-edit-modal.component.d.ts +33 -6
- package/core/user/user-edit.component.d.ts +6 -11
- package/esm2020/context-dashboard/widget-config.component.mjs +3 -3
- package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
- package/esm2020/core/common/ApplicationOptions.mjs +1 -1
- package/esm2020/core/date-time-picker/close-date-picker.directive.mjs +36 -0
- package/esm2020/core/date-time-picker/date-time-picker.component.mjs +28 -8
- package/esm2020/core/date-time-picker/date-time-picker.module.mjs +4 -3
- package/esm2020/core/product-experience/gainsight.service.mjs +170 -81
- package/esm2020/core/product-experience/index.mjs +2 -1
- package/esm2020/core/product-experience/product-experience.module.mjs +42 -24
- package/esm2020/core/product-experience/user-engagements.service.mjs +174 -0
- package/esm2020/core/user/user-edit-modal.component.mjs +68 -33
- package/esm2020/core/user/user-edit.component.mjs +30 -39
- package/esm2020/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +516 -167
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +511 -161
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +2 -2
- package/package.json +1 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
3
2
|
import { TranslateService } from '@ngx-translate/core';
|
|
4
3
|
import { camelCase, flatMap } from 'lodash-es';
|
|
5
|
-
import { BehaviorSubject, combineLatest, fromEvent } from 'rxjs';
|
|
4
|
+
import { BehaviorSubject, Subject, combineLatest, fromEvent } from 'rxjs';
|
|
6
5
|
import { delay, filter, map, take } from 'rxjs/operators';
|
|
7
6
|
import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
|
|
8
7
|
import { OptionsService } from '../common/options.service';
|
|
@@ -19,8 +18,7 @@ import * as i5 from "@ngx-translate/core";
|
|
|
19
18
|
* tag and
|
|
20
19
|
*/
|
|
21
20
|
export class GainsightService {
|
|
22
|
-
constructor(
|
|
23
|
-
this.document = document;
|
|
21
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
24
22
|
this.appState = appState;
|
|
25
23
|
this.options = options;
|
|
26
24
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -30,6 +28,11 @@ export class GainsightService {
|
|
|
30
28
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
31
29
|
*/
|
|
32
30
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
31
|
+
this.trackingLoaded$ = new Subject();
|
|
32
|
+
/**
|
|
33
|
+
* Gainsight is activated only when the cookie banner is present. If functional cookies are enabled, both personally identifiable information (PII) and required data are sent.
|
|
34
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
35
|
+
*/
|
|
33
36
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
34
37
|
/**
|
|
35
38
|
* The name of the key remained unchanged, but applies to all engagements.
|
|
@@ -41,13 +44,21 @@ export class GainsightService {
|
|
|
41
44
|
this.SCRIPT_EXECUTION_WAIT_TIME = 500;
|
|
42
45
|
this.OPTIONS_KEY_CATEGORY = 'gainsight';
|
|
43
46
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
44
|
-
this.ENGAGEMENTS = 'engagements';
|
|
45
47
|
this.isScriptLoaded = false;
|
|
46
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
51
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
52
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
53
|
+
*/
|
|
47
54
|
async isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
48
55
|
const userGainsightPref = await this.userPreferencesService.get(preferenceName).toPromise();
|
|
49
56
|
return userGainsightPref === false;
|
|
50
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Sets the state of the functional cookie.
|
|
60
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
61
|
+
*/
|
|
51
62
|
setFunctionalCookie(value) {
|
|
52
63
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
53
64
|
if (cookies) {
|
|
@@ -76,56 +87,119 @@ export class GainsightService {
|
|
|
76
87
|
/**
|
|
77
88
|
* Load the script tag and calls the identify function to start the tracking.
|
|
78
89
|
* @param currentTenant The current tenant.
|
|
79
|
-
* @param
|
|
90
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
80
91
|
*/
|
|
81
|
-
async loadTag(currentTenant,
|
|
92
|
+
async loadTag(currentTenant, sendPiiData) {
|
|
82
93
|
const scriptTag = document.createElement('script');
|
|
83
94
|
const key = await this.getGainsightKey();
|
|
84
95
|
if (key && !this.isScriptLoaded) {
|
|
85
96
|
this.loadScriptTag(scriptTag, key);
|
|
86
|
-
|
|
97
|
+
const currentUserStream = this.appState.currentUser;
|
|
98
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
99
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
100
|
+
const sourceStreams = sendPiiData
|
|
101
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
102
|
+
: [currentUserStream, scriptLoadStream];
|
|
103
|
+
combineLatest(sourceStreams)
|
|
87
104
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
88
|
-
.subscribe(
|
|
105
|
+
.subscribe(args => {
|
|
106
|
+
const [user, , versions] = args;
|
|
107
|
+
this.setGlobalContext();
|
|
89
108
|
const instanceId = this.getInstanceIdFromUrl();
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
109
|
+
if (sendPiiData) {
|
|
110
|
+
const versionUI = versions.ui.ngx;
|
|
111
|
+
const versionBE = versions.backend;
|
|
112
|
+
const extendedIdentifyData = {
|
|
113
|
+
user,
|
|
114
|
+
currentTenant,
|
|
115
|
+
instanceId,
|
|
116
|
+
versionUI,
|
|
117
|
+
versionBE
|
|
118
|
+
};
|
|
119
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
123
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
93
124
|
}
|
|
94
125
|
this.isScriptLoaded = true;
|
|
95
126
|
this.tagFunction$.next(this.tagFunction);
|
|
127
|
+
this.trackingLoaded$.next(true);
|
|
96
128
|
});
|
|
97
129
|
}
|
|
98
130
|
}
|
|
99
131
|
/**
|
|
100
132
|
* Identifies the user/account at Gainsight.
|
|
101
|
-
* @param
|
|
102
|
-
* @param
|
|
103
|
-
* @param versionUI The UI version used.
|
|
104
|
-
* @param versionBE The BE version used.
|
|
133
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
134
|
+
* @param identifyData Object containing identification data.
|
|
105
135
|
*/
|
|
106
|
-
identify(
|
|
136
|
+
identify(sendPiiData, identifyData) {
|
|
107
137
|
const windowRef = window;
|
|
108
|
-
const { id: userId, email
|
|
109
|
-
const { name
|
|
110
|
-
const {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
138
|
+
const { id: userId, email } = identifyData.user;
|
|
139
|
+
const { name: tenantID } = identifyData.currentTenant;
|
|
140
|
+
const { instanceId } = identifyData;
|
|
141
|
+
/**
|
|
142
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
143
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
144
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
145
|
+
*
|
|
146
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
147
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
148
|
+
*/
|
|
149
|
+
const requiredIdentify = {
|
|
150
|
+
/**
|
|
151
|
+
* Email was not mandatory form field until 10.14
|
|
152
|
+
*/
|
|
153
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
154
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
155
|
+
tenantID: tenantID,
|
|
156
|
+
email: '--',
|
|
157
|
+
userName: '',
|
|
158
|
+
firstName: '',
|
|
159
|
+
lastName: '',
|
|
160
|
+
domainName: '',
|
|
161
|
+
versionUI: '',
|
|
162
|
+
versionBE: '',
|
|
163
|
+
userLanguage: '',
|
|
164
|
+
instanceId: '',
|
|
165
|
+
externalReference: '',
|
|
166
|
+
userRoles: '',
|
|
167
|
+
customBranding: this.isCustomBranding(),
|
|
168
|
+
fullTracking: sendPiiData
|
|
169
|
+
};
|
|
170
|
+
if (sendPiiData) {
|
|
171
|
+
const { userName, firstName, lastName, roles } = identifyData.user;
|
|
172
|
+
const { customProperties, domainName } = identifyData.currentTenant;
|
|
173
|
+
const { versionUI, versionBE } = identifyData;
|
|
174
|
+
const extendedIdentify = {
|
|
175
|
+
...requiredIdentify,
|
|
176
|
+
email,
|
|
177
|
+
userName,
|
|
178
|
+
firstName,
|
|
179
|
+
lastName,
|
|
180
|
+
domainName,
|
|
181
|
+
versionUI,
|
|
182
|
+
versionBE,
|
|
183
|
+
userLanguage: this.translateService.currentLang,
|
|
184
|
+
instanceId,
|
|
185
|
+
externalReference: customProperties?.externalReference,
|
|
186
|
+
userRoles: this.transformUserRolesToStr(roles?.references)
|
|
187
|
+
};
|
|
188
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
189
|
+
id: `${tenantID}_${instanceId}`,
|
|
190
|
+
instanceId
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
128
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
198
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
199
|
+
* along with its associated properties.
|
|
200
|
+
* @param eventName - Name of the event to be triggered.
|
|
201
|
+
* @param props - Optional properties associated with the event.
|
|
202
|
+
*/
|
|
129
203
|
triggerEvent(eventName, props) {
|
|
130
204
|
if (this.tagFunction && eventName) {
|
|
131
205
|
eventName = this.prepareEventName(eventName);
|
|
@@ -147,38 +221,51 @@ export class GainsightService {
|
|
|
147
221
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
148
222
|
}
|
|
149
223
|
/**
|
|
150
|
-
*
|
|
151
|
-
* The decision to
|
|
152
|
-
*
|
|
224
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
225
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
226
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
153
227
|
*/
|
|
154
|
-
|
|
228
|
+
async shouldSendPiiData() {
|
|
155
229
|
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
156
230
|
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
157
|
-
!this.
|
|
158
|
-
!this.isCustomBranding());
|
|
231
|
+
!(await this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
159
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
235
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
236
|
+
* @param name - Name of the user attribute to be updated.
|
|
237
|
+
* @param value - Value to set for the specified user attribute.
|
|
238
|
+
*/
|
|
160
239
|
updateUserAttribute(name, value) {
|
|
161
240
|
window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'user', { [name]: value });
|
|
162
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
244
|
+
*
|
|
245
|
+
* This method checks multiple conditions:
|
|
246
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
247
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
248
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
249
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
250
|
+
*
|
|
251
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
252
|
+
*/
|
|
163
253
|
async canEditProductExperienceSettings() {
|
|
164
254
|
const currentTenant = this.appState.currentTenant.value;
|
|
165
255
|
const { customProperties } = currentTenant;
|
|
256
|
+
if (this.isTrackingDisabled() ||
|
|
257
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
166
260
|
const gainsightKey = !!this.gainsightKey || !!(await this.getGainsightKey());
|
|
167
261
|
return (gainsightKey &&
|
|
168
262
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
169
|
-
|
|
170
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
171
|
-
!this.isCustomBranding());
|
|
172
|
-
}
|
|
173
|
-
switchGainsightEngagementsVisibility(showGainsightEngagements) {
|
|
174
|
-
if (showGainsightEngagements) {
|
|
175
|
-
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
176
|
-
this.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
180
|
-
this.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
263
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
181
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Sets the global context for Gainsight with the current application name.
|
|
267
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
268
|
+
*/
|
|
182
269
|
setGlobalContext() {
|
|
183
270
|
const currentAppState = this.appState.state$.value;
|
|
184
271
|
const currentAppName = currentAppState.app.name;
|
|
@@ -190,18 +277,31 @@ export class GainsightService {
|
|
|
190
277
|
}
|
|
191
278
|
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
192
279
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
280
|
+
/**
|
|
281
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
282
|
+
*
|
|
283
|
+
* @param customProperties - The custom properties of the tenant.
|
|
284
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
285
|
+
*/
|
|
286
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
287
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
288
|
+
return gainsightEnabled === false;
|
|
201
289
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
290
|
+
/**
|
|
291
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
292
|
+
*
|
|
293
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
294
|
+
*/
|
|
295
|
+
isCustomBranding() {
|
|
296
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
297
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Determines if tracking is disabled based on the application options.
|
|
301
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
302
|
+
*/
|
|
303
|
+
isTrackingDisabled() {
|
|
304
|
+
return this.options.disableTracking === true;
|
|
205
305
|
}
|
|
206
306
|
prepareEventName(baseEventName) {
|
|
207
307
|
return baseEventName
|
|
@@ -212,14 +312,6 @@ export class GainsightService {
|
|
|
212
312
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
213
313
|
}
|
|
214
314
|
}
|
|
215
|
-
isGainsightDisabled(customProperties) {
|
|
216
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
217
|
-
return gainsightEnabled === false;
|
|
218
|
-
}
|
|
219
|
-
isCustomBranding() {
|
|
220
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
221
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
222
|
-
}
|
|
223
315
|
loadScriptTag(scriptTag, key) {
|
|
224
316
|
try {
|
|
225
317
|
const windowRef = window;
|
|
@@ -282,15 +374,12 @@ export class GainsightService {
|
|
|
282
374
|
return enTranslation;
|
|
283
375
|
}
|
|
284
376
|
}
|
|
285
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
377
|
+
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: i1.AppStateService }, { token: i2.OptionsService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
286
378
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
287
379
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
288
380
|
type: Injectable,
|
|
289
381
|
args: [{
|
|
290
382
|
providedIn: 'root'
|
|
291
383
|
}]
|
|
292
|
-
}], ctorParameters: function () { return [{ type:
|
|
293
|
-
type: Inject,
|
|
294
|
-
args: [Document]
|
|
295
|
-
}] }, { type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7Ozs7OztBQVk3Rjs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBdUIzQixZQUM0QixRQUFrQixFQUNwQyxRQUF5QixFQUN6QixPQUF1QixFQUN2QixtQkFBd0MsRUFDeEMsc0JBQThDLEVBQzlDLGdCQUFrQztRQUxoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFD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dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXN0b21Qcm9wZXJ0aWVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFB4RXZlbnREYXRhIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuXG5pbnRlcmZhY2UgVXNlclJvbGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb2xlIHtcbiAgcm9sZTogVXNlclJvbGU7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgR2FpbnNpZ2h0IGludGVncmF0aW9uLiBJdCBhbGxvd3MgdG8gbG9hZCB0aGVcbiAqIHRhZyBhbmRcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2FpbnNpZ2h0U2VydmljZSB7XG4gIC8qKlxuICAgKiBBIHN1YmplY3QgdGhhdCBlbWl0cyB0aGUgdGFnIGZ1bmN0aW9uIGFzIHNvb24gYXMgYSBuZXcgdGFnIGlzIHNldC5cbiAgICovXG4gIHRhZ0Z1bmN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgcmVhZG9ubHkgVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZID0gJ2dhaW5zaWdodEVuYWJsZWQnO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGtleSByZW1haW5lZCB1bmNoYW5nZWQsIGJ1dCBhcHBsaWVzIHRvIGFsbCBlbmdhZ2VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IFVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSA9ICdnYWluc2lnaHRCb3RFbmFibGVkJztcbiAgcmVhZG9ubHkgSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEID0gJ2hpZGUtZ3MtYm90JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfVVJMID0gJ3dlYi1zZGsuYXB0cmluc2ljLmNvbS9hcGkvYXB0cmluc2ljLmpzP2E9JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfR0xPQkFMX1NDT1BFID0gJ2FwdHJpbnNpYyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUgPSA1MDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1BUSU9OU19LRVlfQ0FURUdPUlkgPSAnZ2FpbnNpZ2h0JztcbiAgcHJpdmF0ZSByZWFkb25seSBPUFRJT05TX0tFWV9OQU1FID0gJ2FwaS5rZXknO1xuICBwcml2YXRlIHJlYWRvbmx5IEVOR0FHRU1FTlRTID0gJ2VuZ2FnZW1lbnRzJztcbiAgcHJpdmF0ZSBpc1NjcmlwdExvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdhaW5zaWdodEtleTogc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIGNhY2hlZExhbmd1YWdlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChEb2N1bWVudCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIGlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMocHJlZmVyZW5jZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVzZXJHYWluc2lnaHRQcmVmID0gYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChwcmVmZXJlbmNlTmFtZSkudG9Qcm9taXNlKCk7XG4gICAgcmV0dXJuIHVzZXJHYWluc2lnaHRQcmVmID09PSBmYWxzZTtcbiAgfVxuXG4gIHNldEZ1bmN0aW9uYWxDb29raWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb29raWVzID0gdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICAgIGlmIChjb29raWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb29raWVzKS5mb3JFYWNoKGNvb2tpZU5hbWUgPT4ge1xuICAgICAgICBpZiAoY29va2llTmFtZSA9PT0gJ2Z1bmN0aW9uYWwnKSB7XG4gICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXB0Q29va2llTm90aWNlJywgSlNPTi5zdHJpbmdpZnkoY29va2llcykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEdhaW5zaWdodEtleSgpIHtcbiAgICB0aGlzLmdhaW5zaWdodEtleSA9XG4gICAgICB0aGlzLm9wdGlvbnMuZ2FpbnNpZ2h0S2V5IHx8XG4gICAgICAoYXdhaXQgdGhpcy5vcHRpb25zLmdldFN5c3RlbU9wdGlvbih0aGlzLk9QVElPTlNfS0VZX0NBVEVHT1JZLCB0aGlzLk9QVElPTlNfS0VZX05BTUUpKTtcbiAgICByZXR1cm4gdGhpcy5nYWluc2lnaHRLZXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFnIGdsb2JhbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB1c2VyXG4gICAqIG9yIGFkZCBzcGVjaWFsIGV2ZW50cy5cbiAgICovXG4gIGdldCB0YWdGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc2NyaXB0IHRhZyBhbmQgY2FsbHMgdGhlIGlkZW50aWZ5IGZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSB0cmFja2luZy5cbiAgICogQHBhcmFtIGN1cnJlbnRUZW5hbnQgVGhlIGN1cnJlbnQgdGVuYW50LlxuICAgKiBAcGFyYW0gaWRlbnRpZnkgSWYgc2V0IHRvIGZhbHNlLCBvbmx5IHRoZSB0YWcgaXMgbG9hZGVkLlxuICAgKi9cbiAgYXN5bmMgbG9hZFRhZyhjdXJyZW50VGVuYW50LCBpZGVudGlmeSA9IHRydWUpIHtcbiAgICBjb25zdCBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpO1xuXG4gICAgaWYgKGtleSAmJiAhdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgdGhpcy5sb2FkU2NyaXB0VGFnKHNjcmlwdFRhZywga2V5KTtcbiAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIsXG4gICAgICAgIGZyb21FdmVudChzY3JpcHRUYWcsICdsb2FkJyksXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zLmJhY2tlbmQpLFxuICAgICAgICAgIG1hcCgoeyB2ZXJzaW9ucyB9KSA9PiB2ZXJzaW9ucyksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlbGF5KHRoaXMuU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUpLFxuICAgICAgICAgIGZpbHRlcigoW3VzZXIsIHNjcmlwdEV2ZW50XSkgPT4gISEoc2NyaXB0RXZlbnQgJiYgdXNlcikpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoW3VzZXIsICwgdmVyc2lvbnNdKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VJZCA9IHRoaXMuZ2V0SW5zdGFuY2VJZEZyb21VcmwoKTtcbiAgICAgICAgICBpZiAoaWRlbnRpZnkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeSh1c2VyLCBjdXJyZW50VGVuYW50LCBpbnN0YW5jZUlkLCB2ZXJzaW9ucy51aS5uZ3gsIHZlcnNpb25zLmJhY2tlbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRhZ0Z1bmN0aW9uJC5uZXh0KHRoaXMudGFnRnVuY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgdXNlci9hY2NvdW50IGF0IEdhaW5zaWdodC5cbiAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdGVuYW50IFRoZSB0ZW5hbnQgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdmVyc2lvblVJIFRoZSBVSSB2ZXJzaW9uIHVzZWQuXG4gICAqIEBwYXJhbSB2ZXJzaW9uQkUgVGhlIEJFIHZlcnNpb24gdXNlZC5cbiAgICovXG4gIGlkZW50aWZ5KHVzZXIsIHRlbmFudCwgaW5zdGFuY2VJZCwgdmVyc2lvblVJPywgdmVyc2lvbkJFPykge1xuICAgIGNvbnN0IHdpbmRvd1JlZiA9IHdpbmRvdyBhcyBhbnk7XG4gICAgY29uc3QgeyBpZDogdXNlcklkLCBlbWFpbCwgdXNlck5hbWUsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJvbGVzIH0gPSB1c2VyO1xuICAgIGNvbnN0IHsgbmFtZSwgY3VzdG9tUHJvcGVydGllcywgZG9tYWluTmFtZSB9ID0gdGVuYW50O1xuICAgIGNvbnN0IHsgZXh0ZXJuYWxSZWZlcmVuY2UgfSA9IGN1c3RvbVByb3BlcnRpZXMgfHwge307XG4gICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0oXG4gICAgICAnaWRlbnRpZnknLFxuICAgICAge1xuICAgICAgICBpZDogYCR7dXNlcklkfV8ke25hbWV9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgICBlbWFpbCxcbiAgICAgICAgdXNlck5hbWUsXG4gICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWUsXG4gICAgICAgIHZlcnNpb25VSSxcbiAgICAgICAgdmVyc2lvbkJFLFxuICAgICAgICB1c2VyTGFuZ3VhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyxcbiAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2UsXG4gICAgICAgIHVzZXJSb2xlczogdGhpcy50cmFuc2Zvcm1Vc2VyUm9sZXNUb1N0cihyb2xlcz8ucmVmZXJlbmNlcylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBgJHtuYW1lfV8ke2luc3RhbmNlSWR9YCxcbiAgICAgICAgaW5zdGFuY2VJZFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BzPzogUHhFdmVudERhdGEpIHtcbiAgICBpZiAodGhpcy50YWdGdW5jdGlvbiAmJiBldmVudE5hbWUpIHtcbiAgICAgIGV2ZW50TmFtZSA9IHRoaXMucHJlcGFyZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgdGhpcy50YWdGdW5jdGlvbigndHJhY2snLCBldmVudE5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVUb0VuZ2xpc2godGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3VycmVudExhbmcgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcblxuICAgIGlmIChjdXJyZW50TGFuZyA9PT0gJ2VuJykge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudExhbmcgJiYgY3VycmVudExhbmcgIT09IHRoaXMuY2FjaGVkTGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zKSB7XG4gICAgICB0aGlzLmNhY2hlZExhbmd1YWdlID0gY3VycmVudExhbmc7XG4gICAgICB0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zID0gdGhpcy5nZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5UcmFuc2xhdGlvbih0ZXh0VG9UcmFuc2xhdGUsIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgR2FpbnNpZ2h0J3MgdGFnIHNob3VsZCBiZSBsb2FkZWQuXG4gICAqIFRoZSBkZWNpc2lvbiB0byBsb2FkIEdhaW5zaWdodCB3aWxsIGRlcGVuZCBvbiBjdXN0b20gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25hbCBjb29raWVzLlxuICAgKiBAcGFyYW0gY3VzdG9tUHJvcGVydGllcyBUZW5hbnQncyBjdXN0b21Qcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2hvdWxkTG9hZEdhaW5zaWdodFRhZyhjdXN0b21Qcm9wZXJ0aWVzOiBJQ3VzdG9tUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNDb25maWdDb29raWVQcmVmZXJlbmNlc0RlZmluZWQoKSAmJlxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKSAmJlxuICAgICAgIXRoaXMuaXNHYWluc2lnaHREaXNhYmxlZChjdXN0b21Qcm9wZXJ0aWVzKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVVzZXJBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB3aW5kb3dbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXT8uKCdzZXQnLCAndXNlcicsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGNhbkVkaXRQcm9kdWN0RXhwZXJpZW5jZVNldHRpbmdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWU7XG4gICAgY29uc3QgeyBjdXN0b21Qcm9wZXJ0aWVzIH0gPSBjdXJyZW50VGVuYW50O1xuXG4gICAgY29uc3QgZ2FpbnNpZ2h0S2V5ID0gISF0aGlzLmdhaW5zaWdodEtleSB8fCAhIShhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpKTtcblxuICAgIHJldHVybiAoXG4gICAgICBnYWluc2lnaHRLZXkgJiZcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0NvbmZpZ0Nvb2tpZVByZWZlcmVuY2VzRGVmaW5lZCgpICYmXG4gICAgICAhdGhpcy5pc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXMpICYmXG4gICAgICAhIXRoaXMuY29va2llQmFubmVyU2VydmljZS5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHN3aXRjaEdhaW5zaWdodEVuZ2FnZW1lbnRzVmlzaWJpbGl0eShzaG93R2FpbnNpZ2h0RW5nYWdlbWVudHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzKSB7XG4gICAgICB0aGlzLnJlbW92ZUhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lELCAnI2FwdC13aWRnZXQgeyBkaXNwbGF5Om5vbmUgfScpO1xuICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCBmYWxzZSk7XG4gIH1cblxuICBzZXRHbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBcHBTdGF0ZSA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gY3VycmVudEFwcFN0YXRlLmFwcC5uYW1lO1xuXG4gICAgd2luZG93W3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0/Lignc2V0JywgJ2dsb2JhbENvbnRleHQnLCB7IHByb2plY3ROYW1lOiBjdXJyZW50QXBwTmFtZSB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHVzZXJSb2xlcz86IFJvbGVbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF1c2VyUm9sZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcCh1c2VyUm9sZXMsICh1c2VyUm9sZTogeyByb2xlOiBVc2VyUm9sZSB9KSA9PiB1c2VyUm9sZS5yb2xlLm5hbWUpLmpvaW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSGlkaW5nU3R5bGUoc3R5bGVJZDogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlSWQ7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVIaWRpbmdTdHlsZShzdHlsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCk7XG4gICAgc3R5bGU/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnROYW1lKGJhc2VFdmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJhc2VFdmVudE5hbWVcbiAgICAgIC5zcGxpdCgnOicpXG4gICAgICAubWFwKGV2ZW50TmFtZVBhcnQgPT4gY2FtZWxDYXNlKHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0KSkpXG4gICAgICAuam9pbignOicpO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVHJhbnNsYXRpb25Db250ZXh0KGV2ZW50TmFtZVBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXZlbnROYW1lUGFydC5yZXBsYWNlKC9gW1xcd1xcV10qYC9nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXM6IElDdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgZ2FpbnNpZ2h0RW5hYmxlZCA9IGN1c3RvbVByb3BlcnRpZXMgJiYgY3VzdG9tUHJvcGVydGllcy5nYWluc2lnaHRFbmFibGVkO1xuICAgIHJldHVybiBnYWluc2lnaHRFbmFibGVkID09PSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDdXN0b21CcmFuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBicmFuZGluZ0Nzc1ZhcnMgPSB0aGlzLm9wdGlvbnMuZ2V0KCdicmFuZGluZ0Nzc1ZhcnMnKSB8fCB7fTtcbiAgICByZXR1cm4gISFicmFuZGluZ0Nzc1ZhcnNbJ2JyYW5kLWxvZ28taW1nJ107XG4gIH1cblxuICBwcml2YXRlIGxvYWRTY3JpcHRUYWcoc2NyaXB0VGFnOiBIVE1MU2NyaXB0RWxlbWVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2luZG93UmVmID0gd2luZG93IGFzIGFueTtcbiAgICAgIGNvbnN0IGZpcnN0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgY29uc3QgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgIGNvbnN0IGdhaW5zaWdodEdsb2JhbFNjb3BlID0gdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFO1xuICAgICAgc2NyaXB0VGFnLnNyYyA9IGAke3Byb3RvY29sfS8vJHt0aGlzLkdBSU5TSUdIVF9VUkx9JHtrZXl9YDtcbiAgICAgICh3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSA9XG4gICAgICAgIHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdIHx8XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmx5LWFycm93LWZ1bmN0aW9uc1xuICAgICAgICBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICh3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgPSB3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgfHwgW10pLnB1c2goYXJncyk7XG4gICAgICAgIH0pLFxuICAgICAgICAod2luZG93UmVmW2dhaW5zaWdodEdsb2JhbFNjb3BlXS5wID0ga2V5KTtcbiAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICBmaXJzdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHRUYWcsIGZpcnN0VGFnKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBHYWluc2lnaHQgUFgnLCBleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnN0YW5jZUlkRnJvbVVybCgpIHtcbiAgICBjb25zdCBob3N0TmFtZSA9IGxvY2F0aW9uLmhvc3RuYW1lO1xuICAgIHJldHVybiBob3N0TmFtZS5zdWJzdHJpbmcoaG9zdE5hbWUuaW5kZXhPZignLicpICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgdGhlIHRyYW5zbGF0aW9uIG9iamVjdC5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogeyBBZGQgd2lkZ2V0OiBcIldpZGdldCBoaW56dWbDvGdlblwiIH1cbiAgICpcbiAgICogd2lsbCBiZSBjaGFuZ2VkIHRvOlxuICAgKlxuICAgKiB7IFdpZGdldCBoaW56dWbDvGdlbjogXCJBZGQgd2lkZ2V0XCIgfVxuICAgKlxuICAgKiBAcGFyYW0gY3VycmVudExhbmcgTGFuZ3VhZ2Ugd2hvc2UgdHJhbnNsYXRlZCB2YWx1ZXMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgb2JqZWN0IGtleS5cbiAgICogQHJldHVybnMgUmV0dXJucyBhbiBpbnZlcnRlZCBvYmplY3Qgd2hlcmUgdGhlIGtleXMgaGF2ZSBiZWVuIHN3YXBwZWQgd2l0aCB0aGUgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0b3JlLnRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ107XG5cbiAgICBjb25zdCBzd2FwcGVkS2V5c1dpdGhWYWx1ZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHN3YXBwZWRLZXlzV2l0aFZhbHVlc1t0cmFuc2xhdGlvbnNba2V5XV0gPSBrZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN3YXBwZWRLZXlzV2l0aFZhbHVlcztcbiAgfVxuXG4gIC8qKlRyYW5zbGF0ZXMgc3RyaW5nIGJhY2sgaW50byBFbmdsaXNoLlxuICAgKiBJZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBsYW5ndWFnZSBpcyBzZXQgdG8gRW5nbGlzaCwgdGhlIHN0cmluZyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB0ZXh0VG9UcmFuc2xhdGUgc3RyaW5nIHRvIHRyYW5zbGF0ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgc3RyaW5nIHRyYW5zbGF0ZWQgaW50byBFbmdsaXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFblRyYW5zbGF0aW9uKFxuICAgIHRleHRUb1RyYW5zbGF0ZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBlblRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW3RleHRUb1RyYW5zbGF0ZV07XG4gICAgaWYgKCFlblRyYW5zbGF0aW9uKSB7XG4gICAgICByZXR1cm4gdGV4dFRvVHJhbnNsYXRlO1xuICAgIH1cbiAgICAvKiogcmVtb3ZlIHRyYW5zbGF0aW9uIGNvbnRleHQgKi9cbiAgICBjb25zdCByZWdleCA9IC9cXGAoLio/KVxcYC87XG4gICAgZW5UcmFuc2xhdGlvbiA9IGVuVHJhbnNsYXRpb24ucmVwbGFjZShyZWdleCwgJycpO1xuXG4gICAgcmV0dXJuIGVuVHJhbnNsYXRpb247XG4gIH1cbn1cbiJdfQ==
|
|
384
|
+
}], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
|
|
385
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7Ozs7Ozs7QUF1QjdGOzs7R0FHRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUEyQjNCLFlBQ1UsUUFBeUIsRUFDekIsT0FBdUIsRUFDdkIsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxnQkFBa0M7UUFKbEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUEvQjVDOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxJ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LENBQUM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEMscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUN0QixlQUF1QixFQUN2QixZQUF1QztRQUV2QyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixPQUFPLGVBQWUsQ0FBQztTQUN4QjtRQUNELGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDMUIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7OzZHQWphVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXJyZW50VGVuYW50LCBJQ3VzdG9tUHJvcGVydGllcywgSUlkZW50aWZpZWQsIElVc2VyIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFB4RXZlbnREYXRhIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuXG5pbnRlcmZhY2UgVXNlclJvbGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHByb3BlcnR5IHVzZXIgVGhlIHVzZXIgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICogQHByb3BlcnR5IHRlbmFudCBUaGUgdGVuYW50IHdoaWNoIGlzIGdpdmVuIHRvIEdhaW5zaWdodC5cbiAqIEBwcm9wZXJ0eSBpbnN0YW5jZUlkIEV4dHJhY3RlZCBkb21haW4gcGFydCBvZiBhbiBVUkwuXG4gKiBAcHJvcGVydHkgdmVyc2lvblVJIFRoZSBVSSB2ZXJzaW9uIHVzZWQuXG4gKiBAcHJvcGVydHkgdmVyc2lvbkJFIFRoZSBCRSB2ZXJzaW9uIHVzZWQuXG4gKi9cbmludGVyZmFjZSBJZGVudGlmeURhdGEge1xuICB1c2VyOiBJVXNlcjtcbiAgY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQ7XG4gIGluc3RhbmNlSWQ6IHN0cmluZztcbiAgdmVyc2lvblVJPzogc3RyaW5nO1xuICB2ZXJzaW9uQkU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgR2FpbnNpZ2h0IGludGVncmF0aW9uLiBJdCBhbGxvd3MgdG8gbG9hZCB0aGVcbiAqIHRhZyBhbmRcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2FpbnNpZ2h0U2VydmljZSB7XG4gIC8qKlxuICAgKiBBIHN1YmplY3QgdGhhdCBlbWl0cyB0aGUgdGFnIGZ1bmN0aW9uIGFzIHNvb24gYXMgYSBuZXcgdGFnIGlzIHNldC5cbiAgICovXG4gIHRhZ0Z1bmN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHRyYWNraW5nTG9hZGVkJDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIEdhaW5zaWdodCBpcyBhY3RpdmF0ZWQgb25seSB3aGVuIHRoZSBjb29raWUgYmFubmVyIGlzIHByZXNlbnQuIElmIGZ1bmN0aW9uYWwgY29va2llcyBhcmUgZW5hYmxlZCwgYm90aCBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKSBhbmQgcmVxdWlyZWQgZGF0YSBhcmUgc2VudC5cbiAgICogT3RoZXJ3aXNlLCBvbmx5IHRoZSByZXF1aXJlZCBkYXRhIGlzIHRyYW5zbWl0dGVkIGR1cmluZyB0aGUgaWRlbnRpdHkgc3RlcCBleGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSBVU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVkgPSAnZ2FpbnNpZ2h0RW5hYmxlZCc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUga2V5IHJlbWFpbmVkIHVuY2hhbmdlZCwgYnV0IGFwcGxpZXMgdG8gYWxsIGVuZ2FnZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfRU5HQUdFTUVOVFNfS0VZID0gJ2dhaW5zaWdodEJvdEVuYWJsZWQnO1xuICByZWFkb25seSBISURFX0dBSU5TSUdIVF9CT1RfU1RZTEVfSUQgPSAnaGlkZS1ncy1ib3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IEdBSU5TSUdIVF9VUkwgPSAnd2ViLXNkay5hcHRyaW5zaWMuY29tL2FwaS9hcHRyaW5zaWMuanM/YT0nO1xuICBwcml2YXRlIHJlYWRvbmx5IEdBSU5TSUdIVF9HTE9CQUxfU0NPUEUgPSAnYXB0cmluc2ljJztcbiAgcHJpdmF0ZSByZWFkb25seSBTQ1JJUFRfRVhFQ1VUSU9OX1dBSVRfVElNRSA9IDUwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBPUFRJT05TX0tFWV9DQVRFR09SWSA9ICdnYWluc2lnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IE9QVElPTlNfS0VZX05BTUUgPSAnYXBpLmtleSc7XG4gIHByaXZhdGUgaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnYWluc2lnaHRLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBjYWNoZWRSZXZlcnRlZFRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSBjYWNoZWRMYW5ndWFnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29va2llQmFubmVyU2VydmljZTogQ29va2llQmFubmVyU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgR2FpbnNpZ2h0IHByZWZlcmVuY2UgaXMgZGlzYWJsZWQgaW4gdXNlciBwcmVmZXJlbmNlcy5cbiAgICogQHBhcmFtIHByZWZlcmVuY2VOYW1lIC0gTmFtZSBvZiB0aGUgR2FpbnNpZ2h0IHByZWZlcmVuY2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcHJlZmVyZW5jZSBpcyBkaXNhYmxlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBhc3luYyBpc0dhaW5zaWdodFByZWZlcmVuY2VEaXNhYmxlZEluVXNlclByZWZlcmVuY2VzKHByZWZlcmVuY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB1c2VyR2FpbnNpZ2h0UHJlZiA9IGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5nZXQocHJlZmVyZW5jZU5hbWUpLnRvUHJvbWlzZSgpO1xuXG4gICAgcmV0dXJuIHVzZXJHYWluc2lnaHRQcmVmID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZnVuY3Rpb25hbCBjb29raWUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEEgYm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmdW5jdGlvbmFsIGNvb2tpZSBzaG91bGQgYmUgZW5hYmxlZCAoYHRydWVgKSBvciBkaXNhYmxlZCAoYGZhbHNlYCkuXG4gICAqL1xuICBzZXRGdW5jdGlvbmFsQ29va2llKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29va2llcyA9IHRoaXMuY29va2llQmFubmVyU2VydmljZS5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKTtcbiAgICBpZiAoY29va2llcykge1xuICAgICAgT2JqZWN0LmtleXMoY29va2llcykuZm9yRWFjaChjb29raWVOYW1lID0+IHtcbiAgICAgICAgaWYgKGNvb2tpZU5hbWUgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgICAgIGNvb2tpZXNbY29va2llTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FjY2VwdENvb2tpZU5vdGljZScsIEpTT04uc3RyaW5naWZ5KGNvb2tpZXMpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRHYWluc2lnaHRLZXkoKSB7XG4gICAgdGhpcy5nYWluc2lnaHRLZXkgPVxuICAgICAgdGhpcy5vcHRpb25zLmdhaW5zaWdodEtleSB8fFxuICAgICAgKGF3YWl0IHRoaXMub3B0aW9ucy5nZXRTeXN0ZW1PcHRpb24odGhpcy5PUFRJT05TX0tFWV9DQVRFR09SWSwgdGhpcy5PUFRJT05TX0tFWV9OQU1FKSk7XG4gICAgcmV0dXJuIHRoaXMuZ2FpbnNpZ2h0S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhZyBnbG9iYWwgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdXNlclxuICAgKiBvciBhZGQgc3BlY2lhbCBldmVudHMuXG4gICAqL1xuICBnZXQgdGFnRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHNjcmlwdCB0YWcgYW5kIGNhbGxzIHRoZSBpZGVudGlmeSBmdW5jdGlvbiB0byBzdGFydCB0aGUgdHJhY2tpbmcuXG4gICAqIEBwYXJhbSBjdXJyZW50VGVuYW50IFRoZSBjdXJyZW50IHRlbmFudC5cbiAgICogQHBhcmFtIHNlbmRQaWlEYXRhIEZsYWcgZm9yIHNlbmRpbmcgcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gKFBJSSkgZHVyaW5nIGlkZW50aWZpY2F0aW9uIGluIEdhaW5zaWdodC5cbiAgICovXG4gIGFzeW5jIGxvYWRUYWcoY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQsIHNlbmRQaWlEYXRhOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5nZXRHYWluc2lnaHRLZXkoKTtcblxuICAgIGlmIChrZXkgJiYgIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgIHRoaXMubG9hZFNjcmlwdFRhZyhzY3JpcHRUYWcsIGtleSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyU3RyZWFtID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcjtcbiAgICAgIGNvbnN0IHNjcmlwdExvYWRTdHJlYW0gPSBmcm9tRXZlbnQoc2NyaXB0VGFnLCAnbG9hZCcpO1xuICAgICAgY29uc3QgdmVyc2lvblN0cmVhbSA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoeyB2ZXJzaW9ucyB9KSA9PiB2ZXJzaW9ucy5iYWNrZW5kKSxcbiAgICAgICAgbWFwKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlU3RyZWFtcyA9IHNlbmRQaWlEYXRhXG4gICAgICAgID8gW2N1cnJlbnRVc2VyU3RyZWFtLCBzY3JpcHRMb2FkU3RyZWFtLCB2ZXJzaW9uU3RyZWFtXVxuICAgICAgICA6IFtjdXJyZW50VXNlclN0cmVhbSwgc2NyaXB0TG9hZFN0cmVhbV07XG5cbiAgICAgIGNvbWJpbmVMYXRlc3Qoc291cmNlU3RyZWFtcylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVsYXkodGhpcy5TQ1JJUFRfRVhFQ1VUSU9OX1dBSVRfVElNRSksXG4gICAgICAgICAgZmlsdGVyKChbdXNlciwgc2NyaXB0RXZlbnRdKSA9PiAhIShzY3JpcHRFdmVudCAmJiB1c2VyKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGFyZ3MgPT4ge1xuICAgICAgICAgIGNvbnN0IFt1c2VyLCAsIHZlcnNpb25zXSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5zZXRHbG9iYWxDb250ZXh0KCk7XG5cbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUlkID0gdGhpcy5nZXRJbnN0YW5jZUlkRnJvbVVybCgpO1xuICAgICAgICAgIGlmIChzZW5kUGlpRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgdmVyc2lvblVJOiBzdHJpbmcgPSB2ZXJzaW9ucy51aS5uZ3g7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uQkU6IHN0cmluZyA9IHZlcnNpb25zLmJhY2tlbmQ7XG4gICAgICAgICAgICBjb25zdCBleHRlbmRlZElkZW50aWZ5RGF0YTogSWRlbnRpZnlEYXRhID0ge1xuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICBjdXJyZW50VGVuYW50LFxuICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB2ZXJzaW9uVUksXG4gICAgICAgICAgICAgIHZlcnNpb25CRVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZnkoc2VuZFBpaURhdGEsIGV4dGVuZGVkSWRlbnRpZnlEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRJZGVudGlmeURhdGE6IElkZW50aWZ5RGF0YSA9IHsgdXNlciwgY3VycmVudFRlbmFudCwgaW5zdGFuY2VJZCB9O1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeShzZW5kUGlpRGF0YSwgcmVxdWlyZWRJZGVudGlmeURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRhZ0Z1bmN0aW9uJC5uZXh0KHRoaXMudGFnRnVuY3Rpb24pO1xuICAgICAgICAgIHRoaXMudHJhY2tpbmdMb2FkZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSB1c2VyL2FjY291bnQgYXQgR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gc2VuZFBpaURhdGEgRmxhZyBmb3Igc2VuZGluZyBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIGlkZW50aWZ5RGF0YSBPYmplY3QgY29udGFpbmluZyBpZGVudGlmaWNhdGlvbiBkYXRhLlxuICAgKi9cbiAgaWRlbnRpZnkoc2VuZFBpaURhdGE6IGJvb2xlYW4sIGlkZW50aWZ5RGF0YTogSWRlbnRpZnlEYXRhKSB7XG4gICAgY29uc3Qgd2luZG93UmVmID0gd2luZG93IGFzIGFueTtcbiAgICBjb25zdCB7IGlkOiB1c2VySWQsIGVtYWlsIH0gPSBpZGVudGlmeURhdGEudXNlcjtcbiAgICBjb25zdCB7IG5hbWU6IHRlbmFudElEIH0gPSBpZGVudGlmeURhdGEuY3VycmVudFRlbmFudDtcbiAgICBjb25zdCB7IGluc3RhbmNlSWQgfSA9IGlkZW50aWZ5RGF0YTtcblxuICAgIC8qKlxuICAgICAqIFBhc3NpbmcgSUQgaXMgYSBtaW5pbXVtIHJlcXVpcmVkIGRhdGEgdG8gbWFrZSBhbiBpZGVudGlmeSBjYWxsIHRvIEdhaW5zaWdodC5cbiAgICAgKiBpc1VzZXJDcmVhdGVkQWZ0ZXJBbm9ueW1pemF0aW9uV2FzQWN0aXZhdGVkIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gbGF0ZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiB1c2VycyBjcmVhdGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZGF0YSBhbm9ueW1pemF0aW9uIGRvbmUgYnkgR2FpbnNpZ2h0LlxuICAgICAqIHRlbmFudElEIFVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0ZW5hbnRzIHdoZW4gc2FtZSBlbWFpbCBpcyB1c2VkIGZvciBkaWZmZXJlbnQgdGVuYW50cy5cbiAgICAgKlxuICAgICAqIER1ZSB0byBHUyBsaW1pdGF0aW9ucyAoR1MgZG9lcyBub3QgYWxsb3cgY2xlYXJpbmcgdXNlciBhdHRyL3ByZWZlcmVuY2VzIHZpYSB0aGUgR1MgdGFnISksXG4gICAgICogd2UgYWx3YXlzIG5lZWQgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgcmVsYXRlZCB0byBQSUkgdG8gcHJldmVudCBsZWFraW5nIHRoaXMgZGF0YSB0byBHUyB3aGVuIHRoZSB1c2VyIGhhcyBkaXNhYmxlZCBmdW5jdGlvbmFsIGNvb2tpZXMuXG4gICAgICovXG4gICAgY29uc3QgcmVxdWlyZWRJZGVudGlmeSA9IHtcbiAgICAgIC8qKlxuICAgICAgICogRW1haWwgd2FzIG5vdCBtYW5kYXRvcnkgZm9ybSBmaWVsZCB1bnRpbCAxMC4xNFxuICAgICAgICovXG4gICAgICBpZDogZW1haWwgPyBlbWFpbCA6IGAke3VzZXJJZH1fJHt0ZW5hbnRJRH1fJHtpbnN0YW5jZUlkfWAsXG4gICAgICBpc1VzZXJDcmVhdGVkQWZ0ZXJBbm9ueW1pemF0aW9uV2FzQWN0aXZhdGVkOiB0cnVlLFxuICAgICAgdGVuYW50SUQ6IHRlbmFudElELFxuICAgICAgZW1haWw6ICctLScsXG4gICAgICB1c2VyTmFtZTogJycsXG4gICAgICBmaXJzdE5hbWU6ICcnLFxuICAgICAgbGFzdE5hbWU6ICcnLFxuICAgICAgZG9tYWluTmFtZTogJycsXG4gICAgICB2ZXJzaW9uVUk6ICcnLFxuICAgICAgdmVyc2lvbkJFOiAnJyxcbiAgICAgIHVzZXJMYW5ndWFnZTogJycsXG4gICAgICBpbnN0YW5jZUlkOiAnJyxcbiAgICAgIGV4dGVybmFsUmVmZXJlbmNlOiAnJyxcbiAgICAgIHVzZXJSb2xlczogJycsXG4gICAgICBjdXN0b21CcmFuZGluZzogdGhpcy5pc0N1c3RvbUJyYW5kaW5nKCksXG4gICAgICBmdWxsVHJhY2tpbmc6IHNlbmRQaWlEYXRhXG4gICAgfTtcblxuICAgIGlmIChzZW5kUGlpRGF0YSkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSwgcm9sZXMgfSA9IGlkZW50aWZ5RGF0YS51c2VyO1xuICAgICAgY29uc3QgeyBjdXN0b21Qcm9wZXJ0aWVzLCBkb21haW5OYW1lIH0gPSBpZGVudGlmeURhdGEuY3VycmVudFRlbmFudDtcbiAgICAgIGNvbnN0IHsgdmVyc2lvblVJLCB2ZXJzaW9uQkUgfSA9IGlkZW50aWZ5RGF0YTtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRJZGVudGlmeSA9IHtcbiAgICAgICAgLi4ucmVxdWlyZWRJZGVudGlmeSxcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHVzZXJOYW1lLFxuICAgICAgICBmaXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lLFxuICAgICAgICBkb21haW5OYW1lLFxuICAgICAgICB2ZXJzaW9uVUksXG4gICAgICAgIHZlcnNpb25CRSxcbiAgICAgICAgdXNlckxhbmd1YWdlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsXG4gICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgIGV4dGVybmFsUmVmZXJlbmNlOiBjdXN0b21Qcm9wZXJ0aWVzPy5leHRlcm5hbFJlZmVyZW5jZSxcbiAgICAgICAgdXNlclJvbGVzOiB0aGlzLnRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHJvbGVzPy5yZWZlcmVuY2VzKVxuICAgICAgfTtcblxuICAgICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0oJ2lkZW50aWZ5JywgZXh0ZW5kZWRJZGVudGlmeSwge1xuICAgICAgICBpZDogYCR7dGVuYW50SUR9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgICBpbnN0YW5jZUlkXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSgnaWRlbnRpZnknLCByZXF1aXJlZElkZW50aWZ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhbiBldmVudCB0byBiZSByZWNvcmRlZCBieSBHYWluc2lnaHQgUFguXG4gICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBHYWluc2lnaHQgUFgncyB0cmFja2luZyBtZWNoYW5pc20gdG8gbG9nIGEgc3BlY2lmaWMgZXZlbnRcbiAgICogYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gTmFtZSBvZiB0aGUgZXZlbnQgdG8gYmUgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gICAqL1xuICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BzPzogUHhFdmVudERhdGEpIHtcbiAgICBpZiAodGhpcy50YWdGdW5jdGlvbiAmJiBldmVudE5hbWUpIHtcbiAgICAgIGV2ZW50TmFtZSA9IHRoaXMucHJlcGFyZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgdGhpcy50YWdGdW5jdGlvbigndHJhY2snLCBldmVudE5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVUb0VuZ2xpc2godGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3VycmVudExhbmcgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcblxuICAgIGlmIChjdXJyZW50TGFuZyA9PT0gJ2VuJykge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudExhbmcgJiYgY3VycmVudExhbmcgIT09IHRoaXMuY2FjaGVkTGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zKSB7XG4gICAgICB0aGlzLmNhY2hlZExhbmd1YWdlID0gY3VycmVudExhbmc7XG4gICAgICB0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zID0gdGhpcy5nZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5UcmFuc2xhdGlvbih0ZXh0VG9UcmFuc2xhdGUsIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKSBzaG91bGQgYmUgc2VudCB3aGlsZSBsb2FkaW5nIGEgdGFnLlxuICAgKiBUaGUgZGVjaXNpb24gdG8gYWN0aXZhdGUgR2FpbnNpZ2h0IGFuZCBzZW5kIFBJSSByZWxpZXMgb24gd2hldGhlciB0aGUgY29va2llUHJlZmVyZW5jZXMgb3B0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLFxuICAgKiBpZiB0aGUgZnVuY3Rpb25hbCBjb29raWUgaXMgZW5hYmxlZCwgYW5kIGlmIHRoZSB1c2VyIGdyYW50cyBwZXJtaXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgc2hvdWxkU2VuZFBpaURhdGEoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0NvbmZpZ0Nvb2tpZVByZWZlcmVuY2VzRGVmaW5lZCgpICYmXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNGdW5jdGlvbmFsQ29va2llRW5hYmxlZCgpICYmXG4gICAgICAhKGF3YWl0IHRoaXMuaXNHYWluc2lnaHRQcmVmZXJlbmNlRGlzYWJsZWRJblVzZXJQcmVmZXJlbmNlcyhcbiAgICAgICAgdGhpcy5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVlcbiAgICAgICkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc3BlY2lmaWMgdXNlciBhdHRyaWJ1dGUgaW4gdGhlIEdhaW5zaWdodCBnbG9iYWwgc2NvcGUuXG4gICAqIFRoaXMgbWV0aG9kIGludGVyZmFjZXMgd2l0aCB0aGUgR2FpbnNpZ2h0IGdsb2JhbCBvYmplY3QgdG8gc2V0IGEgdXNlcidzIHNwZWNpZmljIGF0dHJpYnV0ZSB3aXRoIGEgcHJvdmlkZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBhdHRyaWJ1dGUgdG8gYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgYXR0cmlidXRlLlxuICAgKi9cbiAgdXBkYXRlVXNlckF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyIHwgYm9vbGVhbik6IHZvaWQge1xuICAgIHdpbmRvd1t0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdPy4oJ3NldCcsICd1c2VyJywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gbW9kaWZ5IEdhaW5zaWdodCBQWCBzZXR0aW5ncy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIG11bHRpcGxlIGNvbmRpdGlvbnM6XG4gICAqIDEuIFdoZXRoZXIgdHJhY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQgZ2xvYmFsbHkgdmlhIGFwcGxpY2F0aW9uIG9wdGlvbnMuXG4gICAqIDIuIFdoZXRoZXIgR2FpbnNpZ2h0IGlzIGRpc2FibGVkIGF0IHRoZSB0ZW5hbnQgbGV2ZWwgdGhyb3VnaCBjdXN0b20gcHJvcGVydGllcy5cbiAgICogMy4gV2hldGhlciBhIEdhaW5zaWdodCBrZXkgaXMgYXZhaWxhYmxlLCBlaXRoZXIgY3VycmVudGx5IGxvYWRlZCBvciBmZXRjaGVkIGFzeW5jaHJvbm91c2x5LlxuICAgKiA0LiBXaGV0aGVyIGNvb2tpZSBwcmVmZXJlbmNlcyBhcmUgZGVmaW5lZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbi4gVHJ1ZSBpbmRpY2F0ZXMgdGhlIHVzZXIgY2FuIGVkaXQgcHJvZHVjdCBleHBlcmllbmNlIHNldHRpbmdzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgY2FuRWRpdFByb2R1Y3RFeHBlcmllbmNlU2V0dGluZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZTtcbiAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1RyYWNraW5nRGlzYWJsZWQoKSB8fFxuICAgICAgdGhpcy5pc0dhaW5zaWdodERpc2FibGVkQXRUZW5hbnRDdXN0b21Qcm9wZXJ0aWVzKGN1c3RvbVByb3BlcnRpZXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGdhaW5zaWdodEtleSA9ICEhdGhpcy5nYWluc2lnaHRLZXkgfHwgISEoYXdhaXQgdGhpcy5nZXRHYWluc2lnaHRLZXkoKSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGdhaW5zaWdodEtleSAmJlxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzQ29uZmlnQ29va2llUHJlZmVyZW5jZXNEZWZpbmVkKCkgJiZcbiAgICAgICEhdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnbG9iYWwgY29udGV4dCBmb3IgR2FpbnNpZ2h0IHdpdGggdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gbmFtZS5cbiAgICogVGhlIGdsb2JhbCBjb250ZXh0IGNhbiBiZSB1dGlsaXplZCBieSBHYWluc2lnaHQgZm9yIHZhcmlvdXMgcHVycG9zZXMsIHN1Y2ggYXMgc2VnbWVudGluZyB1c2Vycy5cbiAgICovXG4gIHNldEdsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEFwcFN0YXRlID0gdGhpcy5hcHBTdGF0ZS5zdGF0ZSQudmFsdWU7XG4gICAgY29uc3QgY3VycmVudEFwcE5hbWUgPSBjdXJyZW50QXBwU3RhdGUuYXBwLm5hbWU7XG5cbiAgICB3aW5kb3dbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXT8uKCdzZXQnLCAnZ2xvYmFsQ29udGV4dCcsIHsgcHJvamVjdE5hbWU6IGN1cnJlbnRBcHBOYW1lIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtVXNlclJvbGVzVG9TdHIodXNlclJvbGVzPzogSUlkZW50aWZpZWRbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF1c2VyUm9sZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcCh1c2VyUm9sZXMsICh1c2VyUm9sZTogeyByb2xlOiBVc2VyUm9sZSB9KSA9PiB1c2VyUm9sZS5yb2xlLm5hbWUpLmpvaW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgR2FpbnNpZ2h0IGlzIGRpc2FibGVkIGJhc2VkIG9uIHRlbmFudCBjdXN0b20gcHJvcGVydGllcy5cbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbVByb3BlcnRpZXMgLSBUaGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIHRlbmFudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBHYWluc2lnaHQgaXMgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzR2FpbnNpZ2h0RGlzYWJsZWRBdFRlbmFudEN1c3RvbVByb3BlcnRpZXMoY3VzdG9tUHJvcGVydGllczogSUN1c3RvbVByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBnYWluc2lnaHRFbmFibGVkID0gY3VzdG9tUHJvcGVydGllcyAmJiBjdXN0b21Qcm9wZXJ0aWVzLmdhaW5zaWdodEVuYWJsZWQ7XG4gICAgcmV0dXJuIGdhaW5zaWdodEVuYWJsZWQgPT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgY3VzdG9tIGJyYW5kaW5nIGlzIGVuYWJsZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYnJhbmQgbG9nby5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBjdXN0b20gYnJhbmRpbmcgaXMgYXBwbGllZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNDdXN0b21CcmFuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBicmFuZGluZ0Nzc1ZhcnMgPSB0aGlzLm9wdGlvbnMuZ2V0KCdicmFuZGluZ0Nzc1ZhcnMnKSB8fCB7fTtcbiAgICByZXR1cm4gISFicmFuZGluZ0Nzc1ZhcnNbJ2JyYW5kLWxvZ28taW1nJ107XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0cmFja2luZyBpcyBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRyYWNraW5nIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIGlzVHJhY2tpbmdEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRpc2FibGVUcmFja2luZyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUV2ZW50TmFtZShiYXNlRXZlbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlRXZlbnROYW1lXG4gICAgICAuc3BsaXQoJzonKVxuICAgICAgLm1hcChldmVudE5hbWVQYXJ0ID0+IGNhbWVsQ2FzZShyZW1vdmVUcmFuc2xhdGlvbkNvbnRleHQoZXZlbnROYW1lUGFydCkpKVxuICAgICAgLmpvaW4oJzonKTtcblxuICAgIGZ1bmN0aW9uIHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGV2ZW50TmFtZVBhcnQucmVwbGFjZSgvYFtcXHdcXFddKmAvZywgJycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFNjcmlwdFRhZyhzY3JpcHRUYWc6IEhUTUxTY3JpcHRFbGVtZW50LCBrZXk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgYW55O1xuICAgICAgY29uc3QgZmlyc3RUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgICBjb25zdCBwcm90b2NvbCA9IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgY29uc3QgZ2FpbnNpZ2h0R2xvYmFsU2NvcGUgPSB0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEU7XG4gICAgICBzY3JpcHRUYWcuc3JjID0gYCR7cHJvdG9jb2x9Ly8ke3RoaXMuR0FJTlNJR0hUX1VSTH0ke2tleX1gO1xuICAgICAgKHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdID1cbiAgICAgICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0gfHxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9ubHktYXJyb3ctZnVuY3Rpb25zXG4gICAgICAgIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgKHdpbmRvd1JlZltnYWluc2lnaHRHbG9iYWxTY29wZV0ucSA9IHdpbmRvd1JlZltnYWluc2lnaHRHbG9iYWxTY29wZV0ucSB8fCBbXSkucHVzaChhcmdzKTtcbiAgICAgICAgfSksXG4gICAgICAgICh3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnAgPSBrZXkpO1xuICAgICAgc2NyaXB0VGFnLmFzeW5jID0gdHJ1ZTtcbiAgICAgIGZpcnN0VGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdFRhZywgZmlyc3RUYWcpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIEdhaW5zaWdodCBQWCcsIGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEluc3RhbmNlSWRGcm9tVXJsKCkge1xuICAgIGNvbnN0IGhvc3ROYW1lID0gbG9jYXRpb24uaG9zdG5hbWU7XG4gICAgcmV0dXJuIGhvc3ROYW1lLnN1YnN0cmluZyhob3N0TmFtZS5pbmRleE9mKCcuJykgKyAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlcyB0aGUgdHJhbnNsYXRpb24gb2JqZWN0LlxuICAgKlxuICAgKiAqKkV4YW1wbGUqKlxuICAgKiB7IEFkZCB3aWRnZXQ6IFwiV2lkZ2V0IGhpbnp1ZsO8Z2VuXCIgfVxuICAgKlxuICAgKiB3aWxsIGJlIGNoYW5nZWQgdG86XG4gICAqXG4gICAqIHsgV2lkZ2V0IGhpbnp1ZsO8Z2VuOiBcIkFkZCB3aWRnZXRcIiB9XG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50TGFuZyBMYW5ndWFnZSB3aG9zZSB0cmFuc2xhdGVkIHZhbHVlcyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoZSBvYmplY3Qga2V5LlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGludmVydGVkIG9iamVjdCB3aGVyZSB0aGUga2V5cyBoYXZlIGJlZW4gc3dhcHBlZCB3aXRoIHRoZSB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGdldFJldmVydGVkVHJhbnNsYXRpb25zKGN1cnJlbnRMYW5nOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RvcmUudHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXTtcblxuICAgIGNvbnN0IHN3YXBwZWRLZXlzV2l0aFZhbHVlcyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgc3dhcHBlZEtleXNXaXRoVmFsdWVzW3RyYW5zbGF0aW9uc1trZXldXSA9IGtleTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3dhcHBlZEtleXNXaXRoVmFsdWVzO1xuICB9XG5cbiAgLyoqVHJhbnNsYXRlcyBzdHJpbmcgYmFjayBpbnRvIEVuZ2xpc2guXG4gICAqIElmIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGxhbmd1YWdlIGlzIHNldCB0byBFbmdsaXNoLCB0aGUgc3RyaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAgICogQHBhcmFtIHRleHRUb1RyYW5zbGF0ZSBzdHJpbmcgdG8gdHJhbnNsYXRlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzdHJpbmcgdHJhbnNsYXRlZCBpbnRvIEVuZ2xpc2guXG4gICAqL1xuICBwcml2YXRlIGdldEVuVHJhbnNsYXRpb24oXG4gICAgdGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4gICk6IHN0cmluZyB7XG4gICAgbGV0IGVuVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbdGV4dFRvVHJhbnNsYXRlXTtcbiAgICBpZiAoIWVuVHJhbnNsYXRpb24pIHtcbiAgICAgIHJldHVybiB0ZXh0VG9UcmFuc2xhdGU7XG4gICAgfVxuICAgIC8qKiByZW1vdmUgdHJhbnNsYXRpb24gY29udGV4dCAqL1xuICAgIGNvbnN0IHJlZ2V4ID0gL1xcYCguKj8pXFxgLztcbiAgICBlblRyYW5zbGF0aW9uID0gZW5UcmFuc2xhdGlvbi5yZXBsYWNlKHJlZ2V4LCAnJyk7XG5cbiAgICByZXR1cm4gZW5UcmFuc2xhdGlvbjtcbiAgfVxufVxuIl19
|
|
@@ -2,4 +2,5 @@ export * from './gainsight.service';
|
|
|
2
2
|
export * from './product-experience.directive';
|
|
3
3
|
export * from './product-experience.model';
|
|
4
4
|
export * from './product-experience.module';
|
|
5
|
-
|
|
5
|
+
export * from './user-engagements.service';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dhaW5zaWdodC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuIl19
|