@abp/ng.feature-management 5.0.1 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/abp-ng.feature-management.d.ts +5 -5
- package/bundles/abp-ng.feature-management-proxy.umd.js +28 -28
- package/bundles/abp-ng.feature-management-proxy.umd.js.map +1 -1
- package/bundles/abp-ng.feature-management.umd.js +534 -534
- package/bundles/abp-ng.feature-management.umd.js.map +1 -1
- package/esm2015/abp-ng.feature-management.js +4 -4
- package/esm2015/lib/components/feature-management/feature-management.component.js +158 -158
- package/esm2015/lib/components/index.js +2 -2
- package/esm2015/lib/directives/free-text-input.directive.js +37 -37
- package/esm2015/lib/directives/index.js +2 -2
- package/esm2015/lib/enums/components.js +2 -2
- package/esm2015/lib/feature-management.module.js +22 -22
- package/esm2015/lib/models/feature-management.js +2 -2
- package/esm2015/lib/models/index.js +2 -2
- package/esm2015/proxy/abp-ng.feature-management-proxy.js +4 -4
- package/esm2015/proxy/lib/index.js +3 -3
- package/esm2015/proxy/lib/proxy/feature-management/features.service.js +30 -30
- package/esm2015/proxy/lib/proxy/feature-management/index.js +3 -3
- package/esm2015/proxy/lib/proxy/feature-management/models.js +2 -2
- package/esm2015/proxy/lib/proxy/validation/index.js +3 -3
- package/esm2015/proxy/lib/proxy/validation/string-values/index.js +2 -2
- package/esm2015/proxy/lib/proxy/validation/string-values/models.js +2 -2
- package/esm2015/proxy/public-api.js +2 -2
- package/esm2015/public-api.js +6 -6
- package/fesm2015/abp-ng.feature-management-proxy.js +26 -26
- package/fesm2015/abp-ng.feature-management-proxy.js.map +1 -1
- package/fesm2015/abp-ng.feature-management.js +192 -192
- package/fesm2015/abp-ng.feature-management.js.map +1 -1
- package/lib/components/feature-management/feature-management.component.d.ts +49 -49
- package/lib/components/index.d.ts +1 -1
- package/lib/directives/free-text-input.directive.d.ts +21 -21
- package/lib/directives/index.d.ts +1 -1
- package/lib/enums/components.d.ts +3 -3
- package/lib/feature-management.module.d.ts +11 -11
- package/lib/models/feature-management.d.ts +11 -11
- package/lib/models/index.d.ts +1 -1
- package/package.json +3 -3
- package/proxy/abp-ng.feature-management-proxy.d.ts +5 -5
- package/proxy/lib/index.d.ts +2 -2
- package/proxy/lib/proxy/feature-management/features.service.d.ts +12 -12
- package/proxy/lib/proxy/feature-management/index.d.ts +2 -2
- package/proxy/lib/proxy/feature-management/models.d.ts +30 -30
- package/proxy/lib/proxy/validation/index.d.ts +2 -2
- package/proxy/lib/proxy/validation/string-values/index.d.ts +1 -1
- package/proxy/lib/proxy/validation/string-values/models.d.ts +11 -11
- package/proxy/public-api.d.ts +1 -1
- package/public-api.d.ts +5 -5
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
import { ConfigStateService, TrackByService } from '@abp/ng.core';
|
|
2
|
-
import { FeaturesService, } from '@abp/ng.feature-management/proxy';
|
|
3
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
-
import { finalize } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@abp/ng.core";
|
|
7
|
-
import * as i2 from "@abp/ng.feature-management/proxy";
|
|
8
|
-
import * as i3 from "@abp/ng.theme.shared";
|
|
9
|
-
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
-
import * as i5 from "@angular/common";
|
|
11
|
-
import * as i6 from "@angular/forms";
|
|
12
|
-
import * as i7 from "../../directives/free-text-input.directive";
|
|
13
|
-
var ValueTypes;
|
|
14
|
-
(function (ValueTypes) {
|
|
15
|
-
ValueTypes["ToggleStringValueType"] = "ToggleStringValueType";
|
|
16
|
-
ValueTypes["FreeTextStringValueType"] = "FreeTextStringValueType";
|
|
17
|
-
ValueTypes["SelectionStringValueType"] = "SelectionStringValueType";
|
|
18
|
-
})(ValueTypes || (ValueTypes = {}));
|
|
19
|
-
export class FeatureManagementComponent {
|
|
20
|
-
constructor(track, service, configState) {
|
|
21
|
-
this.track = track;
|
|
22
|
-
this.service = service;
|
|
23
|
-
this.configState = configState;
|
|
24
|
-
this.groups = [];
|
|
25
|
-
this.valueTypes = ValueTypes;
|
|
26
|
-
this.visibleChange = new EventEmitter();
|
|
27
|
-
this.modalBusy = false;
|
|
28
|
-
}
|
|
29
|
-
get visible() {
|
|
30
|
-
return this._visible;
|
|
31
|
-
}
|
|
32
|
-
set visible(value) {
|
|
33
|
-
if (this._visible === value)
|
|
34
|
-
return;
|
|
35
|
-
this._visible = value;
|
|
36
|
-
this.visibleChange.emit(value);
|
|
37
|
-
if (value)
|
|
38
|
-
this.openModal();
|
|
39
|
-
}
|
|
40
|
-
openModal() {
|
|
41
|
-
if (!this.providerName) {
|
|
42
|
-
throw new Error('providerName is required.');
|
|
43
|
-
}
|
|
44
|
-
this.getFeatures();
|
|
45
|
-
}
|
|
46
|
-
getFeatures() {
|
|
47
|
-
this.service.get(this.providerName, this.providerKey).subscribe(res => {
|
|
48
|
-
var _a;
|
|
49
|
-
if (!((_a = res.groups) === null || _a === void 0 ? void 0 : _a.length))
|
|
50
|
-
return;
|
|
51
|
-
this.groups = res.groups.map(({ name, displayName }) => ({ name, displayName }));
|
|
52
|
-
this.selectedGroupDisplayName = this.groups[0].displayName;
|
|
53
|
-
this.features = res.groups.reduce((acc, val) => (Object.assign(Object.assign({}, acc), { [val.name]: mapFeatures(val.features, document.body.dir) })), {});
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
save() {
|
|
57
|
-
if (this.modalBusy)
|
|
58
|
-
return;
|
|
59
|
-
const changedFeatures = [];
|
|
60
|
-
Object.keys(this.features).forEach(key => {
|
|
61
|
-
this.features[key].forEach(feature => {
|
|
62
|
-
if (feature.value !== feature.initialValue)
|
|
63
|
-
changedFeatures.push({ name: feature.name, value: `${feature.value}` });
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
if (!changedFeatures.length) {
|
|
67
|
-
this.visible = false;
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this.modalBusy = true;
|
|
71
|
-
this.service
|
|
72
|
-
.update(this.providerName, this.providerKey, { features: changedFeatures })
|
|
73
|
-
.pipe(finalize(() => (this.modalBusy = false)))
|
|
74
|
-
.subscribe(() => {
|
|
75
|
-
this.visible = false;
|
|
76
|
-
if (!this.providerKey) {
|
|
77
|
-
// to refresh host's features
|
|
78
|
-
this.configState.refreshAppState().subscribe();
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
onCheckboxClick(val, feature) {
|
|
83
|
-
if (val) {
|
|
84
|
-
this.checkToggleAncestors(feature);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.uncheckToggleDescendants(feature);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
uncheckToggleDescendants(feature) {
|
|
91
|
-
this.findAllDescendantsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node => this.setFeatureValue(node, false));
|
|
92
|
-
}
|
|
93
|
-
checkToggleAncestors(feature) {
|
|
94
|
-
this.findAllAncestorsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node => this.setFeatureValue(node, true));
|
|
95
|
-
}
|
|
96
|
-
findAllAncestorsOfByType(feature, type) {
|
|
97
|
-
let parent = this.findParentByType(feature, type);
|
|
98
|
-
const ancestors = [];
|
|
99
|
-
while (parent) {
|
|
100
|
-
ancestors.push(parent);
|
|
101
|
-
parent = this.findParentByType(parent, type);
|
|
102
|
-
}
|
|
103
|
-
return ancestors;
|
|
104
|
-
}
|
|
105
|
-
findAllDescendantsOfByType(feature, type) {
|
|
106
|
-
const descendants = [];
|
|
107
|
-
const queue = [feature];
|
|
108
|
-
while (queue.length) {
|
|
109
|
-
const node = queue.pop();
|
|
110
|
-
const newDescendants = this.findChildrenByType(node, type);
|
|
111
|
-
descendants.push(...newDescendants);
|
|
112
|
-
queue.push(...newDescendants);
|
|
113
|
-
}
|
|
114
|
-
return descendants;
|
|
115
|
-
}
|
|
116
|
-
findParentByType(feature, type) {
|
|
117
|
-
return this.getCurrentGroup().find(f => f.valueType.name === type && f.name === feature.parentName);
|
|
118
|
-
}
|
|
119
|
-
findChildrenByType(feature, type) {
|
|
120
|
-
return this.getCurrentGroup().filter(f => f.valueType.name === type && f.parentName === feature.name);
|
|
121
|
-
}
|
|
122
|
-
getCurrentGroup() {
|
|
123
|
-
var _a;
|
|
124
|
-
return (_a = this.features[this.selectedGroupDisplayName]) !== null && _a !== void 0 ? _a : [];
|
|
125
|
-
}
|
|
126
|
-
setFeatureValue(feature, val) {
|
|
127
|
-
feature.value = val;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
FeatureManagementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FeatureManagementComponent, deps: [{ token: i1.TrackByService }, { token: i2.FeaturesService }, { token: i1.ConfigStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
-
FeatureManagementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: FeatureManagementComponent, selector: "abp-feature-management", inputs: { providerKey: "providerKey", providerName: "providerName", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, exportAs: ["abpFeatureManagement"], ngImport: i0, template: "<abp-modal *ngIf=\"visible\" [(visible)]=\"visible\" [busy]=\"modalBusy\" [options]=\"{ size: 'lg' }\">\
|
|
132
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FeatureManagementComponent, decorators: [{
|
|
133
|
-
type: Component,
|
|
134
|
-
args: [{
|
|
135
|
-
selector: 'abp-feature-management',
|
|
136
|
-
templateUrl: './feature-management.component.html',
|
|
137
|
-
exportAs: 'abpFeatureManagement',
|
|
138
|
-
}]
|
|
139
|
-
}], ctorParameters: function () { return [{ type: i1.TrackByService }, { type: i2.FeaturesService }, { type: i1.ConfigStateService }]; }, propDecorators: { providerKey: [{
|
|
140
|
-
type: Input
|
|
141
|
-
}], providerName: [{
|
|
142
|
-
type: Input
|
|
143
|
-
}], visible: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], visibleChange: [{
|
|
146
|
-
type: Output
|
|
147
|
-
}] } });
|
|
148
|
-
function mapFeatures(features, dir) {
|
|
149
|
-
const margin = `margin-${dir === 'rtl' ? 'right' : 'left'}.px`;
|
|
150
|
-
return features.map(feature => {
|
|
151
|
-
var _a;
|
|
152
|
-
const value = ((_a = feature.valueType) === null || _a === void 0 ? void 0 : _a.name) === ValueTypes.ToggleStringValueType
|
|
153
|
-
? (feature.value || '').toLowerCase() === 'true'
|
|
154
|
-
: feature.value;
|
|
155
|
-
return Object.assign(Object.assign({}, feature), { value, initialValue: value, style: { [margin]: feature.depth * 20 } });
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1tYW5hZ2VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZlYXR1cmUtbWFuYWdlbWVudC9zcmMvbGliL2NvbXBvbmVudHMvZmVhdHVyZS1tYW5hZ2VtZW50L2ZlYXR1cmUtbWFuYWdlbWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9mZWF0dXJlLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2ZlYXR1cmUtbWFuYWdlbWVudC9mZWF0dXJlLW1hbmFnZW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRSxPQUFPLEVBR0wsZUFBZSxHQUVoQixNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFHMUMsSUFBSyxVQUlKO0FBSkQsV0FBSyxVQUFVO0lBQ2IsNkRBQStDLENBQUE7SUFDL0MsaUVBQW1ELENBQUE7SUFDbkQsbUVBQXFELENBQUE7QUFDdkQsQ0FBQyxFQUpJLFVBQVUsS0FBVixVQUFVLFFBSWQ7QUFPRCxNQUFNLE9BQU8sMEJBQTBCO0lBd0NyQyxZQUNrQixLQUFxQixFQUMzQixPQUF3QixFQUN4QixXQUErQjtRQUZ6QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUE5QjNDLFdBQU0sR0FBb0QsRUFBRSxDQUFDO1FBTTdELGVBQVUsR0FBRyxVQUFVLENBQUM7UUFpQkwsa0JBQWEs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QUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUN2QztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ1N0YXRlU2VydmljZSwgVHJhY2tCeVNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZlYXR1cmVEdG8sXHJcbiAgRmVhdHVyZUdyb3VwRHRvLFxyXG4gIEZlYXR1cmVzU2VydmljZSxcclxuICBVcGRhdGVGZWF0dXJlRHRvLFxyXG59IGZyb20gJ0BhYnAvbmcuZmVhdHVyZS1tYW5hZ2VtZW50L3Byb3h5JztcclxuaW1wb3J0IHsgTG9jYWxlRGlyZWN0aW9uIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmVhdHVyZS1tYW5hZ2VtZW50JztcclxuXHJcbmVudW0gVmFsdWVUeXBlcyB7XHJcbiAgVG9nZ2xlU3RyaW5nVmFsdWVUeXBlID0gJ1RvZ2dsZVN0cmluZ1ZhbHVlVHlwZScsXHJcbiAgRnJlZVRleHRTdHJpbmdWYWx1ZVR5cGUgPSAnRnJlZVRleHRTdHJpbmdWYWx1ZVR5cGUnLFxyXG4gIFNlbGVjdGlvblN0cmluZ1ZhbHVlVHlwZSA9ICdTZWxlY3Rpb25TdHJpbmdWYWx1ZVR5cGUnLFxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FicC1mZWF0dXJlLW1hbmFnZW1lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mZWF0dXJlLW1hbmFnZW1lbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGV4cG9ydEFzOiAnYWJwRmVhdHVyZU1hbmFnZW1lbnQnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmVhdHVyZU1hbmFnZW1lbnRDb21wb25lbnRcclxuICBpbXBsZW1lbnRzXHJcbiAgICBGZWF0dXJlTWFuYWdlbWVudC5GZWF0dXJlTWFuYWdlbWVudENvbXBvbmVudElucHV0cyxcclxuICAgIEZlYXR1cmVNYW5hZ2VtZW50LkZlYXR1cmVNYW5hZ2VtZW50Q29tcG9uZW50T3V0cHV0c1xyXG57XHJcbiAgQElucHV0KClcclxuICBwcm92aWRlcktleTogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHByb3ZpZGVyTmFtZTogc3RyaW5nO1xyXG5cclxuICBzZWxlY3RlZEdyb3VwRGlzcGxheU5hbWU6IHN0cmluZztcclxuXHJcbiAgZ3JvdXBzOiBQaWNrPEZlYXR1cmVHcm91cER0bywgJ25hbWUnIHwgJ2Rpc3BsYXlOYW1lJz5bXSA9IFtdO1xyXG5cclxuICBmZWF0dXJlczoge1xyXG4gICAgW2dyb3VwOiBzdHJpbmddOiBBcnJheTxGZWF0dXJlRHRvICYgeyBzdHlsZT86IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IGluaXRpYWxWYWx1ZTogYW55IH0+O1xyXG4gIH07XHJcblxyXG4gIHZhbHVlVHlwZXMgPSBWYWx1ZVR5cGVzO1xyXG5cclxuICBwcm90ZWN0ZWQgX3Zpc2libGU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fdmlzaWJsZSA9PT0gdmFsdWUpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XHJcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICBpZiAodmFsdWUpIHRoaXMub3Blbk1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgbW9kYWxCdXN5ID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlYWRvbmx5IHRyYWNrOiBUcmFja0J5U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBzZXJ2aWNlOiBGZWF0dXJlc1NlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnU3RhdGU6IENvbmZpZ1N0YXRlU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG9wZW5Nb2RhbCgpIHtcclxuICAgIGlmICghdGhpcy5wcm92aWRlck5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlck5hbWUgaXMgcmVxdWlyZWQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRGZWF0dXJlcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmVhdHVyZXMoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0KHRoaXMucHJvdmlkZXJOYW1lLCB0aGlzLnByb3ZpZGVyS2V5KS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKCFyZXMuZ3JvdXBzPy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgdGhpcy5ncm91cHMgPSByZXMuZ3JvdXBzLm1hcCgoeyBuYW1lLCBkaXNwbGF5TmFtZSB9KSA9PiAoeyBuYW1lLCBkaXNwbGF5TmFtZSB9KSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lID0gdGhpcy5ncm91cHNbMF0uZGlzcGxheU5hbWU7XHJcbiAgICAgIHRoaXMuZmVhdHVyZXMgPSByZXMuZ3JvdXBzLnJlZHVjZShcclxuICAgICAgICAoYWNjLCB2YWwpID0+ICh7XHJcbiAgICAgICAgICAuLi5hY2MsXHJcbiAgICAgICAgICBbdmFsLm5hbWVdOiBtYXBGZWF0dXJlcyh2YWwuZmVhdHVyZXMsIGRvY3VtZW50LmJvZHkuZGlyIGFzIExvY2FsZURpcmVjdGlvbiksXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAge30sXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmUoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjaGFuZ2VkRmVhdHVyZXMgPSBbXSBhcyBVcGRhdGVGZWF0dXJlRHRvW107XHJcblxyXG4gICAgT2JqZWN0LmtleXModGhpcy5mZWF0dXJlcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICB0aGlzLmZlYXR1cmVzW2tleV0uZm9yRWFjaChmZWF0dXJlID0+IHtcclxuICAgICAgICBpZiAoZmVhdHVyZS52YWx1ZSAhPT0gZmVhdHVyZS5pbml0aWFsVmFsdWUpXHJcbiAgICAgICAgICBjaGFuZ2VkRmVhdHVyZXMucHVzaCh7IG5hbWU6IGZlYXR1cmUubmFtZSwgdmFsdWU6IGAke2ZlYXR1cmUudmFsdWV9YCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWNoYW5nZWRGZWF0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1vZGFsQnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLnVwZGF0ZSh0aGlzLnByb3ZpZGVyTmFtZSwgdGhpcy5wcm92aWRlcktleSwgeyBmZWF0dXJlczogY2hhbmdlZEZlYXR1cmVzIH0pXHJcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLm1vZGFsQnVzeSA9IGZhbHNlKSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXJLZXkpIHtcclxuICAgICAgICAgIC8vIHRvIHJlZnJlc2ggaG9zdCdzIGZlYXR1cmVzXHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ1N0YXRlLnJlZnJlc2hBcHBTdGF0ZSgpLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoZWNrYm94Q2xpY2sodmFsOiBib29sZWFuLCBmZWF0dXJlOiBGZWF0dXJlRHRvKSB7XHJcbiAgICBpZiAodmFsKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tUb2dnbGVBbmNlc3RvcnMoZmVhdHVyZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVuY2hlY2tUb2dnbGVEZXNjZW5kYW50cyhmZWF0dXJlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5jaGVja1RvZ2dsZURlc2NlbmRhbnRzKGZlYXR1cmU6IEZlYXR1cmVEdG8pIHtcclxuICAgIHRoaXMuZmluZEFsbERlc2NlbmRhbnRzT2ZCeVR5cGUoZmVhdHVyZSwgVmFsdWVUeXBlcy5Ub2dnbGVTdHJpbmdWYWx1ZVR5cGUpLmZvckVhY2gobm9kZSA9PlxyXG4gICAgICB0aGlzLnNldEZlYXR1cmVWYWx1ZShub2RlLCBmYWxzZSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1RvZ2dsZUFuY2VzdG9ycyhmZWF0dXJlOiBGZWF0dXJlRHRvKSB7XHJcbiAgICB0aGlzLmZpbmRBbGxBbmNlc3RvcnNPZkJ5VHlwZShmZWF0dXJlLCBWYWx1ZVR5cGVzLlRvZ2dsZVN0cmluZ1ZhbHVlVHlwZSkuZm9yRWFjaChub2RlID0+XHJcbiAgICAgIHRoaXMuc2V0RmVhdHVyZVZhbHVlKG5vZGUsIHRydWUpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZEFsbEFuY2VzdG9yc09mQnlUeXBlKGZlYXR1cmU6IEZlYXR1cmVEdG8sIHR5cGU6IFZhbHVlVHlwZXMpIHtcclxuICAgIGxldCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnRCeVR5cGUoZmVhdHVyZSwgdHlwZSk7XHJcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBbXTtcclxuICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcclxuICAgICAgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50QnlUeXBlKHBhcmVudCwgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5jZXN0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kQWxsRGVzY2VuZGFudHNPZkJ5VHlwZShmZWF0dXJlOiBGZWF0dXJlRHRvLCB0eXBlOiBWYWx1ZVR5cGVzKSB7XHJcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IFtdO1xyXG4gICAgY29uc3QgcXVldWUgPSBbZmVhdHVyZV07XHJcblxyXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBub2RlID0gcXVldWUucG9wKCk7XHJcbiAgICAgIGNvbnN0IG5ld0Rlc2NlbmRhbnRzID0gdGhpcy5maW5kQ2hpbGRyZW5CeVR5cGUobm9kZSwgdHlwZSk7XHJcbiAgICAgIGRlc2NlbmRhbnRzLnB1c2goLi4ubmV3RGVzY2VuZGFudHMpO1xyXG4gICAgICBxdWV1ZS5wdXNoKC4uLm5ld0Rlc2NlbmRhbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVzY2VuZGFudHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRQYXJlbnRCeVR5cGUoZmVhdHVyZTogRmVhdHVyZUR0bywgdHlwZTogVmFsdWVUeXBlcykge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudEdyb3VwKCkuZmluZChcclxuICAgICAgZiA9PiBmLnZhbHVlVHlwZS5uYW1lID09PSB0eXBlICYmIGYubmFtZSA9PT0gZmVhdHVyZS5wYXJlbnROYW1lLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZENoaWxkcmVuQnlUeXBlKGZlYXR1cmU6IEZlYXR1cmVEdG8sIHR5cGU6IFZhbHVlVHlwZXMpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRHcm91cCgpLmZpbHRlcihcclxuICAgICAgZiA9PiBmLnZhbHVlVHlwZS5uYW1lID09PSB0eXBlICYmIGYucGFyZW50TmFtZSA9PT0gZmVhdHVyZS5uYW1lLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q3VycmVudEdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZXNbdGhpcy5zZWxlY3RlZEdyb3VwRGlzcGxheU5hbWVdID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGZWF0dXJlVmFsdWUoZmVhdHVyZTogRmVhdHVyZUR0bywgdmFsOiBib29sZWFuKSB7XHJcbiAgICBmZWF0dXJlLnZhbHVlID0gdmFsIGFzIGFueTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcEZlYXR1cmVzKGZlYXR1cmVzOiBGZWF0dXJlRHRvW10sIGRpcjogTG9jYWxlRGlyZWN0aW9uKSB7XHJcbiAgY29uc3QgbWFyZ2luID0gYG1hcmdpbi0ke2RpciA9PT0gJ3J0bCcgPyAncmlnaHQnIDogJ2xlZnQnfS5weGA7XHJcblxyXG4gIHJldHVybiBmZWF0dXJlcy5tYXAoZmVhdHVyZSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZSA9XHJcbiAgICAgIGZlYXR1cmUudmFsdWVUeXBlPy5uYW1lID09PSBWYWx1ZVR5cGVzLlRvZ2dsZVN0cmluZ1ZhbHVlVHlwZVxyXG4gICAgICAgID8gKGZlYXR1cmUudmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xyXG4gICAgICAgIDogZmVhdHVyZS52YWx1ZTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5mZWF0dXJlLFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgaW5pdGlhbFZhbHVlOiB2YWx1ZSxcclxuICAgICAgc3R5bGU6IHsgW21hcmdpbl06IGZlYXR1cmUuZGVwdGggKiAyMCB9LFxyXG4gICAgfTtcclxuICB9KTtcclxufVxyXG4iLCI8YWJwLW1vZGFsICpuZ0lmPVwidmlzaWJsZVwiIFsodmlzaWJsZSldPVwidmlzaWJsZVwiIFtidXN5XT1cIm1vZGFsQnVzeVwiIFtvcHRpb25zXT1cInsgc2l6ZTogJ2xnJyB9XCI+XHJcbiAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XHJcbiAgICA8aDM+e3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpGZWF0dXJlcycgfCBhYnBMb2NhbGl6YXRpb24gfX08L2gzPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgPHVsXHJcbiAgICAgICAgICBuZ2JOYXZcclxuICAgICAgICAgICNuYXY9XCJuZ2JOYXZcIlxyXG4gICAgICAgICAgWyhhY3RpdmVJZCldPVwic2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lXCJcclxuICAgICAgICAgIGNsYXNzPVwibmF2LXBpbGxzXCJcclxuICAgICAgICAgIG9yaWVudGF0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzOyB0cmFja0J5OiB0cmFjay5ieSgnbmFtZScpXCJcclxuICAgICAgICAgICAgW25nYk5hdkl0ZW1dPVwiZ3JvdXAuZGlzcGxheU5hbWVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YSBuZ2JOYXZMaW5rPnt7IGdyb3VwLmRpc3BsYXlOYW1lIH19PC9hPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cclxuICAgICAgICAgICAgICA8aDQ+e3sgc2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lIH19PC9oND5cclxuICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtdC0yIG1iLTNcIiAvPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZlYXR1cmUgb2YgZmVhdHVyZXNbZ3JvdXAubmFtZV07IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrLmJ5KCdpZCcpXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImZlYXR1cmUuc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgW25nU3dpdGNoXT1cImZlYXR1cmUudmFsdWVUeXBlPy5uYW1lXCJcclxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzYXZlKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInZhbHVlVHlwZXMuVG9nZ2xlU3RyaW5nVmFsdWVUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJmZWF0dXJlLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmZWF0dXJlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hlY2tib3hDbGljaygkZXZlbnQsIGZlYXR1cmUpXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2h0bWxGb3JdPVwiZmVhdHVyZS5uYW1lXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZXNjVG1wOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZmVhdHVyZS5kZXNjcmlwdGlvbiB9XCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ2YWx1ZVR5cGVzLkZyZWVUZXh0U3RyaW5nVmFsdWVUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2h0bWxGb3JdPVwiZmVhdHVyZS5uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZmVhdHVyZS5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmVhdHVyZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYWJwRmVhdHVyZU1hbmFnZW1lbnRGcmVlVGV4dF09XCJmZWF0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRlc2NUbXA7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmZWF0dXJlLmRlc2NyaXB0aW9uIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInZhbHVlVHlwZXMuU2VsZWN0aW9uU3RyaW5nVmFsdWVUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmZWF0dXJlLnZhbHVlVHlwZS5pdGVtU291cmNlPy5pdGVtcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtodG1sRm9yXT1cImZlYXR1cmUubmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFtpZF09XCJmZWF0dXJlLm5hbWVcIiBbKG5nTW9kZWwpXT1cImZlYXR1cmUudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2YgZmVhdHVyZS52YWx1ZVR5cGUuaXRlbVNvdXJjZT8uaXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNwbGF5VGV4dD8ucmVzb3VyY2VOYW1lICsgJzo6JyArIGl0ZW0uZGlzcGxheVRleHQ/Lm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYnBMb2NhbGl6YXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRlc2NUbXA7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmZWF0dXJlLmRlc2NyaXB0aW9uIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0Pnt7IGZlYXR1cmUuZGlzcGxheU5hbWUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Rlc2NUbXAgbGV0LWRlc2NyaXB0aW9uPlxyXG4gICAgICAgIDxzbWFsbCAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJkLWJsb2NrIGZvcm0tdGV4dCB0ZXh0LW11dGVkXCI+e3sgZGVzY3JpcHRpb24gfX08L3NtYWxsPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+PGRpdiBbbmdiTmF2T3V0bGV0XT1cIm5hdlwiPjwvZGl2PjwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm14LTNcIiAqbmdJZj1cIiFncm91cHMubGVuZ3RoXCI+XHJcbiAgICAgICAge3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpOb0ZlYXR1cmVGb3VuZE1lc3NhZ2UnIHwgYWJwTG9jYWxpemF0aW9uIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNhYnBGb290ZXI+XHJcbiAgICA8YnV0dG9uIGFicENsb3NlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCI+XHJcbiAgICAgIHt7ICdBYnBGZWF0dXJlTWFuYWdlbWVudDo6Q2FuY2VsJyB8IGFicExvY2FsaXphdGlvbiB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YWJwLWJ1dHRvblxyXG4gICAgICAqbmdJZj1cImdyb3Vwcy5sZW5ndGhcIlxyXG4gICAgICBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJtb2RhbEJ1c3lcIlxyXG4gICAgICAoY2xpY2spPVwic2F2ZSgpXCJcclxuICAgID5cclxuICAgICAge3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpTYXZlJyB8IGFicExvY2FsaXphdGlvbiB9fVxyXG4gICAgPC9hYnAtYnV0dG9uPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvYWJwLW1vZGFsPlxyXG4iXX0=
|
|
1
|
+
import { ConfigStateService, TrackByService } from '@abp/ng.core';
|
|
2
|
+
import { FeaturesService, } from '@abp/ng.feature-management/proxy';
|
|
3
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
+
import { finalize } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@abp/ng.core";
|
|
7
|
+
import * as i2 from "@abp/ng.feature-management/proxy";
|
|
8
|
+
import * as i3 from "@abp/ng.theme.shared";
|
|
9
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
import * as i5 from "@angular/common";
|
|
11
|
+
import * as i6 from "@angular/forms";
|
|
12
|
+
import * as i7 from "../../directives/free-text-input.directive";
|
|
13
|
+
var ValueTypes;
|
|
14
|
+
(function (ValueTypes) {
|
|
15
|
+
ValueTypes["ToggleStringValueType"] = "ToggleStringValueType";
|
|
16
|
+
ValueTypes["FreeTextStringValueType"] = "FreeTextStringValueType";
|
|
17
|
+
ValueTypes["SelectionStringValueType"] = "SelectionStringValueType";
|
|
18
|
+
})(ValueTypes || (ValueTypes = {}));
|
|
19
|
+
export class FeatureManagementComponent {
|
|
20
|
+
constructor(track, service, configState) {
|
|
21
|
+
this.track = track;
|
|
22
|
+
this.service = service;
|
|
23
|
+
this.configState = configState;
|
|
24
|
+
this.groups = [];
|
|
25
|
+
this.valueTypes = ValueTypes;
|
|
26
|
+
this.visibleChange = new EventEmitter();
|
|
27
|
+
this.modalBusy = false;
|
|
28
|
+
}
|
|
29
|
+
get visible() {
|
|
30
|
+
return this._visible;
|
|
31
|
+
}
|
|
32
|
+
set visible(value) {
|
|
33
|
+
if (this._visible === value)
|
|
34
|
+
return;
|
|
35
|
+
this._visible = value;
|
|
36
|
+
this.visibleChange.emit(value);
|
|
37
|
+
if (value)
|
|
38
|
+
this.openModal();
|
|
39
|
+
}
|
|
40
|
+
openModal() {
|
|
41
|
+
if (!this.providerName) {
|
|
42
|
+
throw new Error('providerName is required.');
|
|
43
|
+
}
|
|
44
|
+
this.getFeatures();
|
|
45
|
+
}
|
|
46
|
+
getFeatures() {
|
|
47
|
+
this.service.get(this.providerName, this.providerKey).subscribe(res => {
|
|
48
|
+
var _a;
|
|
49
|
+
if (!((_a = res.groups) === null || _a === void 0 ? void 0 : _a.length))
|
|
50
|
+
return;
|
|
51
|
+
this.groups = res.groups.map(({ name, displayName }) => ({ name, displayName }));
|
|
52
|
+
this.selectedGroupDisplayName = this.groups[0].displayName;
|
|
53
|
+
this.features = res.groups.reduce((acc, val) => (Object.assign(Object.assign({}, acc), { [val.name]: mapFeatures(val.features, document.body.dir) })), {});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
save() {
|
|
57
|
+
if (this.modalBusy)
|
|
58
|
+
return;
|
|
59
|
+
const changedFeatures = [];
|
|
60
|
+
Object.keys(this.features).forEach(key => {
|
|
61
|
+
this.features[key].forEach(feature => {
|
|
62
|
+
if (feature.value !== feature.initialValue)
|
|
63
|
+
changedFeatures.push({ name: feature.name, value: `${feature.value}` });
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
if (!changedFeatures.length) {
|
|
67
|
+
this.visible = false;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.modalBusy = true;
|
|
71
|
+
this.service
|
|
72
|
+
.update(this.providerName, this.providerKey, { features: changedFeatures })
|
|
73
|
+
.pipe(finalize(() => (this.modalBusy = false)))
|
|
74
|
+
.subscribe(() => {
|
|
75
|
+
this.visible = false;
|
|
76
|
+
if (!this.providerKey) {
|
|
77
|
+
// to refresh host's features
|
|
78
|
+
this.configState.refreshAppState().subscribe();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
onCheckboxClick(val, feature) {
|
|
83
|
+
if (val) {
|
|
84
|
+
this.checkToggleAncestors(feature);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.uncheckToggleDescendants(feature);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
uncheckToggleDescendants(feature) {
|
|
91
|
+
this.findAllDescendantsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node => this.setFeatureValue(node, false));
|
|
92
|
+
}
|
|
93
|
+
checkToggleAncestors(feature) {
|
|
94
|
+
this.findAllAncestorsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node => this.setFeatureValue(node, true));
|
|
95
|
+
}
|
|
96
|
+
findAllAncestorsOfByType(feature, type) {
|
|
97
|
+
let parent = this.findParentByType(feature, type);
|
|
98
|
+
const ancestors = [];
|
|
99
|
+
while (parent) {
|
|
100
|
+
ancestors.push(parent);
|
|
101
|
+
parent = this.findParentByType(parent, type);
|
|
102
|
+
}
|
|
103
|
+
return ancestors;
|
|
104
|
+
}
|
|
105
|
+
findAllDescendantsOfByType(feature, type) {
|
|
106
|
+
const descendants = [];
|
|
107
|
+
const queue = [feature];
|
|
108
|
+
while (queue.length) {
|
|
109
|
+
const node = queue.pop();
|
|
110
|
+
const newDescendants = this.findChildrenByType(node, type);
|
|
111
|
+
descendants.push(...newDescendants);
|
|
112
|
+
queue.push(...newDescendants);
|
|
113
|
+
}
|
|
114
|
+
return descendants;
|
|
115
|
+
}
|
|
116
|
+
findParentByType(feature, type) {
|
|
117
|
+
return this.getCurrentGroup().find(f => f.valueType.name === type && f.name === feature.parentName);
|
|
118
|
+
}
|
|
119
|
+
findChildrenByType(feature, type) {
|
|
120
|
+
return this.getCurrentGroup().filter(f => f.valueType.name === type && f.parentName === feature.name);
|
|
121
|
+
}
|
|
122
|
+
getCurrentGroup() {
|
|
123
|
+
var _a;
|
|
124
|
+
return (_a = this.features[this.selectedGroupDisplayName]) !== null && _a !== void 0 ? _a : [];
|
|
125
|
+
}
|
|
126
|
+
setFeatureValue(feature, val) {
|
|
127
|
+
feature.value = val;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
FeatureManagementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FeatureManagementComponent, deps: [{ token: i1.TrackByService }, { token: i2.FeaturesService }, { token: i1.ConfigStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
+
FeatureManagementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: FeatureManagementComponent, selector: "abp-feature-management", inputs: { providerKey: "providerKey", providerName: "providerName", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, exportAs: ["abpFeatureManagement"], ngImport: i0, template: "<abp-modal *ngIf=\"visible\" [(visible)]=\"visible\" [busy]=\"modalBusy\" [options]=\"{ size: 'lg' }\">\n <ng-template #abpHeader>\n <h3>{{ 'AbpFeatureManagement::Features' | abpLocalization }}</h3>\n </ng-template>\n\n <ng-template #abpBody>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <ul\n ngbNav\n #nav=\"ngbNav\"\n [(activeId)]=\"selectedGroupDisplayName\"\n class=\"nav-pills\"\n orientation=\"vertical\"\n >\n <li\n *ngFor=\"let group of groups; trackBy: track.by('name')\"\n [ngbNavItem]=\"group.displayName\"\n >\n <a ngbNavLink>{{ group.displayName }}</a>\n <ng-template ngbNavContent>\n <h4>{{ selectedGroupDisplayName }}</h4>\n <hr class=\"mt-2 mb-3\" />\n\n <div\n class=\"mt-2\"\n *ngFor=\"let feature of features[group.name]; let i = index; trackBy: track.by('id')\"\n [ngStyle]=\"feature.style\"\n [ngSwitch]=\"feature.valueType?.name\"\n (keyup.enter)=\"save()\"\n >\n <ng-container *ngSwitchCase=\"valueTypes.ToggleStringValueType\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"feature.name\"\n [(ngModel)]=\"feature.value\"\n (ngModelChange)=\"onCheckboxClick($event, feature)\"\n />\n\n <label class=\"form-check-label\" [htmlFor]=\"feature.name\">{{\n feature.displayName\n }}</label>\n <ng-container\n *ngTemplateOutlet=\"descTmp; context: { $implicit: feature.description }\"\n ></ng-container>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"valueTypes.FreeTextStringValueType\">\n <div class=\"mb-3 form-group\">\n <label [htmlFor]=\"feature.name\" class=\"form-label\">{{\n feature.displayName\n }}</label>\n <input\n class=\"form-control\"\n type=\"text\"\n [id]=\"feature.name\"\n [(ngModel)]=\"feature.value\"\n [abpFeatureManagementFreeText]=\"feature\"\n />\n\n <ng-container\n *ngTemplateOutlet=\"descTmp; context: { $implicit: feature.description }\"\n ></ng-container>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"valueTypes.SelectionStringValueType\">\n <ng-container *ngIf=\"feature.valueType.itemSource?.items?.length\">\n <div class=\"mb-3 form-group\">\n <label [htmlFor]=\"feature.name\" class=\"form-label\">{{\n feature.displayName\n }}</label>\n <select class=\"form-select\" [id]=\"feature.name\" [(ngModel)]=\"feature.value\">\n <option\n *ngFor=\"\n let item of feature.valueType.itemSource?.items;\n trackBy: track.by('value')\n \"\n [ngValue]=\"item.value\"\n >\n {{\n item.displayText?.resourceName + '::' + item.displayText?.name\n | abpLocalization\n }}\n </option>\n </select>\n <ng-container\n *ngTemplateOutlet=\"descTmp; context: { $implicit: feature.description }\"\n ></ng-container>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ feature.displayName }}</ng-container>\n </div>\n </ng-template>\n </li>\n </ul>\n </div>\n\n <ng-template #descTmp let-description>\n <small *ngIf=\"description\" class=\"d-block form-text text-muted\">{{ description }}</small>\n </ng-template>\n\n <div class=\"col-md-8\"><div [ngbNavOutlet]=\"nav\"></div></div>\n\n <div class=\"mx-3\" *ngIf=\"!groups.length\">\n {{ 'AbpFeatureManagement::NoFeatureFoundMessage' | abpLocalization }}\n </div>\n </div>\n </ng-template>\n\n <ng-template #abpFooter>\n <button abpClose type=\"button\" class=\"btn btn-secondary\">\n {{ 'AbpFeatureManagement::Cancel' | abpLocalization }}\n </button>\n <abp-button\n *ngIf=\"groups.length\"\n iconClass=\"fa fa-check\"\n [disabled]=\"modalBusy\"\n (click)=\"save()\"\n >\n {{ 'AbpFeatureManagement::Save' | abpLocalization }}\n </abp-button>\n </ng-template>\n</abp-modal>\n", components: [{ type: i3.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { type: i4.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { type: i3.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgbNav, selector: "[ngbNav]", inputs: ["animation", "destroyOnHide", "orientation", "roles", "keyboard", "activeId"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgbNavItem, selector: "[ngbNavItem]", inputs: ["disabled", "domId", "destroyOnHide", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { type: i4.NgbNavLink, selector: "a[ngbNavLink]" }, { type: i4.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.FreeTextInputDirective, selector: "input[abpFeatureManagementFreeText]", inputs: ["abpFeatureManagementFreeText"], exportAs: ["inputAbpFeatureManagementFreeText"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i3.ModalCloseDirective, selector: "[abpClose]" }], pipes: { "abpLocalization": i1.LocalizationPipe } });
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FeatureManagementComponent, decorators: [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{
|
|
135
|
+
selector: 'abp-feature-management',
|
|
136
|
+
templateUrl: './feature-management.component.html',
|
|
137
|
+
exportAs: 'abpFeatureManagement',
|
|
138
|
+
}]
|
|
139
|
+
}], ctorParameters: function () { return [{ type: i1.TrackByService }, { type: i2.FeaturesService }, { type: i1.ConfigStateService }]; }, propDecorators: { providerKey: [{
|
|
140
|
+
type: Input
|
|
141
|
+
}], providerName: [{
|
|
142
|
+
type: Input
|
|
143
|
+
}], visible: [{
|
|
144
|
+
type: Input
|
|
145
|
+
}], visibleChange: [{
|
|
146
|
+
type: Output
|
|
147
|
+
}] } });
|
|
148
|
+
function mapFeatures(features, dir) {
|
|
149
|
+
const margin = `margin-${dir === 'rtl' ? 'right' : 'left'}.px`;
|
|
150
|
+
return features.map(feature => {
|
|
151
|
+
var _a;
|
|
152
|
+
const value = ((_a = feature.valueType) === null || _a === void 0 ? void 0 : _a.name) === ValueTypes.ToggleStringValueType
|
|
153
|
+
? (feature.value || '').toLowerCase() === 'true'
|
|
154
|
+
: feature.value;
|
|
155
|
+
return Object.assign(Object.assign({}, feature), { value, initialValue: value, style: { [margin]: feature.depth * 20 } });
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1tYW5hZ2VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZlYXR1cmUtbWFuYWdlbWVudC9zcmMvbGliL2NvbXBvbmVudHMvZmVhdHVyZS1tYW5hZ2VtZW50L2ZlYXR1cmUtbWFuYWdlbWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9mZWF0dXJlLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2ZlYXR1cmUtbWFuYWdlbWVudC9mZWF0dXJlLW1hbmFnZW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRSxPQUFPLEVBR0wsZUFBZSxHQUVoQixNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFHMUMsSUFBSyxVQUlKO0FBSkQsV0FBSyxVQUFVO0lBQ2IsNkRBQStDLENBQUE7SUFDL0MsaUVBQW1ELENBQUE7SUFDbkQsbUVBQXFELENBQUE7QUFDdkQsQ0FBQyxFQUpJLFVBQVUsS0FBVixVQUFVLFFBSWQ7QUFPRCxNQUFNLE9BQU8sMEJBQTBCO0lBd0NyQyxZQUNrQixLQUFxQixFQUMzQixPQUF3QixFQUN4QixXQUErQjtRQUZ6QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUE5QjNDLFdBQU0sR0FBb0QsRUFBRSxDQUFDO1FBTTdELGVBQVUsR0FBRyxVQUFVLENBQUM7UUFpQkwsa0JBQWEs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QUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUN2QztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ1N0YXRlU2VydmljZSwgVHJhY2tCeVNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xuaW1wb3J0IHtcbiAgRmVhdHVyZUR0byxcbiAgRmVhdHVyZUdyb3VwRHRvLFxuICBGZWF0dXJlc1NlcnZpY2UsXG4gIFVwZGF0ZUZlYXR1cmVEdG8sXG59IGZyb20gJ0BhYnAvbmcuZmVhdHVyZS1tYW5hZ2VtZW50L3Byb3h5JztcbmltcG9ydCB7IExvY2FsZURpcmVjdGlvbiB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZlYXR1cmVNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZlYXR1cmUtbWFuYWdlbWVudCc7XG5cbmVudW0gVmFsdWVUeXBlcyB7XG4gIFRvZ2dsZVN0cmluZ1ZhbHVlVHlwZSA9ICdUb2dnbGVTdHJpbmdWYWx1ZVR5cGUnLFxuICBGcmVlVGV4dFN0cmluZ1ZhbHVlVHlwZSA9ICdGcmVlVGV4dFN0cmluZ1ZhbHVlVHlwZScsXG4gIFNlbGVjdGlvblN0cmluZ1ZhbHVlVHlwZSA9ICdTZWxlY3Rpb25TdHJpbmdWYWx1ZVR5cGUnLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhYnAtZmVhdHVyZS1tYW5hZ2VtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZlYXR1cmUtbWFuYWdlbWVudC5jb21wb25lbnQuaHRtbCcsXG4gIGV4cG9ydEFzOiAnYWJwRmVhdHVyZU1hbmFnZW1lbnQnLFxufSlcbmV4cG9ydCBjbGFzcyBGZWF0dXJlTWFuYWdlbWVudENvbXBvbmVudFxuICBpbXBsZW1lbnRzXG4gICAgRmVhdHVyZU1hbmFnZW1lbnQuRmVhdHVyZU1hbmFnZW1lbnRDb21wb25lbnRJbnB1dHMsXG4gICAgRmVhdHVyZU1hbmFnZW1lbnQuRmVhdHVyZU1hbmFnZW1lbnRDb21wb25lbnRPdXRwdXRzXG57XG4gIEBJbnB1dCgpXG4gIHByb3ZpZGVyS2V5OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG5cbiAgc2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lOiBzdHJpbmc7XG5cbiAgZ3JvdXBzOiBQaWNrPEZlYXR1cmVHcm91cER0bywgJ25hbWUnIHwgJ2Rpc3BsYXlOYW1lJz5bXSA9IFtdO1xuXG4gIGZlYXR1cmVzOiB7XG4gICAgW2dyb3VwOiBzdHJpbmddOiBBcnJheTxGZWF0dXJlRHRvICYgeyBzdHlsZT86IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IGluaXRpYWxWYWx1ZTogYW55IH0+O1xuICB9O1xuXG4gIHZhbHVlVHlwZXMgPSBWYWx1ZVR5cGVzO1xuXG4gIHByb3RlY3RlZCBfdmlzaWJsZTtcblxuICBASW5wdXQoKVxuICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgfVxuXG4gIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGUgPT09IHZhbHVlKSByZXR1cm47XG5cbiAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIGlmICh2YWx1ZSkgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSByZWFkb25seSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG1vZGFsQnVzeSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB0cmFjazogVHJhY2tCeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IEZlYXR1cmVzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU3RhdGU6IENvbmZpZ1N0YXRlU2VydmljZSxcbiAgKSB7fVxuXG4gIG9wZW5Nb2RhbCgpIHtcbiAgICBpZiAoIXRoaXMucHJvdmlkZXJOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVyTmFtZSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmdldEZlYXR1cmVzKCk7XG4gIH1cblxuICBnZXRGZWF0dXJlcygpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0KHRoaXMucHJvdmlkZXJOYW1lLCB0aGlzLnByb3ZpZGVyS2V5KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIGlmICghcmVzLmdyb3Vwcz8ubGVuZ3RoKSByZXR1cm47XG4gICAgICB0aGlzLmdyb3VwcyA9IHJlcy5ncm91cHMubWFwKCh7IG5hbWUsIGRpc3BsYXlOYW1lIH0pID0+ICh7IG5hbWUsIGRpc3BsYXlOYW1lIH0pKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lID0gdGhpcy5ncm91cHNbMF0uZGlzcGxheU5hbWU7XG4gICAgICB0aGlzLmZlYXR1cmVzID0gcmVzLmdyb3Vwcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHZhbCkgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW3ZhbC5uYW1lXTogbWFwRmVhdHVyZXModmFsLmZlYXR1cmVzLCBkb2N1bWVudC5ib2R5LmRpciBhcyBMb2NhbGVEaXJlY3Rpb24pLFxuICAgICAgICB9KSxcbiAgICAgICAge30sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5tb2RhbEJ1c3kpIHJldHVybjtcblxuICAgIGNvbnN0IGNoYW5nZWRGZWF0dXJlcyA9IFtdIGFzIFVwZGF0ZUZlYXR1cmVEdG9bXTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuZmVhdHVyZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMuZmVhdHVyZXNba2V5XS5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICBpZiAoZmVhdHVyZS52YWx1ZSAhPT0gZmVhdHVyZS5pbml0aWFsVmFsdWUpXG4gICAgICAgICAgY2hhbmdlZEZlYXR1cmVzLnB1c2goeyBuYW1lOiBmZWF0dXJlLm5hbWUsIHZhbHVlOiBgJHtmZWF0dXJlLnZhbHVlfWAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghY2hhbmdlZEZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tb2RhbEJ1c3kgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZVxuICAgICAgLnVwZGF0ZSh0aGlzLnByb3ZpZGVyTmFtZSwgdGhpcy5wcm92aWRlcktleSwgeyBmZWF0dXJlczogY2hhbmdlZEZlYXR1cmVzIH0pXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiAodGhpcy5tb2RhbEJ1c3kgPSBmYWxzZSkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5wcm92aWRlcktleSkge1xuICAgICAgICAgIC8vIHRvIHJlZnJlc2ggaG9zdCdzIGZlYXR1cmVzXG4gICAgICAgICAgdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBvbkNoZWNrYm94Q2xpY2sodmFsOiBib29sZWFuLCBmZWF0dXJlOiBGZWF0dXJlRHRvKSB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy5jaGVja1RvZ2dsZUFuY2VzdG9ycyhmZWF0dXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bmNoZWNrVG9nZ2xlRGVzY2VuZGFudHMoZmVhdHVyZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmNoZWNrVG9nZ2xlRGVzY2VuZGFudHMoZmVhdHVyZTogRmVhdHVyZUR0bykge1xuICAgIHRoaXMuZmluZEFsbERlc2NlbmRhbnRzT2ZCeVR5cGUoZmVhdHVyZSwgVmFsdWVUeXBlcy5Ub2dnbGVTdHJpbmdWYWx1ZVR5cGUpLmZvckVhY2gobm9kZSA9PlxuICAgICAgdGhpcy5zZXRGZWF0dXJlVmFsdWUobm9kZSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrVG9nZ2xlQW5jZXN0b3JzKGZlYXR1cmU6IEZlYXR1cmVEdG8pIHtcbiAgICB0aGlzLmZpbmRBbGxBbmNlc3RvcnNPZkJ5VHlwZShmZWF0dXJlLCBWYWx1ZVR5cGVzLlRvZ2dsZVN0cmluZ1ZhbHVlVHlwZSkuZm9yRWFjaChub2RlID0+XG4gICAgICB0aGlzLnNldEZlYXR1cmVWYWx1ZShub2RlLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWxsQW5jZXN0b3JzT2ZCeVR5cGUoZmVhdHVyZTogRmVhdHVyZUR0bywgdHlwZTogVmFsdWVUeXBlcykge1xuICAgIGxldCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnRCeVR5cGUoZmVhdHVyZSwgdHlwZSk7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gW107XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcbiAgICAgIHBhcmVudCA9IHRoaXMuZmluZFBhcmVudEJ5VHlwZShwYXJlbnQsIHR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWxsRGVzY2VuZGFudHNPZkJ5VHlwZShmZWF0dXJlOiBGZWF0dXJlRHRvLCB0eXBlOiBWYWx1ZVR5cGVzKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSBbXTtcbiAgICBjb25zdCBxdWV1ZSA9IFtmZWF0dXJlXTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBxdWV1ZS5wb3AoKTtcbiAgICAgIGNvbnN0IG5ld0Rlc2NlbmRhbnRzID0gdGhpcy5maW5kQ2hpbGRyZW5CeVR5cGUobm9kZSwgdHlwZSk7XG4gICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLm5ld0Rlc2NlbmRhbnRzKTtcbiAgICAgIHF1ZXVlLnB1c2goLi4ubmV3RGVzY2VuZGFudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmVudEJ5VHlwZShmZWF0dXJlOiBGZWF0dXJlRHRvLCB0eXBlOiBWYWx1ZVR5cGVzKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudEdyb3VwKCkuZmluZChcbiAgICAgIGYgPT4gZi52YWx1ZVR5cGUubmFtZSA9PT0gdHlwZSAmJiBmLm5hbWUgPT09IGZlYXR1cmUucGFyZW50TmFtZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ2hpbGRyZW5CeVR5cGUoZmVhdHVyZTogRmVhdHVyZUR0bywgdHlwZTogVmFsdWVUeXBlcykge1xuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRHcm91cCgpLmZpbHRlcihcbiAgICAgIGYgPT4gZi52YWx1ZVR5cGUubmFtZSA9PT0gdHlwZSAmJiBmLnBhcmVudE5hbWUgPT09IGZlYXR1cmUubmFtZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZXNbdGhpcy5zZWxlY3RlZEdyb3VwRGlzcGxheU5hbWVdID8/IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGZWF0dXJlVmFsdWUoZmVhdHVyZTogRmVhdHVyZUR0bywgdmFsOiBib29sZWFuKSB7XG4gICAgZmVhdHVyZS52YWx1ZSA9IHZhbCBhcyBhbnk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwRmVhdHVyZXMoZmVhdHVyZXM6IEZlYXR1cmVEdG9bXSwgZGlyOiBMb2NhbGVEaXJlY3Rpb24pIHtcbiAgY29uc3QgbWFyZ2luID0gYG1hcmdpbi0ke2RpciA9PT0gJ3J0bCcgPyAncmlnaHQnIDogJ2xlZnQnfS5weGA7XG5cbiAgcmV0dXJuIGZlYXR1cmVzLm1hcChmZWF0dXJlID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9XG4gICAgICBmZWF0dXJlLnZhbHVlVHlwZT8ubmFtZSA9PT0gVmFsdWVUeXBlcy5Ub2dnbGVTdHJpbmdWYWx1ZVR5cGVcbiAgICAgICAgPyAoZmVhdHVyZS52YWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG4gICAgICAgIDogZmVhdHVyZS52YWx1ZTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5mZWF0dXJlLFxuICAgICAgdmFsdWUsXG4gICAgICBpbml0aWFsVmFsdWU6IHZhbHVlLFxuICAgICAgc3R5bGU6IHsgW21hcmdpbl06IGZlYXR1cmUuZGVwdGggKiAyMCB9LFxuICAgIH07XG4gIH0pO1xufVxuIiwiPGFicC1tb2RhbCAqbmdJZj1cInZpc2libGVcIiBbKHZpc2libGUpXT1cInZpc2libGVcIiBbYnVzeV09XCJtb2RhbEJ1c3lcIiBbb3B0aW9uc109XCJ7IHNpemU6ICdsZycgfVwiPlxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cbiAgICA8aDM+e3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpGZWF0dXJlcycgfCBhYnBMb2NhbGl6YXRpb24gfX08L2gzPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgPHVsXG4gICAgICAgICAgbmdiTmF2XG4gICAgICAgICAgI25hdj1cIm5nYk5hdlwiXG4gICAgICAgICAgWyhhY3RpdmVJZCldPVwic2VsZWN0ZWRHcm91cERpc3BsYXlOYW1lXCJcbiAgICAgICAgICBjbGFzcz1cIm5hdi1waWxsc1wiXG4gICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHM7IHRyYWNrQnk6IHRyYWNrLmJ5KCduYW1lJylcIlxuICAgICAgICAgICAgW25nYk5hdkl0ZW1dPVwiZ3JvdXAuZGlzcGxheU5hbWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxhIG5nYk5hdkxpbms+e3sgZ3JvdXAuZGlzcGxheU5hbWUgfX08L2E+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cbiAgICAgICAgICAgICAgPGg0Pnt7IHNlbGVjdGVkR3JvdXBEaXNwbGF5TmFtZSB9fTwvaDQ+XG4gICAgICAgICAgICAgIDxociBjbGFzcz1cIm10LTIgbWItM1wiIC8+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMlwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZlYXR1cmUgb2YgZmVhdHVyZXNbZ3JvdXAubmFtZV07IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrLmJ5KCdpZCcpXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJmZWF0dXJlLnN0eWxlXCJcbiAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiZmVhdHVyZS52YWx1ZVR5cGU/Lm5hbWVcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzYXZlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidmFsdWVUeXBlcy5Ub2dnbGVTdHJpbmdWYWx1ZVR5cGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZmVhdHVyZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZlYXR1cmUudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hlY2tib3hDbGljaygkZXZlbnQsIGZlYXR1cmUpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2h0bWxGb3JdPVwiZmVhdHVyZS5uYW1lXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmRpc3BsYXlOYW1lXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVzY1RtcDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGZlYXR1cmUuZGVzY3JpcHRpb24gfVwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInZhbHVlVHlwZXMuRnJlZVRleHRTdHJpbmdWYWx1ZVR5cGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtodG1sRm9yXT1cImZlYXR1cmUubmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImZlYXR1cmUubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmZWF0dXJlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYWJwRmVhdHVyZU1hbmFnZW1lbnRGcmVlVGV4dF09XCJmZWF0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZXNjVG1wOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZmVhdHVyZS5kZXNjcmlwdGlvbiB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidmFsdWVUeXBlcy5TZWxlY3Rpb25TdHJpbmdWYWx1ZVR5cGVcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmZWF0dXJlLnZhbHVlVHlwZS5pdGVtU291cmNlPy5pdGVtcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2h0bWxGb3JdPVwiZmVhdHVyZS5uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgW2lkXT1cImZlYXR1cmUubmFtZVwiIFsobmdNb2RlbCldPVwiZmVhdHVyZS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSBvZiBmZWF0dXJlLnZhbHVlVHlwZS5pdGVtU291cmNlPy5pdGVtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRpc3BsYXlUZXh0Py5yZXNvdXJjZU5hbWUgKyAnOjonICsgaXRlbS5kaXNwbGF5VGV4dD8ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYnBMb2NhbGl6YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVzY1RtcDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGZlYXR1cmUuZGVzY3JpcHRpb24gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD57eyBmZWF0dXJlLmRpc3BsYXlOYW1lIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVzY1RtcCBsZXQtZGVzY3JpcHRpb24+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJkLWJsb2NrIGZvcm0tdGV4dCB0ZXh0LW11dGVkXCI+e3sgZGVzY3JpcHRpb24gfX08L3NtYWxsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+PGRpdiBbbmdiTmF2T3V0bGV0XT1cIm5hdlwiPjwvZGl2PjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibXgtM1wiICpuZ0lmPVwiIWdyb3Vwcy5sZW5ndGhcIj5cbiAgICAgICAge3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpOb0ZlYXR1cmVGb3VuZE1lc3NhZ2UnIHwgYWJwTG9jYWxpemF0aW9uIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICA8YnV0dG9uIGFicENsb3NlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCI+XG4gICAgICB7eyAnQWJwRmVhdHVyZU1hbmFnZW1lbnQ6OkNhbmNlbCcgfCBhYnBMb2NhbGl6YXRpb24gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YWJwLWJ1dHRvblxuICAgICAgKm5nSWY9XCJncm91cHMubGVuZ3RoXCJcbiAgICAgIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCJcbiAgICAgIFtkaXNhYmxlZF09XCJtb2RhbEJ1c3lcIlxuICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgPlxuICAgICAge3sgJ0FicEZlYXR1cmVNYW5hZ2VtZW50OjpTYXZlJyB8IGFicExvY2FsaXphdGlvbiB9fVxuICAgIDwvYWJwLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYWJwLW1vZGFsPlxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './feature-management/feature-management.component';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './feature-management/feature-management.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9mZWF0dXJlLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbURBQW1ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZlYXR1cmUtbWFuYWdlbWVudC9mZWF0dXJlLW1hbmFnZW1lbnQuY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { Directive, HostBinding, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export const INPUT_TYPES = {
|
|
4
|
-
numeric: 'number',
|
|
5
|
-
default: 'text',
|
|
6
|
-
};
|
|
7
|
-
export class FreeTextInputDirective {
|
|
8
|
-
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
9
|
-
set feature(val) {
|
|
10
|
-
this._feature = val;
|
|
11
|
-
this.setInputType();
|
|
12
|
-
}
|
|
13
|
-
get feature() {
|
|
14
|
-
return this._feature;
|
|
15
|
-
}
|
|
16
|
-
setInputType() {
|
|
17
|
-
var _a, _b, _c, _d;
|
|
18
|
-
const validatorType = (_c = (_b = (_a = this.feature) === null || _a === void 0 ? void 0 : _a.valueType) === null || _b === void 0 ? void 0 : _b.validator) === null || _c === void 0 ? void 0 : _c.name.toLowerCase();
|
|
19
|
-
this.type = (_d = INPUT_TYPES[validatorType]) !== null && _d !== void 0 ? _d : INPUT_TYPES.default;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
FreeTextInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FreeTextInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
23
|
-
FreeTextInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: FreeTextInputDirective, selector: "input[abpFeatureManagementFreeText]", inputs: { feature: ["abpFeatureManagementFreeText", "feature"] }, host: { properties: { "type": "this.type" } }, exportAs: ["inputAbpFeatureManagementFreeText"], ngImport: i0 });
|
|
24
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FreeTextInputDirective, decorators: [{
|
|
25
|
-
type: Directive,
|
|
26
|
-
args: [{
|
|
27
|
-
selector: 'input[abpFeatureManagementFreeText]',
|
|
28
|
-
exportAs: 'inputAbpFeatureManagementFreeText',
|
|
29
|
-
}]
|
|
30
|
-
}], propDecorators: { feature: [{
|
|
31
|
-
type: Input,
|
|
32
|
-
args: ['abpFeatureManagementFreeText']
|
|
33
|
-
}], type: [{
|
|
34
|
-
type: HostBinding,
|
|
35
|
-
args: ['type']
|
|
36
|
-
}] } });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Directive, HostBinding, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export const INPUT_TYPES = {
|
|
4
|
+
numeric: 'number',
|
|
5
|
+
default: 'text',
|
|
6
|
+
};
|
|
7
|
+
export class FreeTextInputDirective {
|
|
8
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
|
9
|
+
set feature(val) {
|
|
10
|
+
this._feature = val;
|
|
11
|
+
this.setInputType();
|
|
12
|
+
}
|
|
13
|
+
get feature() {
|
|
14
|
+
return this._feature;
|
|
15
|
+
}
|
|
16
|
+
setInputType() {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
const validatorType = (_c = (_b = (_a = this.feature) === null || _a === void 0 ? void 0 : _a.valueType) === null || _b === void 0 ? void 0 : _b.validator) === null || _c === void 0 ? void 0 : _c.name.toLowerCase();
|
|
19
|
+
this.type = (_d = INPUT_TYPES[validatorType]) !== null && _d !== void 0 ? _d : INPUT_TYPES.default;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
FreeTextInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FreeTextInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
23
|
+
FreeTextInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: FreeTextInputDirective, selector: "input[abpFeatureManagementFreeText]", inputs: { feature: ["abpFeatureManagementFreeText", "feature"] }, host: { properties: { "type": "this.type" } }, exportAs: ["inputAbpFeatureManagementFreeText"], ngImport: i0 });
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FreeTextInputDirective, decorators: [{
|
|
25
|
+
type: Directive,
|
|
26
|
+
args: [{
|
|
27
|
+
selector: 'input[abpFeatureManagementFreeText]',
|
|
28
|
+
exportAs: 'inputAbpFeatureManagementFreeText',
|
|
29
|
+
}]
|
|
30
|
+
}], propDecorators: { feature: [{
|
|
31
|
+
type: Input,
|
|
32
|
+
args: ['abpFeatureManagementFreeText']
|
|
33
|
+
}], type: [{
|
|
34
|
+
type: HostBinding,
|
|
35
|
+
args: ['type']
|
|
36
|
+
}] } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZS10ZXh0LWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZlYXR1cmUtbWFuYWdlbWVudC9zcmMvbGliL2RpcmVjdGl2ZXMvZnJlZS10ZXh0LWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVzlELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixPQUFPLEVBQUUsUUFBUTtJQUNqQixPQUFPLEVBQUUsTUFBTTtDQUNoQixDQUFDO0FBTUYsTUFBTSxPQUFPLHNCQUFzQjtJQUVqQywyREFBMkQ7SUFDM0QsSUFBMkMsT0FBTyxDQUFDLEdBQWlCO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFJTyxZQUFZOztRQUNsQixNQUFNLGFBQWEsR0FBRyxNQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxTQUFTLDBDQUFFLFNBQVMsMENBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBQSxXQUFXLENBQUMsYUFBYSxDQUFDLG1DQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDaEUsQ0FBQzs7b0hBakJVLHNCQUFzQjt3R0FBdEIsc0JBQXNCOzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFDQUFxQztvQkFDL0MsUUFBUSxFQUFFLG1DQUFtQztpQkFDOUM7OEJBSTRDLE9BQU87c0JBQWpELEtBQUs7dUJBQUMsOEJBQThCO2dCQVNoQixJQUFJO3NCQUF4QixXQUFXO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyBUT0RPOiBpbXByb3ZlIHRoaXMgdHlwZVxuZXhwb3J0IGludGVyZmFjZSBGcmVlVGV4dFR5cGUge1xuICB2YWx1ZVR5cGU6IHtcbiAgICB2YWxpZGF0b3I6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSU5QVVRfVFlQRVMgPSB7XG4gIG51bWVyaWM6ICdudW1iZXInLFxuICBkZWZhdWx0OiAndGV4dCcsXG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFthYnBGZWF0dXJlTWFuYWdlbWVudEZyZWVUZXh0XScsXG4gIGV4cG9ydEFzOiAnaW5wdXRBYnBGZWF0dXJlTWFuYWdlbWVudEZyZWVUZXh0Jyxcbn0pXG5leHBvcnQgY2xhc3MgRnJlZVRleHRJbnB1dERpcmVjdGl2ZSB7XG4gIF9mZWF0dXJlOiBGcmVlVGV4dFR5cGU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnYWJwRmVhdHVyZU1hbmFnZW1lbnRGcmVlVGV4dCcpIHNldCBmZWF0dXJlKHZhbDogRnJlZVRleHRUeXBlKSB7XG4gICAgdGhpcy5fZmVhdHVyZSA9IHZhbDtcbiAgICB0aGlzLnNldElucHV0VHlwZSgpO1xuICB9XG5cbiAgZ2V0IGZlYXR1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlYXR1cmU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3R5cGUnKSB0eXBlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzZXRJbnB1dFR5cGUoKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yVHlwZSA9IHRoaXMuZmVhdHVyZT8udmFsdWVUeXBlPy52YWxpZGF0b3I/Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnR5cGUgPSBJTlBVVF9UWVBFU1t2YWxpZGF0b3JUeXBlXSA/PyBJTlBVVF9UWVBFUy5kZWZhdWx0O1xuICB9XG59XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './free-text-input.directive';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './free-text-input.directive';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9mZWF0dXJlLW1hbmFnZW1lbnQvc3JjL2xpYi9kaXJlY3RpdmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZyZWUtdGV4dC1pbnB1dC5kaXJlY3RpdmUnO1xuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZlYXR1cmUtbWFuYWdlbWVudC9zcmMvbGliL2VudW1zL2NvbXBvbmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlbnVtIGVGZWF0dXJlTWFuYWdlbWVudENvbXBvbmVudHMge1xuICBGZWF0dXJlTWFuYWdlbWVudCA9ICdGZWF0dXJlTWFuYWdlbWVudC5GZWF0dXJlTWFuYWdlbWVudENvbXBvbmVudCcsXG59XG4iXX0=
|