ng-configcat-publicapi-ui 2.2.1 → 2.3.3
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 +15 -15
- package/bundles/ng-configcat-publicapi-ui.umd.js +1917 -1758
- package/bundles/ng-configcat-publicapi-ui.umd.js.map +1 -1
- package/esm2015/lib/_models/index.js +3 -3
- package/esm2015/lib/_models/settingValuesModel.js +2 -2
- package/esm2015/lib/_models/updateSettingValuesModel.js +2 -2
- package/esm2015/lib/_services/form-helper.js +21 -21
- package/esm2015/lib/_services/index.js +2 -2
- package/esm2015/lib/_services/public-api.service.js +69 -71
- package/esm2015/lib/_services/setting-list-form-helper.js +135 -128
- package/esm2015/lib/authorization/authorization.component.js +54 -49
- package/esm2015/lib/base/base.component.js +42 -40
- package/esm2015/lib/configuration.js +13 -10
- package/esm2015/lib/dialogs/concurrent-dialog/concurrent-dialog.component.js +29 -26
- package/esm2015/lib/dialogs/expand-dialog/expand-dialog.component.js +81 -70
- package/esm2015/lib/dialogs/reason-dialog/reason-dialog.component.js +40 -35
- package/esm2015/lib/dialogs/save-snackbar/save-snackbar.component.js +18 -15
- package/esm2015/lib/ng-configcat-publicapi-ui.module.js +160 -101
- package/esm2015/lib/selects/config-select/config-select.component.js +61 -48
- package/esm2015/lib/selects/environment-select/environment-select.component.js +47 -40
- package/esm2015/lib/selects/product-select/product-select.component.js +40 -34
- package/esm2015/lib/selects/setting-select/setting-select.component.js +47 -40
- package/esm2015/lib/setting-item/setting-item.component.js +121 -106
- package/esm2015/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.js +87 -69
- package/esm2015/lib/setting-list/setting/rollout-rules/rollout-rules.component.js +287 -260
- package/esm2015/lib/setting-list/setting/setting.component.js +131 -112
- package/esm2015/lib/setting-list/setting/value/value.component.js +39 -31
- package/esm2015/lib/setting-list/setting-list.component.js +195 -179
- package/esm2015/ng-configcat-publicapi-ui.js +5 -19
- package/esm2015/public-api.js +12 -12
- package/fesm2015/ng-configcat-publicapi-ui.js +1536 -1378
- package/fesm2015/ng-configcat-publicapi-ui.js.map +1 -1
- package/lib/_models/index.d.ts +2 -2
- package/lib/_models/settingValuesModel.d.ts +11 -11
- package/lib/_models/updateSettingValuesModel.d.ts +7 -7
- package/lib/_services/form-helper.d.ts +4 -4
- package/lib/_services/index.d.ts +1 -1
- package/lib/_services/public-api.service.d.ts +18 -15
- package/lib/_services/setting-list-form-helper.d.ts +17 -14
- package/lib/authorization/authorization.component.d.ts +18 -15
- package/lib/base/base.component.d.ts +16 -13
- package/lib/configuration.d.ts +8 -5
- package/lib/dialogs/concurrent-dialog/concurrent-dialog.component.d.ts +12 -9
- package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +24 -20
- package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +15 -12
- package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +8 -5
- package/lib/ng-configcat-publicapi-ui.module.d.ts +44 -6
- package/lib/selects/config-select/config-select.component.d.ts +17 -14
- package/lib/selects/environment-select/environment-select.component.d.ts +17 -14
- package/lib/selects/product-select/product-select.component.d.ts +14 -11
- package/lib/selects/setting-select/setting-select.component.d.ts +17 -14
- package/lib/setting-item/setting-item.component.d.ts +34 -31
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +27 -22
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +52 -46
- package/lib/setting-list/setting/setting.component.d.ts +40 -37
- package/lib/setting-list/setting/value/value.component.d.ts +19 -16
- package/lib/setting-list/setting-list.component.d.ts +46 -42
- package/ng-configcat-publicapi-ui.d.ts +5 -18
- package/package.json +8 -10
- package/public-api.d.ts +8 -8
- package/ng-configcat-publicapi-ui.metadata.json +0 -1
|
@@ -1,69 +1,87 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { SettingType } from 'ng-configcat-publicapi';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return this.formGroup.get('
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return this.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
this.rolloutPercentageItems().
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { SettingType } from 'ng-configcat-publicapi';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/material/chips";
|
|
5
|
+
import * as i2 from "@angular/material/icon";
|
|
6
|
+
import * as i3 from "../value/value.component";
|
|
7
|
+
import * as i4 from "@angular/forms";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "@angular/material/tooltip";
|
|
10
|
+
export class RolloutPercentageItemsComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.readOnly = false;
|
|
13
|
+
this.SettingType = SettingType;
|
|
14
|
+
}
|
|
15
|
+
setting() {
|
|
16
|
+
var _a;
|
|
17
|
+
return (_a = this.formGroup.get('setting')) === null || _a === void 0 ? void 0 : _a.value;
|
|
18
|
+
}
|
|
19
|
+
rolloutRules() {
|
|
20
|
+
return this.formGroup.get('rolloutRules');
|
|
21
|
+
}
|
|
22
|
+
rolloutPercentageItems() {
|
|
23
|
+
return this.formGroup.get('rolloutPercentageItems');
|
|
24
|
+
}
|
|
25
|
+
rolloutPercentageItemsSum() {
|
|
26
|
+
return this.formGroup.get('rolloutPercentageItemsSum');
|
|
27
|
+
}
|
|
28
|
+
value(rolloutPercentageItem) {
|
|
29
|
+
return this.setting().settingType === SettingType.Boolean ?
|
|
30
|
+
rolloutPercentageItem.get('valueDisabled') :
|
|
31
|
+
rolloutPercentageItem.get('value');
|
|
32
|
+
}
|
|
33
|
+
percentageChanged(index) {
|
|
34
|
+
if (this.rolloutPercentageItems().controls[index].value.percentage < 0) {
|
|
35
|
+
this.rolloutPercentageItems().controls[index].controls.percentage.setValue(0);
|
|
36
|
+
}
|
|
37
|
+
if (this.rolloutPercentageItems().controls[index].value.percentage > 100) {
|
|
38
|
+
this.rolloutPercentageItems().controls[index].controls.percentage.setValue(100);
|
|
39
|
+
}
|
|
40
|
+
if (this.rolloutPercentageItems().controls.length === 2) {
|
|
41
|
+
this.rolloutPercentageItems().controls[1 - index].controls.percentage
|
|
42
|
+
.setValue(100 - this.rolloutPercentageItems().controls[index].value.percentage);
|
|
43
|
+
}
|
|
44
|
+
this.updateSum();
|
|
45
|
+
}
|
|
46
|
+
updateSum() {
|
|
47
|
+
if (this.rolloutPercentageItems().controls.length === 0) {
|
|
48
|
+
this.rolloutPercentageItemsSum().setValue(100);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.rolloutPercentageItemsSum().setValue(this.rolloutPercentageItems().controls.map(v => v.value.percentage)
|
|
52
|
+
.reduce((a, b) => a + b));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
removeRolloutPercentageItem(index) {
|
|
56
|
+
this.rolloutPercentageItems().removeAt(index);
|
|
57
|
+
this.rolloutPercentageItems().markAsDirty();
|
|
58
|
+
this.updateSum();
|
|
59
|
+
}
|
|
60
|
+
removeAll() {
|
|
61
|
+
this.rolloutPercentageItems().clear();
|
|
62
|
+
this.rolloutPercentageItems().markAsDirty();
|
|
63
|
+
this.updateSum();
|
|
64
|
+
}
|
|
65
|
+
getRolloutPercentageItemFormGroups() {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
return (_b = (_a = this.rolloutPercentageItems()) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.map(c => c);
|
|
68
|
+
}
|
|
69
|
+
getPercentageFormControl(rolloutPercentageItem) {
|
|
70
|
+
return rolloutPercentageItem.controls.percentage;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
RolloutPercentageItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: RolloutPercentageItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
74
|
+
RolloutPercentageItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.12", type: RolloutPercentageItemsComponent, selector: "configcat-rollout-percentage-items", inputs: { formGroup: "formGroup", readOnly: "readOnly" }, ngImport: i0, template: "<div class=\"percentage-wrapper\" [formGroup]=\"formGroup\">\n\n <div class=\"if\" *ngIf=\"rolloutRules().controls.length > 0\">\n <mat-chip-list>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-list>\n </div>\n <div class=\"grow\">\n <div class=\"percentage-row flex\"\n *ngFor=\"let rolloutPercentageItem of getRolloutPercentageItemFormGroups(); let i = index\">\n <div class=\"flex\">\n <input type=\"number\" [formControl]=\"getPercentageFormControl(rolloutPercentageItem)\"\n (input)=\"percentageChanged(i)\">%\n <span class=\"users\">of <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">users</a>\n </span>\n </div>\n\n <div class=\"delete-option\" matTooltip=\"Remove this % option\"\n *ngIf=\"!readOnly && rolloutPercentageItems().controls.length > 2\"\n (click)=\"removeRolloutPercentageItem(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n\n <span data-tooltip=\"The sum of percentages must be equal to 100.\"\n *ngIf=\"(i === rolloutPercentageItems().controls.length -1) && (rolloutPercentageItemsSum().invalid)\">\n <mat-icon color=\"warn\">\n error_outline\n </mat-icon>\n </span>\n\n <div class=\"value flex\">\n <span class=\"value-name\" *ngIf=\"setting().settingType !== SettingType.Boolean\">Served value:</span>\n <configcat-value class=\"served-value\" [valueFormControl]=\"value(rolloutPercentageItem)\"\n [setting]=\"setting()\">\n </configcat-value>\n </div>\n <div class=\"delete\" matTooltip=\"Remove % options\" (click)=\"removeAll()\" *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n </div>\n</div>", styles: [".percentage-wrapper{border:1px solid #d5d5d5;background-color:#fff;border-radius:4px;margin:.5em 1em;position:relative;padding:.5em 0;display:flex}.percentage-wrapper .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px}.percentage-wrapper .delete:hover{color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px}.percentage-wrapper .delete-option{color:#d6a9a9;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover{color:#ed5251}.percentage-wrapper .delete-option mat-icon{font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{background-color:#67b1fc3d}.grow{flex-grow:1}.percentage-row{min-height:40px;margin-left:.5em}.flex{display:flex;flex-wrap:wrap;align-items:center}.value{margin-left:auto;min-width:100px}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-right:5px;font-size:15px;padding:0 5px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 700px){.percentage-wrapper{margin:.5em .3em}}\n"], components: [{ type: i1.MatChipList, selector: "mat-chip-list", inputs: ["aria-orientation", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "selectable", "tabIndex", "errorStateMatcher"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
75
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: RolloutPercentageItemsComponent, decorators: [{
|
|
76
|
+
type: Component,
|
|
77
|
+
args: [{
|
|
78
|
+
selector: 'configcat-rollout-percentage-items',
|
|
79
|
+
templateUrl: './rollout-percentage-items.component.html',
|
|
80
|
+
styleUrls: ['./rollout-percentage-items.component.scss']
|
|
81
|
+
}]
|
|
82
|
+
}], ctorParameters: function () { return []; }, propDecorators: { formGroup: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], readOnly: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}] } });
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1wZXJjZW50YWdlLWl0ZW1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXBlcmNlbnRhZ2UtaXRlbXMvcm9sbG91dC1wZXJjZW50YWdlLWl0ZW1zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXBlcmNlbnRhZ2UtaXRlbXMvcm9sbG91dC1wZXJjZW50YWdlLWl0ZW1zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7QUFPckQsTUFBTSxPQUFPLCtCQUErQjtJQTZCMUM7UUExQlMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztJQXlCVixDQUFDO0lBdEJqQixPQUFPOztRQUNMLE9BQU8sTUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsMENBQUUsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQWMsQ0FBQztJQUNuRSxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FB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QkFBd0IsQ0FBQyxxQkFBMEI7UUFDakQsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsVUFBeUIsQ0FBQztJQUNsRSxDQUFDOzs2SEE1RVUsK0JBQStCO2lIQUEvQiwrQkFBK0Isb0lDVDVDLCtnRUEwQ007NEZEakNPLCtCQUErQjtrQkFMM0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0NBQW9DO29CQUM5QyxXQUFXLEVBQUUsMkNBQTJDO29CQUN4RCxTQUFTLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQztpQkFDekQ7MEVBR1UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQXJyYXksIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2V0dGluZ1R5cGUgfSBmcm9tICduZy1jb25maWdjYXQtcHVibGljYXBpJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29uZmlnY2F0LXJvbGxvdXQtcGVyY2VudGFnZS1pdGVtcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xsb3V0LXBlcmNlbnRhZ2UtaXRlbXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xsb3V0LXBlcmNlbnRhZ2UtaXRlbXMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xsb3V0UGVyY2VudGFnZUl0ZW1zQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gIFNldHRpbmdUeXBlID0gU2V0dGluZ1R5cGU7XG5cblxuICBzZXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ3NldHRpbmcnKT8udmFsdWU7XG4gIH1cblxuICByb2xsb3V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgncm9sbG91dFJ1bGVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgcm9sbG91dFBlcmNlbnRhZ2VJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyb2xsb3V0UGVyY2VudGFnZUl0ZW1zJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgcm9sbG91dFBlcmNlbnRhZ2VJdGVtc1N1bSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyb2xsb3V0UGVyY2VudGFnZUl0ZW1zU3VtJykgYXMgRm9ybUNvbnRyb2w7XG4gIH1cblxuICB2YWx1ZShyb2xsb3V0UGVyY2VudGFnZUl0ZW06IEZvcm1Hcm91cCk6IEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nKCkuc2V0dGluZ1R5cGUgPT09IFNldHRpbmdUeXBlLkJvb2xlYW4gP1xuICAgICAgcm9sbG91dFBlcmNlbnRhZ2VJdGVtLmdldCgndmFsdWVEaXNhYmxlZCcpIGFzIEZvcm1Db250cm9sIDpcbiAgICAgIHJvbGxvdXRQZXJjZW50YWdlSXRlbS5nZXQoJ3ZhbHVlJykgYXMgRm9ybUNvbnRyb2w7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIHBlcmNlbnRhZ2VDaGFuZ2VkKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHNbaW5kZXhdLnZhbHVlLnBlcmNlbnRhZ2UgPCAwKSB7XG4gICAgICAodGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHNbaW5kZXhdIGFzIEZvcm1Hcm91cCkuY29udHJvbHMucGVyY2VudGFnZS5zZXRWYWx1ZSgwKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm9sbG91dFBlcmNlbnRhZ2VJdGVtcygpLmNvbnRyb2xzW2luZGV4XS52YWx1ZS5wZXJjZW50YWdlID4gMTAwKSB7XG4gICAgICAodGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHNbaW5kZXhdIGFzIEZvcm1Hcm91cCkuY29udHJvbHMucGVyY2VudGFnZS5zZXRWYWx1ZSgxMDApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvbGxvdXRQZXJjZW50YWdlSXRlbXMoKS5jb250cm9scy5sZW5ndGggPT09IDIpIHtcbiAgICAgICh0aGlzLnJvbGxvdXRQZXJjZW50YWdlSXRlbXMoKS5jb250cm9sc1sxIC0gaW5kZXhdIGFzIEZvcm1Hcm91cCkuY29udHJvbHMucGVyY2VudGFnZVxuICAgICAgICAuc2V0VmFsdWUoMTAwIC0gdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHNbaW5kZXhdLnZhbHVlLnBlcmNlbnRhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3VtKCk7XG4gIH1cblxuICB1cGRhdGVTdW0oKSB7XG4gICAgaWYgKHRoaXMucm9sbG91dFBlcmNlbnRhZ2VJdGVtcygpLmNvbnRyb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zU3VtKCkuc2V0VmFsdWUoMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zU3VtKCkuc2V0VmFsdWUoXG4gICAgICAgIHRoaXMucm9sbG91dFBlcmNlbnRhZ2VJdGVtcygpLmNvbnRyb2xzLm1hcCh2ID0+IHYudmFsdWUucGVyY2VudGFnZSlcbiAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhICsgYilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlUm9sbG91dFBlcmNlbnRhZ2VJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnJvbGxvdXRQZXJjZW50YWdlSXRlbXMoKS5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLnVwZGF0ZVN1bSgpO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMucm9sbG91dFBlcmNlbnRhZ2VJdGVtcygpLmNsZWFyKCk7XG4gICAgdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLnVwZGF0ZVN1bSgpO1xuICB9XG5cbiAgZ2V0Um9sbG91dFBlcmNlbnRhZ2VJdGVtRm9ybUdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCk/LmNvbnRyb2xzPy5tYXAoYyA9PiBjIGFzIEZvcm1Hcm91cCk7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlRm9ybUNvbnRyb2wocm9sbG91dFBlcmNlbnRhZ2VJdGVtOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFBlcmNlbnRhZ2VJdGVtLmNvbnRyb2xzLnBlcmNlbnRhZ2UgYXMgRm9ybUNvbnRyb2w7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwZXJjZW50YWdlLXdyYXBwZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlmXCIgKm5nSWY9XCJyb2xsb3V0UnVsZXMoKS5jb250cm9scy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxtYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPkVMU0UgSUY8L21hdC1jaGlwPlxuICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2Utcm93IGZsZXhcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvbGxvdXRQZXJjZW50YWdlSXRlbSBvZiBnZXRSb2xsb3V0UGVyY2VudGFnZUl0ZW1Gb3JtR3JvdXBzKCk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0UGVyY2VudGFnZUZvcm1Db250cm9sKHJvbGxvdXRQZXJjZW50YWdlSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicGVyY2VudGFnZUNoYW5nZWQoaSlcIj4lXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2Vyc1wiPm9mIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+dXNlcnM8L2E+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGUtb3B0aW9uXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0aGlzICUgb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seSAmJiByb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHMubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVJvbGxvdXRQZXJjZW50YWdlSXRlbShpKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxzcGFuIGRhdGEtdG9vbHRpcD1cIlRoZSBzdW0gb2YgcGVyY2VudGFnZXMgbXVzdCBiZSBlcXVhbCB0byAxMDAuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIihpID09PSByb2xsb3V0UGVyY2VudGFnZUl0ZW1zKCkuY29udHJvbHMubGVuZ3RoIC0xKSAmJiAocm9sbG91dFBlcmNlbnRhZ2VJdGVtc1N1bSgpLmludmFsaWQpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiPlxuICAgICAgICAgICAgICAgICAgICBlcnJvcl9vdXRsaW5lXG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZsZXhcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlLW5hbWVcIiAqbmdJZj1cInNldHRpbmcoKS5zZXR0aW5nVHlwZSAhPT0gU2V0dGluZ1R5cGUuQm9vbGVhblwiPlNlcnZlZCB2YWx1ZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGNvbmZpZ2NhdC12YWx1ZSBjbGFzcz1cInNlcnZlZC12YWx1ZVwiIFt2YWx1ZUZvcm1Db250cm9sXT1cInZhbHVlKHJvbGxvdXRQZXJjZW50YWdlSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbc2V0dGluZ109XCJzZXR0aW5nKClcIj5cbiAgICAgICAgICAgICAgICA8L2NvbmZpZ2NhdC12YWx1ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZVwiIG1hdFRvb2x0aXA9XCJSZW1vdmUgJSBvcHRpb25zXCIgKGNsaWNrKT1cInJlbW92ZUFsbCgpXCIgKm5nSWY9XCIhcmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|