ng-configcat-publicapi-ui 2.4.0 → 2.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/esm2020/lib/_services/public-api.service.mjs +11 -5
  2. package/esm2020/lib/_services/setting-list-form-helper.mjs +30 -13
  3. package/esm2020/lib/authorization/authorization.component.mjs +3 -3
  4. package/esm2020/lib/base/base.component.mjs +7 -4
  5. package/esm2020/lib/configuration.mjs +3 -3
  6. package/esm2020/lib/dialogs/concurrent-dialog/concurrent-dialog.component.mjs +3 -3
  7. package/esm2020/lib/dialogs/expand-dialog/expand-dialog.component.mjs +3 -3
  8. package/esm2020/lib/dialogs/reason-dialog/reason-dialog.component.mjs +3 -3
  9. package/esm2020/lib/dialogs/save-snackbar/save-snackbar.component.mjs +4 -4
  10. package/esm2020/lib/ng-configcat-publicapi-ui.module.mjs +4 -4
  11. package/esm2020/lib/selects/config-select/config-select.component.mjs +3 -3
  12. package/esm2020/lib/selects/environment-select/environment-select.component.mjs +3 -3
  13. package/esm2020/lib/selects/product-select/product-select.component.mjs +3 -3
  14. package/esm2020/lib/selects/setting-select/setting-select.component.mjs +3 -3
  15. package/esm2020/lib/setting-item/setting-item.component.mjs +14 -5
  16. package/esm2020/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +4 -4
  17. package/esm2020/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +21 -6
  18. package/esm2020/lib/setting-list/setting/setting.component.mjs +15 -6
  19. package/esm2020/lib/setting-list/setting/value/value.component.mjs +4 -4
  20. package/esm2020/lib/setting-list/setting-list.component.mjs +15 -9
  21. package/fesm2015/ng-configcat-publicapi-ui.mjs +148 -83
  22. package/fesm2015/ng-configcat-publicapi-ui.mjs.map +1 -1
  23. package/fesm2020/ng-configcat-publicapi-ui.mjs +147 -83
  24. package/fesm2020/ng-configcat-publicapi-ui.mjs.map +1 -1
  25. package/lib/_services/public-api.service.d.ts +2 -1
  26. package/lib/base/base.component.d.ts +1 -0
  27. package/lib/setting-item/setting-item.component.d.ts +3 -1
  28. package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +10 -2
  29. package/lib/setting-list/setting/setting.component.d.ts +4 -2
  30. package/lib/setting-list/setting-list.component.d.ts +4 -1
  31. package/package.json +4 -4
@@ -36,6 +36,15 @@ export class SettingItemComponent extends BaseComponent {
36
36
  return throwError(error);
37
37
  }));
38
38
  };
39
+ this.loadSegments = () => {
40
+ return this.createSegmentsService().getSegments(this.productId)
41
+ .pipe(map(segments => {
42
+ this.segments = segments;
43
+ return segments;
44
+ }), catchError(error => {
45
+ return throwError(error);
46
+ }));
47
+ };
39
48
  this.handleSave = (model) => {
40
49
  if (model.settingValues.length === 0) {
41
50
  return of();
@@ -78,11 +87,11 @@ export class SettingItemComponent extends BaseComponent {
78
87
  this.formValuesChanged.emit();
79
88
  }
80
89
  }
81
- SettingItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SettingItemComponent, deps: [{ token: i1.PublicApiService }], target: i0.ɵɵFactoryTarget.Component });
82
- SettingItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: SettingItemComponent, selector: "configcat-setting-item", inputs: { productId: "productId", environmentId: "environmentId", configId: "configId", settingId: "settingId", canEditSetting: "canEditSetting", canDeleteSetting: "canDeleteSetting", deleteSettingText: "deleteSettingText", showEnvironmentName: "showEnvironmentName" }, outputs: { editSettingRequested: "editSettingRequested", deleteSettingRequested: "deleteSettingRequested", loadSucceeded: "loadSucceeded", loadFailed: "loadFailed", saveSucceeded: "saveSucceeded", saveFailed: "saveFailed", formValuesChanged: "formValuesChanged" }, usesInheritance: true, ngImport: i0, template: "<configcat-setting-list [canEditSetting]=\"canEditSetting\" [canDeleteSetting]=\"canDeleteSetting\"\n [onSave]=\"handleSave\" [loadSettingValues]=\"loadSettingValues\"\n (editSettingRequested)=\"onEditSettingRequested($event)\" (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [deleteSettingText]=\"deleteSettingText\"\n [showEnvironmentName]=\"showEnvironmentName\" (formValuesChanged)=\"onFormValuesChanged()\">\n</configcat-setting-list>", styles: [".container{font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;background-color:#f3f3f3;border:1px solid rgba(0,0,0,.12);border-radius:4px;margin:1em 0}.container .setting-full{position:relative;display:flex;flex-wrap:nowrap}.container .setting-full .setting-details{display:flex;flex-direction:column;width:400px;padding:1em 0 1em 1em}.container .setting-full .setting-details>*{margin:.5em}.container .setting-full .setting-details .setting-name{flex-direction:row}.container .setting-full .setting-details .setting-name .name{font-weight:bold;word-wrap:break-word;max-width:100%}.container .setting-full .setting-details .setting-key{word-wrap:break-word}.container .setting-full .setting-details .description{font-size:.8em}.container .setting-full .setting-details code{background-color:#d3d3d3;padding:3px 6px}.container .setting-full .rules-list{width:100%;padding:1em}.container .setting-full .targeting-button{margin-left:1rem;margin-bottom:1em}.all-other{min-height:40px;justify-content:flex-start;border:1px solid #d5d5d5;border-radius:4px;background-color:#fff;margin:.5em 1em;padding:4px 0 4px .5em}.all-other .chip{background-color:#67b1fc3d}.all-other .served-value{margin-left:auto;min-width:100px}.end{margin-left:auto}.flex{display:flex;flex-wrap:wrap;align-items:center}.show-hide-toggle{margin-left:1em;cursor:pointer}@media (max-width: 1200px){.setting-full .setting-details{width:300px}}@media (max-width: 700px){.setting-full{flex-wrap:wrap}.setting-full .setting-details{padding:.2em 0 .2em .2em}.setting-full .all-other{margin:.5em .3em}}\n"], components: [{ type: i2.SettingListComponent, selector: "configcat-setting-list", inputs: ["canEditSetting", "canDeleteSetting", "onSave", "loadSettingValues", "deleteSettingText", "showEnvironmentName"], outputs: ["editSettingRequested", "deleteSettingRequested", "formValuesChanged"] }] });
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SettingItemComponent, decorators: [{
90
+ SettingItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SettingItemComponent, deps: [{ token: i1.PublicApiService }], target: i0.ɵɵFactoryTarget.Component });
91
+ SettingItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: SettingItemComponent, selector: "configcat-setting-item", inputs: { productId: "productId", environmentId: "environmentId", configId: "configId", settingId: "settingId", canEditSetting: "canEditSetting", canDeleteSetting: "canDeleteSetting", deleteSettingText: "deleteSettingText", showEnvironmentName: "showEnvironmentName" }, outputs: { editSettingRequested: "editSettingRequested", deleteSettingRequested: "deleteSettingRequested", loadSucceeded: "loadSucceeded", loadFailed: "loadFailed", saveSucceeded: "saveSucceeded", saveFailed: "saveFailed", formValuesChanged: "formValuesChanged" }, usesInheritance: true, ngImport: i0, template: "<configcat-setting-list [canEditSetting]=\"canEditSetting\" [canDeleteSetting]=\"canDeleteSetting\" [onSave]=\"handleSave\"\n [loadSettingValues]=\"loadSettingValues\" [loadSegments]=\"loadSegments\"\n (editSettingRequested)=\"onEditSettingRequested($event)\" (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [deleteSettingText]=\"deleteSettingText\" [showEnvironmentName]=\"showEnvironmentName\"\n (formValuesChanged)=\"onFormValuesChanged()\">\n</configcat-setting-list>", styles: [".container{font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;background-color:#f3f3f3;border:1px solid rgba(0,0,0,.12);border-radius:4px;margin:1em 0}.container .setting-full{position:relative;display:flex;flex-wrap:nowrap}.container .setting-full .setting-details{display:flex;flex-direction:column;width:400px;padding:1em 0 1em 1em}.container .setting-full .setting-details>*{margin:.5em}.container .setting-full .setting-details .setting-name{flex-direction:row}.container .setting-full .setting-details .setting-name .name{font-weight:700;word-wrap:break-word;max-width:100%}.container .setting-full .setting-details .setting-key{word-wrap:break-word}.container .setting-full .setting-details .description{font-size:.8em}.container .setting-full .setting-details code{background-color:#d3d3d3;padding:3px 6px}.container .setting-full .rules-list{width:100%;padding:1em}.container .setting-full .targeting-button{margin-left:1rem;margin-bottom:1em}.all-other{min-height:40px;justify-content:flex-start;border:1px solid #d5d5d5;border-radius:4px;background-color:#fff;margin:.5em 1em;padding:4px 0 4px .5em}.all-other .chip{background-color:#67b1fc3d}.all-other .served-value{margin-left:auto;min-width:100px}.end{margin-left:auto}.flex{display:flex;flex-wrap:wrap;align-items:center}.show-hide-toggle{margin-left:1em;cursor:pointer}@media (max-width: 1200px){.setting-full .setting-details{width:300px}}@media (max-width: 700px){.setting-full{flex-wrap:wrap}.setting-full .setting-details{padding:.2em 0 .2em .2em}.setting-full .all-other{margin:.5em .3em}}\n"], components: [{ type: i2.SettingListComponent, selector: "configcat-setting-list", inputs: ["canEditSetting", "canDeleteSetting", "onSave", "loadSettingValues", "loadSegments", "deleteSettingText", "showEnvironmentName"], outputs: ["editSettingRequested", "deleteSettingRequested", "formValuesChanged"] }] });
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SettingItemComponent, decorators: [{
84
93
  type: Component,
85
- args: [{ selector: 'configcat-setting-item', template: "<configcat-setting-list [canEditSetting]=\"canEditSetting\" [canDeleteSetting]=\"canDeleteSetting\"\n [onSave]=\"handleSave\" [loadSettingValues]=\"loadSettingValues\"\n (editSettingRequested)=\"onEditSettingRequested($event)\" (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [deleteSettingText]=\"deleteSettingText\"\n [showEnvironmentName]=\"showEnvironmentName\" (formValuesChanged)=\"onFormValuesChanged()\">\n</configcat-setting-list>", styles: [".container{font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;background-color:#f3f3f3;border:1px solid rgba(0,0,0,.12);border-radius:4px;margin:1em 0}.container .setting-full{position:relative;display:flex;flex-wrap:nowrap}.container .setting-full .setting-details{display:flex;flex-direction:column;width:400px;padding:1em 0 1em 1em}.container .setting-full .setting-details>*{margin:.5em}.container .setting-full .setting-details .setting-name{flex-direction:row}.container .setting-full .setting-details .setting-name .name{font-weight:bold;word-wrap:break-word;max-width:100%}.container .setting-full .setting-details .setting-key{word-wrap:break-word}.container .setting-full .setting-details .description{font-size:.8em}.container .setting-full .setting-details code{background-color:#d3d3d3;padding:3px 6px}.container .setting-full .rules-list{width:100%;padding:1em}.container .setting-full .targeting-button{margin-left:1rem;margin-bottom:1em}.all-other{min-height:40px;justify-content:flex-start;border:1px solid #d5d5d5;border-radius:4px;background-color:#fff;margin:.5em 1em;padding:4px 0 4px .5em}.all-other .chip{background-color:#67b1fc3d}.all-other .served-value{margin-left:auto;min-width:100px}.end{margin-left:auto}.flex{display:flex;flex-wrap:wrap;align-items:center}.show-hide-toggle{margin-left:1em;cursor:pointer}@media (max-width: 1200px){.setting-full .setting-details{width:300px}}@media (max-width: 700px){.setting-full{flex-wrap:wrap}.setting-full .setting-details{padding:.2em 0 .2em .2em}.setting-full .all-other{margin:.5em .3em}}\n"] }]
94
+ args: [{ selector: 'configcat-setting-item', template: "<configcat-setting-list [canEditSetting]=\"canEditSetting\" [canDeleteSetting]=\"canDeleteSetting\" [onSave]=\"handleSave\"\n [loadSettingValues]=\"loadSettingValues\" [loadSegments]=\"loadSegments\"\n (editSettingRequested)=\"onEditSettingRequested($event)\" (deleteSettingRequested)=\"onDeleteSettingRequested($event)\"\n [deleteSettingText]=\"deleteSettingText\" [showEnvironmentName]=\"showEnvironmentName\"\n (formValuesChanged)=\"onFormValuesChanged()\">\n</configcat-setting-list>", styles: [".container{font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;background-color:#f3f3f3;border:1px solid rgba(0,0,0,.12);border-radius:4px;margin:1em 0}.container .setting-full{position:relative;display:flex;flex-wrap:nowrap}.container .setting-full .setting-details{display:flex;flex-direction:column;width:400px;padding:1em 0 1em 1em}.container .setting-full .setting-details>*{margin:.5em}.container .setting-full .setting-details .setting-name{flex-direction:row}.container .setting-full .setting-details .setting-name .name{font-weight:700;word-wrap:break-word;max-width:100%}.container .setting-full .setting-details .setting-key{word-wrap:break-word}.container .setting-full .setting-details .description{font-size:.8em}.container .setting-full .setting-details code{background-color:#d3d3d3;padding:3px 6px}.container .setting-full .rules-list{width:100%;padding:1em}.container .setting-full .targeting-button{margin-left:1rem;margin-bottom:1em}.all-other{min-height:40px;justify-content:flex-start;border:1px solid #d5d5d5;border-radius:4px;background-color:#fff;margin:.5em 1em;padding:4px 0 4px .5em}.all-other .chip{background-color:#67b1fc3d}.all-other .served-value{margin-left:auto;min-width:100px}.end{margin-left:auto}.flex{display:flex;flex-wrap:wrap;align-items:center}.show-hide-toggle{margin-left:1em;cursor:pointer}@media (max-width: 1200px){.setting-full .setting-details{width:300px}}@media (max-width: 700px){.setting-full{flex-wrap:wrap}.setting-full .setting-details{padding:.2em 0 .2em .2em}.setting-full .all-other{margin:.5em .3em}}\n"] }]
86
95
  }], ctorParameters: function () { return [{ type: i1.PublicApiService }]; }, propDecorators: { productId: [{
87
96
  type: Input
88
97
  }], environmentId: [{
@@ -114,4 +123,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImpor
114
123
  }], formValuesChanged: [{
115
124
  type: Output
116
125
  }] } });
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWl0ZW0vc2V0dGluZy1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWl0ZW0vc2V0dGluZy1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQWMsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBU2pELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxhQUFhO0lBd0JyRCxZQUNFLGdCQUFrQztRQUNsQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQW5CakIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLGdCQUFnQixDQUFDO1FBQ3JDLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUxQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFNUMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUs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eEIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVztZQUMxQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7O2lIQXRHVSxvQkFBb0I7cUdBQXBCLG9CQUFvQiw0bUJDYmpDLHFkQUt5QjsyRkRRWixvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usd0JBQXdCO3VHQU16QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUksb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPcHRpb25hbCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nVmFsdWVNb2RlbCwgVXBkYXRlU2V0dGluZ1ZhbHVlTW9kZWwgfSBmcm9tICduZy1jb25maWdjYXQtcHVibGljYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQdWJsaWNBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzJztcbmltcG9ydCB7IFNldHRpbmdWYWx1ZXNNb2RlbCwgVXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsIH0gZnJvbSAnLi4vX21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbmZpZ2NhdC1zZXR0aW5nLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vc2V0dGluZy1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2V0dGluZy1pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2V0dGluZ0l0ZW1Db21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwcm9kdWN0SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbmZpZ0lkITogc3RyaW5nO1xuICBASW5wdXQoKSBzZXR0aW5nSWQhOiBudW1iZXI7XG5cbiAgQElucHV0KCkgY2FuRWRpdFNldHRpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBjYW5EZWxldGVTZXR0aW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgZGVsZXRlU2V0dGluZ1RleHQgPSAnRGVsZXRlIHNldHRpbmcnO1xuICBASW5wdXQoKSBzaG93RW52aXJvbm1lbnROYW1lID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZWRpdFNldHRpbmdSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTZXR0aW5nUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBsb2FkU3VjY2VlZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbG9hZEZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNhdmVTdWNjZWVkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzYXZlRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBmb3JtVmFsdWVzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBzZXR0aW5nVmFsdWUhOiBTZXR0aW5nVmFsdWVNb2RlbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWNBcGlTZXJ2aWNlOiBQdWJsaWNBcGlTZXJ2aWNlKSB7XG4gICAgc3VwZXIocHVibGljQXBpU2VydmljZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIGxvYWRTZXR0aW5nVmFsdWVzID0gKCk6IE9ic2VydmFibGU8U2V0dGluZ1ZhbHVlc01vZGVsPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2V0dGluZ1ZhbHVlc1NlcnZpY2UoKS5nZXRTZXR0aW5nVmFsdWUodGhpcy5lbnZpcm9ubWVudElkLCB0aGlzLnNldHRpbmdJZClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoc2V0dGluZ1ZhbHVlID0+IHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdWYWx1ZSA9IHNldHRpbmdWYWx1ZTtcblxuICAgICAgICAgIGNvbnN0IHNldHRpbmdWYWx1ZXMgPSB7XG4gICAgICAgICAgICBzZXR0aW5nVmFsdWVzOiBbc2V0dGluZ1ZhbHVlXSxcbiAgICAgICAgICAgIHJlYWRPbmx5OiBzZXR0aW5nVmFsdWUucmVhZE9ubHksXG4gICAgICAgICAgICBjb25maWc6IHNldHRpbmdWYWx1ZS5jb25maWcsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogc2V0dGluZ1ZhbHVlLmVudmlyb25tZW50XG4gICAgICAgICAgfSBhcyBTZXR0aW5nVmFsdWVzTW9kZWw7XG5cbiAgICAgICAgICB0aGlzLmxvYWRTdWNjZWVkZWQuZW1pdChzZXR0aW5nVmFsdWVzKTtcbiAgICAgICAgICByZXR1cm4gc2V0dGluZ1ZhbHVlcztcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZhaWxlZC5lbWl0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgaGFuZGxlU2F2ZSA9IChtb2RlbDogVXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsKTogT2JzZXJ2YWJsZTxTZXR0aW5nVmFsdWVzTW9kZWw+ID0+IHtcbiAgICBpZiAobW9kZWwuc2V0dGluZ1ZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVNb2RlbCA9IG1vZGVsLnNldHRpbmdWYWx1ZXNbMF0gYXMgVXBkYXRlU2V0dGluZ1ZhbHVlTW9kZWw7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXR0aW5nVmFsdWVzU2VydmljZSgpLnJlcGxhY2VTZXR0aW5nVmFsdWUoXG4gICAgICB0aGlzLmVudmlyb25tZW50SWQsIHRoaXMuc2V0dGluZ0lkLCB1cGRhdGVNb2RlbCwgbW9kZWwucmVhc29uKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChzZXR0aW5nVmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ1ZhbHVlID0gc2V0dGluZ1ZhbHVlO1xuXG4gICAgICAgICAgY29uc3Qgc2V0dGluZ1ZhbHVlcyA9IHtcbiAgICAgICAgICAgIHNldHRpbmdWYWx1ZXM6IFtzZXR0aW5nVmFsdWVdLFxuICAgICAgICAgICAgcmVhZE9ubHk6IHNldHRpbmdWYWx1ZS5yZWFkT25seSxcbiAgICAgICAgICAgIGNvbmZpZzogc2V0dGluZ1ZhbHVlLmNvbmZpZyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzZXR0aW5nVmFsdWUuZW52aXJvbm1lbnRcbiAgICAgICAgICB9IGFzIFNldHRpbmdWYWx1ZXNNb2RlbDtcblxuICAgICAgICAgIHRoaXMuc2F2ZVN1Y2NlZWRlZC5lbWl0KHNldHRpbmdWYWx1ZXMpO1xuICAgICAgICAgIHJldHVybiBzZXR0aW5nVmFsdWVzO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlRmFpbGVkLmVtaXQoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBvbkVkaXRTZXR0aW5nUmVxdWVzdGVkKHNldHRpbmc6IGFueSkge1xuICAgIHRoaXMuZWRpdFNldHRpbmdSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICBzZXR0aW5nOiBzZXR0aW5nLnNldHRpbmcsXG4gICAgICBlbnZpcm9ubWVudDogdGhpcy5zZXR0aW5nVmFsdWUuZW52aXJvbm1lbnQsXG4gICAgICBjb25maWc6IHRoaXMuc2V0dGluZ1ZhbHVlLmNvbmZpZ1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWxldGVTZXR0aW5nUmVxdWVzdGVkKHNldHRpbmc6IGFueSkge1xuICAgIHRoaXMuZGVsZXRlU2V0dGluZ1JlcXVlc3RlZC5lbWl0KHtcbiAgICAgIHNldHRpbmc6IHNldHRpbmcuc2V0dGluZyxcbiAgICAgIGVudmlyb25tZW50OiB0aGlzLnNldHRpbmdWYWx1ZS5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZzogdGhpcy5zZXR0aW5nVmFsdWUuY29uZmlnXG4gICAgfSk7XG4gIH1cblxuICBvbkZvcm1WYWx1ZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWQuZW1pdCgpO1xuICB9XG59XG4iLCI8Y29uZmlnY2F0LXNldHRpbmctbGlzdCBbY2FuRWRpdFNldHRpbmddPVwiY2FuRWRpdFNldHRpbmdcIiBbY2FuRGVsZXRlU2V0dGluZ109XCJjYW5EZWxldGVTZXR0aW5nXCJcbiAgICBbb25TYXZlXT1cImhhbmRsZVNhdmVcIiBbbG9hZFNldHRpbmdWYWx1ZXNdPVwibG9hZFNldHRpbmdWYWx1ZXNcIlxuICAgIChlZGl0U2V0dGluZ1JlcXVlc3RlZCk9XCJvbkVkaXRTZXR0aW5nUmVxdWVzdGVkKCRldmVudClcIiAoZGVsZXRlU2V0dGluZ1JlcXVlc3RlZCk9XCJvbkRlbGV0ZVNldHRpbmdSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgW2RlbGV0ZVNldHRpbmdUZXh0XT1cImRlbGV0ZVNldHRpbmdUZXh0XCJcbiAgICBbc2hvd0Vudmlyb25tZW50TmFtZV09XCJzaG93RW52aXJvbm1lbnROYW1lXCIgKGZvcm1WYWx1ZXNDaGFuZ2VkKT1cIm9uRm9ybVZhbHVlc0NoYW5nZWQoKVwiPlxuPC9jb25maWdjYXQtc2V0dGluZy1saXN0PiJdfQ==
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWl0ZW0vc2V0dGluZy1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWl0ZW0vc2V0dGluZy1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQWMsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBU2pELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxhQUFhO0lBeUJyRCxZQUNFLGdCQUFrQztRQUNsQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQXBCakIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLGdCQUFnQixDQUFDO1FBQ3JDLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUxQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFNUMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUs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TUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3B0aW9uYWwsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VnbWVudExpc3RNb2RlbCwgU2V0dGluZ1ZhbHVlTW9kZWwsIFVwZGF0ZVNldHRpbmdWYWx1ZU1vZGVsIH0gZnJvbSAnbmctY29uZmlnY2F0LXB1YmxpY2FwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHVibGljQXBpU2VydmljZSB9IGZyb20gJy4uL19zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTZXR0aW5nVmFsdWVzTW9kZWwsIFVwZGF0ZVNldHRpbmdWYWx1ZXNNb2RlbCB9IGZyb20gJy4uL19tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtc2V0dGluZy1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmctaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NldHRpbmctaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNldHRpbmdJdGVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgcHJvZHVjdElkITogc3RyaW5nO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudElkITogc3RyaW5nO1xuICBASW5wdXQoKSBjb25maWdJZCE6IHN0cmluZztcbiAgQElucHV0KCkgc2V0dGluZ0lkITogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIGNhbkVkaXRTZXR0aW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgY2FuRGVsZXRlU2V0dGluZyA9IHRydWU7XG4gIEBJbnB1dCgpIGRlbGV0ZVNldHRpbmdUZXh0ID0gJ0RlbGV0ZSBzZXR0aW5nJztcbiAgQElucHV0KCkgc2hvd0Vudmlyb25tZW50TmFtZSA9IHRydWU7XG5cbiAgQE91dHB1dCgpIGVkaXRTZXR0aW5nUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU2V0dGluZ1JlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgbG9hZFN1Y2NlZWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGxvYWRGYWlsZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzYXZlU3VjY2VlZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2F2ZUZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgZm9ybVZhbHVlc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgc2V0dGluZ1ZhbHVlITogU2V0dGluZ1ZhbHVlTW9kZWw7XG4gIHNlZ21lbnRzITogU2VnbWVudExpc3RNb2RlbFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpY0FwaVNlcnZpY2U6IFB1YmxpY0FwaVNlcnZpY2UpIHtcbiAgICBzdXBlcihwdWJsaWNBcGlTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbG9hZFNldHRpbmdWYWx1ZXMgPSAoKTogT2JzZXJ2YWJsZTxTZXR0aW5nVmFsdWVzTW9kZWw+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXR0aW5nVmFsdWVzU2VydmljZSgpLmdldFNldHRpbmdWYWx1ZSh0aGlzLmVudmlyb25tZW50SWQsIHRoaXMuc2V0dGluZ0lkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChzZXR0aW5nVmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ1ZhbHVlID0gc2V0dGluZ1ZhbHVlO1xuXG4gICAgICAgICAgY29uc3Qgc2V0dGluZ1ZhbHVlcyA9IHtcbiAgICAgICAgICAgIHNldHRpbmdWYWx1ZXM6IFtzZXR0aW5nVmFsdWVdLFxuICAgICAgICAgICAgcmVhZE9ubHk6IHNldHRpbmdWYWx1ZS5yZWFkT25seSxcbiAgICAgICAgICAgIGNvbmZpZzogc2V0dGluZ1ZhbHVlLmNvbmZpZyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzZXR0aW5nVmFsdWUuZW52aXJvbm1lbnRcbiAgICAgICAgICB9IGFzIFNldHRpbmdWYWx1ZXNNb2RlbDtcblxuICAgICAgICAgIHRoaXMubG9hZFN1Y2NlZWRlZC5lbWl0KHNldHRpbmdWYWx1ZXMpO1xuICAgICAgICAgIHJldHVybiBzZXR0aW5nVmFsdWVzO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkRmFpbGVkLmVtaXQoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBsb2FkU2VnbWVudHMgPSAoKTogT2JzZXJ2YWJsZTxTZWdtZW50TGlzdE1vZGVsW10+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZWdtZW50c1NlcnZpY2UoKS5nZXRTZWdtZW50cyh0aGlzLnByb2R1Y3RJZClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoc2VnbWVudHMgPT4ge1xuICAgICAgICAgIHRoaXMuc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICByZXR1cm4gc2VnbWVudHM7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgaGFuZGxlU2F2ZSA9IChtb2RlbDogVXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsKTogT2JzZXJ2YWJsZTxTZXR0aW5nVmFsdWVzTW9kZWw+ID0+IHtcbiAgICBpZiAobW9kZWwuc2V0dGluZ1ZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVNb2RlbCA9IG1vZGVsLnNldHRpbmdWYWx1ZXNbMF0gYXMgVXBkYXRlU2V0dGluZ1ZhbHVlTW9kZWw7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXR0aW5nVmFsdWVzU2VydmljZSgpLnJlcGxhY2VTZXR0aW5nVmFsdWUoXG4gICAgICB0aGlzLmVudmlyb25tZW50SWQsIHRoaXMuc2V0dGluZ0lkLCB1cGRhdGVNb2RlbCwgbW9kZWwucmVhc29uKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChzZXR0aW5nVmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ1ZhbHVlID0gc2V0dGluZ1ZhbHVlO1xuXG4gICAgICAgICAgY29uc3Qgc2V0dGluZ1ZhbHVlcyA9IHtcbiAgICAgICAgICAgIHNldHRpbmdWYWx1ZXM6IFtzZXR0aW5nVmFsdWVdLFxuICAgICAgICAgICAgcmVhZE9ubHk6IHNldHRpbmdWYWx1ZS5yZWFkT25seSxcbiAgICAgICAgICAgIGNvbmZpZzogc2V0dGluZ1ZhbHVlLmNvbmZpZyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzZXR0aW5nVmFsdWUuZW52aXJvbm1lbnRcbiAgICAgICAgICB9IGFzIFNldHRpbmdWYWx1ZXNNb2RlbDtcblxuICAgICAgICAgIHRoaXMuc2F2ZVN1Y2NlZWRlZC5lbWl0KHNldHRpbmdWYWx1ZXMpO1xuICAgICAgICAgIHJldHVybiBzZXR0aW5nVmFsdWVzO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlRmFpbGVkLmVtaXQoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBvbkVkaXRTZXR0aW5nUmVxdWVzdGVkKHNldHRpbmc6IGFueSkge1xuICAgIHRoaXMuZWRpdFNldHRpbmdSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICBzZXR0aW5nOiBzZXR0aW5nLnNldHRpbmcsXG4gICAgICBlbnZpcm9ubWVudDogdGhpcy5zZXR0aW5nVmFsdWUuZW52aXJvbm1lbnQsXG4gICAgICBjb25maWc6IHRoaXMuc2V0dGluZ1ZhbHVlLmNvbmZpZ1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWxldGVTZXR0aW5nUmVxdWVzdGVkKHNldHRpbmc6IGFueSkge1xuICAgIHRoaXMuZGVsZXRlU2V0dGluZ1JlcXVlc3RlZC5lbWl0KHtcbiAgICAgIHNldHRpbmc6IHNldHRpbmcuc2V0dGluZyxcbiAgICAgIGVudmlyb25tZW50OiB0aGlzLnNldHRpbmdWYWx1ZS5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZzogdGhpcy5zZXR0aW5nVmFsdWUuY29uZmlnXG4gICAgfSk7XG4gIH1cblxuICBvbkZvcm1WYWx1ZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWQuZW1pdCgpO1xuICB9XG59XG4iLCI8Y29uZmlnY2F0LXNldHRpbmctbGlzdCBbY2FuRWRpdFNldHRpbmddPVwiY2FuRWRpdFNldHRpbmdcIiBbY2FuRGVsZXRlU2V0dGluZ109XCJjYW5EZWxldGVTZXR0aW5nXCIgW29uU2F2ZV09XCJoYW5kbGVTYXZlXCJcbiAgICBbbG9hZFNldHRpbmdWYWx1ZXNdPVwibG9hZFNldHRpbmdWYWx1ZXNcIiBbbG9hZFNlZ21lbnRzXT1cImxvYWRTZWdtZW50c1wiXG4gICAgKGVkaXRTZXR0aW5nUmVxdWVzdGVkKT1cIm9uRWRpdFNldHRpbmdSZXF1ZXN0ZWQoJGV2ZW50KVwiIChkZWxldGVTZXR0aW5nUmVxdWVzdGVkKT1cIm9uRGVsZXRlU2V0dGluZ1JlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICBbZGVsZXRlU2V0dGluZ1RleHRdPVwiZGVsZXRlU2V0dGluZ1RleHRcIiBbc2hvd0Vudmlyb25tZW50TmFtZV09XCJzaG93RW52aXJvbm1lbnROYW1lXCJcbiAgICAoZm9ybVZhbHVlc0NoYW5nZWQpPVwib25Gb3JtVmFsdWVzQ2hhbmdlZCgpXCI+XG48L2NvbmZpZ2NhdC1zZXR0aW5nLWxpc3Q+Il19
@@ -68,11 +68,11 @@ export class RolloutPercentageItemsComponent {
68
68
  return rolloutPercentageItem.controls.percentage;
69
69
  }
70
70
  }
71
- RolloutPercentageItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: RolloutPercentageItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
- RolloutPercentageItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: RolloutPercentageItemsComponent, selector: "configcat-rollout-percentage-items", inputs: { formGroup: "formGroup", readOnly: "readOnly" }, ngImport: i0, template: "<div class=\"percentage-wrapper\" [formGroup]=\"formGroup\">\n\n <div class=\"if\" *ngIf=\"rolloutRules().controls.length > 0\">\n <mat-chip-list>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-list>\n </div>\n <div class=\"grow\">\n <div class=\"percentage-row flex\"\n *ngFor=\"let rolloutPercentageItem of getRolloutPercentageItemFormGroups(); let i = index\">\n <div class=\"flex\">\n <input type=\"number\" [formControl]=\"getPercentageFormControl(rolloutPercentageItem)\"\n (input)=\"percentageChanged(i)\">%\n <span class=\"users\">of <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">users</a>\n </span>\n </div>\n\n <div class=\"delete-option\" matTooltip=\"Remove this % option\"\n *ngIf=\"!readOnly && rolloutPercentageItems().controls.length > 2\"\n (click)=\"removeRolloutPercentageItem(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n\n <span data-tooltip=\"The sum of percentages must be equal to 100.\"\n *ngIf=\"(i === rolloutPercentageItems().controls.length -1) && (rolloutPercentageItemsSum().invalid)\">\n <mat-icon color=\"warn\">\n error_outline\n </mat-icon>\n </span>\n\n <div class=\"value flex\">\n <span class=\"value-name\" *ngIf=\"setting().settingType !== SettingType.Boolean\">Served value:</span>\n <configcat-value class=\"served-value\" [valueFormControl]=\"value(rolloutPercentageItem)\"\n [setting]=\"setting()\">\n </configcat-value>\n </div>\n <div class=\"delete\" matTooltip=\"Remove % options\" (click)=\"removeAll()\" *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n </div>\n</div>", styles: [".percentage-wrapper{border:1px solid #d5d5d5;background-color:#fff;border-radius:4px;margin:.5em 1em;position:relative;padding:.5em 0;display:flex}.percentage-wrapper .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px}.percentage-wrapper .delete:hover{color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px}.percentage-wrapper .delete-option{color:#d6a9a9;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover{color:#ed5251}.percentage-wrapper .delete-option mat-icon{font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{background-color:#67b1fc3d}.grow{flex-grow:1}.percentage-row{min-height:40px;margin-left:.5em}.flex{display:flex;flex-wrap:wrap;align-items:center}.value{margin-left:auto;min-width:100px}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-right:5px;font-size:15px;padding:0 5px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 700px){.percentage-wrapper{margin:.5em .3em}}\n"], components: [{ type: i1.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
73
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: RolloutPercentageItemsComponent, decorators: [{
71
+ RolloutPercentageItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: RolloutPercentageItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
+ RolloutPercentageItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: RolloutPercentageItemsComponent, selector: "configcat-rollout-percentage-items", inputs: { formGroup: "formGroup", readOnly: "readOnly" }, ngImport: i0, template: "<div class=\"percentage-wrapper\" [formGroup]=\"formGroup\">\n\n <div class=\"if\" *ngIf=\"rolloutRules().controls.length > 0\">\n <mat-chip-list>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-list>\n </div>\n <div class=\"grow\">\n <div class=\"percentage-row flex\"\n *ngFor=\"let rolloutPercentageItem of getRolloutPercentageItemFormGroups(); let i = index\">\n <div class=\"flex\">\n <input type=\"number\" [formControl]=\"getPercentageFormControl(rolloutPercentageItem)\"\n (input)=\"percentageChanged(i)\">%\n <span class=\"users\">of <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">users</a>\n </span>\n </div>\n\n <div class=\"delete-option\" matTooltip=\"Remove this % option\"\n *ngIf=\"!readOnly && rolloutPercentageItems().controls.length > 2\"\n (click)=\"removeRolloutPercentageItem(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n\n <span data-tooltip=\"The sum of percentages must be equal to 100.\"\n *ngIf=\"(i === rolloutPercentageItems().controls.length -1) && (rolloutPercentageItemsSum().invalid)\">\n <mat-icon color=\"warn\">\n error_outline\n </mat-icon>\n </span>\n\n <div class=\"value flex\">\n <span class=\"value-name\" *ngIf=\"setting().settingType !== SettingType.Boolean\">Served value:</span>\n <configcat-value class=\"served-value\" [valueFormControl]=\"value(rolloutPercentageItem)\"\n [setting]=\"setting()\">\n </configcat-value>\n </div>\n <div class=\"delete\" matTooltip=\"Remove % options\" (click)=\"removeAll()\" *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n </div>\n</div>", styles: [".percentage-wrapper{border:1px solid #d5d5d5;background-color:#fff;border-radius:4px;margin:.5em 1em;position:relative;padding:.5em 0;display:flex}.percentage-wrapper .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px}.percentage-wrapper .delete:hover{color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px}.percentage-wrapper .delete-option{color:#d6a9a9;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover{color:#ed5251}.percentage-wrapper .delete-option mat-icon{font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{background-color:#67b1fc3d}.grow{flex-grow:1}.percentage-row{min-height:40px;margin-left:.5em}.flex{display:flex;flex-wrap:wrap;align-items:center}.value{margin-left:auto;min-width:100px}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-right:5px;font-size:15px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 700px){.percentage-wrapper{margin:.5em .3em}}\n"], components: [{ type: i1.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", 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-list>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-list>\n </div>\n <div class=\"grow\">\n <div class=\"percentage-row flex\"\n *ngFor=\"let rolloutPercentageItem of getRolloutPercentageItemFormGroups(); let i = index\">\n <div class=\"flex\">\n <input type=\"number\" [formControl]=\"getPercentageFormControl(rolloutPercentageItem)\"\n (input)=\"percentageChanged(i)\">%\n <span class=\"users\">of <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">users</a>\n </span>\n </div>\n\n <div class=\"delete-option\" matTooltip=\"Remove this % option\"\n *ngIf=\"!readOnly && rolloutPercentageItems().controls.length > 2\"\n (click)=\"removeRolloutPercentageItem(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n\n <span data-tooltip=\"The sum of percentages must be equal to 100.\"\n *ngIf=\"(i === rolloutPercentageItems().controls.length -1) && (rolloutPercentageItemsSum().invalid)\">\n <mat-icon color=\"warn\">\n error_outline\n </mat-icon>\n </span>\n\n <div class=\"value flex\">\n <span class=\"value-name\" *ngIf=\"setting().settingType !== SettingType.Boolean\">Served value:</span>\n <configcat-value class=\"served-value\" [valueFormControl]=\"value(rolloutPercentageItem)\"\n [setting]=\"setting()\">\n </configcat-value>\n </div>\n <div class=\"delete\" matTooltip=\"Remove % options\" (click)=\"removeAll()\" *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n </div>\n</div>", styles: [".percentage-wrapper{border:1px solid #d5d5d5;background-color:#fff;border-radius:4px;margin:.5em 1em;position:relative;padding:.5em 0;display:flex}.percentage-wrapper .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px}.percentage-wrapper .delete:hover{color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px}.percentage-wrapper .delete-option{color:#d6a9a9;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover{color:#ed5251}.percentage-wrapper .delete-option mat-icon{font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{background-color:#67b1fc3d}.grow{flex-grow:1}.percentage-row{min-height:40px;margin-left:.5em}.flex{display:flex;flex-wrap:wrap;align-items:center}.value{margin-left:auto;min-width:100px}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-right:5px;font-size:15px;padding:0 5px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 700px){.percentage-wrapper{margin:.5em .3em}}\n"] }]
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-list>\n <mat-chip class=\"chip\">ELSE IF</mat-chip>\n </mat-chip-list>\n </div>\n <div class=\"grow\">\n <div class=\"percentage-row flex\"\n *ngFor=\"let rolloutPercentageItem of getRolloutPercentageItemFormGroups(); let i = index\">\n <div class=\"flex\">\n <input type=\"number\" [formControl]=\"getPercentageFormControl(rolloutPercentageItem)\"\n (input)=\"percentageChanged(i)\">%\n <span class=\"users\">of <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">users</a>\n </span>\n </div>\n\n <div class=\"delete-option\" matTooltip=\"Remove this % option\"\n *ngIf=\"!readOnly && rolloutPercentageItems().controls.length > 2\"\n (click)=\"removeRolloutPercentageItem(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n\n <span data-tooltip=\"The sum of percentages must be equal to 100.\"\n *ngIf=\"(i === rolloutPercentageItems().controls.length -1) && (rolloutPercentageItemsSum().invalid)\">\n <mat-icon color=\"warn\">\n error_outline\n </mat-icon>\n </span>\n\n <div class=\"value flex\">\n <span class=\"value-name\" *ngIf=\"setting().settingType !== SettingType.Boolean\">Served value:</span>\n <configcat-value class=\"served-value\" [valueFormControl]=\"value(rolloutPercentageItem)\"\n [setting]=\"setting()\">\n </configcat-value>\n </div>\n <div class=\"delete\" matTooltip=\"Remove % options\" (click)=\"removeAll()\" *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n </div>\n</div>", styles: [".percentage-wrapper{border:1px solid #d5d5d5;background-color:#fff;border-radius:4px;margin:.5em 1em;position:relative;padding:.5em 0;display:flex}.percentage-wrapper .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px}.percentage-wrapper .delete:hover{color:#ed5251}.percentage-wrapper .delete mat-icon{font-size:20px}.percentage-wrapper .delete-option{color:#d6a9a9;cursor:pointer;margin-left:1rem;margin-top:4px}.percentage-wrapper .delete-option:hover{color:#ed5251}.percentage-wrapper .delete-option mat-icon{font-size:20px}.if{display:flex;align-items:center}.if>*{margin:0 .5em}.if .spacing{margin-right:44px}.if .chip{background-color:#67b1fc3d}.grow{flex-grow:1}.percentage-row{min-height:40px;margin-left:.5em}.flex{display:flex;flex-wrap:wrap;align-items:center}.value{margin-left:auto;min-width:100px}.value .value-name{display:none}input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;width:40px;margin-right:5px;font-size:15px;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.users{margin-left:20px}@media (max-width: 700px){.percentage-wrapper{margin:.5em .3em}}\n"] }]
76
76
  }], ctorParameters: function () { return []; }, propDecorators: { formGroup: [{
77
77
  type: Input
78
78
  }], readOnly: [{
@@ -3,7 +3,7 @@ import { Validators } from '@angular/forms';
3
3
  import { moveItemInArray } from '@angular/cdk/drag-drop';
4
4
  import { valid } from 'semver';
5
5
  import { ExpandDialogComponent } from '../../../dialogs/expand-dialog/expand-dialog.component';
6
- import { SettingType, RolloutRuleComparator } from 'ng-configcat-publicapi';
6
+ import { SettingType, RolloutRuleComparator, SegmentComparator } from 'ng-configcat-publicapi';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/material/dialog";
9
9
  import * as i2 from "@angular/material/icon";
@@ -42,6 +42,10 @@ export class RolloutRulesComponent {
42
42
  { value: RolloutRuleComparator.SensitiveIsOneOf, label: 'IS ONE OF (Sensitive)' },
43
43
  { value: RolloutRuleComparator.SensitiveIsNotOneOf, label: 'IS NOT ONE OF (Sensitive)' },
44
44
  ];
45
+ this.segmentComparators = [
46
+ { value: SegmentComparator.IsIn, label: 'IS IN SEGMENT' },
47
+ { value: SegmentComparator.IsNotIn, label: 'IS NOT IN SEGMENT' },
48
+ ];
45
49
  }
46
50
  onlyFirstTooltip() {
47
51
  return this.formGroup.root.get('allRolloutRulesCount')?.value > 20 || this.rolloutRules().controls.length > 10;
@@ -263,18 +267,29 @@ export class RolloutRulesComponent {
263
267
  getRolloutRuleComparisonAttributeFormControl(rolloutRule) {
264
268
  return rolloutRule.controls.comparisonAttribute;
265
269
  }
270
+ getRolloutRuleTypeFormControl(rolloutRule) {
271
+ return rolloutRule.controls.type;
272
+ }
266
273
  getRolloutRuleComparatorFormControl(rolloutRule) {
267
274
  return rolloutRule.controls.comparator;
268
275
  }
276
+ getRolloutRuleSegmentComparatorFormControl(rolloutRule) {
277
+ return rolloutRule.controls.segmentComparator;
278
+ }
279
+ getRolloutRuleSegmentIdFormControl(rolloutRule) {
280
+ return rolloutRule.controls.segmentId;
281
+ }
269
282
  }
270
- RolloutRulesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: RolloutRulesComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
271
- RolloutRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: RolloutRulesComponent, selector: "configcat-rollout-rules", inputs: { formGroup: "formGroup", readOnly: "readOnly" }, 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\">\n <div class=\"drag-handle\" cdkDragHandle data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\">\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\" data-tooltip=\"Custom user attribute\"\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"SENSITIVE 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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" data-tooltip=\"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 <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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-list>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-list>\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;border-radius:4px;background-color:#fff;margin:.5em 1em;display:flex;position:relative;padding:.5em 0}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px}.targeting-row .info a{color:#7fb3fd}.targeting-row .info a:hover{color:#0068f0}.targeting-row .info mat-icon{font-size:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:128px}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px}.chip{background-color:#67b1fc3d}.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:46px}.fields .attribute-span{margin-left:.5em}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;font-size:15px;padding:0 10px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin-right:5px}.fields .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px;z-index:999}.fields .delete:hover{color:#ed5251}.fields .delete mat-icon{font-size:20px}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .comparison-value{flex-grow:100;min-width:200px;display:flex;align-items:center;margin-left:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;flex-grow:100;font-size:15px;padding:0 30px 0 10px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .comparison-value .invalid{border:1px solid #ff5252}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 5px}.warn{padding-left:3em;font-size:.8em}.flex{display:flex;flex-wrap:wrap;align-items:center}.expand{position:absolute;right:2px;font-size:8px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.expand mat-icon{transform:rotate(45deg)}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 700px){.targeting-row{flex-direction:column;margin:.5em .3em}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:0}.targeting-row .fields .comparison-value{margin:0}}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i6.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }], directives: [{ type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.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"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i3.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }] });
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: RolloutRulesComponent, decorators: [{
283
+ RolloutRulesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: RolloutRulesComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
284
+ RolloutRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", 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 data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\">\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\" data-tooltip=\"Custom user attribute\"\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"SENSITIVE 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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" data-tooltip=\"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 <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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *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 data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *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-list>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-list>\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;border-radius:4px;background-color:#fff;margin:.5em 1em;display:flex;position:relative;padding:.5em 0}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px}.targeting-row .info a{color:#7fb3fd}.targeting-row .info a:hover{color:#0068f0}.targeting-row .info mat-icon{font-size:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:128px}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px}.chip{background-color:#67b1fc3d}.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:46px}.fields .attribute-span{margin-left:.5em}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;font-size:15px;padding:0 10px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin-right:5px}.fields .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px;z-index:999}.fields .delete:hover{color:#ed5251}.fields .delete mat-icon{font-size:20px}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .comparison-value{flex-grow:100;min-width:200px;display:flex;align-items:center;margin-left:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;flex-grow:100;font-size:15px;padding:0 30px 0 10px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value .invalid{border:1px solid #ff5252}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 5px}.warn{padding-left:3em;font-size:.8em}.flex{display:flex;flex-wrap:wrap;align-items:center}.expand{position:absolute;right:2px;font-size:8px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.expand mat-icon{transform:rotate(45deg)}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 700px){.targeting-row{flex-direction:column;margin:.5em .3em}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select,.targeting-row .fields .comparison-value{margin:0}}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i6.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }], directives: [{ type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.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"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i3.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.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"] }, { type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }] });
285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: RolloutRulesComponent, decorators: [{
273
286
  type: Component,
274
- 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\">\n <div class=\"drag-handle\" cdkDragHandle data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\">\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\" data-tooltip=\"Custom user attribute\"\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"SENSITIVE 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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" data-tooltip=\"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 <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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-list>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-list>\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;border-radius:4px;background-color:#fff;margin:.5em 1em;display:flex;position:relative;padding:.5em 0}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px}.targeting-row .info a{color:#7fb3fd}.targeting-row .info a:hover{color:#0068f0}.targeting-row .info mat-icon{font-size:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:128px}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px}.chip{background-color:#67b1fc3d}.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:46px}.fields .attribute-span{margin-left:.5em}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;font-size:15px;padding:0 10px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin-right:5px}.fields .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px;z-index:999}.fields .delete:hover{color:#ed5251}.fields .delete mat-icon{font-size:20px}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .comparison-value{flex-grow:100;min-width:200px;display:flex;align-items:center;margin-left:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;flex-grow:100;font-size:15px;padding:0 30px 0 10px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300}.fields .comparison-value .invalid{border:1px solid #ff5252}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 5px}.warn{padding-left:3em;font-size:.8em}.flex{display:flex;flex-wrap:wrap;align-items:center}.expand{position:absolute;right:2px;font-size:8px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.expand mat-icon{transform:rotate(45deg)}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 700px){.targeting-row{flex-direction:column;margin:.5em .3em}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:0}.targeting-row .fields .comparison-value{margin:0}}\n"] }]
287
+ 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 data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\">\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\" data-tooltip=\"Custom user attribute\"\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"SENSITIVE 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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" data-tooltip=\"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 <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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *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 data-tooltip=\"Drag here to reorder\" *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-list [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-list>\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 [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\">\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\" [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\"\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\"\n [matTooltipDisabled]=\"onlyFirstTooltip() && i !== 0\" *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-list>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-list>\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;border-radius:4px;background-color:#fff;margin:.5em 1em;display:flex;position:relative;padding:.5em 0}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px}.targeting-row .info a{color:#7fb3fd}.targeting-row .info a:hover{color:#0068f0}.targeting-row .info mat-icon{font-size:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:128px}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px}.chip{background-color:#67b1fc3d}.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:46px}.fields .attribute-span{margin-left:.5em}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;font-size:15px;padding:0 10px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin-right:5px}.fields .delete{position:absolute;color:#d6a9a9;cursor:pointer;top:-8px;right:-12px;z-index:999}.fields .delete:hover{color:#ed5251}.fields .delete mat-icon{font-size:20px}.fields .drag-handle{position:absolute;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;min-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .comparison-value{flex-grow:100;min-width:200px;display:flex;align-items:center;margin-left:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;min-width:170px;flex-grow:100;font-size:15px;padding:0 30px 0 10px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value .invalid{border:1px solid #ff5252}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 5px}.warn{padding-left:3em;font-size:.8em}.flex{display:flex;flex-wrap:wrap;align-items:center}.expand{position:absolute;right:2px;font-size:8px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.expand mat-icon{transform:rotate(45deg)}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 700px){.targeting-row{flex-direction:column;margin:.5em .3em}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select,.targeting-row .fields .comparison-value{margin:0}}\n"] }]
275
288
  }], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { formGroup: [{
276
289
  type: Input
277
290
  }], readOnly: [{
278
291
  type: Input
292
+ }], segments: [{
293
+ type: Input
279
294
  }] } });
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFPNUUsTUFBTSxPQUFPLHFCQUFxQjtJQWlDaEMsWUFBb0IsTUFBaUI7UUFBakIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQTlCNUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQixnQ0FBMkIsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakUsMkJBQXNCLEdBQUc7WUFDdkIsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxX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Q25ELENBQUM7SUFFRCx3Q0FBd0MsQ0FBQyxXQUFnQjtRQUN2RCxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsZUFBOEIsQ0FBQztJQUM3RCxDQUFDO0lBRUQsNENBQTRDLENBQUMsV0FBZ0I7UUFDM0QsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLG1CQUFrQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxtQ0FBbUMsQ0FBQyxXQUFnQjtRQUNsRCxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBeUIsQ0FBQztJQUN4RCxDQUFDOztrSEEvUlUscUJBQXFCO3NHQUFyQixxQkFBcUIseUhDYmxDLGl6T0FzSE07MkZEekdPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSx5QkFBeUI7Z0dBTTFCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJhZ0Ryb3AgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IHZhbGlkIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEV4cGFuZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2RpYWxvZ3MvZXhwYW5kLWRpYWxvZy9leHBhbmQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU2V0dGluZ1R5cGUsIFJvbGxvdXRSdWxlQ29tcGFyYXRvciB9IGZyb20gJ25nLWNvbmZpZ2NhdC1wdWJsaWNhcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtcm9sbG91dC1ydWxlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sbG91dC1ydWxlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGxvdXRSdWxlc0NvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuXG4gIFNldHRpbmdUeXBlID0gU2V0dGluZ1R5cGU7XG5cbiAgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzID0gWydJZGVudGlmaWVyJywgJ0VtYWlsJywgJ0NvdW50cnknXTtcblxuICByb2xsb3V0UnVsZUNvbXBhcmF0b3JzID0gW1xuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRicgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWlucywgbGFiZWw6ICdDT05UQUlOUycgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW4sIGxhYmVsOiAnRE9FUyBOT1QgQ09OVEFJTicgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GIChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzLCBsYWJlbDogJzwgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3NPckVxdWFscywgbGFiZWw6ICc8PSAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlciwgbGFiZWw6ICc+IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHMsIGxhYmVsOiAnPj0gKFNlbVZlciknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzLCBsYWJlbDogJz0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbCwgbGFiZWw6ICchPSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzcywgbGFiZWw6ICc8IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHMsIGxhYmVsOiAnPD0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXIsIGxhYmVsOiAnPiAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzLCBsYWJlbDogJz49IChOdW1iZXIpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChTZW5zaXRpdmUpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKFNlbnNpdGl2ZSknIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZykgeyB9XG5cbiAgb25seUZpcnN0VG9vbHRpcCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAucm9vdC5nZXQoJ2FsbFJvbGxvdXRSdWxlc0NvdW50Jyk/LnZhbHVlID4gMjAgfHwgdGhpcy5yb2xsb3V0UnVsZXMoKS5jb250cm9scy5sZW5ndGggPiAxMDtcbiAgfVxuXG4gIHNldHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgnc2V0dGluZycpPy52YWx1ZTtcbiAgfVxuXG4gIHJvbGxvdXRSdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyb2xsb3V0UnVsZXMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBjb21wYXJpc29uQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAucm9vdC5nZXQoJ2NvbXBhcmlzb25BdHRyaWJ1dGVzJyk/LnZhbHVlO1xuICB9XG5cbiAgcmVtb3ZlUnVsZShpbmRleDogYW55KSB7XG4gICAgdGhpcy5yb2xsb3V0UnVsZXMoKS5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5yb2xsb3V0UnVsZXMoKS5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgb25Ecm9wKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCByb2xsb3V0UnVsZXMgPSB0aGlzLnJvbGxvdXRSdWxlcygpLmNvbnRyb2xzO1xuICAgIG1vdmVJdGVtSW5BcnJheShyb2xsb3V0UnVsZXMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWQoZXZlbnQ6IGFueSwgY29tcGFyaXNvbkF0dHJpYnV0ZTogRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihldmVudC52YWx1ZSkgIT09IC0xKSB7XG4gICAgICBpZiAoY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSAhPT0gZXZlbnQudmFsdWUpIHtcbiAgICAgICAgY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZShldmVudC52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgICBjb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRQbGFjZUhvbGRlcihyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IHVzZXJfaWQxLCB1c2VyX2lkMiwgdXNlcl9pZDMnO1xuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBqYW5lQGV4YW1wbGUuY29tLCBqb2huQGV4YW1wbGUuY29tJztcbiAgICAgICAgICBjYXNlICdjb3VudHJ5JzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBGcmFuY2UsIEJyYXppbCc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgICAgICAgIHJldHVybiAncGFydC1vZi1pZCc7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IEBleGFtcGxlLmNvbSc7XG4gICAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogVW5pdGVkJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IGFueS1wYXJ0LW9mLXlvdXItdmFsdWUtc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2Y6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCwgMi4wLjEnO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHJldHVybiAnZS5nOiAxLjAuMCc7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdlLmc6IDQyJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbDpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgIH1cbiAgfVxuXG4gIGdldEluZm9DbGFzcyhyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ3dhcm4nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbmZvJztcbiAgICB9XG4gIH1cblxuICBnZXRJbmZvVG9vbHRpcChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgaWYgKCFyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJ0xlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICByZXR1cm4gJ0NvbnNpZGVyIHVzaW5nIHNlbnNpdGl2ZSB0ZXh0IGNvbXBhcmF0b3JzLiBDbGljayB0byBsZWFybiBtb3JlLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0NsaWNrIHRvIGxlYXJuIG1vcmUgYWJvdXQgY29tcGFyYXRvcnMnO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBsZXQgdmFsaWRhdG9yczogYW55W10gPSBbXTtcblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNjU1MzUpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbGlkYXRlU2VtVmVyTGlzdF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWxpZGF0ZVNlbVZlcl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oLTEuNzk3NjkzMTM0ODYyMzJFKzMwOCksIFZhbGlkYXRvcnMubWF4KDEuNzk3NjkzMTM0ODYyMzJFKzMwOCldO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgaXNMaXN0VHlwZShyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2Y6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU2VtVmVyKGM6IEZvcm1Db250cm9sKSB7XG5cbiAgICBpZiAodmFsaWQoYy52YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyOiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlckxpc3QoYzogRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyTGlzdDoge1xuICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlbXZlcnMgPSBjLnZhbHVlLnNwbGl0KCcsJykubWFwKChzOiBhbnkpID0+IHMudHJpbSgpKTtcbiAgICBpZiAoc2VtdmVycy5maW5kKChzOiBhbnkpID0+IHMgJiYgcyAhPT0gJycgJiYgdmFsaWQocykgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHBvcE91dChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihFeHBhbmREaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBjb250cm9sOiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUsXG4gICAgICAgIG11bHRpbGluZTogdGhpcy5pc0xpc3RUeXBlKHJvbGxvdXRSdWxlKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVWYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudmFsdWUgYXMgRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yIGFzIEZvcm1Db250cm9sO1xuICB9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQpXCIgW2Nka0Ryb3BMaXN0RGlzYWJsZWRdPVwicmVhZE9ubHlcIlxuICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cInJvbGxvdXRSdWxlcygpLmNvbnRyb2xzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvbGxvdXRSdWxlIG9mIHJvbGxvdXRSdWxlcygpLmNvbnRyb2xzOyB0cmFja0J5OiB0cmFja0J5SW5kZXg7IGxldCBpID0gaW5kZXhcIiBjZGtEcmFnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhcmdldGluZy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRzIGZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBkYXRhLXRvb2x0aXA9XCJEcmFnIGhlcmUgdG8gcmVvcmRlclwiICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXInczwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3QgYXR0cmlidXRlLXNlbGVjdFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwib25seUZpcnN0VG9vbHRpcCgpICYmIGkgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJhdHRyaWJ1dGVDaGFuZ2VkKCRldmVudC50YXJnZXQsIGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmlzb25BdHRyaWJ1dGUgb2YgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZSA9PT0gZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJpc29uQXR0cmlidXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzLmluZGV4T2YoZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLXNwYW5cIiBkYXRhLXRvb2x0aXA9XCJDdXN0b20gdXNlciBhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpICE9PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIG1hdElucHV0IFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIGNsYXNzPVwiYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRXllIGNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uQXR0cmlidXRlcygpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cIm9ubHlGaXJzdFRvb2x0aXAoKSAmJiBpICE9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIlNFTlNJVElWRSBURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgxNiwgMTgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiVEVYVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMCwgNClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJTRU1BTlRJQyBWRVJTSU9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSg0LCAxMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJOVU1CRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDEwLCAxNilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlKVwiIFttYXRUb29sdGlwXT1cImdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJvbmx5Rmlyc3RUb29sdGlwKCkgJiYgaSAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC90YXJnZXRpbmcvI2NvbXBhcmF0b3JcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmlzb24tdmFsdWVcIiBkYXRhLXRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSlcIiBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2VIb2xkZXIocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kXCIgbWF0VG9vbHRpcD1cIlBvcC1vdXQgRWRpdG9yXCIgKGNsaWNrKT1cInBvcE91dChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSk9PT0ndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aGVpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cIm9ubHlGaXJzdFRvb2x0aXAoKSAmJiBpICE9PSAwXCIgKm5nSWY9XCIhcmVhZE9ubHlcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2ZVwiICpuZ0lmPVwic2V0dGluZygpLnNldHRpbmdUeXBlICE9PSBTZXR0aW5nVHlwZS5Cb29sZWFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJjaGlwXCI+U2VydmU6PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ2NhdC12YWx1ZSBjbGFzcz1cInNlcnZlZC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgW3NldHRpbmddPVwic2V0dGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY29uZmlnY2F0LXZhbHVlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBT2pILE1BQU0sT0FBTyxxQkFBcUI7SUF1Q2hDLFlBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFwQzVCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHMUIsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFFMUIsZ0NBQTJCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWpFLDJCQUFzQixHQUFHO1lBQ3ZCLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLE9BQU8sRUFB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VUFBVSxDQUFDLFdBQVcsQ0FBQzthQUN4QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxZQUFZLENBQUMsS0FBYTtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxXQUFnQjtRQUM3QyxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBb0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQsd0NBQXdDLENBQUMsV0FBZ0I7UUFDdkQsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLGVBQThCLENBQUM7SUFDN0QsQ0FBQztJQUVELDRDQUE0QyxDQUFDLFdBQWdCO1FBQzNELE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxtQkFBa0MsQ0FBQztJQUNqRSxDQUFDO0lBRUQsNkJBQTZCLENBQUMsV0FBZ0I7UUFDNUMsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQW1CLENBQUM7SUFDbEQsQ0FBQztJQUVELG1DQUFtQyxDQUFDLFdBQWdCO1FBQ2xELE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUF5QixDQUFDO0lBQ3hELENBQUM7SUFFRCwwQ0FBMEMsQ0FBQyxXQUFnQjtRQUN6RCxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWdDLENBQUM7SUFDL0QsQ0FBQztJQUVELGtDQUFrQyxDQUFDLFdBQWdCO1FBQ2pELE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUF3QixDQUFDO0lBQ3ZELENBQUM7O2tIQWpUVSxxQkFBcUI7c0dBQXJCLHFCQUFxQiwrSUNibEMsdTlUQW9LTTsyRkR2Sk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLHlCQUF5QjtnR0FNMUIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXksIENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyB2YWxpZCB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBFeHBhbmREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kaWFsb2dzL2V4cGFuZC1kaWFsb2cvZXhwYW5kLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFNldHRpbmdUeXBlLCBSb2xsb3V0UnVsZUNvbXBhcmF0b3IsIFNlZ21lbnRMaXN0TW9kZWwsIFNlZ21lbnRDb21wYXJhdG9yIH0gZnJvbSAnbmctY29uZmlnY2F0LXB1YmxpY2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbmZpZ2NhdC1yb2xsb3V0LXJ1bGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm9sbG91dFJ1bGVzQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlZ21lbnRzITogU2VnbWVudExpc3RNb2RlbFtdO1xuXG4gIFNldHRpbmdUeXBlID0gU2V0dGluZ1R5cGU7XG5cbiAgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzID0gWydJZGVudGlmaWVyJywgJ0VtYWlsJywgJ0NvdW50cnknXTtcblxuICByb2xsb3V0UnVsZUNvbXBhcmF0b3JzID0gW1xuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRicgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWlucywgbGFiZWw6ICdDT05UQUlOUycgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW4sIGxhYmVsOiAnRE9FUyBOT1QgQ09OVEFJTicgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GIChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzLCBsYWJlbDogJzwgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3NPckVxdWFscywgbGFiZWw6ICc8PSAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlciwgbGFiZWw6ICc+IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHMsIGxhYmVsOiAnPj0gKFNlbVZlciknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzLCBsYWJlbDogJz0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbCwgbGFiZWw6ICchPSAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzcywgbGFiZWw6ICc8IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHMsIGxhYmVsOiAnPD0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXIsIGxhYmVsOiAnPiAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzLCBsYWJlbDogJz49IChOdW1iZXIpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2YsIGxhYmVsOiAnSVMgT05FIE9GIChTZW5zaXRpdmUpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YgKFNlbnNpdGl2ZSknIH0sXG4gIF07XG5cbiAgc2VnbWVudENvbXBhcmF0b3JzID0gW1xuICAgIHsgdmFsdWU6IFNlZ21lbnRDb21wYXJhdG9yLklzSW4sIGxhYmVsOiAnSVMgSU4gU0VHTUVOVCcgfSxcbiAgICB7IHZhbHVlOiBTZWdtZW50Q29tcGFyYXRvci5Jc05vdEluLCBsYWJlbDogJ0lTIE5PVCBJTiBTRUdNRU5UJyB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2cpIHsgfVxuXG4gIG9ubHlGaXJzdFRvb2x0aXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnJvb3QuZ2V0KCdhbGxSb2xsb3V0UnVsZXNDb3VudCcpPy52YWx1ZSA+IDIwIHx8IHRoaXMucm9sbG91dFJ1bGVzKCkuY29udHJvbHMubGVuZ3RoID4gMTA7XG4gIH1cblxuICBzZXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ3NldHRpbmcnKT8udmFsdWU7XG4gIH1cblxuICByb2xsb3V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgncm9sbG91dFJ1bGVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgY29tcGFyaXNvbkF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnJvb3QuZ2V0KCdjb21wYXJpc29uQXR0cmlidXRlcycpPy52YWx1ZTtcbiAgfVxuXG4gIHJlbW92ZVJ1bGUoaW5kZXg6IGFueSkge1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogYW55KSB7XG4gICAgY29uc3Qgcm9sbG91dFJ1bGVzID0gdGhpcy5yb2xsb3V0UnVsZXMoKS5jb250cm9scztcbiAgICBtb3ZlSXRlbUluQXJyYXkocm9sbG91dFJ1bGVzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBhbnksIGNvbXBhcmlzb25BdHRyaWJ1dGU6IEZvcm1Db250cm9sKSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzLmluZGV4T2YoZXZlbnQudmFsdWUpICE9PSAtMSkge1xuICAgICAgaWYgKGNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUgIT09IGV2ZW50LnZhbHVlKSB7XG4gICAgICAgIGNvbXBhcmlzb25BdHRyaWJ1dGUuc2V0VmFsdWUoZXZlbnQudmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UGxhY2VIb2xkZXIocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIGlmICghcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiB1c2VyX2lkMSwgdXNlcl9pZDIsIHVzZXJfaWQzJztcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogamFuZUBleGFtcGxlLmNvbSwgam9obkBleGFtcGxlLmNvbSc7XG4gICAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogRnJhbmNlLCBCcmF6aWwnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogdmFsdWUxLCB2YWx1ZTIsIHZhbHVlMyc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gJ3BhcnQtb2YtaWQnO1xuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBAZXhhbXBsZS5jb20nO1xuICAgICAgICAgIGNhc2UgJ2NvdW50cnknOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IFVuaXRlZCc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBhbnktcGFydC1vZi15b3VyLXZhbHVlLXN0cmluZyc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICByZXR1cm4gJ2UuZzogMS4wLjAsIDIuMC4xJztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICByZXR1cm4gJ2UuZzogMS4wLjAnO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXI6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHM6XG4gICAgICAgIHJldHVybiAnZS5nOiA0Mic7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICB9XG4gIH1cblxuICBnZXRJbmZvQ2xhc3Mocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIGlmICghcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkge1xuICAgICAgcmV0dXJuICdpbmZvJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgcmV0dXJuICd3YXJuJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnaW5mbyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5mb1Rvb2x0aXAocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIGlmICghcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkge1xuICAgICAgcmV0dXJuICdMZWFybiBtb3JlIGFib3V0IGNvbXBhcmF0b3JzJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgcmV0dXJuICdDb25zaWRlciB1c2luZyBzZW5zaXRpdmUgdGV4dCBjb21wYXJhdG9ycy4gQ2xpY2sgdG8gbGVhcm4gbW9yZS4nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdDbGljayB0byBsZWFybiBtb3JlIGFib3V0IGNvbXBhcmF0b3JzJztcbiAgICB9XG4gIH1cblxuICBjb21wYXJhdG9yQ2hhbmdlZChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgbGV0IHZhbGlkYXRvcnM6IGFueVtdID0gW107XG5cbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDY1NTM1KV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2Y6XG4gICAgICAgIHZhbGlkYXRvcnMgPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWxpZGF0ZVNlbVZlckxpc3RdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3NPckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMudmFsaWRhdGVTZW1WZXJdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbDpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKC0xLjc5NzY5MzEzNDg2MjMyRSszMDgpLCBWYWxpZGF0b3JzLm1heCgxLjc5NzY5MzEzNDg2MjMyRSszMDgpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIGlzTGlzdFR5cGUocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlcihjOiBGb3JtQ29udHJvbCkge1xuXG4gICAgaWYgKHZhbGlkKGMudmFsdWUpID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlcjoge1xuICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFsaWRhdGVTZW1WZXJMaXN0KGM6IEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCFjLnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW12ZXJzID0gYy52YWx1ZS5zcGxpdCgnLCcpLm1hcCgoczogYW55KSA9PiBzLnRyaW0oKSk7XG4gICAgaWYgKHNlbXZlcnMuZmluZCgoczogYW55KSA9PiBzICYmIHMgIT09ICcnICYmIHZhbGlkKHMpID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVTZW1WZXJMaXN0OiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwb3BPdXQocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHRoaXMuZGlhbG9nLm9wZW4oRXhwYW5kRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29udHJvbDogcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLFxuICAgICAgICBtdWx0aWxpbmU6IHRoaXMuaXNMaXN0VHlwZShyb2xsb3V0UnVsZSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnZhbHVlIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlVHlwZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudHlwZSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvciBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlU2VnbWVudENvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnNlZ21lbnRDb21wYXJhdG9yIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLnNlZ21lbnRJZCBhcyBGb3JtQ29udHJvbDtcbiAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50KVwiIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJyb2xsb3V0UnVsZXMoKS5jb250cm9sc1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb2xsb3V0UnVsZSBvZiByb2xsb3V0UnVsZXMoKS5jb250cm9sczsgdHJhY2tCeTogdHJhY2tCeUluZGV4OyBsZXQgaSA9IGluZGV4XCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBkYXRhLXRvb2x0aXA9XCJEcmFnIGhlcmUgdG8gcmVvcmRlclwiICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXInczwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3QgYXR0cmlidXRlLXNlbGVjdFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwib25seUZpcnN0VG9vbHRpcCgpICYmIGkgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJhdHRyaWJ1dGVDaGFuZ2VkKCRldmVudC50YXJnZXQsIGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmlzb25BdHRyaWJ1dGUgb2YgZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZSA9PT0gZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJpc29uQXR0cmlidXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZGVmYXVsdENvbXBhcmlzb25BdHRyaWJ1dGVzLmluZGV4T2YoZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLXNwYW5cIiBkYXRhLXRvb2x0aXA9XCJDdXN0b20gdXNlciBhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpICE9PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIG1hdElucHV0IFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIGNsYXNzPVwiYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gRXllIGNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uQXR0cmlidXRlcygpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cIm9ubHlGaXJzdFRvb2x0aXAoKSAmJiBpICE9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbXBhcmF0b3JDaGFuZ2VkKHJvbGxvdXRSdWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIlNFTlNJVElWRSBURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgxNiwgMTgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiVEVYVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMCwgNClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJTRU1BTlRJQyBWRVJTSU9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSg0LCAxMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJOVU1CRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDEwLCAxNilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlKVwiIFttYXRUb29sdGlwXT1cImdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJvbmx5Rmlyc3RUb29sdGlwKCkgJiYgaSAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC90YXJnZXRpbmcvI2NvbXBhcmF0b3JcIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmlzb24tdmFsdWVcIiBkYXRhLXRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSlcIiBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2VIb2xkZXIocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kXCIgbWF0VG9vbHRpcD1cIlBvcC1vdXQgRWRpdG9yXCIgKGNsaWNrKT1cInBvcE91dChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29tcGFyaXNvblZhbHVlVHlwZShyb2xsb3V0UnVsZSk9PT0ndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aGVpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cIm9ubHlGaXJzdFRvb2x0aXAoKSAmJiBpICE9PSAwXCIgKm5nSWY9XCIhcmVhZE9ubHlcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBkYXRhLXRvb2x0aXA9XCJEcmFnIGhlcmUgdG8gcmVvcmRlclwiICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9hZHZhbmNlZC91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnVzZXI8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBzZWdtZW50LWNvbXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVNlZ21lbnRDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU2VnbWVudCBjb21wYXJhdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwib25seUZpcnN0VG9vbHRpcCgpICYmIGkgIT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHNlZ21lbnRDb21wYXJhdG9yc1wiIFtuZ1ZhbHVlXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXR0cmlidXRlLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3Qgc2VnbWVudC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlKVwiIG1hdFRvb2x0aXA9XCJTZWdtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwib25seUZpcnN0VG9vbHRpcCgpICYmIGkgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZCc6IGdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiBzZWdtZW50c1wiIFtuZ1ZhbHVlXT1cInNlZ21lbnQuc2VnbWVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VnbWVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGVcIiBtYXRUb29sdGlwPVwiUmVtb3ZlIHRhcmdldGluZyBydWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwib25seUZpcnN0VG9vbHRpcCgpICYmIGkgIT09IDBcIiAqbmdJZj1cIiFyZWFkT25seVwiIChjbGljayk9XCJyZW1vdmVSdWxlKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2ZVwiICpuZ0lmPVwic2V0dGluZygpLnNldHRpbmdUeXBlICE9PSBTZXR0aW5nVHlwZS5Cb29sZWFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJjaGlwXCI+U2VydmU6PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ2NhdC12YWx1ZSBjbGFzcz1cInNlcnZlZC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgW3NldHRpbmddPVwic2V0dGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY29uZmlnY2F0LXZhbHVlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19