@c8y/ngx-components 1016.0.476 → 1016.0.483
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/header/right-drawer/right-drawer.component.d.ts +22 -0
- package/core/product-experience/gainsight.service.d.ts +96 -22
- 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/shared/core.model.d.ts +22 -0
- package/core/user/user-edit-modal.component.d.ts +36 -10
- package/core/user/user-edit.component.d.ts +7 -12
- package/device-grid/device-grid.service.d.ts +3 -4
- package/esm2020/core/action-bar/action-bar.component.mjs +10 -7
- package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
- package/esm2020/core/common/ApplicationOptions.mjs +1 -1
- package/esm2020/core/dynamic-forms/validation/validation-config.factory.mjs +2 -2
- package/esm2020/core/header/right-drawer/right-drawer.component.mjs +5 -3
- package/esm2020/core/product-experience/gainsight.service.mjs +174 -71
- 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/shared/core.model.mjs +15 -0
- package/esm2020/core/user/user-edit-modal.component.mjs +73 -45
- package/esm2020/core/user/user-edit.component.mjs +38 -43
- package/esm2020/device-grid/device-grid.service.mjs +6 -15
- package/esm2020/sensor-phone/sensor-phone-modal.component.mjs +26 -15
- package/esm2020/sensor-phone/sensor-phone.model.mjs +13 -0
- package/esm2020/sensor-phone/sensor-phone.service.mjs +5 -7
- package/esm2020/sub-assets/delete-assets-modal/delete-assets-modal.component.mjs +13 -3
- package/esm2020/sub-assets/shared/sub-assets.model.mjs +11 -0
- package/fesm2015/c8y-ngx-components-device-grid.mjs +4 -15
- package/fesm2015/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sensor-phone.mjs +40 -19
- package/fesm2015/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sub-assets.mjs +22 -2
- package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +513 -173
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-device-grid.mjs +4 -13
- package/fesm2020/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sensor-phone.mjs +40 -19
- package/fesm2020/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sub-assets.mjs +22 -2
- package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +497 -166
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +4 -4
- package/package.json +2 -2
- package/sensor-phone/sensor-phone.model.d.ts +18 -0
- package/sensor-phone/sensor-phone.service.d.ts +2 -3
- package/sub-assets/delete-assets-modal/delete-assets-modal.component.d.ts +1 -0
- package/sub-assets/shared/sub-assets.model.d.ts +15 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { DOCUMENT as Document } from '@angular/common';
|
|
3
|
+
import { BehaviorSubject, combineLatest, from, of } from 'rxjs';
|
|
4
|
+
import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
|
|
5
|
+
import { GainsightService } from './gainsight.service';
|
|
6
|
+
import { switchMap, take, tap } from 'rxjs/operators';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../common/user-preferences/user-preferences.service";
|
|
9
|
+
import * as i2 from "./gainsight.service";
|
|
10
|
+
export class UserEngagementsService {
|
|
11
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
12
|
+
this.document = document;
|
|
13
|
+
this.userPreferencesService = userPreferencesService;
|
|
14
|
+
this.gainsightService = gainsightService;
|
|
15
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
16
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
17
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
18
|
+
this.ENGAGEMENTS = 'engagements';
|
|
19
|
+
this.handleUserEngagements();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Handles user engagement settings based on various conditions.
|
|
23
|
+
*
|
|
24
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
25
|
+
* - Retrieves the engagement settings.
|
|
26
|
+
* - Updates the engagement settings based on the combined observations.
|
|
27
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
28
|
+
*/
|
|
29
|
+
handleUserEngagements() {
|
|
30
|
+
this.gainsightService.trackingLoaded$
|
|
31
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
32
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
36
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
37
|
+
*/
|
|
38
|
+
updateUserEngagementPreference(isEnabled) {
|
|
39
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
40
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
44
|
+
*
|
|
45
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
46
|
+
*/
|
|
47
|
+
toggleGainsightEngagements(isEnabled) {
|
|
48
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
52
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
53
|
+
*
|
|
54
|
+
* 1. User's preferences for Gainsight engagements.
|
|
55
|
+
* 2. A flag indicating if PII data should be sent.
|
|
56
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
57
|
+
*
|
|
58
|
+
* @returns An observable emitting an array of boolean values.
|
|
59
|
+
*/
|
|
60
|
+
getEngagementSettingsObservable() {
|
|
61
|
+
return combineLatest([
|
|
62
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
63
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
64
|
+
of(this.gainsightService.isCustomBranding())
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
69
|
+
*
|
|
70
|
+
* Based on the received values, the method decides to:
|
|
71
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
72
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
73
|
+
*
|
|
74
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
75
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
76
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
77
|
+
*/
|
|
78
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
79
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
80
|
+
this.userEngagementsEnabled$.next(false);
|
|
81
|
+
}
|
|
82
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
83
|
+
/**
|
|
84
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
85
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
86
|
+
*/
|
|
87
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
95
|
+
*
|
|
96
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
97
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
98
|
+
*
|
|
99
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
100
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
101
|
+
*/
|
|
102
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
103
|
+
return !shouldSendPiiData;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Determines if the user engagement bot setting is undefined.
|
|
107
|
+
*
|
|
108
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
109
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
110
|
+
*
|
|
111
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
112
|
+
*/
|
|
113
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
114
|
+
return userEngagementBotSetting === undefined;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Enables the visibility of Gainsight engagements.
|
|
118
|
+
*
|
|
119
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
120
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
121
|
+
*/
|
|
122
|
+
showGainsightEngagements() {
|
|
123
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
124
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Hides the Gainsight engagements.
|
|
128
|
+
*
|
|
129
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
130
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
131
|
+
*/
|
|
132
|
+
hideGainsightEngagements() {
|
|
133
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
134
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Removes the specified CSS style from the document.
|
|
138
|
+
*
|
|
139
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
140
|
+
*/
|
|
141
|
+
removeHidingStyle(styleId) {
|
|
142
|
+
const style = this.document.getElementById(styleId);
|
|
143
|
+
style?.remove();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Adds a new CSS style to the document.
|
|
147
|
+
*
|
|
148
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
149
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
150
|
+
* then appends it to the document head.
|
|
151
|
+
*
|
|
152
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
153
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
154
|
+
*/
|
|
155
|
+
addHidingStyle(styleId, textContent) {
|
|
156
|
+
if (this.document.getElementById(styleId)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const style = this.document.createElement('style');
|
|
160
|
+
style.id = styleId;
|
|
161
|
+
style.textContent = textContent;
|
|
162
|
+
this.document.head.appendChild(style);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
UserEngagementsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, deps: [{ token: Document }, { token: i1.UserPreferencesService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
166
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
168
|
+
type: Injectable,
|
|
169
|
+
args: [{ providedIn: 'root' }]
|
|
170
|
+
}], ctorParameters: function () { return [{ type: Document, decorators: [{
|
|
171
|
+
type: Inject,
|
|
172
|
+
args: [Document]
|
|
173
|
+
}] }, { type: i1.UserPreferencesService }, { type: i2.GainsightService }]; } });
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lbmdhZ2VtZW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9wcm9kdWN0LWV4cGVyaWVuY2UvdXNlci1lbmdhZ2VtZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUd0RCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQzRCLFFBQWtCLEVBQ3BDLHNCQUE4QyxFQUM5QyxnQkFBa0M7UUFGaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFUbkMsK0NBQTBDLEdBQUcscUJBQXFCLENBQUM7UUFDbkUsNEJBQXVCLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9FLGdDQUEyQixHQUFHLGFBQWEsQ0FBQztRQUNwQyxnQkFBVyxHQUFHLGFBQWEsQ0FBQztRQU8zQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZTthQUNsQyxJ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LEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssY0FBYyxDQUFDLE9BQWUsRUFBRSxXQUFtQjtRQUN6RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELEtBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDOzttSEFwTFUsc0JBQXNCLGtCQVF2QixRQUFRO3VIQVJQLHNCQUFzQixjQURULE1BQU07MkZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7MERBU00sUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCBhcyBEb2N1bWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuL2dhaW5zaWdodC5zZXJ2aWNlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVzZXJFbmdhZ2VtZW50c1NlcnZpY2Uge1xuICByZWFkb25seSBVU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVkgPSAnZ2FpbnNpZ2h0Qm90RW5hYmxlZCc7XG4gIHJlYWRvbmx5IHVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICByZWFkb25seSBISURFX0dBSU5TSUdIVF9CT1RfU1RZTEVfSUQgPSAnaGlkZS1ncy1ib3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IEVOR0FHRU1FTlRTID0gJ2VuZ2FnZW1lbnRzJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERvY3VtZW50KSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaGFuZGxlVXNlckVuZ2FnZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB1c2VyIGVuZ2FnZW1lbnQgc2V0dGluZ3MgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zLlxuICAgKlxuICAgKiAtIFdhaXRzIGZvciB0aGUgR2FpbnNpZ2h0IHRyYWNraW5nIHRvIGJlIGxvYWRlZC5cbiAgICogLSBSZXRyaWV2ZXMgdGhlIGVuZ2FnZW1lbnQgc2V0dGluZ3MuXG4gICAqIC0gVXBkYXRlcyB0aGUgZW5nYWdlbWVudCBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgY29tYmluZWQgb2JzZXJ2YXRpb25zLlxuICAgKiAtIEZpbmFsbHksIHRvZ2dsZXMgdGhlIEdhaW5zaWdodCBlbmdhZ2VtZW50cyBiYXNlZCBvbiB0aGUgbGF0ZXN0IGB1c2VyRW5nYWdlbWVudHNFbmFibGVkJGAgdmFsdWUuXG4gICAqL1xuICBoYW5kbGVVc2VyRW5nYWdlbWVudHMoKSB7XG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyYWNraW5nTG9hZGVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldEVuZ2FnZW1lbnRTZXR0aW5nc09ic2VydmFibGUoKSksXG4gICAgICAgIHRhcCgoc2V0dGluZ3M6IFtib29sZWFuLCBib29sZWFuLCBib29sZWFuXSkgPT5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJFbmdhZ2VtZW50U2V0dGluZ3MoLi4uc2V0dGluZ3MpXG4gICAgICAgICksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkLnBpcGUodGFrZSgxKSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGlzRW5hYmxlZCA9PiB0aGlzLnRvZ2dsZUdhaW5zaWdodEVuZ2FnZW1lbnRzKGlzRW5hYmxlZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwcmVmZXJlbmNlIGZvciBHYWluc2lnaHQgRW5nYWdlbWVudHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbmFibGVkIC0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHVzZXIncyBlbmdhZ2VtZW50IHByZWZlcmVuY2UuXG4gICAqL1xuICB1cGRhdGVVc2VyRW5nYWdlbWVudFByZWZlcmVuY2UoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KGlzRW5hYmxlZCk7XG4gICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLnNldChcbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVksXG4gICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkLnZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIEdhaW5zaWdodCBFbmdhZ2VtZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZmxhZy5cbiAgICpcbiAgICogQHBhcmFtIGlzRW5hYmxlZCAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgR2FpbnNpZ2h0IEVuZ2FnZW1lbnRzIHNob3VsZCBiZSB2aXNpYmxlLlxuICAgKi9cbiAgdG9nZ2xlR2FpbnNpZ2h0RW5nYWdlbWVudHMoaXNFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaXNFbmFibGVkID8gdGhpcy5zaG93R2FpbnNpZ2h0RW5nYWdlbWVudHMoKSA6IHRoaXMuaGlkZUdhaW5zaWdodEVuZ2FnZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgcmVwcmVzZW50aW5nXG4gICAqIHRoZSBjdXJyZW50IGVuZ2FnZW1lbnQgc2V0dGluZ3MuIFRoZSBvYnNlcnZhYmxlIGNvbWJpbmVzIHRoZSBsYXRlc3QgdmFsdWVzIGZyb206XG4gICAqXG4gICAqIDEuIFVzZXIncyBwcmVmZXJlbmNlcyBmb3IgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKiAyLiBBIGZsYWcgaW5kaWNhdGluZyBpZiBQSUkgZGF0YSBzaG91bGQgYmUgc2VudC5cbiAgICogMy4gQSBmbGFnIGluZGljYXRpbmcgaWYgdGhlIHBsYXRmb3JtIHVzZXMgY3VzdG9tIGJyYW5kaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIGFuIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmdhZ2VtZW50U2V0dGluZ3NPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbltdPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLm9ic2VydmU8Ym9vbGVhbj4odGhpcy5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVkpLFxuICAgICAgZnJvbSh0aGlzLmdhaW5zaWdodFNlcnZpY2Uuc2hvdWxkU2VuZFBpaURhdGEoKSksXG4gICAgICBvZih0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNDdXN0b21CcmFuZGluZygpKVxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdXNlciBlbmdhZ2VtZW50IHNldHRpbmdzIGJhc2VkIG9uIHByb3ZpZGVkIHByZWZlcmVuY2VzIGFuZCBzZXR0aW5ncy5cbiAgICpcbiAgICogQmFzZWQgb24gdGhlIHJlY2VpdmVkIHZhbHVlcywgdGhlIG1ldGhvZCBkZWNpZGVzIHRvOlxuICAgKiAxLiBEaXNhYmxlIHVzZXIgZW5nYWdlbWVudHMgaWYgUElJIGRhdGEgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3IgY2VydGFpbiBicmFuZGluZy9zZXR0aW5ncyBjb25kaXRpb25zIGFyZSBtZXQuXG4gICAqIDIuIFVwZGF0ZSB0aGUgdXNlciBlbmdhZ2VtZW50IHByZWZlcmVuY2UgaWYgdGhlIHVzZXIgZW5nYWdlbWVudCBib3Qgc2V0dGluZyBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyRW5nYWdlbWVudEJvdFNldHRpbmcgLSBUaGUgdXNlcidzIHNldHRpbmcgZm9yIHRoZSBlbmdhZ2VtZW50IGJvdC5cbiAgICogQHBhcmFtIHNob3VsZFNlbmRQaWlEYXRhIC0gSW5kaWNhdGVzIHdoZXRoZXIgUElJIGRhdGEgc2hvdWxkIGJlIHNoYXJlZC5cbiAgICogQHBhcmFtIGhhc0N1c3RvbUJyYW5kaW5nIC0gSW5kaWNhdGVzIGlmIGN1c3RvbSBicmFuZGluZyBpcyBhcHBsaWVkLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVVc2VyRW5nYWdlbWVudFNldHRpbmdzKFxuICAgIHVzZXJFbmdhZ2VtZW50Qm90U2V0dGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBzaG91bGRTZW5kUGlpRGF0YTogYm9vbGVhbixcbiAgICBoYXNDdXN0b21CcmFuZGluZzogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGREaXNhYmxlVXNlckVuZ2FnZW1lbnRzRHVlVG9QSUlEYXRhKHNob3VsZFNlbmRQaWlEYXRhKSkge1xuICAgICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNVc2VyRW5nYWdlbWVudEJvdFNldHRpbmdVbmRlZmluZWQodXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBDYXNlIHdoZXJlIHRoZSB1c2VyIGlzIG5ldyAoZnJlc2hseSBjcmVhdGVkKSBhbmQgaGFzIG5vdCBjaGFuZ2VkIHRoZSB1c2VyIGVuZ2FnZW1lbnQgc2V0dGluZ3MgaW4gdGhlIHVzZXIgZWRpdCBtb2RhbCAodW50b3VjaGVkIHN0YXRlKS5cbiAgICAgICAqIFdoZW4gY3VzdG9tIGJyYW5kaW5nIGlzIG5vdCBzZXQsIHdlIHdpbGwgc2V0IHRoZSB1c2VyIGVuZ2FnZW1lbnRzIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzIHRvIHRydWUgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgdGhpcy51cGRhdGVVc2VyRW5nYWdlbWVudFByZWZlcmVuY2UoIWhhc0N1c3RvbUJyYW5kaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KHVzZXJFbmdhZ2VtZW50Qm90U2V0dGluZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB1c2VyIGVuZ2FnZW1lbnRzIHNob3VsZCBiZSBkaXNhYmxlZCBkdWUgdG8gUElJIGRhdGEgc2V0dGluZ3MuXG4gICAqXG4gICAqIElmIHRoZSBgc2hvdWxkU2VuZFBpaURhdGFgIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBlbmdhZ2VtZW50c1xuICAgKiBzaG91bGQgYmUgZGlzYWJsZWQgdG8gcHJldmVudCBzaGFyaW5nIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFNlbmRQaWlEYXRhIC0gSW5kaWNhdGVzIHdoZXRoZXIgUElJIGRhdGEgaXMgYWxsb3dlZCB0byBiZSBzZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHVzZXIgZW5nYWdlbWVudHMgc2hvdWxkIGJlIGRpc2FibGVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZERpc2FibGVVc2VyRW5nYWdlbWVudHNEdWVUb1BJSURhdGEoc2hvdWxkU2VuZFBpaURhdGE6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNob3VsZFNlbmRQaWlEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIHVzZXIgZW5nYWdlbWVudCBib3Qgc2V0dGluZyBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gdXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nIC0gVGhlIHNldHRpbmcgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2V0dGluZyBpcyB1bmRlZmluZWQ7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICpcbiAgICogVGhpcyBzY2VuYXJpbyBvY2N1cnMgd2hlbiBhIHVzZXIgaXMgbmV3IGFuZCBoYXNuJ3QgbW9kaWZpZWQgdGhlIGJvdCBzZXR0aW5ncyBpbiB0aGUgdXNlciBkZXRhaWxzIFVJIHlldC5cbiAgICovXG4gIHByaXZhdGUgaXNVc2VyRW5nYWdlbWVudEJvdFNldHRpbmdVbmRlZmluZWQoXG4gICAgdXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nOiBib29sZWFuIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1c2VyRW5nYWdlbWVudEJvdFNldHRpbmcgPT09IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgdmlzaWJpbGl0eSBvZiBHYWluc2lnaHQgZW5nYWdlbWVudHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIENTUyBzdHlsZXMgdGhhdCBoaWRlIHRoZSBHYWluc2lnaHQgZW5nYWdlbWVudHNcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlbGV2YW50IHVzZXIgYXR0cmlidXRlIHRvIG1hcmsgdGhlIGVuZ2FnZW1lbnRzIGFzIHZpc2libGUuXG4gICAqL1xuICBwcml2YXRlIHNob3dHYWluc2lnaHRFbmdhZ2VtZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEKTtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBsaWVzIENTUyBzdHlsZXMgdG8gaGlkZSB0aGUgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzXG4gICAqIGFuZCB1cGRhdGVzIHRoZSByZWxldmFudCB1c2VyIGF0dHJpYnV0ZSB0byBtYXJrIHRoZSBlbmdhZ2VtZW50cyBhcyBoaWRkZW4uXG4gICAqL1xuICBwcml2YXRlIGhpZGVHYWluc2lnaHRFbmdhZ2VtZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lELCAnI2FwdC13aWRnZXQgeyBkaXNwbGF5Om5vbmUgfScpO1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS51cGRhdGVVc2VyQXR0cmlidXRlKHRoaXMuRU5HQUdFTUVOVFMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgQ1NTIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVJZCAtIFRoZSBJRCBvZiB0aGUgQ1NTIHN0eWxlIGVsZW1lbnQgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVIaWRpbmdTdHlsZShzdHlsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCk7XG4gICAgc3R5bGU/LnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgQ1NTIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cbiAgICpcbiAgICogSWYgdGhlIHN0eWxlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBhbHJlYWR5IGV4aXN0cywgdGhlIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBhIG5ldyBgPHN0eWxlPmAgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgY29udGVudCxcbiAgICogdGhlbiBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCBoZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVJZCAtIFRoZSBJRCB0byBhc3NpZ24gdG8gdGhlIG5ldyBzdHlsZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dENvbnRlbnQgLSBUaGUgQ1NTIHJ1bGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzdHlsZS5cbiAgICovXG4gIHByaXZhdGUgYWRkSGlkaW5nU3R5bGUoc3R5bGVJZDogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUuaWQgPSBzdHlsZUlkO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gICAgdGhpcy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const PRODUCT_EXPERIENCE = {
|
|
2
|
+
ACTION_BAR: {
|
|
3
|
+
EVENTS: { ACTION_BAR_ITEM: 'actionBarItem' },
|
|
4
|
+
COMPONENTS: { ACTION_BAR_COMPONENT: 'action-bar' },
|
|
5
|
+
ACTIONS: {},
|
|
6
|
+
RESULTS: {}
|
|
7
|
+
},
|
|
8
|
+
QUICK_LINKS: {
|
|
9
|
+
EVENTS: { QUICK_LINK_RIGHT_DRAWER: 'quickLinkRightDrawer' },
|
|
10
|
+
COMPONENTS: { RIGHT_DRAWER_COMPONENT: 'right-drawer' },
|
|
11
|
+
ACTIONS: {},
|
|
12
|
+
RESULTS: {}
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc2hhcmVkL2NvcmUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsVUFBVSxFQUFFO1FBQ1YsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRTtRQUM1QyxVQUFVLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUU7UUFDbEQsT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtLQUNaO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsTUFBTSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUU7UUFDM0QsVUFBVSxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFO1FBQ3RELE9BQU8sRUFBRSxFQUFFO1FBQ1gsT0FBTyxFQUFFLEVBQUU7S0FDWjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUFJPRFVDVF9FWFBFUklFTkNFID0ge1xuICBBQ1RJT05fQkFSOiB7XG4gICAgRVZFTlRTOiB7IEFDVElPTl9CQVJfSVRFTTogJ2FjdGlvbkJhckl0ZW0nIH0sXG4gICAgQ09NUE9ORU5UUzogeyBBQ1RJT05fQkFSX0NPTVBPTkVOVDogJ2FjdGlvbi1iYXInIH0sXG4gICAgQUNUSU9OUzoge30sXG4gICAgUkVTVUxUUzoge31cbiAgfSxcbiAgUVVJQ0tfTElOS1M6IHtcbiAgICBFVkVOVFM6IHsgUVVJQ0tfTElOS19SSUdIVF9EUkFXRVI6ICdxdWlja0xpbmtSaWdodERyYXdlcicgfSxcbiAgICBDT01QT05FTlRTOiB7IFJJR0hUX0RSQVdFUl9DT01QT05FTlQ6ICdyaWdodC1kcmF3ZXInIH0sXG4gICAgQUNUSU9OUzoge30sXG4gICAgUkVTVUxUUzoge31cbiAgfVxufTtcbiJdfQ==
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { Component } from '@angular/core';
|
|
2
2
|
import { BasicAuth, FetchClient, TenantLoginOptionType, UserService } from '@c8y/client';
|
|
3
3
|
import { omit } from 'lodash-es';
|
|
4
|
-
import { BsModalRef
|
|
5
|
-
import { take } from 'rxjs/operators';
|
|
4
|
+
import { BsModalRef } from 'ngx-bootstrap/modal';
|
|
6
5
|
import { AlertService } from '../alert/alert.service';
|
|
7
6
|
import { PasswordService } from '../authentication/password.service';
|
|
8
7
|
import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
|
|
@@ -14,6 +13,7 @@ import { TranslateService } from '../i18n/translate.service';
|
|
|
14
13
|
import { LoginService } from '../login/login.service';
|
|
15
14
|
import { ModalService } from '../modal/modal.service';
|
|
16
15
|
import { GainsightService } from '../product-experience/gainsight.service';
|
|
16
|
+
import { UserEngagementsService } from '../product-experience/user-engagements.service';
|
|
17
17
|
import * as i0 from "@angular/core";
|
|
18
18
|
import * as i1 from "ngx-bootstrap/modal";
|
|
19
19
|
import * as i2 from "@c8y/client";
|
|
@@ -26,12 +26,13 @@ import * as i8 from "../product-experience/gainsight.service";
|
|
|
26
26
|
import * as i9 from "../bootstrap/cookie-banner/cookie-banner.service";
|
|
27
27
|
import * as i10 from "../login/login.service";
|
|
28
28
|
import * as i11 from "../authentication/password.service";
|
|
29
|
-
import * as i12 from "../
|
|
30
|
-
import * as i13 from "
|
|
31
|
-
import * as i14 from "
|
|
32
|
-
import * as i15 from "
|
|
29
|
+
import * as i12 from "../product-experience/user-engagements.service";
|
|
30
|
+
import * as i13 from "../modal/modal.component";
|
|
31
|
+
import * as i14 from "./user-edit.component";
|
|
32
|
+
import * as i15 from "../i18n/c8y-translate.pipe";
|
|
33
|
+
import * as i16 from "@angular/common";
|
|
33
34
|
export class UserEditModalComponent {
|
|
34
|
-
constructor(modal, user, ui, auth, client, alert, translate, userPreferences,
|
|
35
|
+
constructor(modal, user, ui, auth, client, alert, translate, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
35
36
|
this.modal = modal;
|
|
36
37
|
this.user = user;
|
|
37
38
|
this.ui = ui;
|
|
@@ -40,48 +41,56 @@ export class UserEditModalComponent {
|
|
|
40
41
|
this.alert = alert;
|
|
41
42
|
this.translate = translate;
|
|
42
43
|
this.userPreferences = userPreferences;
|
|
43
|
-
this.modalService = modalService;
|
|
44
44
|
this.c8yModalService = c8yModalService;
|
|
45
45
|
this.gainsightService = gainsightService;
|
|
46
46
|
this.cookieBannerService = cookieBannerService;
|
|
47
47
|
this.loginService = loginService;
|
|
48
48
|
this.passwordService = passwordService;
|
|
49
|
+
this.userEngagementsService = userEngagementsService;
|
|
49
50
|
this.loading = false;
|
|
50
|
-
this.
|
|
51
|
+
this.showProductExperienceOptions = false;
|
|
51
52
|
this.lang = this.ui.state.lang;
|
|
52
|
-
this.modalService.onHide.pipe(take(1)).subscribe((reason) => {
|
|
53
|
-
if (reason !== null && this.changedLang !== undefined) {
|
|
54
|
-
this.translate.switchToLanguage(this.lang);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
53
|
}
|
|
58
54
|
async ngOnInit() {
|
|
59
55
|
this.updateUserInAppState();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
56
|
+
await this.setInitialProductExperienceOptions();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Initializes product experience options for the user.
|
|
60
|
+
*
|
|
61
|
+
* This function performs the following operations:
|
|
62
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
63
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
64
|
+
* - Checks whether personalized product experience tracking is active.
|
|
65
|
+
* - Checks whether in-product information and communication is active.
|
|
66
|
+
*/
|
|
67
|
+
async setInitialProductExperienceOptions() {
|
|
68
|
+
this.showProductExperienceOptions =
|
|
69
|
+
await this.gainsightService.canEditProductExperienceSettings();
|
|
70
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
71
|
+
// Enable personalized product experience tracking option
|
|
72
|
+
this.currentUsageTrackingState =
|
|
73
|
+
!(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
74
|
+
// Enable in-product information & communication option
|
|
75
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
76
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
68
77
|
}
|
|
69
78
|
}
|
|
70
|
-
onDismiss() {
|
|
79
|
+
async onDismiss() {
|
|
71
80
|
if (this.changedLang !== undefined) {
|
|
72
|
-
this.translate.switchToLanguage(this.lang);
|
|
81
|
+
await this.translate.switchToLanguage(this.lang);
|
|
73
82
|
}
|
|
74
83
|
this.modal.hide();
|
|
75
84
|
}
|
|
76
|
-
onLanguage(lang) {
|
|
85
|
+
async onLanguage(lang) {
|
|
77
86
|
this.changedLang = lang;
|
|
78
|
-
this.translate.switchToLanguage(this.changedLang);
|
|
87
|
+
await this.translate.switchToLanguage(this.changedLang);
|
|
79
88
|
}
|
|
80
|
-
|
|
81
|
-
this.usageTrackingState =
|
|
89
|
+
onUsageTrackingChange(isEnabled) {
|
|
90
|
+
this.usageTrackingState = isEnabled;
|
|
82
91
|
}
|
|
83
|
-
|
|
84
|
-
this.
|
|
92
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
93
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
85
94
|
}
|
|
86
95
|
async updateAndClose(user) {
|
|
87
96
|
this.loading = true;
|
|
@@ -103,16 +112,7 @@ export class UserEditModalComponent {
|
|
|
103
112
|
if (this.changedLang && this.changedLang !== this.lang) {
|
|
104
113
|
reloadRequired = await this.persistLanguage(this.changedLang);
|
|
105
114
|
}
|
|
106
|
-
|
|
107
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY, this.gainsightBotState);
|
|
108
|
-
}
|
|
109
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
110
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
111
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
112
|
-
this.usageTrackingState
|
|
113
|
-
? await this.gainsightService.loadTag(this.client.tenant)
|
|
114
|
-
: await this.gainsightTrackingAppReload();
|
|
115
|
-
}
|
|
115
|
+
await this.updateProductExperienceOptions();
|
|
116
116
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
117
117
|
await this.user.updateCurrent(omit(user, 'password'));
|
|
118
118
|
await this.updateUserInAppState();
|
|
@@ -164,6 +164,34 @@ export class UserEditModalComponent {
|
|
|
164
164
|
// do nothing
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
|
+
async updateProductExperienceOptions() {
|
|
168
|
+
this.updateUserEngagementsPreference();
|
|
169
|
+
await this.updateTrackingOption();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
173
|
+
* Calls the user engagements service to update the preference.
|
|
174
|
+
*
|
|
175
|
+
* The update only occurs if the current preference differs from the new state.
|
|
176
|
+
*/
|
|
177
|
+
updateUserEngagementsPreference() {
|
|
178
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
179
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
184
|
+
* If the current usage tracking state differs from the new state,
|
|
185
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
186
|
+
* before triggering a reload of the application.
|
|
187
|
+
*/
|
|
188
|
+
async updateTrackingOption() {
|
|
189
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
190
|
+
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
191
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
192
|
+
await this.gainsightTrackingAppReload();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
167
195
|
async updateUserInAppState() {
|
|
168
196
|
const currentUserResult = await this.user.current();
|
|
169
197
|
this.ui.currentUser.next(currentUserResult.data);
|
|
@@ -177,10 +205,10 @@ export class UserEditModalComponent {
|
|
|
177
205
|
this.auth.updateCredentials(newCredentials);
|
|
178
206
|
}
|
|
179
207
|
}
|
|
180
|
-
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.UserService }, { token: i3.AppStateService }, { token: i2.BasicAuth }, { token: i2.FetchClient }, { token: i4.AlertService }, { token: i5.TranslateService }, { token: i6.UserPreferencesService }, { token:
|
|
181
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
208
|
+
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.UserService }, { token: i3.AppStateService }, { token: i2.BasicAuth }, { token: i2.FetchClient }, { token: i4.AlertService }, { token: i5.TranslateService }, { token: i6.UserPreferencesService }, { token: i7.ModalService }, { token: i8.GainsightService }, { token: i9.CookieBannerService }, { token: i10.LoginService }, { token: i11.PasswordService }, { token: i12.UserEngagementsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
209
|
+
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [lang]=\"lang\"\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n (onLanguage)=\"onLanguage($event)\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: i13.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i14.UserEditComponent, selector: "c8y-user-edit", inputs: ["lang", "loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled"], outputs: ["onUser", "onLanguage", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: i15.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i16.AsyncPipe, name: "async" }] });
|
|
182
210
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
183
211
|
type: Component,
|
|
184
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
185
|
-
}], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i2.UserService }, { type: i3.AppStateService }, { type: i2.BasicAuth }, { type: i2.FetchClient }, { type: i4.AlertService }, { type: i5.TranslateService }, { type: i6.UserPreferencesService }, { type:
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUdYLHFCQUFxQixFQUNyQixXQUFXLEVBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTTNFLE1BQU0sT0FBTyxzQkFBc0I7SUFXakMsWUFDUyxLQUFpQixFQUNqQixJQUFpQixFQUNqQixFQUFtQixFQUNsQixJQUFlLEVBQ2YsTUFBbUIsRUFDbkIsS0FBbUIsRUFDbkIsU0FBMkIsRUFDM0IsZUFBdUMsRUFDdkMsWUFBNEIsRUFDNUIsZUFBNkIsRUFDN0IsZ0JBQWtDLEVBQ2xDLG1CQUF3QyxFQUN4QyxZQUEwQixFQUMxQixlQUFnQztRQWJqQyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBaUI7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFjO1FBQzdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFyQjFDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBc0J2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFDbEUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDOUYsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLHlCQUF5QjtvQkFDNUIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDhDQUE4QyxDQUMxRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsOEJBQThCLENBQ3JELENBQUMsQ0FBQztnQkFDTCxJQUFJLENBQUMsd0JBQXdCO29CQUMzQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsOENBQThDLENBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FDekQsQ0FBQyxDQUFDO2FBQ047U0FDRjtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJO1FBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWU7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWU7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUUzQixJQUFJO1lBQ0YsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsS0FBSyxDQUFDO1lBQ25GLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDO1lBRXJFLElBQUksQ0FBQyxjQUFjLElBQUksZUFBZSxFQUFFO2dCQUN0QyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3BCLE9BQU87aUJBQ1I7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQzFFLElBQUksU0FBUyxFQUFFO29CQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN0RCxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMvRDtZQUVELElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDNUQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxFQUN4RCxJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7YUFDSDtZQUVELElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDOUQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDhCQUE4QixFQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsa0JBQWtCO29CQUNyQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUN6RCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQzthQUM3QztZQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7Z0JBQ2pELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztTQUM1QztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQztTQUNGO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNuQjtTQUNGO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSTtRQUN4QixJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDaEMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQzdCLE9BQU8sQ0FDTCw4S0FBOEssQ0FDL0ssRUFDRCxNQUFNLENBQUMsT0FBTyxFQUNkO2dCQUNFLEVBQUUsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN6QixNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQzthQUNoQyxDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDckI7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUN0QjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsMEJBQTBCO1FBQzlCLElBQUk7WUFDRixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUNoQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFDMUIsT0FBTyxDQUNMLDZLQUE2SyxDQUM5SyxFQUNELE1BQU0sQ0FBQyxPQUFPLEVBQ2Q7Z0JBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ3pCLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDO2FBQ2hDLENBQ0YsQ0FBQztZQUNGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNuQjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsYUFBYTtTQUNkO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0I7UUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN4QyxNQUFNLGNBQWMsR0FBaUI7WUFDbkMsUUFBUTtZQUNSLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1NBQzNCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O21IQWpNVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiwyREM1Qm5DLHNvQkFnQkE7MkZEWWEsc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCYXNpY0F1dGgsXG4gIEZldGNoQ2xpZW50LFxuICBJQ3JlZGVudGlhbHMsXG4gIElVc2VyLFxuICBUZW5hbnRMb2dpbk9wdGlvblR5cGUsXG4gIFVzZXJTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiwgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkU2VydmljZSB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29va2llQmFubmVyU2VydmljZSB9IGZyb20gJy4uL2Jvb3RzdHJhcC9jb29raWUtYmFubmVyL2Nvb2tpZS1iYW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9jb21tb24vc3RhdHVzLm1vZGVsJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vaTE4bi90cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dpblNlcnZpY2UgfSBmcm9tICcuLi9sb2dpbi9sb2dpbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS11c2VyLWVkaXQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBVc2VyRWRpdE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY3VycmVudFVzZXI6IElVc2VyO1xuICBsYW5nOiBzdHJpbmc7XG4gIGNoYW5nZWRMYW5nOiBzdHJpbmc7XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgc2hvd1Byb2R1Y3RVc2FnZVNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFVzYWdlVHJhY2tpbmdTdGF0ZTogYm9vbGVhbjtcbiAgY3VycmVudEdhaW5zaWdodEJvdFN0YXRlOiBib29sZWFuO1xuICB1c2FnZVRyYWNraW5nU3RhdGU6IGJvb2xlYW47XG4gIGdhaW5zaWdodEJvdFN0YXRlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtb2RhbDogQnNNb2RhbFJlZixcbiAgICBwdWJsaWMgdXNlcjogVXNlclNlcnZpY2UsXG4gICAgcHVibGljIHVpOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBCYXNpY0F1dGgsXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlczogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjOHlNb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9naW5TZXJ2aWNlOiBMb2dpblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYXNzd29yZFNlcnZpY2U6IFBhc3N3b3JkU2VydmljZVxuICApIHtcbiAgICB0aGlzLmxhbmcgPSB0aGlzLnVpLnN0YXRlLmxhbmc7XG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub25IaWRlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChyZWFzb246IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCAmJiB0aGlzLmNoYW5nZWRMYW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuc3dpdGNoVG9MYW5ndWFnZSh0aGlzLmxhbmcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVVc2VySW5BcHBTdGF0ZSgpO1xuICAgIHRoaXMuc2hvd1Byb2R1Y3RVc2FnZVNldHRpbmcgPSBhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UuY2FuRWRpdFByb2R1Y3RFeHBlcmllbmNlU2V0dGluZ3MoKTtcbiAgICBpZiAodGhpcy5zaG93UHJvZHVjdFVzYWdlU2V0dGluZykge1xuICAgICAgaWYgKHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0Z1bmN0aW9uYWxDb29raWVFbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlID1cbiAgICAgICAgICAhKGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5pc0dhaW5zaWdodFByZWZlcmVuY2VEaXNhYmxlZEluVXNlclByZWZlcmVuY2VzKFxuICAgICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWVxuICAgICAgICAgICkpO1xuICAgICAgICB0aGlzLmN1cnJlbnRHYWluc2lnaHRCb3RTdGF0ZSA9XG4gICAgICAgICAgIShhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNHYWluc2lnaHRQcmVmZXJlbmNlRGlzYWJsZWRJblVzZXJQcmVmZXJlbmNlcyhcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9CT1RfS0VZXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EaXNtaXNzKCkge1xuICAgIGlmICh0aGlzLmNoYW5nZWRMYW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnN3aXRjaFRvTGFuZ3VhZ2UodGhpcy5sYW5nKTtcbiAgICB9XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBvbkxhbmd1YWdlKGxhbmcpIHtcbiAgICB0aGlzLmNoYW5nZWRMYW5nID0gbGFuZztcbiAgICB0aGlzLnRyYW5zbGF0ZS5zd2l0Y2hUb0xhbmd1YWdlKHRoaXMuY2hhbmdlZExhbmcpO1xuICB9XG5cbiAgb25Qcm9kdWN0RXhwZXJpZW5jZShvcHRpb246IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZSA9IG9wdGlvbjtcbiAgfVxuXG4gIG9uR2FpbnNpZ2h0Qm90KG9wdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuZ2FpbnNpZ2h0Qm90U3RhdGUgPSBvcHRpb247XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbmRDbG9zZSh1c2VyKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGxldCByZWxvYWRSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkQ2hhbmdlZCA9IEJvb2xlYW4odXNlci5wYXNzd29yZCk7XG4gICAgICBjb25zdCB1c2VzQmFzaWMgPSB0aGlzLmxvZ2luU2VydmljZS5sb2dpbk1vZGUudHlwZSA9PT0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDO1xuICAgICAgY29uc3QgaXNFeHRlcm5hbFVzZXIgPSB1c2VyLmN1c3RvbVByb3BlcnRpZXMudXNlck9yaWdpbiA9PT0gJ09BVVRIMic7XG5cbiAgICAgIGlmICghaXNFeHRlcm5hbFVzZXIgJiYgcGFzc3dvcmRDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXNzd29yZCA9IGF3YWl0IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmN1cnJlbnRQYXNzd29yZCgpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAoIWN1cnJlbnRQYXNzd29yZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuY2hhbmdlQ3VycmVudFVzZXJQYXNzd29yZCh1c2VyLnBhc3N3b3JkLCBjdXJyZW50UGFzc3dvcmQpO1xuICAgICAgICBpZiAodXNlc0Jhc2ljKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDcmVkZW50aWFscyh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jaGFuZ2VkTGFuZyAmJiB0aGlzLmNoYW5nZWRMYW5nICE9PSB0aGlzLmxhbmcpIHtcbiAgICAgICAgcmVsb2FkUmVxdWlyZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RMYW5ndWFnZSh0aGlzLmNoYW5nZWRMYW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY3VycmVudEdhaW5zaWdodEJvdFN0YXRlICE9PSB0aGlzLmdhaW5zaWdodEJvdFN0YXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzLnNldChcbiAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfQk9UX0tFWSxcbiAgICAgICAgICB0aGlzLmdhaW5zaWdodEJvdFN0YXRlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgIT09IHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzLnNldChcbiAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZLFxuICAgICAgICAgIHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnNldEZ1bmN0aW9uYWxDb29raWUodGhpcy51c2FnZVRyYWNraW5nU3RhdGUpO1xuICAgICAgICB0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmxvYWRUYWcodGhpcy5jbGllbnQudGVuYW50KVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5nYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gIT09ICdPQVVUSDInKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlci51cGRhdGVDdXJyZW50KG9taXQodXNlciwgJ3Bhc3N3b3JkJykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdVc2VyIHNhdmVkLicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHJlbG9hZFJlcXVpcmVkKSB7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHBlcnNpc3RMYW5ndWFnZShsYW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHNob3VsZFJlbG9hZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jOHlNb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVsb2FkIHJlY29tbWVuZGVkJyksXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1RvIGNoYW5nZSB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGVudGlyZSBhcHBsaWNhdGlvbiwgd2UgcmVjb21tZW5kIHlvdSB0byByZWxvYWQgdGhlIHBhZ2UuIElmIHlvdSBoYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMsIHlvdSBjYW4gcmVsb2FkIGxhdGVyLiBIb3cgd291bGQgeW91IGxpa2UgdG8gcHJvY2VlZD8nXG4gICAgICAgICksXG4gICAgICAgIFN0YXR1cy5XQVJOSU5HLFxuICAgICAgICB7XG4gICAgICAgICAgb2s6IGdldHRleHQoJ1JlbG9hZCBub3cnKSxcbiAgICAgICAgICBjYW5jZWw6IGdldHRleHQoJ1JlbG9hZCBsYXRlcicpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zYXZlSW5Mb2NhbFN0b3JhZ2UobGFuZyk7XG4gICAgICBhd2FpdCB0aGlzLnVzZXJQcmVmZXJlbmNlcy5zZXQoJ2xhbmd1YWdlJywgbGFuZyk7XG4gICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy50cmFuc2xhdGUuc2F2ZUluTG9jYWxTdG9yYWdlKGxhbmcpO1xuICAgICAgYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXMuc2V0KCdsYW5ndWFnZScsIGxhbmcpO1xuICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgIHNob3VsZFJlbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRSZWxvYWQ7XG4gIH1cblxuICBhc3luYyBnYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jOHlNb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVsb2FkIHJlcXVpcmVkJyksXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1RvIGNoYW5nZSB0aGUgdHJhY2tpbmcgb3B0aW9uIGluIHRoZSBlbnRpcmUgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHJlbG9hZCB0aGUgcGFnZS4gSWYgeW91IGhhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcywgeW91IGNhbiByZWxvYWQgbGF0ZXIuIEhvdyB3b3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPydcbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnUmVsb2FkIG5vdycpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnUmVsb2FkIGxhdGVyJylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVVc2VySW5BcHBTdGF0ZSgpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlclJlc3VsdCA9IGF3YWl0IHRoaXMudXNlci5jdXJyZW50KCk7XG4gICAgdGhpcy51aS5jdXJyZW50VXNlci5uZXh0KGN1cnJlbnRVc2VyUmVzdWx0LmRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDcmVkZW50aWFscyhwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IElDcmVkZW50aWFscyA9IHtcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdXNlcjogdGhpcy51aS5jdXJyZW50VXNlci52YWx1ZS5pZCxcbiAgICAgIHRlbmFudDogdGhpcy5jbGllbnQudGVuYW50XG4gICAgfTtcbiAgICB0aGlzLmF1dGgudXBkYXRlQ3JlZGVudGlhbHMobmV3Q3JlZGVudGlhbHMpO1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsIFtjdXN0b21Gb290ZXJdPVwidHJ1ZVwiIFt0aXRsZV09XCInRWRpdCB1c2VyJyB8IHRyYW5zbGF0ZVwiIChvbkRpc21pc3MpPVwib25EaXNtaXNzKClcIj5cbiAgPGM4eS11c2VyLWVkaXRcbiAgICBbbGFuZ109XCJsYW5nXCJcbiAgICBbdXNlcl09XCJ1aS5jdXJyZW50VXNlciB8IGFzeW5jXCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbaXNVc2FnZVRyYWNraW5nRW5hYmxlZF09XCJjdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlXCJcbiAgICBbaXNHYWluc2lnaHRCb3RFbmFibGVkXT1cImN1cnJlbnRHYWluc2lnaHRCb3RTdGF0ZVwiXG4gICAgW3Nob3dQcm9kdWN0VXNhZ2VTZXR0aW5nXT1cInNob3dQcm9kdWN0VXNhZ2VTZXR0aW5nXCJcbiAgICAob25MYW5ndWFnZSk9XCJvbkxhbmd1YWdlKCRldmVudClcIlxuICAgIChvblByb2R1Y3RFeHBlcmllbmNlKT1cIm9uUHJvZHVjdEV4cGVyaWVuY2UoJGV2ZW50KVwiXG4gICAgKG9uR2FpbnNpZ2h0Qm90KT1cIm9uR2FpbnNpZ2h0Qm90KCRldmVudClcIlxuICAgIChvblVzZXIpPVwidXBkYXRlQW5kQ2xvc2UoJGV2ZW50KVwiXG4gICAgKG9uQ2FuY2VsKT1cIm9uRGlzbWlzcygpXCJcbiAgPlxuICA8L2M4eS11c2VyLWVkaXQ+XG48L2M4eS1tb2RhbD5cbiJdfQ==
|
|
212
|
+
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [lang]=\"lang\"\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n (onLanguage)=\"onLanguage($event)\"\n ></c8y-user-edit>\n</c8y-modal>\n" }]
|
|
213
|
+
}], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i2.UserService }, { type: i3.AppStateService }, { type: i2.BasicAuth }, { type: i2.FetchClient }, { type: i4.AlertService }, { type: i5.TranslateService }, { type: i6.UserPreferencesService }, { type: i7.ModalService }, { type: i8.GainsightService }, { type: i9.CookieBannerService }, { type: i10.LoginService }, { type: i11.PasswordService }, { type: i12.UserEngagementsService }]; } });
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUdYLHFCQUFxQixFQUNyQixXQUFXLEVBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzNFLE9BQU8s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QUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsOEJBQThCLEVBQ3BELElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNuRSxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0I7UUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN4QyxNQUFNLGNBQWMsR0FBaUI7WUFDbkMsUUFBUTtZQUNSLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1NBQzNCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O21IQTlOVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiwyREM1Qm5DLDh0QkFtQkE7MkZEU2Esc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCYXNpY0F1dGgsXG4gIEZldGNoQ2xpZW50LFxuICBJQ3JlZGVudGlhbHMsXG4gIElVc2VyLFxuICBUZW5hbnRMb2dpbk9wdGlvblR5cGUsXG4gIFVzZXJTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9wYXNzd29yZC5zZXJ2aWNlJztcbmltcG9ydCB7IENvb2tpZUJhbm5lclNlcnZpY2UgfSBmcm9tICcuLi9ib290c3RyYXAvY29va2llLWJhbm5lci9jb29raWUtYmFubmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vY29tbW9uL3N0YXR1cy5tb2RlbCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uL2kxOG4vdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSAnLi4vbG9naW4vbG9naW4uc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckVuZ2FnZW1lbnRzU2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdXNlci1lZGl0LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGN1cnJlbnRVc2VyOiBJVXNlcjtcbiAgbGFuZzogc3RyaW5nO1xuICBjaGFuZ2VkTGFuZzogc3RyaW5nO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIHNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMgPSBmYWxzZTtcbiAgY3VycmVudFVzYWdlVHJhY2tpbmdTdGF0ZTogYm9vbGVhbjtcbiAgY3VycmVudFVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUluaXRpYWxTdGF0ZTogYm9vbGVhbjtcbiAgdXNhZ2VUcmFja2luZ1N0YXRlOiBib29sZWFuO1xuICB1c2VyRW5nYWdlbWVudFByZWZlcmVuY2VOZXdTdGF0ZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbW9kYWw6IEJzTW9kYWxSZWYsXG4gICAgcHVibGljIHVzZXI6IFVzZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyB1aTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogQmFzaWNBdXRoLFxuICAgIHByaXZhdGUgY2xpZW50OiBGZXRjaENsaWVudCxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXM6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjOHlNb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9naW5TZXJ2aWNlOiBMb2dpblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYXNzd29yZFNlcnZpY2U6IFBhc3N3b3JkU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJFbmdhZ2VtZW50c1NlcnZpY2U6IFVzZXJFbmdhZ2VtZW50c1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5sYW5nID0gdGhpcy51aS5zdGF0ZS5sYW5nO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVVc2VySW5BcHBTdGF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuc2V0SW5pdGlhbFByb2R1Y3RFeHBlcmllbmNlT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHByb2R1Y3QgZXhwZXJpZW5jZSBvcHRpb25zIGZvciB0aGUgdXNlci5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnM6XG4gICAqIC0gRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gZWRpdCBwcm9kdWN0IGV4cGVyaWVuY2Ugb3B0aW9ucy5cbiAgICogLSBJZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gYW5kIGZ1bmN0aW9uYWwgY29va2llcyBhcmUgZW5hYmxlZDpcbiAgICogICAtIENoZWNrcyB3aGV0aGVyIHBlcnNvbmFsaXplZCBwcm9kdWN0IGV4cGVyaWVuY2UgdHJhY2tpbmcgaXMgYWN0aXZlLlxuICAgKiAgIC0gQ2hlY2tzIHdoZXRoZXIgaW4tcHJvZHVjdCBpbmZvcm1hdGlvbiBhbmQgY29tbXVuaWNhdGlvbiBpcyBhY3RpdmUuXG4gICAqL1xuICBhc3luYyBzZXRJbml0aWFsUHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zKCkge1xuICAgIHRoaXMuc2hvd1Byb2R1Y3RFeHBlcmllbmNlT3B0aW9ucyA9XG4gICAgICBhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UuY2FuRWRpdFByb2R1Y3RFeHBlcmllbmNlU2V0dGluZ3MoKTtcblxuICAgIGlmICh0aGlzLnNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMgJiYgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKSkge1xuICAgICAgLy8gRW5hYmxlIHBlcnNvbmFsaXplZCBwcm9kdWN0IGV4cGVyaWVuY2UgdHJhY2tpbmcgb3B0aW9uXG4gICAgICB0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgPVxuICAgICAgICAhKGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5pc0dhaW5zaWdodFByZWZlcmVuY2VEaXNhYmxlZEluVXNlclByZWZlcmVuY2VzKFxuICAgICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVlcbiAgICAgICAgKSk7XG5cbiAgICAgIC8vIEVuYWJsZSBpbi1wcm9kdWN0IGluZm9ybWF0aW9uICYgY29tbXVuaWNhdGlvbiBvcHRpb25cbiAgICAgIHRoaXMuY3VycmVudFVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUluaXRpYWxTdGF0ZSA9XG4gICAgICAgIHRoaXMudXNlckVuZ2FnZW1lbnRzU2VydmljZS51c2VyRW5nYWdlbWVudHNFbmFibGVkJC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkRpc21pc3MoKSB7XG4gICAgaWYgKHRoaXMuY2hhbmdlZExhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy50cmFuc2xhdGUuc3dpdGNoVG9MYW5ndWFnZSh0aGlzLmxhbmcpO1xuICAgIH1cbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uTGFuZ3VhZ2UobGFuZykge1xuICAgIHRoaXMuY2hhbmdlZExhbmcgPSBsYW5nO1xuICAgIGF3YWl0IHRoaXMudHJhbnNsYXRlLnN3aXRjaFRvTGFuZ3VhZ2UodGhpcy5jaGFuZ2VkTGFuZyk7XG4gIH1cblxuICBvblVzYWdlVHJhY2tpbmdDaGFuZ2UoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy51c2FnZVRyYWNraW5nU3RhdGUgPSBpc0VuYWJsZWQ7XG4gIH1cblxuICBvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZShpc0VuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZU5ld1N0YXRlID0gaXNFbmFibGVkO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQW5kQ2xvc2UodXNlcikge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICBsZXQgcmVsb2FkUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXNzd29yZENoYW5nZWQgPSBCb29sZWFuKHVzZXIucGFzc3dvcmQpO1xuICAgICAgY29uc3QgdXNlc0Jhc2ljID0gdGhpcy5sb2dpblNlcnZpY2UubG9naW5Nb2RlLnR5cGUgPT09IFRlbmFudExvZ2luT3B0aW9uVHlwZS5CQVNJQztcbiAgICAgIGNvbnN0IGlzRXh0ZXJuYWxVc2VyID0gdXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gPT09ICdPQVVUSDInO1xuXG4gICAgICBpZiAoIWlzRXh0ZXJuYWxVc2VyICYmIHBhc3N3b3JkQ2hhbmdlZCkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGFzc3dvcmQgPSBhd2FpdCB0aGlzLnBhc3N3b3JkU2VydmljZS5jdXJyZW50UGFzc3dvcmQoKS50b1Byb21pc2UoKTtcbiAgICAgICAgaWYgKCFjdXJyZW50UGFzc3dvcmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51c2VyLmNoYW5nZUN1cnJlbnRVc2VyUGFzc3dvcmQodXNlci5wYXNzd29yZCwgY3VycmVudFBhc3N3b3JkKTtcbiAgICAgICAgaWYgKHVzZXNCYXNpYykge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ3JlZGVudGlhbHModXNlci5wYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2hhbmdlZExhbmcgJiYgdGhpcy5jaGFuZ2VkTGFuZyAhPT0gdGhpcy5sYW5nKSB7XG4gICAgICAgIHJlbG9hZFJlcXVpcmVkID0gYXdhaXQgdGhpcy5wZXJzaXN0TGFuZ3VhZ2UodGhpcy5jaGFuZ2VkTGFuZyk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb2R1Y3RFeHBlcmllbmNlT3B0aW9ucygpO1xuXG4gICAgICBpZiAodXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gIT09ICdPQVVUSDInKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlci51cGRhdGVDdXJyZW50KG9taXQodXNlciwgJ3Bhc3N3b3JkJykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdVc2VyIHNhdmVkLicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHJlbG9hZFJlcXVpcmVkKSB7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHBlcnNpc3RMYW5ndWFnZShsYW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHNob3VsZFJlbG9hZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jOHlNb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVsb2FkIHJlY29tbWVuZGVkJyksXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1RvIGNoYW5nZSB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGVudGlyZSBhcHBsaWNhdGlvbiwgd2UgcmVjb21tZW5kIHlvdSB0byByZWxvYWQgdGhlIHBhZ2UuIElmIHlvdSBoYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMsIHlvdSBjYW4gcmVsb2FkIGxhdGVyLiBIb3cgd291bGQgeW91IGxpa2UgdG8gcHJvY2VlZD8nXG4gICAgICAgICksXG4gICAgICAgIFN0YXR1cy5XQVJOSU5HLFxuICAgICAgICB7XG4gICAgICAgICAgb2s6IGdldHRleHQoJ1JlbG9hZCBub3cnKSxcbiAgICAgICAgICBjYW5jZWw6IGdldHRleHQoJ1JlbG9hZCBsYXRlcicpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zYXZlSW5Mb2NhbFN0b3JhZ2UobGFuZyk7XG4gICAgICBhd2FpdCB0aGlzLnVzZXJQcmVmZXJlbmNlcy5zZXQoJ2xhbmd1YWdlJywgbGFuZyk7XG4gICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy50cmFuc2xhdGUuc2F2ZUluTG9jYWxTdG9yYWdlKGxhbmcpO1xuICAgICAgYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXMuc2V0KCdsYW5ndWFnZScsIGxhbmcpO1xuICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgIHNob3VsZFJlbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRSZWxvYWQ7XG4gIH1cblxuICBhc3luYyBnYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jOHlNb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVsb2FkIHJlcXVpcmVkJyksXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1RvIGNoYW5nZSB0aGUgdHJhY2tpbmcgb3B0aW9uIGluIHRoZSBlbnRpcmUgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHJlbG9hZCB0aGUgcGFnZS4gSWYgeW91IGhhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcywgeW91IGNhbiByZWxvYWQgbGF0ZXIuIEhvdyB3b3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPydcbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnUmVsb2FkIG5vdycpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnUmVsb2FkIGxhdGVyJylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMoKSB7XG4gICAgdGhpcy51cGRhdGVVc2VyRW5nYWdlbWVudHNQcmVmZXJlbmNlKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVUcmFja2luZ09wdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIgZW5nYWdlbWVudCBwcmVmZXJlbmNlIGlmIGl0IGhhcyBjaGFuZ2VkIGZyb20gdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqIENhbGxzIHRoZSB1c2VyIGVuZ2FnZW1lbnRzIHNlcnZpY2UgdG8gdXBkYXRlIHRoZSBwcmVmZXJlbmNlLlxuICAgKlxuICAgKiBUaGUgdXBkYXRlIG9ubHkgb2NjdXJzIGlmIHRoZSBjdXJyZW50IHByZWZlcmVuY2UgZGlmZmVycyBmcm9tIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVVzZXJFbmdhZ2VtZW50c1ByZWZlcmVuY2UoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jdXJyZW50VXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlSW5pdGlhbFN0YXRlICE9PSB0aGlzLnVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZU5ld1N0YXRlXG4gICAgKSB7XG4gICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50c1NlcnZpY2UudXBkYXRlVXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlKFxuICAgICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZU5ld1N0YXRlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSB1cGRhdGVzIHRoZSB0cmFja2luZyBvcHRpb24gZm9yIHVzZXIgcHJlZmVyZW5jZXMuXG4gICAqIElmIHRoZSBjdXJyZW50IHVzYWdlIHRyYWNraW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGUgbmV3IHN0YXRlLFxuICAgKiBpdCB1cGRhdGVzIHRoZSBHYWluc2lnaHQgcHJlZmVyZW5jZXMgYW5kIHNldHMgYSBmdW5jdGlvbmFsIGNvb2tpZVxuICAgKiBiZWZvcmUgdHJpZ2dlcmluZyBhIHJlbG9hZCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVRyYWNraW5nT3B0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgIT09IHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZXJQcmVmZXJlbmNlcy5zZXQoXG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVksXG4gICAgICAgIHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlXG4gICAgICApO1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnNldEZ1bmN0aW9uYWxDb29raWUodGhpcy51c2FnZVRyYWNraW5nU3RhdGUpO1xuICAgICAgYXdhaXQgdGhpcy5nYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVXNlckluQXBwU3RhdGUoKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnVzZXIuY3VycmVudCgpO1xuICAgIHRoaXMudWkuY3VycmVudFVzZXIubmV4dChjdXJyZW50VXNlclJlc3VsdC5kYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3JlZGVudGlhbHMocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld0NyZWRlbnRpYWxzOiBJQ3JlZGVudGlhbHMgPSB7XG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXI6IHRoaXMudWkuY3VycmVudFVzZXIudmFsdWUuaWQsXG4gICAgICB0ZW5hbnQ6IHRoaXMuY2xpZW50LnRlbmFudFxuICAgIH07XG4gICAgdGhpcy5hdXRoLnVwZGF0ZUNyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKTtcbiAgfVxufVxuIiwiPGM4eS1tb2RhbFxuICBbdGl0bGVdPVwiJ0VkaXQgdXNlcicgfCB0cmFuc2xhdGVcIlxuICBbY3VzdG9tRm9vdGVyXT1cInRydWVcIlxuICAob25EaXNtaXNzKT1cIm9uRGlzbWlzcygpXCJcbj5cbiAgPGM4eS11c2VyLWVkaXRcbiAgICBbbGFuZ109XCJsYW5nXCJcbiAgICBbdXNlcl09XCJ1aS5jdXJyZW50VXNlciB8IGFzeW5jXCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbaXNVc2FnZVRyYWNraW5nRW5hYmxlZF09XCJjdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlXCJcbiAgICBbaXNVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VFbmFibGVkXT1cImN1cnJlbnRVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VJbml0aWFsU3RhdGVcIlxuICAgIFtzaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zXT1cInNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnNcIlxuICAgIChvblVzYWdlVHJhY2tpbmdDaGFuZ2UpPVwib25Vc2FnZVRyYWNraW5nQ2hhbmdlKCRldmVudClcIlxuICAgIChvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZSk9XCJvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob25Vc2VyKT1cInVwZGF0ZUFuZENsb3NlKCRldmVudClcIlxuICAgIChvbkNhbmNlbCk9XCJvbkRpc21pc3MoKVwiXG4gICAgKG9uTGFuZ3VhZ2UpPVwib25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgPjwvYzh5LXVzZXItZWRpdD5cbjwvYzh5LW1vZGFsPlxuIl19
|