ng-configcat-publicapi-ui 3.0.3 → 3.0.4
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/esm2020/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +2 -2
- package/esm2020/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +3 -3
- package/fesm2015/ng-configcat-publicapi-ui.mjs +4 -4
- package/fesm2015/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/fesm2020/ng-configcat-publicapi-ui.mjs +4 -4
- package/fesm2020/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -69,10 +69,10 @@ export class RolloutPercentageItemsComponent {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
RolloutPercentageItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RolloutPercentageItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
72
|
-
RolloutPercentageItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", 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-set>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-set>\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 matTooltip=\"The sum of percentages must be equal to 100.\" matTooltipPosition=\"above\"\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;margin:.5em 1em;position:relative;padding:.5em 0;display:flex;flex-wrap:wrap}.percentage-wrapper .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.percentage-wrapper .delete:hover mat-icon{opacity:1}.percentage-wrapper .delete-option{color:#ed5251;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover mat-icon{opacity:1}.percentage-wrapper .delete-option mat-icon{opacity:.5;font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{font-size:12px;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}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-top:3px;margin-right:5px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 920px){.value{min-width:0!important}.value .served-value{margin:3px 7px 3px 0}}@media (max-width: 650px){.users{margin-left:5px}}@media (max-width: 540px){.users{font-size:12px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i5.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i5.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role"] }, { kind: "component", type: i6.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }] });
|
|
72
|
+
RolloutPercentageItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", 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-set>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-set>\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 matTooltip=\"The sum of percentages must be equal to 100.\" matTooltipPosition=\"above\"\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;margin:.5em 1em;position:relative;padding:.5em 0;display:flex;flex-wrap:wrap}.percentage-wrapper .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.percentage-wrapper .delete:hover mat-icon{opacity:1}.percentage-wrapper .delete-option{color:#ed5251;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover mat-icon{opacity:1}.percentage-wrapper .delete-option mat-icon{opacity:.5;font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{font-size:12px;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}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-top:3px;margin-right:5px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}input:focus{outline-color:#e5e5e5;outline-offset:-1px}.users{margin-left:20px}@media (max-width: 920px){.value{min-width:0!important}.value .served-value{margin:3px 7px 3px 0}}@media (max-width: 650px){.users{margin-left:5px}}@media (max-width: 540px){.users{font-size:12px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i5.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i5.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role"] }, { kind: "component", type: i6.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }] });
|
|
73
73
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RolloutPercentageItemsComponent, decorators: [{
|
|
74
74
|
type: Component,
|
|
75
|
-
args: [{ selector: 'configcat-rollout-percentage-items', template: "<div class=\"percentage-wrapper\" [formGroup]=\"formGroup\">\n\n <div class=\"if\" *ngIf=\"rolloutRules().controls.length > 0\">\n <mat-chip-set>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-set>\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 matTooltip=\"The sum of percentages must be equal to 100.\" matTooltipPosition=\"above\"\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;margin:.5em 1em;position:relative;padding:.5em 0;display:flex;flex-wrap:wrap}.percentage-wrapper .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.percentage-wrapper .delete:hover mat-icon{opacity:1}.percentage-wrapper .delete-option{color:#ed5251;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover mat-icon{opacity:1}.percentage-wrapper .delete-option mat-icon{opacity:.5;font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{font-size:12px;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}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-top:3px;margin-right:5px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 920px){.value{min-width:0!important}.value .served-value{margin:3px 7px 3px 0}}@media (max-width: 650px){.users{margin-left:5px}}@media (max-width: 540px){.users{font-size:12px}}\n"] }]
|
|
75
|
+
args: [{ selector: 'configcat-rollout-percentage-items', template: "<div class=\"percentage-wrapper\" [formGroup]=\"formGroup\">\n\n <div class=\"if\" *ngIf=\"rolloutRules().controls.length > 0\">\n <mat-chip-set>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-set>\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 matTooltip=\"The sum of percentages must be equal to 100.\" matTooltipPosition=\"above\"\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;margin:.5em 1em;position:relative;padding:.5em 0;display:flex;flex-wrap:wrap}.percentage-wrapper .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.percentage-wrapper .delete:hover mat-icon{opacity:1}.percentage-wrapper .delete-option{color:#ed5251;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover mat-icon{opacity:1}.percentage-wrapper .delete-option mat-icon{opacity:.5;font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{font-size:12px;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}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-top:3px;margin-right:5px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}input:focus{outline-color:#e5e5e5;outline-offset:-1px}.users{margin-left:20px}@media (max-width: 920px){.value{min-width:0!important}.value .served-value{margin:3px 7px 3px 0}}@media (max-width: 650px){.users{margin-left:5px}}@media (max-width: 540px){.users{font-size:12px}}\n"] }]
|
|
76
76
|
}], ctorParameters: function () { return []; }, propDecorators: { formGroup: [{
|
|
77
77
|
type: Input
|
|
78
78
|
}], readOnly: [{
|
|
@@ -279,10 +279,10 @@ export class RolloutRulesComponent {
|
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
RolloutRulesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RolloutRulesComponent, deps: [{ token: i1.MatDialog }, { token: i2.SettingListFormHelper }], target: i0.ɵɵFactoryTarget.Component });
|
|
282
|
-
RolloutRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: RolloutRulesComponent, selector: "configcat-rollout-rules", inputs: { formGroup: "formGroup", readOnly: "readOnly", segments: "segments" }, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\" matTooltip=\"Comparison value\" matTooltipPosition=\"above\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" (click)=\"popOut(rolloutRule)\"\n *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", 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]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i12.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }] });
|
|
282
|
+
RolloutRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: RolloutRulesComponent, selector: "configcat-rollout-rules", inputs: { formGroup: "formGroup", readOnly: "readOnly", segments: "segments" }, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", 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]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i12.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }] });
|
|
283
283
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RolloutRulesComponent, decorators: [{
|
|
284
284
|
type: Component,
|
|
285
|
-
args: [{ selector: 'configcat-rollout-rules', template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\" matTooltip=\"Comparison value\" matTooltipPosition=\"above\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" (click)=\"popOut(rolloutRule)\"\n *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"] }]
|
|
285
|
+
args: [{ selector: 'configcat-rollout-rules', template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"] }]
|
|
286
286
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.SettingListFormHelper }]; }, propDecorators: { formGroup: [{
|
|
287
287
|
type: Input
|
|
288
288
|
}], readOnly: [{
|
|
@@ -290,4 +290,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
|
|
|
290
290
|
}], segments: [{
|
|
291
291
|
type: Input
|
|
292
292
|
}] } });
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTzVELE1BQU0sT0FBTyxxQkFBcUI7SUF1Q2hDLFlBQ1UsTUFBaUIsRUFDakIscUJBQTRDO1FBRDVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQXRDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUcxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQixnQ0FBMkIsR0FBRyxDQUFDLFlBQVks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cG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyB2YWxpZCB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBFeHBhbmREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kaWFsb2dzL2V4cGFuZC1kaWFsb2cvZXhwYW5kLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFNldHRpbmdUeXBlLCBSb2xsb3V0UnVsZUNvbXBhcmF0b3IsIFNlZ21lbnRMaXN0TW9kZWwsIFNlZ21lbnRDb21wYXJhdG9yIH0gZnJvbSAnbmctY29uZmlnY2F0LXB1YmxpY2FwaSc7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEZvcm1IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvc2V0dGluZy1saXN0LWZvcm0taGVscGVyJztcbmltcG9ydCB7IEZvcm1IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvZm9ybS1oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtcm9sbG91dC1ydWxlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sbG91dC1ydWxlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGxvdXRSdWxlc0NvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgZm9ybUdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VnbWVudHMhOiBTZWdtZW50TGlzdE1vZGVsW107XG5cbiAgU2V0dGluZ1R5cGUgPSBTZXR0aW5nVHlwZTtcblxuICBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMgPSBbJ0lkZW50aWZpZXInLCAnRW1haWwnLCAnQ291bnRyeSddO1xuXG4gIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMgPSBbXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChjbGVhcnRleHQpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zLCBsYWJlbDogJ0NPTlRBSU5TIChjbGVhcnRleHQpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbiwgbGFiZWw6ICdET0VTIE5PVCBDT05UQUlOIChjbGVhcnRleHQpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3MsIGxhYmVsOiAnPCAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBsYWJlbDogJzw9IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyLCBsYWJlbDogJz4gKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6ICc+PSAoU2VtVmVyKScgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHMsIGxhYmVsOiAnPSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsLCBsYWJlbDogJyE9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzLCBsYWJlbDogJzwgKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFscywgbGFiZWw6ICc8PSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlciwgbGFiZWw6ICc+IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGxhYmVsOiAnPj0gKE51bWJlciknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKGhhc2hlZCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoaGFzaGVkKScgfSxcbiAgXTtcblxuICBzZWdtZW50Q29tcGFyYXRvcnMgPSBbXG4gICAgeyB2YWx1ZTogU2VnbWVudENvbXBhcmF0b3IuSXNJbiwgbGFiZWw6ICdJUyBJTiBTRUdNRU5UJyB9LFxuICAgIHsgdmFsdWU6IFNlZ21lbnRDb21wYXJhdG9yLklzTm90SW4sIGxhYmVsOiAnSVMgTk9UIElOIFNFR01FTlQnIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNldHRpbmdMaXN0Rm9ybUhlbHBlcjogU2V0dGluZ0xpc3RGb3JtSGVscGVyKSB7IH1cblxuICBzZXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ3NldHRpbmcnKT8udmFsdWU7XG4gIH1cblxuICByb2xsb3V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgncm9sbG91dFJ1bGVzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIGNvbXBhcmlzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5yb290LmdldCgnY29tcGFyaXNvbkF0dHJpYnV0ZXMnKT8udmFsdWU7XG4gIH1cblxuICByZW1vdmVSdWxlKGluZGV4OiBhbnkpIHtcbiAgICB0aGlzLnJvbGxvdXRSdWxlcygpLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnJvbGxvdXRSdWxlcygpLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHJvbGxvdXRSdWxlcyA9IHRoaXMucm9sbG91dFJ1bGVzKCkuY29udHJvbHM7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHJvbGxvdXRSdWxlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZChldmVudDogYW55LCBjb21wYXJpc29uQXR0cmlidXRlOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihldmVudC52YWx1ZSkgIT09IC0xKSB7XG4gICAgICBpZiAoY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSAhPT0gZXZlbnQudmFsdWUpIHtcbiAgICAgICAgY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZShldmVudC52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgICBjb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRQbGFjZUhvbGRlcihyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IHVzZXJfaWQxLCB1c2VyX2lkMiwgdXNlcl9pZDMnO1xuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBqYW5lQGV4YW1wbGUuY29tLCBqb2huQGV4YW1wbGUuY29tJztcbiAgICAgICAgICBjYXNlICdjb3VudHJ5JzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBGcmFuY2UsIEJyYXppbCc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgICAgICAgIHJldHVybiAncGFydC1vZi1pZCc7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IEBleGFtcGxlLmNvbSc7XG4gICAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogVW5pdGVkJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IGFueS1wYXJ0LW9mLXlvdXItdmFsdWUtc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2Y6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCwgMi4wLjEnO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCc7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdlLmc6IDQyJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nTGlzdEZvcm1IZWxwZXIuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgfVxuXG4gIGdldEluZm9DbGFzcyhyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ3dhcm4nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbmZvJztcbiAgICB9XG4gIH1cblxuICBnZXRJbmZvVG9vbHRpcChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ0xlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ0NvbnNpZGVyIHVzaW5nIHNlbnNpdGl2ZSB0ZXh0IGNvbXBhcmF0b3JzLiBDbGljayB0byBsZWFybiBtb3JlLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0NsaWNrIHRvIGxlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBsZXQgdmFsaWRhdG9yczogYW55W10gPSBbXTtcblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNjU1MzUpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbGlkYXRlU2VtVmVyTGlzdF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWxpZGF0ZVNlbVZlcl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oLTEuNzk3NjkzMTM0ODYyMzJFKzMwOCksIFZhbGlkYXRvcnMubWF4KDEuNzk3NjkzMTM0ODYyMzJFKzMwOCldO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICBpZiAodGhpcy5nZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWU7XG4gICAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUuc2V0VmFsdWUoRm9ybUhlbHBlci5ub3JtYWxpemVOdW1iZXJTdG9yZWRBc1N0cmluZyhyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWUpKTtcbiAgICAgIGlmIChvbGRWYWx1ZSAhPT0gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnZhbHVlKSB7XG4gICAgICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBpc0xpc3RUeXBlKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVTZW1WZXIoYzogVW50eXBlZEZvcm1Db250cm9sKSB7XG5cbiAgICBpZiAodmFsaWQoYy52YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyOiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlckxpc3QoYzogVW50eXBlZEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCFjLnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW12ZXJzID0gYy52YWx1ZS5zcGxpdCgnLCcpLm1hcCgoczogYW55KSA9PiBzLnRyaW0oKSk7XG4gICAgaWYgKHNlbXZlcnMuZmluZCgoczogYW55KSA9PiBzICYmIHMgIT09ICcnICYmIHZhbGlkKHMpID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVTZW1WZXJMaXN0OiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwb3BPdXQocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHRoaXMuZGlhbG9nLm9wZW4oRXhwYW5kRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29udHJvbDogcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLFxuICAgICAgICBtdWx0aWxpbmU6IHRoaXMuaXNMaXN0VHlwZShyb2xsb3V0UnVsZSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnZhbHVlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVHlwZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudHlwZSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZUNvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVTZWdtZW50Q29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuc2VnbWVudENvbXBhcmF0b3IgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnNlZ21lbnRJZCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIiBbY2RrRHJvcExpc3REaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwicm9sbG91dFJ1bGVzKCkuY29udHJvbHNcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm9sbG91dFJ1bGUgb2Ygcm9sbG91dFJ1bGVzKCkuY29udHJvbHM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleDsgbGV0IGkgPSBpbmRleFwiIGNka0RyYWc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZHMgZmxleFwiICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVUeXBlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZVwiIGNka0RyYWdIYW5kbGUgbWF0VG9vbHRpcD1cIkRyYWcgaGVyZSB0byByZW9yZGVyXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQgW2NsYXNzLnNwYWNpbmddPVwiaSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBjbGFzcz1cImNoaXBcIj57eyBpID09PSAwID8gJ0lGJyA6ICdFTFNFIElGJyB9fTwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXInczwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3QgYXR0cmlidXRlLXNlbGVjdFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImF0dHJpYnV0ZUNoYW5nZWQoJGV2ZW50LnRhcmdldCwgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmlzb25BdHRyaWJ1dGUgb2YgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZSA9PT0gZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJpc29uQXR0cmlidXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzLmluZGV4T2YoZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLXNwYW5cIiBtYXRUb29sdGlwPVwiQ3VzdG9tIHVzZXIgYXR0cmlidXRlXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpICE9PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIG1hdElucHV0IFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIGNsYXNzPVwiYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRXllIGNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uQXR0cmlidXRlcygpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkNPTkZJREVOVElBTCBURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgxNiwgMTgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiVEVYVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMCwgNClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJTRU1BTlRJQyBWRVJTSU9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSg0LCAxMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJOVU1CRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDEwLCAxNilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlKVwiIFttYXRUb29sdGlwXT1cImdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC90YXJnZXRpbmcvI2NvbXBhcmF0b3JcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmlzb24tdmFsdWVcIiBtYXRUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZVwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSlcIiBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2VIb2xkZXIocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERpc3BsYXlOb3JtYWxpemVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4cGFuZFwiIG1hdFRvb2x0aXA9XCJQb3Atb3V0IEVkaXRvclwiIChjbGljayk9XCJwb3BPdXQocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGUpPT09J3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmhlaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZVwiIG1hdFRvb2x0aXA9XCJSZW1vdmUgdGFyZ2V0aW5nIHJ1bGVcIiAqbmdJZj1cIiFyZWFkT25seVwiIChjbGljayk9XCJyZW1vdmVSdWxlKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRzIGZsZXhcIiAqbmdJZj1cImdldFJvbGxvdXRSdWxlVHlwZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS52YWx1ZSA9PT0gMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBjZGtEcmFnSGFuZGxlIG1hdFRvb2x0aXA9XCJEcmFnIGhlcmUgdG8gcmVvcmRlclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtc2V0IFtjbGFzcy5zcGFjaW5nXT1cImkgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJjaGlwXCI+e3sgaSA9PT0gMCA/ICdJRicgOiAnRUxTRSBJRicgfX08L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9jb25maWdjYXQuY29tL2RvY3MvYWR2YW5jZWQvdXNlci1vYmplY3RcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj51c2VyPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3Qgc2VnbWVudC1jb21wYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVTZWdtZW50Q29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNlZ21lbnQgY29tcGFyYXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiBzZWdtZW50Q29tcGFyYXRvcnNcIiBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dHJpYnV0ZS1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJjdXN0b20tc2VsZWN0IHNlZ21lbnQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIiBtYXRUb29sdGlwPVwiU2VnbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZCc6IGdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiBzZWdtZW50c1wiIFtuZ1ZhbHVlXT1cInNlZ21lbnQuc2VnbWVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VnbWVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGVcIiBtYXRUb29sdGlwPVwiUmVtb3ZlIHRhcmdldGluZyBydWxlXCIgKm5nSWY9XCIhcmVhZE9ubHlcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmVcIiAqbmdJZj1cInNldHRpbmcoKS5zZXR0aW5nVHlwZSAhPT0gU2V0dGluZ1R5cGUuQm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJjaGlwXCI+U2VydmU6PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8Y29uZmlnY2F0LXZhbHVlIGNsYXNzPVwic2VydmVkLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIiBbc2V0dGluZ109XCJzZXR0aW5nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jb25maWdjYXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTzVELE1BQU0sT0FBTyxxQkFBcUI7SUF1Q2hDLFlBQ1UsTUFBaUIsRUFDakIscUJBQTRDO1FBRDVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQXRDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUcxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQixnQ0FBMkIsR0FBRyxDQUFDLFlBQVks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cG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyB2YWxpZCB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBFeHBhbmREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kaWFsb2dzL2V4cGFuZC1kaWFsb2cvZXhwYW5kLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFNldHRpbmdUeXBlLCBSb2xsb3V0UnVsZUNvbXBhcmF0b3IsIFNlZ21lbnRMaXN0TW9kZWwsIFNlZ21lbnRDb21wYXJhdG9yIH0gZnJvbSAnbmctY29uZmlnY2F0LXB1YmxpY2FwaSc7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEZvcm1IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvc2V0dGluZy1saXN0LWZvcm0taGVscGVyJztcbmltcG9ydCB7IEZvcm1IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvZm9ybS1oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtcm9sbG91dC1ydWxlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sbG91dC1ydWxlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGxvdXRSdWxlc0NvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgZm9ybUdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VnbWVudHMhOiBTZWdtZW50TGlzdE1vZGVsW107XG5cbiAgU2V0dGluZ1R5cGUgPSBTZXR0aW5nVHlwZTtcblxuICBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMgPSBbJ0lkZW50aWZpZXInLCAnRW1haWwnLCAnQ291bnRyeSddO1xuXG4gIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMgPSBbXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChjbGVhcnRleHQpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zLCBsYWJlbDogJ0NPTlRBSU5TIChjbGVhcnRleHQpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbiwgbGFiZWw6ICdET0VTIE5PVCBDT05UQUlOIChjbGVhcnRleHQpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3MsIGxhYmVsOiAnPCAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBsYWJlbDogJzw9IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyLCBsYWJlbDogJz4gKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6ICc+PSAoU2VtVmVyKScgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHMsIGxhYmVsOiAnPSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsLCBsYWJlbDogJyE9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzLCBsYWJlbDogJzwgKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFscywgbGFiZWw6ICc8PSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlciwgbGFiZWw6ICc+IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGxhYmVsOiAnPj0gKE51bWJlciknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKGhhc2hlZCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoaGFzaGVkKScgfSxcbiAgXTtcblxuICBzZWdtZW50Q29tcGFyYXRvcnMgPSBbXG4gICAgeyB2YWx1ZTogU2VnbWVudENvbXBhcmF0b3IuSXNJbiwgbGFiZWw6ICdJUyBJTiBTRUdNRU5UJyB9LFxuICAgIHsgdmFsdWU6IFNlZ21lbnRDb21wYXJhdG9yLklzTm90SW4sIGxhYmVsOiAnSVMgTk9UIElOIFNFR01FTlQnIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNldHRpbmdMaXN0Rm9ybUhlbHBlcjogU2V0dGluZ0xpc3RGb3JtSGVscGVyKSB7IH1cblxuICBzZXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ3NldHRpbmcnKT8udmFsdWU7XG4gIH1cblxuICByb2xsb3V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgncm9sbG91dFJ1bGVzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIGNvbXBhcmlzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5yb290LmdldCgnY29tcGFyaXNvbkF0dHJpYnV0ZXMnKT8udmFsdWU7XG4gIH1cblxuICByZW1vdmVSdWxlKGluZGV4OiBhbnkpIHtcbiAgICB0aGlzLnJvbGxvdXRSdWxlcygpLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnJvbGxvdXRSdWxlcygpLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHJvbGxvdXRSdWxlcyA9IHRoaXMucm9sbG91dFJ1bGVzKCkuY29udHJvbHM7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHJvbGxvdXRSdWxlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZChldmVudDogYW55LCBjb21wYXJpc29uQXR0cmlidXRlOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihldmVudC52YWx1ZSkgIT09IC0xKSB7XG4gICAgICBpZiAoY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSAhPT0gZXZlbnQudmFsdWUpIHtcbiAgICAgICAgY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZShldmVudC52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgICBjb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRQbGFjZUhvbGRlcihyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IHVzZXJfaWQxLCB1c2VyX2lkMiwgdXNlcl9pZDMnO1xuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBqYW5lQGV4YW1wbGUuY29tLCBqb2huQGV4YW1wbGUuY29tJztcbiAgICAgICAgICBjYXNlICdjb3VudHJ5JzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBGcmFuY2UsIEJyYXppbCc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgICAgICAgIHJldHVybiAncGFydC1vZi1pZCc7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IEBleGFtcGxlLmNvbSc7XG4gICAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogVW5pdGVkJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IGFueS1wYXJ0LW9mLXlvdXItdmFsdWUtc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2Y6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCwgMi4wLjEnO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCc7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdlLmc6IDQyJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nTGlzdEZvcm1IZWxwZXIuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgfVxuXG4gIGdldEluZm9DbGFzcyhyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ3dhcm4nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbmZvJztcbiAgICB9XG4gIH1cblxuICBnZXRJbmZvVG9vbHRpcChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ0xlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ0NvbnNpZGVyIHVzaW5nIHNlbnNpdGl2ZSB0ZXh0IGNvbXBhcmF0b3JzLiBDbGljayB0byBsZWFybiBtb3JlLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0NsaWNrIHRvIGxlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBsZXQgdmFsaWRhdG9yczogYW55W10gPSBbXTtcblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNjU1MzUpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbGlkYXRlU2VtVmVyTGlzdF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWxpZGF0ZVNlbVZlcl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oLTEuNzk3NjkzMTM0ODYyMzJFKzMwOCksIFZhbGlkYXRvcnMubWF4KDEuNzk3NjkzMTM0ODYyMzJFKzMwOCldO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICBpZiAodGhpcy5nZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWU7XG4gICAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUuc2V0VmFsdWUoRm9ybUhlbHBlci5ub3JtYWxpemVOdW1iZXJTdG9yZWRBc1N0cmluZyhyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWUpKTtcbiAgICAgIGlmIChvbGRWYWx1ZSAhPT0gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnZhbHVlKSB7XG4gICAgICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBpc0xpc3RUeXBlKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVTZW1WZXIoYzogVW50eXBlZEZvcm1Db250cm9sKSB7XG5cbiAgICBpZiAodmFsaWQoYy52YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyOiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlckxpc3QoYzogVW50eXBlZEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCFjLnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW12ZXJzID0gYy52YWx1ZS5zcGxpdCgnLCcpLm1hcCgoczogYW55KSA9PiBzLnRyaW0oKSk7XG4gICAgaWYgKHNlbXZlcnMuZmluZCgoczogYW55KSA9PiBzICYmIHMgIT09ICcnICYmIHZhbGlkKHMpID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVTZW1WZXJMaXN0OiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwb3BPdXQocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHRoaXMuZGlhbG9nLm9wZW4oRXhwYW5kRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29udHJvbDogcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLFxuICAgICAgICBtdWx0aWxpbmU6IHRoaXMuaXNMaXN0VHlwZShyb2xsb3V0UnVsZSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnZhbHVlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVHlwZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudHlwZSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZUNvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVTZWdtZW50Q29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuc2VnbWVudENvbXBhcmF0b3IgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnNlZ21lbnRJZCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIiBbY2RrRHJvcExpc3REaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwicm9sbG91dFJ1bGVzKCkuY29udHJvbHNcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm9sbG91dFJ1bGUgb2Ygcm9sbG91dFJ1bGVzKCkuY29udHJvbHM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleDsgbGV0IGkgPSBpbmRleFwiIGNka0RyYWc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZHMgZmxleFwiICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVUeXBlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZVwiIGNka0RyYWdIYW5kbGUgbWF0VG9vbHRpcD1cIkRyYWcgaGVyZSB0byByZW9yZGVyXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQgW2NsYXNzLnNwYWNpbmddPVwiaSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBjbGFzcz1cImNoaXBcIj57eyBpID09PSAwID8gJ0lGJyA6ICdFTFNFIElGJyB9fTwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXInczwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3QgYXR0cmlidXRlLXNlbGVjdFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImF0dHJpYnV0ZUNoYW5nZWQoJGV2ZW50LnRhcmdldCwgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmlzb25BdHRyaWJ1dGUgb2YgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZSA9PT0gZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJpc29uQXR0cmlidXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzLmluZGV4T2YoZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLXNwYW5cIiBtYXRUb29sdGlwPVwiQ3VzdG9tIHVzZXIgYXR0cmlidXRlXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpICE9PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIG1hdElucHV0IFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIGNsYXNzPVwiYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRXllIGNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uQXR0cmlidXRlcygpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkNPTkZJREVOVElBTCBURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgxNiwgMTgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiVEVYVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMCwgNClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJTRU1BTlRJQyBWRVJTSU9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSg0LCAxMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJOVU1CRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDEwLCAxNilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlKVwiIFttYXRUb29sdGlwXT1cImdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC90YXJnZXRpbmcvI2NvbXBhcmF0b3JcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmlzb24tdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZFwiPio8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlKVwiIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZUhvbGRlcihyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBpbnB1dERpc3BsYXlOb3JtYWxpemVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4cGFuZFwiIG1hdFRvb2x0aXA9XCJQb3Atb3V0IEVkaXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicG9wT3V0KHJvbGxvdXRSdWxlKVwiICpuZ0lmPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSk9PT0ndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aGVpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiICpuZ0lmPVwiIXJlYWRPbmx5XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGUoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZHMgZmxleFwiICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVUeXBlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlID09PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZVwiIGNka0RyYWdIYW5kbGUgbWF0VG9vbHRpcD1cIkRyYWcgaGVyZSB0byByZW9yZGVyXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVhZE9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQgW2NsYXNzLnNwYWNpbmddPVwiaSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBjbGFzcz1cImNoaXBcIj57eyBpID09PSAwID8gJ0lGJyA6ICdFTFNFIElGJyB9fTwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXI8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBzZWdtZW50LWNvbXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVNlZ21lbnRDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU2VnbWVudCBjb21wYXJhdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHNlZ21lbnRDb21wYXJhdG9yc1wiIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3Qgc2VnbWVudC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIG1hdFRvb2x0aXA9XCJTZWdtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzZWdtZW50IG9mIHNlZ21lbnRzXCIgW25nVmFsdWVdPVwic2VnbWVudC5zZWdtZW50SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWdtZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZVwiIG1hdFRvb2x0aXA9XCJSZW1vdmUgdGFyZ2V0aW5nIHJ1bGVcIiAqbmdJZj1cIiFyZWFkT25seVwiIChjbGljayk9XCJyZW1vdmVSdWxlKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2ZVwiICpuZ0lmPVwic2V0dGluZygpLnNldHRpbmdUeXBlICE9PSBTZXR0aW5nVHlwZS5Cb29sZWFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBjbGFzcz1cImNoaXBcIj5TZXJ2ZTo8L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxjb25maWdjYXQtdmFsdWUgY2xhc3M9XCJzZXJ2ZWQtdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVWYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIFtzZXR0aW5nXT1cInNldHRpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ2NhdC12YWx1ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|