ng-configcat-publicapi-ui 3.0.8 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +38 -0
- package/esm2022/lib/_models/flag-state.mjs +2 -0
- package/esm2022/lib/_models/setting-value-formgroup.mjs +2 -0
- package/esm2022/lib/_models/user-comparator.mjs +100 -0
- package/esm2022/lib/_services/app-data-adapter.mjs +18 -0
- package/esm2022/lib/_services/comparison-value-list-helper.mjs +72 -0
- package/esm2022/lib/_services/date-helper.mjs +56 -0
- package/esm2022/lib/_services/form-generator.mjs +359 -0
- package/esm2022/lib/_services/form-helper.mjs +107 -0
- package/esm2022/lib/_services/messaging.service.mjs +26 -0
- package/esm2022/lib/_services/public-api.service.mjs +77 -0
- package/esm2022/lib/_services/setting-list-form-helper.mjs +171 -0
- package/esm2022/lib/_services/tracking.directive.mjs +16 -0
- package/esm2022/lib/ace-editor/ace-editor.component.mjs +137 -0
- package/esm2022/lib/authorization/authorization.component.mjs +62 -0
- package/{esm2020 → esm2022}/lib/base/base-select.component.mjs +4 -4
- package/esm2022/lib/base/base.component.mjs +48 -0
- package/esm2022/lib/bootstrap.mjs +10 -0
- package/{esm2020 → esm2022}/lib/configuration.mjs +4 -4
- package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +28 -0
- package/{esm2020 → esm2022}/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +6 -6
- package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +80 -0
- package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +29 -0
- package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +36 -0
- package/{esm2020 → esm2022}/lib/dialogs/save-snackbar/save-snackbar.component.mjs +5 -5
- package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +285 -0
- package/esm2022/lib/selects/config-select/config-select.component.mjs +60 -0
- package/esm2022/lib/selects/environment-select/environment-select.component.mjs +47 -0
- package/esm2022/lib/selects/product-select/product-select.component.mjs +40 -0
- package/esm2022/lib/selects/setting-select/setting-select.component.mjs +47 -0
- package/esm2022/lib/setting-item/setting-item.component.mjs +118 -0
- package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +81 -0
- package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +293 -0
- package/{esm2020 → esm2022}/lib/setting-list/setting/setting.component.mjs +5 -5
- package/esm2022/lib/setting-list/setting/value/value.component.mjs +37 -0
- package/esm2022/lib/setting-list/setting-list.component.mjs +194 -0
- package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +123 -0
- package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +30 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +220 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +61 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +72 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +25 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +105 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +75 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +48 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +113 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.mjs +251 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +444 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +84 -0
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +129 -0
- package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +190 -0
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +65 -0
- package/esm2022/lib/v2/feature-flag-item.component.mjs +319 -0
- package/{esm2020 → esm2022}/public-api.mjs +2 -1
- package/fesm2022/ng-configcat-publicapi-ui.mjs +4790 -0
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -0
- package/lib/_models/flag-state.d.ts +20 -0
- package/lib/_models/setting-value-formgroup.d.ts +69 -0
- package/lib/_models/user-comparator.d.ts +84 -0
- package/lib/_services/app-data-adapter.d.ts +7 -0
- package/lib/_services/comparison-value-list-helper.d.ts +17 -0
- package/lib/_services/date-helper.d.ts +6 -0
- package/lib/_services/form-generator.d.ts +59 -0
- package/lib/_services/form-helper.d.ts +4 -1
- package/lib/_services/messaging.service.d.ts +12 -0
- package/lib/_services/public-api.service.d.ts +2 -1
- package/lib/_services/setting-list-form-helper.d.ts +1 -1
- package/lib/_services/tracking.directive.d.ts +6 -0
- package/lib/ace-editor/ace-editor.component.d.ts +32 -0
- package/lib/authorization/authorization.component.d.ts +2 -2
- package/lib/base/base-select.component.d.ts +1 -1
- package/lib/base/base.component.d.ts +2 -1
- package/lib/bootstrap.d.ts +12 -0
- package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +19 -0
- package/lib/dialogs/info-dialog/info-dialog.d.ts +17 -0
- package/lib/ng-configcat-publicapi-ui.module.d.ts +47 -19
- package/lib/selects/config-select/config-select.component.d.ts +1 -1
- package/lib/selects/environment-select/environment-select.component.d.ts +1 -1
- package/lib/selects/product-select/product-select.component.d.ts +1 -1
- package/lib/selects/setting-select/setting-select.component.d.ts +1 -1
- package/lib/setting-item/setting-item.component.d.ts +4 -2
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +1 -1
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +4 -4
- package/lib/setting-list/setting/setting.component.d.ts +1 -1
- package/lib/setting-list/setting/value/value.component.d.ts +1 -1
- package/lib/setting-list/setting-list.component.d.ts +1 -1
- package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +25 -0
- package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +27 -0
- package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +41 -0
- package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +18 -0
- package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +30 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +10 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +27 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +36 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +21 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +79 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.d.ts +63 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +94 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +31 -0
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +33 -0
- package/lib/v2/feature-flag/feature-flag.component.d.ts +49 -0
- package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +28 -0
- package/lib/v2/feature-flag-item.component.d.ts +66 -0
- package/package.json +12 -16
- package/public-api.d.ts +1 -0
- package/public-api.scss +205 -3
- package/esm2020/lib/_directives/input-display-normalizer.directive.mjs +0 -38
- package/esm2020/lib/_services/form-helper.mjs +0 -104
- package/esm2020/lib/_services/public-api.service.mjs +0 -71
- package/esm2020/lib/_services/setting-list-form-helper.mjs +0 -171
- package/esm2020/lib/authorization/authorization.component.mjs +0 -62
- package/esm2020/lib/base/base.component.mjs +0 -45
- package/esm2020/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
- package/esm2020/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
- package/esm2020/lib/ng-configcat-publicapi-ui.module.mjs +0 -179
- package/esm2020/lib/selects/config-select/config-select.component.mjs +0 -60
- package/esm2020/lib/selects/environment-select/environment-select.component.mjs +0 -47
- package/esm2020/lib/selects/product-select/product-select.component.mjs +0 -40
- package/esm2020/lib/selects/setting-select/setting-select.component.mjs +0 -47
- package/esm2020/lib/setting-item/setting-item.component.mjs +0 -116
- package/esm2020/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
- package/esm2020/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
- package/esm2020/lib/setting-list/setting/value/value.component.mjs +0 -37
- package/esm2020/lib/setting-list/setting-list.component.mjs +0 -194
- package/fesm2015/ng-configcat-publicapi-ui.mjs +0 -1786
- package/fesm2015/ng-configcat-publicapi-ui.mjs.map +0 -1
- package/fesm2020/ng-configcat-publicapi-ui.mjs +0 -1763
- package/fesm2020/ng-configcat-publicapi-ui.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/_directives/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_models/deleteSettingModel.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_models/settingValuesModel.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_models/updateSettingValuesModel.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/_services/platform-helper.mjs +0 -0
- /package/{esm2020 → esm2022}/ng-configcat-publicapi-ui.mjs +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { BaseComponent } from '../base/base.component';
|
|
3
|
+
import { FormArray, FormControl, Validators } from '@angular/forms';
|
|
4
|
+
import { forkJoin, throwError } from 'rxjs';
|
|
5
|
+
import { ConfirmationDialogComponent } from '../dialogs/confirmation-dialog/confirmation-dialog';
|
|
6
|
+
import { ReasonDialogComponent } from '../dialogs/reason-dialog/reason-dialog.component';
|
|
7
|
+
import { SaveSnackbarComponent } from '../dialogs/save-snackbar/save-snackbar.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../_services/form-generator";
|
|
10
|
+
import * as i2 from "@angular/material/dialog";
|
|
11
|
+
import * as i3 from "@angular/material/snack-bar";
|
|
12
|
+
import * as i4 from "../_services";
|
|
13
|
+
import * as i5 from "@angular/common";
|
|
14
|
+
import * as i6 from "@angular/forms";
|
|
15
|
+
import * as i7 from "@angular/material/button";
|
|
16
|
+
import * as i8 from "@angular/material/icon";
|
|
17
|
+
import * as i9 from "./feature-flag/feature-flag.component";
|
|
18
|
+
import * as i10 from "../_services/tracking.directive";
|
|
19
|
+
export class FeatureFlagItemComponent extends BaseComponent {
|
|
20
|
+
constructor(formGenerator, dialog, snackBar, publicApiService) {
|
|
21
|
+
super(publicApiService);
|
|
22
|
+
this.formGenerator = formGenerator;
|
|
23
|
+
this.dialog = dialog;
|
|
24
|
+
this.snackBar = snackBar;
|
|
25
|
+
this.canDeleteSetting = true;
|
|
26
|
+
this.deleteSettingText = 'Delete setting';
|
|
27
|
+
this.showEnvironmentName = true;
|
|
28
|
+
this.deleteSettingRequested = new EventEmitter();
|
|
29
|
+
this.loadSucceeded = new EventEmitter();
|
|
30
|
+
this.loadFailed = new EventEmitter();
|
|
31
|
+
this.saveSucceeded = new EventEmitter();
|
|
32
|
+
this.saveFailed = new EventEmitter();
|
|
33
|
+
this.expandedStateChanged = new EventEmitter();
|
|
34
|
+
this.formValuesChanged = new EventEmitter();
|
|
35
|
+
this.loading = true;
|
|
36
|
+
this.showFeedBackMessage = false;
|
|
37
|
+
this.hasSettingValues = false;
|
|
38
|
+
this.hasOtherEnvironment = false;
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
this.reloadSettingValues();
|
|
42
|
+
}
|
|
43
|
+
ngOnDestroy() {
|
|
44
|
+
this.unsubscribeFormValueChangesSubscription();
|
|
45
|
+
}
|
|
46
|
+
reloadSettingValues() {
|
|
47
|
+
this.loading = true;
|
|
48
|
+
this.createSettingValuesV2Service();
|
|
49
|
+
forkJoin({
|
|
50
|
+
segments: this.createSegmentsService().getSegments(this.productId),
|
|
51
|
+
settings: this.createSettingsService().getSettings(this.configId),
|
|
52
|
+
settingFormula: this.createSettingValuesV2Service().getSettingValueV2(this.environmentId, this.settingId)
|
|
53
|
+
}).subscribe(result => {
|
|
54
|
+
this.settings = result.settings;
|
|
55
|
+
this.prerequisiteSettings = this.settings.map(sv => {
|
|
56
|
+
return {
|
|
57
|
+
settingId: sv.settingId,
|
|
58
|
+
key: sv.key,
|
|
59
|
+
name: sv.name,
|
|
60
|
+
settingType: sv.settingType
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
this.segments = result.segments;
|
|
64
|
+
this.handleFetchedSettingValues(result.settingFormula);
|
|
65
|
+
this.loading = false;
|
|
66
|
+
this.loadSucceeded.emit();
|
|
67
|
+
}, (error) => {
|
|
68
|
+
this.loadFailed.emit(error);
|
|
69
|
+
return throwError(error);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
handleFetchedSettingValues(model) {
|
|
73
|
+
this.settingFormula = model;
|
|
74
|
+
// when we have less we had previously
|
|
75
|
+
this.flagState = {
|
|
76
|
+
addButtonRenderState: {
|
|
77
|
+
hasPercentageOnlyRule: false,
|
|
78
|
+
renderTopAddButtons: false,
|
|
79
|
+
addRuleButtonTracker: []
|
|
80
|
+
},
|
|
81
|
+
readOnly: model.readOnly,
|
|
82
|
+
dependeeSettings: [],
|
|
83
|
+
settingValue: model,
|
|
84
|
+
panelExpanded: true,
|
|
85
|
+
prerequisiteSettings: this.getAvailablePrerequisiteSettings(model.setting.settingId)
|
|
86
|
+
};
|
|
87
|
+
this.unsubscribeFormValueChangesSubscription();
|
|
88
|
+
this.createFormGroupFromState(this.settingFormula);
|
|
89
|
+
this.formValueChangesSubscription = this.formGroup.valueChanges.subscribe(() => {
|
|
90
|
+
this.formValuesChanged.emit();
|
|
91
|
+
});
|
|
92
|
+
this.recalcAddButtons();
|
|
93
|
+
this.recalcPrerequisites();
|
|
94
|
+
}
|
|
95
|
+
unsubscribeFormValueChangesSubscription() {
|
|
96
|
+
if (this.formValueChangesSubscription) {
|
|
97
|
+
this.formValueChangesSubscription.unsubscribe();
|
|
98
|
+
this.formValueChangesSubscription = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
createFormGroupFromState(model) {
|
|
102
|
+
this.formGroup = this.formGenerator.generateSettingValuesFormGroup(model, model.readOnly, this.prerequisiteSettings, model.featureFlagLimitations);
|
|
103
|
+
}
|
|
104
|
+
getAvailablePrerequisiteSettings(settingId) {
|
|
105
|
+
return this.prerequisiteSettings.filter(ds => ds.settingId !== settingId);
|
|
106
|
+
}
|
|
107
|
+
revert() {
|
|
108
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
109
|
+
data: {
|
|
110
|
+
title: 'Revert to last saved state?',
|
|
111
|
+
body: 'All changes will be lost.',
|
|
112
|
+
yesButtonLabel: 'Revert',
|
|
113
|
+
noButtonLabel: 'No'
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
dialogRef.afterClosed().subscribe(result => {
|
|
117
|
+
if (result === 'yes') {
|
|
118
|
+
this.revertDirtyValuesFromState();
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
revertDirtyValuesFromState() {
|
|
123
|
+
if (this.formGroup.dirty) {
|
|
124
|
+
this.formGroup.setControl('defaultValue', this.formGenerator.generateValueFormGroup(this.settingFormula.defaultValue, this.settingFormula.setting.settingType, this.settingFormula.readOnly, this.settingFormula.featureFlagLimitations));
|
|
125
|
+
this.formGroup.setControl('percentageEvaluationAttribute', new FormControl({ value: this.settingFormula.percentageEvaluationAttribute, disabled: this.settingFormula.readOnly }, { validators: [Validators.max(1000)] }));
|
|
126
|
+
this.formGroup.setControl('targetingRules', new FormArray(this.settingFormula.targetingRules.map(ft => this.formGenerator.generateTargetingRuleFormGroup(ft, this.settingFormula.setting.settingType, this.settingFormula.readOnly, this.prerequisiteSettings, this.settingFormula.featureFlagLimitations))));
|
|
127
|
+
this.recalcAddButtons();
|
|
128
|
+
}
|
|
129
|
+
this.formGroup.markAsPristine();
|
|
130
|
+
this.formGroup.markAsUntouched();
|
|
131
|
+
this.recalcPrerequisites();
|
|
132
|
+
this.showFeedBackMessage = false;
|
|
133
|
+
}
|
|
134
|
+
submit() {
|
|
135
|
+
if (!this.formGroup) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!this.formGroup.valid) {
|
|
139
|
+
this.showFeedBackMessage = true;
|
|
140
|
+
this.formGroup.markAllAsTouched();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this.showFeedBackMessage = false;
|
|
144
|
+
const value = {
|
|
145
|
+
...this.formGroup.getRawValue(),
|
|
146
|
+
};
|
|
147
|
+
this.updateSettingValues(value);
|
|
148
|
+
}
|
|
149
|
+
updateSettingValues(updateModel, reason = null) {
|
|
150
|
+
this.createSettingValuesV2Service().replaceSettingValueV2(this.environmentId, this.settingId, updateModel, reason)
|
|
151
|
+
.subscribe({
|
|
152
|
+
next: settingValues => {
|
|
153
|
+
this.handleFetchedSettingValues(settingValues);
|
|
154
|
+
this.snackBar.openFromComponent(SaveSnackbarComponent, { duration: 5000, panelClass: 'green-snackbar' });
|
|
155
|
+
this.saveSucceeded.emit();
|
|
156
|
+
},
|
|
157
|
+
error: (error) => {
|
|
158
|
+
if (error.status === 400 && error.error && error.error.Reason && error.error.Reason[0] === 'Reason required.') {
|
|
159
|
+
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
|
160
|
+
width: '450px'
|
|
161
|
+
});
|
|
162
|
+
dialogRef.afterClosed()
|
|
163
|
+
.subscribe(result => {
|
|
164
|
+
if (result && result.button === 'save' && result.reason) {
|
|
165
|
+
this.updateSettingValues(updateModel, result.reason);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (error.status === 400 && error.error && error.error.SegmentCondition && error.error.SegmentCondition[0] === 'Segment not found.') {
|
|
171
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
172
|
+
width: '450px',
|
|
173
|
+
data: {
|
|
174
|
+
title: 'Cannot save feature flags',
|
|
175
|
+
body: 'A segment referenced by one of your feature flags has been deleted. Reload the config to see its latest state, apply your changes and try the save again.',
|
|
176
|
+
yesButtonLabel: 'Reload',
|
|
177
|
+
hideNoButton: true
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
dialogRef.afterClosed()
|
|
181
|
+
.subscribe(() => {
|
|
182
|
+
this.reloadSettingValues();
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (error.status === 400 && error.error && ('' + error.error).startsWith('Circular dependency detected.')) {
|
|
187
|
+
const errorMessage = ('' + error.error).slice('Circular dependency detected.'.length + 1);
|
|
188
|
+
this.dialog.open(ConfirmationDialogComponent, {
|
|
189
|
+
width: '450px',
|
|
190
|
+
data: {
|
|
191
|
+
title: 'Cannot save feature flags.',
|
|
192
|
+
body: 'Circular dependency detected between the following feature flags:<p>' + errorMessage + '</p>Please <strong>eliminate the circular dependency</strong> before saving your feature flags.',
|
|
193
|
+
yesButtonLabel: 'I understand',
|
|
194
|
+
hideNoButton: true
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.formGroup.setErrors({ internalServerError: 'Internal server error' });
|
|
200
|
+
this.formGroup.markAsTouched();
|
|
201
|
+
this.showFeedBackMessage = true;
|
|
202
|
+
this.saveFailed.emit();
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
onDeleteSettingRequested(setting) {
|
|
207
|
+
if (this.formGroup.dirty) {
|
|
208
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
209
|
+
data: {
|
|
210
|
+
title: 'Discard changes?',
|
|
211
|
+
body: 'You have unsaved feature flag changes. If you continue, unsaved changes will be lost.',
|
|
212
|
+
yesButtonLabel: 'Discard changes',
|
|
213
|
+
noButtonLabel: 'No'
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
dialogRef.afterClosed()
|
|
217
|
+
.subscribe(result => {
|
|
218
|
+
if (result === 'yes') {
|
|
219
|
+
this.revertDirtyValuesFromState();
|
|
220
|
+
this.deleteSettingInternal(setting);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
this.deleteSettingInternal(setting);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
deleteSettingInternal(setting) {
|
|
229
|
+
this.deleteSettingRequested.emit({ config: this.settingFormula.config, environment: this.settingFormula.environment, setting: setting.setting });
|
|
230
|
+
}
|
|
231
|
+
subscriptionLimitReachedCalled() {
|
|
232
|
+
// TODO this.subscriptionLimitReached(this.constellation, this.dialog);
|
|
233
|
+
}
|
|
234
|
+
addSegmentConditionRequestedWithoutSegments() {
|
|
235
|
+
this.dialog.open(ConfirmationDialogComponent, {
|
|
236
|
+
data: {
|
|
237
|
+
title: 'There are no segments in this product yet.',
|
|
238
|
+
body: `Go ahead to the ConfiCat Dashboard and create your first user segment before adding it to a targeting rule.`,
|
|
239
|
+
yesButtonLabel: `I understand`
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
trackByIndex(index) {
|
|
244
|
+
return index;
|
|
245
|
+
}
|
|
246
|
+
recalcPrerequisites() {
|
|
247
|
+
const settingValue = this.settingFormula;
|
|
248
|
+
this.flagState.dependeeSettings = this.settings.filter(s => settingValue.settingIdsWherePrerequisite?.includes(s.settingId))
|
|
249
|
+
.map(s => { return { key: s.key, name: s.name, settingId: s.settingId }; });
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
recalcAddButtons() {
|
|
253
|
+
const state = this.flagState;
|
|
254
|
+
const group = this.formGroup;
|
|
255
|
+
state.addButtonRenderState.renderTopAddButtons = !group.controls.targetingRules.controls.length ||
|
|
256
|
+
this.hasOnlyPercentageRule(group);
|
|
257
|
+
if (!group.controls.targetingRules.controls.length) {
|
|
258
|
+
state.addButtonRenderState.addRuleButtonTracker = [];
|
|
259
|
+
state.addButtonRenderState.hasPercentageOnlyRule = false;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const hasPercOnly = state.addButtonRenderState.hasPercentageOnlyRule = group.controls.targetingRules.controls.length > 0
|
|
263
|
+
&& this.formGenerator.isPercentageOnlyTargetingRule(group.controls.targetingRules.controls[group.controls.targetingRules.controls.length - 1]);
|
|
264
|
+
state.addButtonRenderState.addRuleButtonTracker = group.controls.targetingRules.controls.map((item, i, rules) => {
|
|
265
|
+
const isLastRule = i === group.controls.targetingRules.controls.length - 1;
|
|
266
|
+
const isBeforeLast = i === group.controls.targetingRules.controls.length - 2;
|
|
267
|
+
return {
|
|
268
|
+
showAddRuleButtons: hasPercOnly ? i === rules.length - 2 : i === rules.length - 1,
|
|
269
|
+
showOrChip: hasPercOnly ? i < rules.length - 2 : i < rules.length - 1,
|
|
270
|
+
renderSeparationArea: this.formGenerator.isPercentageOnlyTargetingRule(item) ||
|
|
271
|
+
(this.settingFormula.readOnly && (isLastRule || (hasPercOnly && isBeforeLast))),
|
|
272
|
+
};
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
hasOnlyPercentageRule(group) {
|
|
277
|
+
return group.controls.targetingRules.controls.length === 1 &&
|
|
278
|
+
this.formGenerator.isPercentageOnlyTargetingRule(group.controls.targetingRules.controls[0]);
|
|
279
|
+
}
|
|
280
|
+
expandedChanged(expandedState) {
|
|
281
|
+
this.flagState.panelExpanded = expandedState;
|
|
282
|
+
this.expandedStateChanged.emit();
|
|
283
|
+
}
|
|
284
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FeatureFlagItemComponent, deps: [{ token: i1.FormGenerator }, { token: i2.MatDialog }, { token: i3.MatSnackBar }, { token: i4.PublicApiService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
285
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: FeatureFlagItemComponent, selector: "configcat-feature-flag-item", inputs: { productId: "productId", environmentId: "environmentId", configId: "configId", settingId: "settingId", canDeleteSetting: "canDeleteSetting", deleteSettingText: "deleteSettingText", showEnvironmentName: "showEnvironmentName" }, outputs: { deleteSettingRequested: "deleteSettingRequested", loadSucceeded: "loadSucceeded", loadFailed: "loadFailed", saveSucceeded: "saveSucceeded", saveFailed: "saveFailed", expandedStateChanged: "expandedStateChanged", formValuesChanged: "formValuesChanged" }, usesInheritance: true, ngImport: i0, template: "<div class=\"container\">\n <ng-container *ngIf=\"!loading\">\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"submit()\" id=\"feature-flag-form\">\n <div [ngClass]=\"{'invalid-flag': formGroup.invalid}\">\n <app-feature-flag [formGroup]=\"formGroup\" [flagState]=\"flagState\" [segments]=\"segments\"\n (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [featureFlagLimitations]=\"settingFormula.featureFlagLimitations\" [hasOtherEnvironment]=\"false\"\n (subscriptionLimitReached)=\"subscriptionLimitReachedCalled()\"\n (addSegmentConditionRequestedWithoutSegments)=\"addSegmentConditionRequestedWithoutSegments()\"\n (prerequisiteConditionChanged)=\"recalcPrerequisites()\" (recalcAddButtons)=\"recalcAddButtons()\"\n (expandedChanged)=\"expandedChanged($event)\"\n [showEnvironmentName]=\"showEnvironmentName\" [environmentName]=\"settingFormula.environment.name\"\n [deleteSettingText]=\"deleteSettingText\">\n </app-feature-flag>\n </div>\n <div class=\"save\" *ngIf=\"!settingFormula.readOnly && formGroup?.dirty\">\n <button class=\"save-button\" mat-flat-button color=\"warn\" type=\"submit\" [class.animate]=\"formGroup.dirty\"\n [track]=\"['save & publish click', 'feature flags and settings']\">\n <mat-icon>backup</mat-icon> <span> Save & publish changes</span>\n </button>\n <button type=\"button\" class=\"revert-button\" mat-stroked-button (click)=\"revert()\"\n [track]=\"['revert click', 'feature flags and settings']\">\n <span>Revert</span>\n </button>\n <div class=\"feedback\" *ngIf=\"formGroup.touched && formGroup.invalid && showFeedBackMessage\">\n <div class=\"error\" *ngIf=\"formGroup.errors && formGroup.errors.internalServerError\">\n <span>Something went wrong and we could not save your settings. You can try again or <a\n href=\"https://configcat.com/support\" target=\"_blank\" rel=\"noopener noreferrer\">contact\n us.</a></span>\n </div>\n <div class=\"error\" *ngIf=\"!formGroup.errors || !formGroup.errors.internalServerError\">\n <span>Oh no! A feature flag has invalid or missing data. </span>\n </div>\n </div>\n </div>\n </form>\n\n </ng-container>\n</div>", styles: [".container .expand-collapse{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;margin-left:auto;margin-top:.3rem;display:flex;flex-wrap:nowrap}.container .expand-collapse .mat-mdc-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-raised-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-unelevated-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-outlined-button .mat-mdc-button-touch-target{display:none}.container .expand-collapse .btn{font-size:.6em;padding:0 8px;min-width:105px}.container .expand-collapse .btn mat-icon{font-size:14px;width:14px;height:14px;margin-right:4px;color:#838383}.container .expand-collapse .expand{margin-right:6px}.container .read-only-notification{margin-top:.6rem}.container .save{position:sticky;bottom:0;background-color:#fff;display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;z-index:999;padding-top:.5rem;padding-bottom:.5rem}.container .save .save-button{animation:shadow-pulse 1s 3}.container .save .save-button:disabled{animation:none}.container .save>*{margin-top:.5rem;margin-bottom:.5rem;margin-right:.6em}.container .error{color:#f44336;padding:5px;font-size:.9em}.container .error a{color:#f44336;text-decoration:underline}@media (max-width: 750px){.expand-collapse{flex-wrap:wrap!important}.expand-collapse .btn{margin-bottom:2px}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.FeatureFlagComponent, selector: "app-feature-flag", inputs: ["formGroup", "flagState", "segments", "featureFlagLimitations", "hasOtherEnvironment", "environmentName", "showEnvironmentName", "deleteSettingText"], outputs: ["addSegmentConditionRequestedWithoutSegments", "expandedChanged", "deleteSettingRequested", "subscriptionLimitReached", "prerequisiteConditionChanged", "recalcAddButtons"] }, { kind: "directive", type: i10.TrackingDirective, selector: "[track]", inputs: ["track"] }] }); }
|
|
286
|
+
}
|
|
287
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FeatureFlagItemComponent, decorators: [{
|
|
288
|
+
type: Component,
|
|
289
|
+
args: [{ selector: 'configcat-feature-flag-item', template: "<div class=\"container\">\n <ng-container *ngIf=\"!loading\">\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"submit()\" id=\"feature-flag-form\">\n <div [ngClass]=\"{'invalid-flag': formGroup.invalid}\">\n <app-feature-flag [formGroup]=\"formGroup\" [flagState]=\"flagState\" [segments]=\"segments\"\n (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [featureFlagLimitations]=\"settingFormula.featureFlagLimitations\" [hasOtherEnvironment]=\"false\"\n (subscriptionLimitReached)=\"subscriptionLimitReachedCalled()\"\n (addSegmentConditionRequestedWithoutSegments)=\"addSegmentConditionRequestedWithoutSegments()\"\n (prerequisiteConditionChanged)=\"recalcPrerequisites()\" (recalcAddButtons)=\"recalcAddButtons()\"\n (expandedChanged)=\"expandedChanged($event)\"\n [showEnvironmentName]=\"showEnvironmentName\" [environmentName]=\"settingFormula.environment.name\"\n [deleteSettingText]=\"deleteSettingText\">\n </app-feature-flag>\n </div>\n <div class=\"save\" *ngIf=\"!settingFormula.readOnly && formGroup?.dirty\">\n <button class=\"save-button\" mat-flat-button color=\"warn\" type=\"submit\" [class.animate]=\"formGroup.dirty\"\n [track]=\"['save & publish click', 'feature flags and settings']\">\n <mat-icon>backup</mat-icon> <span> Save & publish changes</span>\n </button>\n <button type=\"button\" class=\"revert-button\" mat-stroked-button (click)=\"revert()\"\n [track]=\"['revert click', 'feature flags and settings']\">\n <span>Revert</span>\n </button>\n <div class=\"feedback\" *ngIf=\"formGroup.touched && formGroup.invalid && showFeedBackMessage\">\n <div class=\"error\" *ngIf=\"formGroup.errors && formGroup.errors.internalServerError\">\n <span>Something went wrong and we could not save your settings. You can try again or <a\n href=\"https://configcat.com/support\" target=\"_blank\" rel=\"noopener noreferrer\">contact\n us.</a></span>\n </div>\n <div class=\"error\" *ngIf=\"!formGroup.errors || !formGroup.errors.internalServerError\">\n <span>Oh no! A feature flag has invalid or missing data. </span>\n </div>\n </div>\n </div>\n </form>\n\n </ng-container>\n</div>", styles: [".container .expand-collapse{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;margin-left:auto;margin-top:.3rem;display:flex;flex-wrap:nowrap}.container .expand-collapse .mat-mdc-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-raised-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-unelevated-button .mat-mdc-button-touch-target,.container .expand-collapse .mat-mdc-outlined-button .mat-mdc-button-touch-target{display:none}.container .expand-collapse .btn{font-size:.6em;padding:0 8px;min-width:105px}.container .expand-collapse .btn mat-icon{font-size:14px;width:14px;height:14px;margin-right:4px;color:#838383}.container .expand-collapse .expand{margin-right:6px}.container .read-only-notification{margin-top:.6rem}.container .save{position:sticky;bottom:0;background-color:#fff;display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;z-index:999;padding-top:.5rem;padding-bottom:.5rem}.container .save .save-button{animation:shadow-pulse 1s 3}.container .save .save-button:disabled{animation:none}.container .save>*{margin-top:.5rem;margin-bottom:.5rem;margin-right:.6em}.container .error{color:#f44336;padding:5px;font-size:.9em}.container .error a{color:#f44336;text-decoration:underline}@media (max-width: 750px){.expand-collapse{flex-wrap:wrap!important}.expand-collapse .btn{margin-bottom:2px}}\n"] }]
|
|
290
|
+
}], ctorParameters: () => [{ type: i1.FormGenerator }, { type: i2.MatDialog }, { type: i3.MatSnackBar }, { type: i4.PublicApiService }], propDecorators: { productId: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}], environmentId: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], configId: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], settingId: [{
|
|
297
|
+
type: Input
|
|
298
|
+
}], canDeleteSetting: [{
|
|
299
|
+
type: Input
|
|
300
|
+
}], deleteSettingText: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], showEnvironmentName: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], deleteSettingRequested: [{
|
|
305
|
+
type: Output
|
|
306
|
+
}], loadSucceeded: [{
|
|
307
|
+
type: Output
|
|
308
|
+
}], loadFailed: [{
|
|
309
|
+
type: Output
|
|
310
|
+
}], saveSucceeded: [{
|
|
311
|
+
type: Output
|
|
312
|
+
}], saveFailed: [{
|
|
313
|
+
type: Output
|
|
314
|
+
}], expandedStateChanged: [{
|
|
315
|
+
type: Output
|
|
316
|
+
}], formValuesChanged: [{
|
|
317
|
+
type: Output
|
|
318
|
+
}] } });
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1mbGFnLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi92Mi9mZWF0dXJlLWZsYWctaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvRSxPQUFPLEVBQWdCLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFJekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0RBQWtELENBQUM7Ozs7Ozs7Ozs7OztBQVF6RixNQUFNLE9BQU8sd0JBQXlCLFNBQVEsYUFBYTtJQXdDekQsWUFDVSxhQUE0QixFQUM1QixNQUFpQixFQUNqQixRQUFxQixFQUM3QixnQkFBa0M7UUFFbEMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFMaEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBcEN0QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFD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QUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWdtZW50TGlzdE1vZGVsLCBTZXR0aW5nRGF0YU1vZGVsLCBTZXR0aW5nRm9ybXVsYU1vZGVsLCBVcGRhdGVFdmFsdWF0aW9uRm9ybXVsYU1vZGVsIH0gZnJvbSAnbmctY29uZmlnY2F0LXB1YmxpY2FwaSc7XG5pbXBvcnQgeyBJRmxhZ1N0YXRlIH0gZnJvbSAnLi4vX21vZGVscy9mbGFnLXN0YXRlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElQcmVyZXF1aXNpdGVTZXR0aW5nLCBUYXJnZXRpbmdSdWxlRm9ybSwgVXBkYXRlU2V0dGluZ1ZhbHVlRm9ybSB9IGZyb20gJy4uL19tb2RlbHMvc2V0dGluZy12YWx1ZS1mb3JtZ3JvdXAnO1xuaW1wb3J0IHsgUHVibGljQXBpU2VydmljZSB9IGZyb20gJy4uL19zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZvcmtKb2luLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9kaWFsb2dzL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZyc7XG5pbXBvcnQgeyBSZWFzb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9kaWFsb2dzL3JlYXNvbi1kaWFsb2cvcmVhc29uLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvciB9IGZyb20gJy4uL19zZXJ2aWNlcy9mb3JtLWdlbmVyYXRvcic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgU2F2ZVNuYWNrYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGlhbG9ncy9zYXZlLXNuYWNrYmFyL3NhdmUtc25hY2tiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZVNldHRpbmdNb2RlbCB9IGZyb20gJy4uL19tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtZmVhdHVyZS1mbGFnLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmVhdHVyZS1mbGFnLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mZWF0dXJlLWZsYWctaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnSXRlbUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcHJvZHVjdElkITogc3RyaW5nO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudElkITogc3RyaW5nO1xuICBASW5wdXQoKSBjb25maWdJZCE6IHN0cmluZztcbiAgQElucHV0KCkgc2V0dGluZ0lkITogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZVNldHRpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBkZWxldGVTZXR0aW5nVGV4dCA9ICdEZWxldGUgc2V0dGluZyc7XG4gIEBJbnB1dCgpIHNob3dFbnZpcm9ubWVudE5hbWUgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBkZWxldGVTZXR0aW5nUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBsb2FkU3VjY2VlZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbG9hZEZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNhdmVTdWNjZWVkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzYXZlRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZXhwYW5kZWRTdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmb3JtVmFsdWVzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBzZWdtZW50cyE6IFNlZ21lbnRMaXN0TW9kZWxbXTtcbiAgZGFzaGJvYXJkQmFzZVBhdGg6IHN0cmluZztcbiAgbG9hZGluZyA9IHRydWU7XG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXA8VXBkYXRlU2V0dGluZ1ZhbHVlRm9ybT47XG4gIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBzZXR0aW5nczogU2V0dGluZ0RhdGFNb2RlbFtdO1xuXG4gIGZsYWdTdGF0ZTogSUZsYWdTdGF0ZTtcblxuICBzZXR0aW5nRm9ybXVsYTogU2V0dGluZ0Zvcm11bGFNb2RlbDtcbiAgcHJlcmVxdWlzaXRlU2V0dGluZ3M6IElQcmVyZXF1aXNpdGVTZXR0aW5nW107XG5cbiAgc2hvd0ZlZWRCYWNrTWVzc2FnZSA9IGZhbHNlO1xuXG4gIGhhc1NldHRpbmdWYWx1ZXMgPSBmYWxzZTtcblxuICBoYXNPdGhlckVudmlyb25tZW50ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljQXBpU2VydmljZTogUHVibGljQXBpU2VydmljZVxuICApIHtcbiAgICBzdXBlcihwdWJsaWNBcGlTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVsb2FkU2V0dGluZ1ZhbHVlcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZUZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHJlbG9hZFNldHRpbmdWYWx1ZXMoKSB7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY3JlYXRlU2V0dGluZ1ZhbHVlc1YyU2VydmljZSgpXG5cbiAgICBmb3JrSm9pbih7XG4gICAgICBzZWdtZW50czogdGhpcy5jcmVhdGVTZWdtZW50c1NlcnZpY2UoKS5nZXRTZWdtZW50cyh0aGlzLnByb2R1Y3RJZCksXG4gICAgICBzZXR0aW5nczogdGhpcy5jcmVhdGVTZXR0aW5nc1NlcnZpY2UoKS5nZXRTZXR0aW5ncyh0aGlzLmNvbmZpZ0lkKSxcbiAgICAgIHNldHRpbmdGb3JtdWxhOiB0aGlzLmNyZWF0ZVNldHRpbmdWYWx1ZXNWMlNlcnZpY2UoKS5nZXRTZXR0aW5nVmFsdWVWMih0aGlzLmVudmlyb25tZW50SWQsIHRoaXMuc2V0dGluZ0lkKVxuICAgIH0pLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHJlc3VsdC5zZXR0aW5ncztcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlU2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLm1hcChzdiA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2V0dGluZ0lkOiBzdi5zZXR0aW5nSWQsXG4gICAgICAgICAga2V5OiBzdi5rZXksXG4gICAgICAgICAgbmFtZTogc3YubmFtZSxcbiAgICAgICAgICBzZXR0aW5nVHlwZTogc3Yuc2V0dGluZ1R5cGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlZ21lbnRzID0gcmVzdWx0LnNlZ21lbnRzO1xuICAgICAgdGhpcy5oYW5kbGVGZXRjaGVkU2V0dGluZ1ZhbHVlcyhyZXN1bHQuc2V0dGluZ0Zvcm11bGEpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxvYWRTdWNjZWVkZWQuZW1pdCgpO1xuICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkRmFpbGVkLmVtaXQoZXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUZldGNoZWRTZXR0aW5nVmFsdWVzKG1vZGVsOiBTZXR0aW5nRm9ybXVsYU1vZGVsKSB7XG4gICAgdGhpcy5zZXR0aW5nRm9ybXVsYSA9IG1vZGVsO1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBsZXNzIHdlIGhhZCBwcmV2aW91c2x5XG4gICAgdGhpcy5mbGFnU3RhdGUgPSB7XG4gICAgICBhZGRCdXR0b25SZW5kZXJTdGF0ZToge1xuICAgICAgICBoYXNQZXJjZW50YWdlT25seVJ1bGU6IGZhbHNlLFxuICAgICAgICByZW5kZXJUb3BBZGRCdXR0b25zOiBmYWxzZSxcbiAgICAgICAgYWRkUnVsZUJ1dHRvblRyYWNrZXI6IFtdXG4gICAgICB9LFxuICAgICAgcmVhZE9ubHk6IG1vZGVsLnJlYWRPbmx5LFxuICAgICAgZGVwZW5kZWVTZXR0aW5nczogW10sXG4gICAgICBzZXR0aW5nVmFsdWU6IG1vZGVsLFxuICAgICAgcGFuZWxFeHBhbmRlZDogdHJ1ZSxcbiAgICAgIHByZXJlcXVpc2l0ZVNldHRpbmdzOiB0aGlzLmdldEF2YWlsYWJsZVByZXJlcXVpc2l0ZVNldHRpbmdzKG1vZGVsLnNldHRpbmcuc2V0dGluZ0lkKVxuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmVGb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKCk7XG5cbiAgICB0aGlzLmNyZWF0ZUZvcm1Hcm91cEZyb21TdGF0ZSh0aGlzLnNldHRpbmdGb3JtdWxhKTtcblxuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5mb3JtVmFsdWVzQ2hhbmdlZC5lbWl0KCk7XG4gICAgfSlcblxuICAgIHRoaXMucmVjYWxjQWRkQnV0dG9ucygpO1xuICAgIHRoaXMucmVjYWxjUHJlcmVxdWlzaXRlcygpO1xuICB9XG5cbiAgdW5zdWJzY3JpYmVGb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKCkge1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm1Hcm91cEZyb21TdGF0ZShtb2RlbDogU2V0dGluZ0Zvcm11bGFNb2RlbCkge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5mb3JtR2VuZXJhdG9yLmdlbmVyYXRlU2V0dGluZ1ZhbHVlc0Zvcm1Hcm91cChtb2RlbCwgbW9kZWwucmVhZE9ubHksIHRoaXMucHJlcmVxdWlzaXRlU2V0dGluZ3MsIG1vZGVsLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpO1xuICB9XG5cbiAgZ2V0QXZhaWxhYmxlUHJlcmVxdWlzaXRlU2V0dGluZ3Moc2V0dGluZ0lkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVyZXF1aXNpdGVTZXR0aW5ncy5maWx0ZXIoZHMgPT4gZHMuc2V0dGluZ0lkICE9PSBzZXR0aW5nSWQpO1xuICB9XG5cbiAgcmV2ZXJ0KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnUmV2ZXJ0IHRvIGxhc3Qgc2F2ZWQgc3RhdGU/JyxcbiAgICAgICAgYm9keTogJ0FsbCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4nLFxuICAgICAgICB5ZXNCdXR0b25MYWJlbDogJ1JldmVydCcsXG4gICAgICAgIG5vQnV0dG9uTGFiZWw6ICdObydcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3llcycpIHtcbiAgICAgICAgdGhpcy5yZXZlcnREaXJ0eVZhbHVlc0Zyb21TdGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV2ZXJ0RGlydHlWYWx1ZXNGcm9tU3RhdGUoKSB7XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuZGlydHkpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woJ2RlZmF1bHRWYWx1ZScsXG4gICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZVZhbHVlRm9ybUdyb3VwKHRoaXMuc2V0dGluZ0Zvcm11bGEuZGVmYXVsdFZhbHVlLCB0aGlzLnNldHRpbmdGb3JtdWxhLnNldHRpbmcuc2V0dGluZ1R5cGUsIHRoaXMuc2V0dGluZ0Zvcm11bGEucmVhZE9ubHksIHRoaXMuc2V0dGluZ0Zvcm11bGEuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucykpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbCgncGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGUnLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5zZXR0aW5nRm9ybXVsYS5wZXJjZW50YWdlRXZhbHVhdGlvbkF0dHJpYnV0ZSwgZGlzYWJsZWQ6IHRoaXMuc2V0dGluZ0Zvcm11bGEucmVhZE9ubHkgfSwgeyB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5tYXgoMTAwMCldIH0pLCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5zZXRDb250cm9sKCd0YXJnZXRpbmdSdWxlcycsXG4gICAgICAgIG5ldyBGb3JtQXJyYXk8Rm9ybUdyb3VwPFRhcmdldGluZ1J1bGVGb3JtPj4oXG4gICAgICAgICAgdGhpcy5zZXR0aW5nRm9ybXVsYS50YXJnZXRpbmdSdWxlcy5tYXAoZnQgPT4gdGhpcy5mb3JtR2VuZXJhdG9yLmdlbmVyYXRlVGFyZ2V0aW5nUnVsZUZvcm1Hcm91cChmdCwgdGhpcy5zZXR0aW5nRm9ybXVsYS5zZXR0aW5nLnNldHRpbmdUeXBlLCB0aGlzLnNldHRpbmdGb3JtdWxhLnJlYWRPbmx5LCB0aGlzLnByZXJlcXVpc2l0ZVNldHRpbmdzLCB0aGlzLnNldHRpbmdGb3JtdWxhLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpKVxuICAgICAgICApKTtcbiAgICAgIHRoaXMucmVjYWxjQWRkQnV0dG9ucygpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAubWFya0FzVW50b3VjaGVkKCk7XG4gICAgdGhpcy5yZWNhbGNQcmVyZXF1aXNpdGVzKCk7XG4gICAgdGhpcy5zaG93RmVlZEJhY2tNZXNzYWdlID0gZmFsc2U7XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrTWVzc2FnZSA9IHRydWU7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZEJhY2tNZXNzYWdlID0gZmFsc2U7XG4gICAgY29uc3QgdmFsdWU6IFVwZGF0ZUV2YWx1YXRpb25Gb3JtdWxhTW9kZWwgPSB7XG4gICAgICAuLi50aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpLFxuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdWYWx1ZXModmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVNb2RlbDogVXBkYXRlRXZhbHVhdGlvbkZvcm11bGFNb2RlbCwgcmVhc29uOiBzdHJpbmcgPSBudWxsKSB7XG5cbiAgICB0aGlzLmNyZWF0ZVNldHRpbmdWYWx1ZXNWMlNlcnZpY2UoKS5yZXBsYWNlU2V0dGluZ1ZhbHVlVjIodGhpcy5lbnZpcm9ubWVudElkLCB0aGlzLnNldHRpbmdJZCwgdXBkYXRlTW9kZWwsIHJlYXNvbilcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBzZXR0aW5nVmFsdWVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUZldGNoZWRTZXR0aW5nVmFsdWVzKHNldHRpbmdWYWx1ZXMpO1xuXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuRnJvbUNvbXBvbmVudChTYXZlU25hY2tiYXJDb21wb25lbnQsIHsgZHVyYXRpb246IDUwMDAsIHBhbmVsQ2xhc3M6ICdncmVlbi1zbmFja2JhcicgfSk7XG4gICAgICAgICAgdGhpcy5zYXZlU3VjY2VlZGVkLmVtaXQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAwICYmIGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLlJlYXNvbiAmJiBlcnJvci5lcnJvci5SZWFzb25bMF0gPT09ICdSZWFzb24gcmVxdWlyZWQuJykge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihSZWFzb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgd2lkdGg6ICc0NTBweCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmJ1dHRvbiA9PT0gJ3NhdmUnICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVNb2RlbCwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDAgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3IuU2VnbWVudENvbmRpdGlvbiAmJiBlcnJvci5lcnJvci5TZWdtZW50Q29uZGl0aW9uWzBdID09PSAnU2VnbWVudCBub3QgZm91bmQuJykge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgd2lkdGg6ICc0NTBweCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Nhbm5vdCBzYXZlIGZlYXR1cmUgZmxhZ3MnLFxuICAgICAgICAgICAgICAgIGJvZHk6ICdBIHNlZ21lbnQgcmVmZXJlbmNlZCBieSBvbmUgb2YgeW91ciBmZWF0dXJlIGZsYWdzIGhhcyBiZWVuIGRlbGV0ZWQuIFJlbG9hZCB0aGUgY29uZmlnIHRvIHNlZSBpdHMgbGF0ZXN0IHN0YXRlLCBhcHBseSB5b3VyIGNoYW5nZXMgYW5kIHRyeSB0aGUgc2F2ZSBhZ2Fpbi4nLFxuICAgICAgICAgICAgICAgIHllc0J1dHRvbkxhYmVsOiAnUmVsb2FkJyxcbiAgICAgICAgICAgICAgICBoaWRlTm9CdXR0b246IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFNldHRpbmdWYWx1ZXMoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAwICYmIGVycm9yLmVycm9yICYmICgnJyArIGVycm9yLmVycm9yKS5zdGFydHNXaXRoKCdDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkLicpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAoJycgKyBlcnJvci5lcnJvcikuc2xpY2UoJ0NpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuJy5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgIHdpZHRoOiAnNDUwcHgnLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDYW5ub3Qgc2F2ZSBmZWF0dXJlIGZsYWdzLicsXG4gICAgICAgICAgICAgICAgYm9keTogJ0NpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGZlYXR1cmUgZmxhZ3M6PHA+JyArIGVycm9yTWVzc2FnZSArICc8L3A+UGxlYXNlIDxzdHJvbmc+ZWxpbWluYXRlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5PC9zdHJvbmc+IGJlZm9yZSBzYXZpbmcgeW91ciBmZWF0dXJlIGZsYWdzLicsXG4gICAgICAgICAgICAgICAgeWVzQnV0dG9uTGFiZWw6ICdJIHVuZGVyc3RhbmQnLFxuICAgICAgICAgICAgICAgIGhpZGVOb0J1dHRvbjogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRFcnJvcnMoeyBpbnRlcm5hbFNlcnZlckVycm9yOiAnSW50ZXJuYWwgc2VydmVyIGVycm9yJyB9KTtcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNhdmVGYWlsZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU2V0dGluZ1JlcXVlc3RlZChzZXR0aW5nKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmRpcnR5KSB7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdGl0bGU6ICdEaXNjYXJkIGNoYW5nZXM/JyxcbiAgICAgICAgICBib2R5OiAnWW91IGhhdmUgdW5zYXZlZCBmZWF0dXJlIGZsYWcgY2hhbmdlcy4gSWYgeW91IGNvbnRpbnVlLCB1bnNhdmVkIGNoYW5nZXMgd2lsbCBiZSBsb3N0LicsXG4gICAgICAgICAgeWVzQnV0dG9uTGFiZWw6ICdEaXNjYXJkIGNoYW5nZXMnLFxuICAgICAgICAgIG5vQnV0dG9uTGFiZWw6ICdObydcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAneWVzJykge1xuICAgICAgICAgICAgdGhpcy5yZXZlcnREaXJ0eVZhbHVlc0Zyb21TdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVTZXR0aW5nSW50ZXJuYWwoc2V0dGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVTZXR0aW5nSW50ZXJuYWwoc2V0dGluZyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVTZXR0aW5nSW50ZXJuYWwoc2V0dGluZykge1xuICAgIHRoaXMuZGVsZXRlU2V0dGluZ1JlcXVlc3RlZC5lbWl0KDxEZWxldGVTZXR0aW5nTW9kZWw+eyBjb25maWc6IHRoaXMuc2V0dGluZ0Zvcm11bGEuY29uZmlnLCBlbnZpcm9ubWVudDogdGhpcy5zZXR0aW5nRm9ybXVsYS5lbnZpcm9ubWVudCwgc2V0dGluZzogc2V0dGluZy5zZXR0aW5nIH0pXG4gIH1cblxuICBzdWJzY3JpcHRpb25MaW1pdFJlYWNoZWRDYWxsZWQoKSB7XG4gICAgLy8gVE9ETyB0aGlzLnN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZCh0aGlzLmNvbnN0ZWxsYXRpb24sIHRoaXMuZGlhbG9nKTtcbiAgfVxuXG4gIGFkZFNlZ21lbnRDb25kaXRpb25SZXF1ZXN0ZWRXaXRob3V0U2VnbWVudHMoKSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdUaGVyZSBhcmUgbm8gc2VnbWVudHMgaW4gdGhpcyBwcm9kdWN0IHlldC4nLFxuICAgICAgICBib2R5OiBgR28gYWhlYWQgdG8gdGhlIENvbmZpQ2F0IERhc2hib2FyZCBhbmQgY3JlYXRlIHlvdXIgZmlyc3QgdXNlciBzZWdtZW50IGJlZm9yZSBhZGRpbmcgaXQgdG8gYSB0YXJnZXRpbmcgcnVsZS5gLFxuICAgICAgICB5ZXNCdXR0b25MYWJlbDogYEkgdW5kZXJzdGFuZGBcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICByZWNhbGNQcmVyZXF1aXNpdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdWYWx1ZSA9IHRoaXMuc2V0dGluZ0Zvcm11bGE7XG4gICAgdGhpcy5mbGFnU3RhdGUuZGVwZW5kZWVTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZmlsdGVyKHMgPT4gc2V0dGluZ1ZhbHVlLnNldHRpbmdJZHNXaGVyZVByZXJlcXVpc2l0ZT8uaW5jbHVkZXMocy5zZXR0aW5nSWQpKVxuICAgICAgLm1hcChzID0+IHsgcmV0dXJuIHsga2V5OiBzLmtleSwgbmFtZTogcy5uYW1lLCBzZXR0aW5nSWQ6IHMuc2V0dGluZ0lkIH0gfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVjYWxjQWRkQnV0dG9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZmxhZ1N0YXRlO1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtR3JvdXA7XG5cbiAgICBzdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5yZW5kZXJUb3BBZGRCdXR0b25zID0gIWdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLmxlbmd0aCB8fFxuICAgICAgdGhpcy5oYXNPbmx5UGVyY2VudGFnZVJ1bGUoZ3JvdXApO1xuXG4gICAgaWYgKCFncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9scy5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmFkZEJ1dHRvblJlbmRlclN0YXRlLmFkZFJ1bGVCdXR0b25UcmFja2VyID0gW107XG4gICAgICBzdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5oYXNQZXJjZW50YWdlT25seVJ1bGUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFzUGVyY09ubHkgPSBzdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5oYXNQZXJjZW50YWdlT25seVJ1bGUgPSBncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9scy5sZW5ndGggPiAwXG4gICAgICAgICYmIHRoaXMuZm9ybUdlbmVyYXRvci5pc1BlcmNlbnRhZ2VPbmx5VGFyZ2V0aW5nUnVsZShncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9sc1tncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9scy5sZW5ndGggLSAxXSk7XG4gICAgICBzdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5hZGRSdWxlQnV0dG9uVHJhY2tlciA9IGdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLm1hcCgoaXRlbSwgaSwgcnVsZXMpID0+IHtcbiAgICAgICAgY29uc3QgaXNMYXN0UnVsZSA9IGkgPT09IGdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IGlzQmVmb3JlTGFzdCA9IGkgPT09IGdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLmxlbmd0aCAtIDI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2hvd0FkZFJ1bGVCdXR0b25zOiBoYXNQZXJjT25seSA/IGkgPT09IHJ1bGVzLmxlbmd0aCAtIDIgOiBpID09PSBydWxlcy5sZW5ndGggLSAxLFxuICAgICAgICAgIHNob3dPckNoaXA6IGhhc1BlcmNPbmx5ID8gaSA8IHJ1bGVzLmxlbmd0aCAtIDIgOiBpIDwgcnVsZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICByZW5kZXJTZXBhcmF0aW9uQXJlYTogdGhpcy5mb3JtR2VuZXJhdG9yLmlzUGVyY2VudGFnZU9ubHlUYXJnZXRpbmdSdWxlKGl0ZW0pIHx8XG4gICAgICAgICAgICAodGhpcy5zZXR0aW5nRm9ybXVsYS5yZWFkT25seSAmJiAoaXNMYXN0UnVsZSB8fCAoaGFzUGVyY09ubHkgJiYgaXNCZWZvcmVMYXN0KSkpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYXNPbmx5UGVyY2VudGFnZVJ1bGUoZ3JvdXA6IEZvcm1Hcm91cDxVcGRhdGVTZXR0aW5nVmFsdWVGb3JtPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9scy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5pc1BlcmNlbnRhZ2VPbmx5VGFyZ2V0aW5nUnVsZShncm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5jb250cm9sc1swXSlcbiAgfVxuXG4gIGV4cGFuZGVkQ2hhbmdlZChleHBhbmRlZFN0YXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mbGFnU3RhdGUucGFuZWxFeHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgdGhpcy5leHBhbmRlZFN0YXRlQ2hhbmdlZC5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiAobmdTdWJtaXQpPVwic3VibWl0KClcIiBpZD1cImZlYXR1cmUtZmxhZy1mb3JtXCI+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaW52YWxpZC1mbGFnJzogZm9ybUdyb3VwLmludmFsaWR9XCI+XG4gICAgICAgICAgICAgICAgPGFwcC1mZWF0dXJlLWZsYWcgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBbZmxhZ1N0YXRlXT1cImZsYWdTdGF0ZVwiIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgICAgIChkZWxldGVTZXR0aW5nUmVxdWVzdGVkKT1cIm9uRGVsZXRlU2V0dGluZ1JlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZlYXR1cmVGbGFnTGltaXRhdGlvbnNdPVwic2V0dGluZ0Zvcm11bGEuZmVhdHVyZUZsYWdMaW1pdGF0aW9uc1wiIFtoYXNPdGhlckVudmlyb25tZW50XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgKHN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZCk9XCJzdWJzY3JpcHRpb25MaW1pdFJlYWNoZWRDYWxsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChhZGRTZWdtZW50Q29uZGl0aW9uUmVxdWVzdGVkV2l0aG91dFNlZ21lbnRzKT1cImFkZFNlZ21lbnRDb25kaXRpb25SZXF1ZXN0ZWRXaXRob3V0U2VnbWVudHMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChwcmVyZXF1aXNpdGVDb25kaXRpb25DaGFuZ2VkKT1cInJlY2FsY1ByZXJlcXVpc2l0ZXMoKVwiIChyZWNhbGNBZGRCdXR0b25zKT1cInJlY2FsY0FkZEJ1dHRvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChleHBhbmRlZENoYW5nZWQpPVwiZXhwYW5kZWRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0Vudmlyb25tZW50TmFtZV09XCJzaG93RW52aXJvbm1lbnROYW1lXCIgW2Vudmlyb25tZW50TmFtZV09XCJzZXR0aW5nRm9ybXVsYS5lbnZpcm9ubWVudC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlbGV0ZVNldHRpbmdUZXh0XT1cImRlbGV0ZVNldHRpbmdUZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtZmVhdHVyZS1mbGFnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZVwiICpuZ0lmPVwiIXNldHRpbmdGb3JtdWxhLnJlYWRPbmx5ICYmIGZvcm1Hcm91cD8uZGlydHlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgdHlwZT1cInN1Ym1pdFwiIFtjbGFzcy5hbmltYXRlXT1cImZvcm1Hcm91cC5kaXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgIFt0cmFja109XCJbJ3NhdmUgJiBwdWJsaXNoIGNsaWNrJywgJ2ZlYXR1cmUgZmxhZ3MgYW5kIHNldHRpbmdzJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmJhY2t1cDwvbWF0LWljb24+IDxzcGFuPiBTYXZlICYgcHVibGlzaCBjaGFuZ2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicmV2ZXJ0LWJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwicmV2ZXJ0KClcIlxuICAgICAgICAgICAgICAgICAgICBbdHJhY2tdPVwiWydyZXZlcnQgY2xpY2snLCAnZmVhdHVyZSBmbGFncyBhbmQgc2V0dGluZ3MnXVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5SZXZlcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZWRiYWNrXCIgKm5nSWY9XCJmb3JtR3JvdXAudG91Y2hlZCAmJiBmb3JtR3JvdXAuaW52YWxpZCAmJiBzaG93RmVlZEJhY2tNZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvclwiICpuZ0lmPVwiZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLmludGVybmFsU2VydmVyRXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB5b3VyIHNldHRpbmdzLiBZb3UgY2FuIHRyeSBhZ2FpbiBvciA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9jb25maWdjYXQuY29tL3N1cHBvcnRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+Y29udGFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cy48L2E+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCIhZm9ybUdyb3VwLmVycm9ycyB8fCAhZm9ybUdyb3VwLmVycm9ycy5pbnRlcm5hbFNlcnZlckVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PaCBubyEgQSBmZWF0dXJlIGZsYWcgaGFzIGludmFsaWQgb3IgbWlzc2luZyBkYXRhLiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=
|
|
@@ -11,4 +11,5 @@ export * from './lib/selects/config-select/config-select.component';
|
|
|
11
11
|
export * from './lib/selects/environment-select/environment-select.component';
|
|
12
12
|
export * from './lib/selects/setting-select/setting-select.component';
|
|
13
13
|
export * from './lib/dialogs/delete-setting-dialog/delete-setting-dialog.component';
|
|
14
|
-
|
|
14
|
+
export * from './lib/v2/feature-flag-item.component';
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsNkNBQTZDLENBQUM7QUFDNUQsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLHFEQUFxRCxDQUFDO0FBQ3BFLGNBQWMsK0RBQStELENBQUM7QUFDOUUsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLHFFQUFxRSxDQUFDO0FBQ3BGLGNBQWMsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWlcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9fZGlyZWN0aXZlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9fc2VydmljZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2V0dGluZy1pdGVtL3NldHRpbmctaXRlbS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXV0aG9yaXphdGlvbi9hdXRob3JpemF0aW9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZWxlY3RzL3Byb2R1Y3Qtc2VsZWN0L3Byb2R1Y3Qtc2VsZWN0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZWxlY3RzL2NvbmZpZy1zZWxlY3QvY29uZmlnLXNlbGVjdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VsZWN0cy9lbnZpcm9ubWVudC1zZWxlY3QvZW52aXJvbm1lbnQtc2VsZWN0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZWxlY3RzL3NldHRpbmctc2VsZWN0L3NldHRpbmctc2VsZWN0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaWFsb2dzL2RlbGV0ZS1zZXR0aW5nLWRpYWxvZy9kZWxldGUtc2V0dGluZy1kaWFsb2cuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3YyL2ZlYXR1cmUtZmxhZy1pdGVtLmNvbXBvbmVudCc7Il19
|