ng-configcat-publicapi-ui 4.2.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/fesm2022/ng-configcat-publicapi-ui.mjs +4240 -3534
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/index.d.ts +476 -3
- package/package.json +11 -10
- package/src/css/button.scss +83 -0
- package/src/css/controls.scss +390 -0
- package/src/css/dialog.scss +63 -0
- package/src/css/icon.scss +7 -0
- package/src/css/slider.scss +82 -0
- package/src/css/snackbar.scss +16 -0
- package/src/css/table.scss +142 -0
- package/src/css/theme.scss +47 -0
- package/src/css/tooltip.scss +12 -0
- package/src/css/variables.scss +324 -0
- package/src/css/vars/auth.scss +24 -0
- package/src/css/vars/banner.scss +116 -0
- package/src/css/vars/box.scss +48 -0
- package/src/css/vars/config-overview.scss +27 -0
- package/src/css/vars/flag.scss +146 -0
- package/src/css/vars/header.scss +24 -0
- package/src/css/vars/icon.scss +33 -0
- package/src/css/vars/logo.scss +19 -0
- package/src/css/vars/notification.scss +38 -0
- package/src/css/vars/overview.scss +51 -0
- package/src/css/vars/prism.scss +44 -0
- package/src/css/vars/sidenav.scss +42 -0
- package/src/css/vars/theme.scss +78 -0
- package/src/public-api.scss +208 -0
- package/esm2022/lib/_directives/index.mjs +0 -2
- package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +0 -38
- package/esm2022/lib/_models/deleteSettingModel.mjs +0 -2
- package/esm2022/lib/_models/flag-state.mjs +0 -2
- package/esm2022/lib/_models/index.mjs +0 -4
- package/esm2022/lib/_models/setting-value-formgroup.mjs +0 -2
- package/esm2022/lib/_models/settingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/updateSettingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/user-comparator.mjs +0 -100
- package/esm2022/lib/_services/app-data-adapter.mjs +0 -18
- package/esm2022/lib/_services/comparison-value-list-helper.mjs +0 -72
- package/esm2022/lib/_services/date-helper.mjs +0 -56
- package/esm2022/lib/_services/form-generator.mjs +0 -359
- package/esm2022/lib/_services/form-helper.mjs +0 -163
- package/esm2022/lib/_services/index.mjs +0 -3
- package/esm2022/lib/_services/messaging.service.mjs +0 -26
- package/esm2022/lib/_services/platform-helper.mjs +0 -7
- package/esm2022/lib/_services/public-api.service.mjs +0 -77
- package/esm2022/lib/_services/setting-list-form-helper.mjs +0 -171
- package/esm2022/lib/_services/tracking.directive.mjs +0 -16
- package/esm2022/lib/ace-editor/ace-editor.component.mjs +0 -137
- package/esm2022/lib/authorization/authorization.component.mjs +0 -62
- package/esm2022/lib/base/base-select.component.mjs +0 -27
- package/esm2022/lib/base/base.component.mjs +0 -48
- package/esm2022/lib/bootstrap.mjs +0 -11
- package/esm2022/lib/configuration.mjs +0 -14
- package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +0 -27
- package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
- package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +0 -29
- package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
- package/esm2022/lib/dialogs/reroute-dialog/reroute-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/save-snackbar/save-snackbar.component.mjs +0 -14
- package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +0 -288
- package/esm2022/lib/selects/config-select/config-select.component.mjs +0 -60
- package/esm2022/lib/selects/environment-select/environment-select.component.mjs +0 -47
- package/esm2022/lib/selects/product-select/product-select.component.mjs +0 -40
- package/esm2022/lib/selects/setting-select/setting-select.component.mjs +0 -47
- package/esm2022/lib/setting-item/setting-item.component.mjs +0 -118
- package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
- package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
- package/esm2022/lib/setting-list/setting/setting.component.mjs +0 -136
- package/esm2022/lib/setting-list/setting/value/value.component.mjs +0 -37
- package/esm2022/lib/setting-list/setting-list.component.mjs +0 -194
- package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +0 -123
- package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +0 -30
- package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +0 -220
- package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +0 -61
- package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +0 -72
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +0 -25
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +0 -105
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +0 -75
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +0 -48
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +0 -113
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.mjs +0 -251
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +0 -444
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +0 -84
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +0 -129
- package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +0 -190
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +0 -65
- package/esm2022/lib/v2/feature-flag-item.component.mjs +0 -330
- package/esm2022/ng-configcat-publicapi-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/lib/_directives/index.d.ts +0 -1
- package/lib/_directives/input-display-normalizer.directive.d.ts +0 -13
- package/lib/_models/deleteSettingModel.d.ts +0 -6
- package/lib/_models/flag-state.d.ts +0 -20
- package/lib/_models/index.d.ts +0 -3
- package/lib/_models/setting-value-formgroup.d.ts +0 -69
- package/lib/_models/settingValuesModel.d.ts +0 -11
- package/lib/_models/updateSettingValuesModel.d.ts +0 -7
- package/lib/_models/user-comparator.d.ts +0 -84
- package/lib/_services/app-data-adapter.d.ts +0 -7
- package/lib/_services/comparison-value-list-helper.d.ts +0 -17
- package/lib/_services/date-helper.d.ts +0 -6
- package/lib/_services/form-generator.d.ts +0 -59
- package/lib/_services/form-helper.d.ts +0 -21
- package/lib/_services/index.d.ts +0 -2
- package/lib/_services/messaging.service.d.ts +0 -12
- package/lib/_services/platform-helper.d.ts +0 -3
- package/lib/_services/public-api.service.d.ts +0 -21
- package/lib/_services/setting-list-form-helper.d.ts +0 -19
- package/lib/_services/tracking.directive.d.ts +0 -6
- package/lib/ace-editor/ace-editor.component.d.ts +0 -32
- package/lib/authorization/authorization.component.d.ts +0 -21
- package/lib/base/base-select.component.d.ts +0 -10
- package/lib/base/base.component.d.ts +0 -18
- package/lib/bootstrap.d.ts +0 -13
- package/lib/configuration.d.ts +0 -9
- package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +0 -19
- package/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.d.ts +0 -17
- package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +0 -25
- package/lib/dialogs/info-dialog/info-dialog.d.ts +0 -17
- package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +0 -15
- package/lib/dialogs/reroute-dialog/reroute-dialog.d.ts +0 -20
- package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +0 -8
- package/lib/ng-configcat-publicapi-ui.module.d.ts +0 -75
- package/lib/selects/config-select/config-select.component.d.ts +0 -17
- package/lib/selects/environment-select/environment-select.component.d.ts +0 -17
- package/lib/selects/product-select/product-select.component.d.ts +0 -14
- package/lib/selects/setting-select/setting-select.component.d.ts +0 -17
- package/lib/setting-item/setting-item.component.d.ts +0 -37
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +0 -27
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +0 -61
- package/lib/setting-list/setting/setting.component.d.ts +0 -43
- package/lib/setting-list/setting/value/value.component.d.ts +0 -20
- package/lib/setting-list/setting-list.component.d.ts +0 -53
- package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +0 -25
- package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +0 -41
- package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +0 -18
- package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +0 -30
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +0 -10
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +0 -36
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +0 -21
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +0 -79
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.d.ts +0 -63
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +0 -94
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +0 -31
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +0 -33
- package/lib/v2/feature-flag/feature-flag.component.d.ts +0 -49
- package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +0 -28
- package/lib/v2/feature-flag-item.component.d.ts +0 -66
- package/public-api.d.ts +0 -11
- package/public-api.scss +0 -350
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { FormHelper, SegmentComparator } from '../../../../../../bootstrap';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common";
|
|
5
|
-
import * as i2 from "@angular/forms";
|
|
6
|
-
import * as i3 from "@angular/material/form-field";
|
|
7
|
-
import * as i4 from "@angular/material/button";
|
|
8
|
-
import * as i5 from "@angular/material/input";
|
|
9
|
-
import * as i6 from "@angular/material/icon";
|
|
10
|
-
import * as i7 from "@angular/material/tooltip";
|
|
11
|
-
import * as i8 from "@angular/material/menu";
|
|
12
|
-
import * as i9 from "../condition-chip/condition-chip.component";
|
|
13
|
-
import * as i10 from "../../../../../../_services/tracking.directive";
|
|
14
|
-
export class SegmentConditionComponent {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.createSegmentRequested = new EventEmitter();
|
|
17
|
-
this.manageSegmentsRequested = new EventEmitter();
|
|
18
|
-
this.FormHelper = FormHelper;
|
|
19
|
-
this.segmentComparators = [
|
|
20
|
-
{ value: SegmentComparator.IsIn, label: 'IS IN SEGMENT' },
|
|
21
|
-
{ value: SegmentComparator.IsNotIn, label: 'IS NOT IN SEGMENT' },
|
|
22
|
-
];
|
|
23
|
-
}
|
|
24
|
-
createSegment() {
|
|
25
|
-
this.createSegmentRequested.emit();
|
|
26
|
-
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SegmentConditionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SegmentConditionComponent, selector: "app-segment-condition", inputs: { targetingRuleIndex: "targetingRuleIndex", conditionIndex: "conditionIndex", formGroup: "formGroup", segments: "segments", canManageSegments: "canManageSegments" }, outputs: { createSegmentRequested: "createSegmentRequested", manageSegmentsRequested: "manageSegmentsRequested" }, ngImport: i0, template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/segment-condition/\" target=\"_blank\"\n rel=\"noopener noreferrer\" class=\"user-link\">user</a></div>\n </div>\n\n <div class=\"targeting-rule-component pad-right\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl [formControl]=\"formGroup.controls.comparator\" matTooltip=\"Segment comparator\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl [formControl]=\"formGroup.controls.segmentId\" matTooltip=\"Segment\">\n <option [ngValue]=\"null\" disabled selected hidden *ngIf=\"segments.length\">Select segment ...\n </option>\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\"\n [title]=\"segment.description\">\n {{segment.name}}\n </option>\n <option *ngIf=\"segments.length === 0\" disabled>\n no segments available\n </option>\n </select>\n <mat-error *ngIf=\"formGroup.controls.segmentId.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.segmentId)}}\n </mat-error>\n </mat-form-field>\n </div>\n <button class=\"segment-more\" type=\"button\" mat-icon-button *ngIf=\"canManageSegments\"\n matTooltip=\"Create and manage segments\" [matMenuTriggerFor]=\"segmentMenu\"\n [track]=\"['segment menu click', 'feature flags and settings']\">\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\n </button>\n </div>\n</div>\n\n<mat-menu #segmentMenu=\"matMenu\">\n <ng-template matMenuContent>\n <a mat-menu-item (click)=\"createSegmentRequested.emit()\"\n [track]=\"['create segment click', 'Feature flags & settings V2 page']\">\n <mat-icon>add</mat-icon><span>Create new segment</span>\n </a>\n <a mat-menu-item (click)=\"manageSegmentsRequested.emit()\"\n [track]=\"['manage segment click', 'Feature flags & settings V2 page']\">\n <mat-icon>pie_chart</mat-icon><span>Manage segments</span>\n </a>\n </ng-template>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".segment-more{--mat-icon-button-touch-target-display: none;padding:0;line-height:1;margin-top:4px;height:28px;width:28px;display:inline-flex;align-items:center;justify-content:center}.segment-more .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.segment-more mat-icon{font-size:18px;width:18px;height:18px;color:#818181}select.ng-invalid{color:#00000061}select.ng-invalid option{color:#000}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i9.ConditionChipComponent, selector: "app-condition-chip", inputs: ["targetingRuleIndex", "conditionIndex"] }, { kind: "directive", type: i10.TrackingDirective, selector: "[track]", inputs: ["track"] }] }); }
|
|
29
|
-
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SegmentConditionComponent, decorators: [{
|
|
31
|
-
type: Component,
|
|
32
|
-
args: [{ selector: 'app-segment-condition', template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/segment-condition/\" target=\"_blank\"\n rel=\"noopener noreferrer\" class=\"user-link\">user</a></div>\n </div>\n\n <div class=\"targeting-rule-component pad-right\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl [formControl]=\"formGroup.controls.comparator\" matTooltip=\"Segment comparator\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl [formControl]=\"formGroup.controls.segmentId\" matTooltip=\"Segment\">\n <option [ngValue]=\"null\" disabled selected hidden *ngIf=\"segments.length\">Select segment ...\n </option>\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\"\n [title]=\"segment.description\">\n {{segment.name}}\n </option>\n <option *ngIf=\"segments.length === 0\" disabled>\n no segments available\n </option>\n </select>\n <mat-error *ngIf=\"formGroup.controls.segmentId.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.segmentId)}}\n </mat-error>\n </mat-form-field>\n </div>\n <button class=\"segment-more\" type=\"button\" mat-icon-button *ngIf=\"canManageSegments\"\n matTooltip=\"Create and manage segments\" [matMenuTriggerFor]=\"segmentMenu\"\n [track]=\"['segment menu click', 'feature flags and settings']\">\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\n </button>\n </div>\n</div>\n\n<mat-menu #segmentMenu=\"matMenu\">\n <ng-template matMenuContent>\n <a mat-menu-item (click)=\"createSegmentRequested.emit()\"\n [track]=\"['create segment click', 'Feature flags & settings V2 page']\">\n <mat-icon>add</mat-icon><span>Create new segment</span>\n </a>\n <a mat-menu-item (click)=\"manageSegmentsRequested.emit()\"\n [track]=\"['manage segment click', 'Feature flags & settings V2 page']\">\n <mat-icon>pie_chart</mat-icon><span>Manage segments</span>\n </a>\n </ng-template>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".segment-more{--mat-icon-button-touch-target-display: none;padding:0;line-height:1;margin-top:4px;height:28px;width:28px;display:inline-flex;align-items:center;justify-content:center}.segment-more .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.segment-more mat-icon{font-size:18px;width:18px;height:18px;color:#818181}select.ng-invalid{color:#00000061}select.ng-invalid option{color:#000}\n"] }]
|
|
33
|
-
}], propDecorators: { targetingRuleIndex: [{
|
|
34
|
-
type: Input
|
|
35
|
-
}], conditionIndex: [{
|
|
36
|
-
type: Input
|
|
37
|
-
}], formGroup: [{
|
|
38
|
-
type: Input
|
|
39
|
-
}], segments: [{
|
|
40
|
-
type: Input
|
|
41
|
-
}], canManageSegments: [{
|
|
42
|
-
type: Input
|
|
43
|
-
}], createSegmentRequested: [{
|
|
44
|
-
type: Output
|
|
45
|
-
}], manageSegmentsRequested: [{
|
|
46
|
-
type: Output
|
|
47
|
-
}] } });
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC1jb25kaXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy9ldmFsdWF0aW9uLWZvcm11bGEvdGFyZ2V0aW5nLXJ1bGUvY29uZGl0aW9ucy9zZWdtZW50LWNvbmRpdGlvbi9zZWdtZW50LWNvbmRpdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS90YXJnZXRpbmctcnVsZS9jb25kaXRpb25zL3NlZ21lbnQtY29uZGl0aW9uL3NlZ21lbnQtY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLFVBQVUsRUFBa0MsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVTVHLE1BQU0sT0FBTyx5QkFBeUI7SUFSdEM7UUFjWSwyQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVDLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdkQsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUV4Qix1QkFBa0IsR0FBRztZQUNuQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUN6RCxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFO1NBQ2pFLENBQUM7S0FLSDtJQUhDLGFBQWE7UUFDWCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQzsrR0FsQlUseUJBQXlCO21HQUF6Qix5QkFBeUIsOFZDWnRDLDhsR0EyRFc7OzRGRC9DRSx5QkFBeUI7a0JBUnJDLFNBQVM7K0JBQ0UsdUJBQXVCOzhCQVF4QixrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybUhlbHBlciwgU2VnbWVudENvbmRpdGlvbkZvcm0sIElTZWdtZW50LCBTZWdtZW50Q29tcGFyYXRvciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2Jvb3RzdHJhcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zZWdtZW50LWNvbmRpdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWdtZW50LWNvbmRpdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuLi8uLi8uLi9jb21wb25lbnRzLnNjc3MnLFxuICAgICcuL3NlZ21lbnQtY29uZGl0aW9uLmNvbXBvbmVudC5zY3NzJ1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNlZ21lbnRDb25kaXRpb25Db21wb25lbnQge1xuICBASW5wdXQoKSB0YXJnZXRpbmdSdWxlSW5kZXg6IG51bWJlcjtcbiAgQElucHV0KCkgY29uZGl0aW9uSW5kZXg6IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybUdyb3VwOiBGb3JtR3JvdXA8U2VnbWVudENvbmRpdGlvbkZvcm0+O1xuICBASW5wdXQoKSBzZWdtZW50czogSVNlZ21lbnRbXTtcbiAgQElucHV0KCkgY2FuTWFuYWdlU2VnbWVudHM6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSBjcmVhdGVTZWdtZW50UmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbWFuYWdlU2VnbWVudHNSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgRm9ybUhlbHBlciA9IEZvcm1IZWxwZXI7XG5cbiAgc2VnbWVudENvbXBhcmF0b3JzID0gW1xuICAgIHsgdmFsdWU6IFNlZ21lbnRDb21wYXJhdG9yLklzSW4sIGxhYmVsOiAnSVMgSU4gU0VHTUVOVCcgfSxcbiAgICB7IHZhbHVlOiBTZWdtZW50Q29tcGFyYXRvci5Jc05vdEluLCBsYWJlbDogJ0lTIE5PVCBJTiBTRUdNRU5UJyB9LFxuICBdO1xuXG4gIGNyZWF0ZVNlZ21lbnQoKSB7XG4gICAgdGhpcy5jcmVhdGVTZWdtZW50UmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWxpbmUgc21hbGxlc3QtZm9ybS1maWVsZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJleHBsYW5hdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxhcHAtY29uZGl0aW9uLWNoaXAgW3RhcmdldGluZ1J1bGVJbmRleF09XCJ0YXJnZXRpbmdSdWxlSW5kZXhcIlxuICAgICAgICAgICAgW2NvbmRpdGlvbkluZGV4XT1cImNvbmRpdGlvbkluZGV4XCI+PC9hcHAtY29uZGl0aW9uLWNoaXA+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV4cGxhbmF0aW9uXCI+PGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL3RhcmdldGluZy90YXJnZXRpbmctcnVsZS9zZWdtZW50LWNvbmRpdGlvbi9cIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBjbGFzcz1cInVzZXItbGlua1wiPnVzZXI8L2E+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IHBhZC1yaWdodFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yXCIgbWF0VG9vbHRpcD1cIlNlZ21lbnQgY29tcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygc2VnbWVudENvbXBhcmF0b3JzXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IpfX1cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyLWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1jb21wb25lbnRcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5zZWdtZW50SWRcIiBtYXRUb29sdGlwPVwiU2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4gKm5nSWY9XCJzZWdtZW50cy5sZW5ndGhcIj5TZWxlY3Qgc2VnbWVudCAuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHNcIiBbbmdWYWx1ZV09XCJzZWdtZW50LnNlZ21lbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwic2VnbWVudC5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tzZWdtZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInNlZ21lbnRzLmxlbmd0aCA9PT0gMFwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgbm8gc2VnbWVudHMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMuc2VnbWVudElkLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuc2VnbWVudElkKX19XG4gICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlZ21lbnQtbW9yZVwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJjYW5NYW5hZ2VTZWdtZW50c1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VnbWVudHNcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2VnbWVudE1lbnVcIlxuICAgICAgICAgICAgW3RyYWNrXT1cIlsnc2VnbWVudCBtZW51IGNsaWNrJywgJ2ZlYXR1cmUgZmxhZ3MgYW5kIHNldHRpbmdzJ11cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBbaW5saW5lXT1cInRydWVcIj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LW1lbnUgI3NlZ21lbnRNZW51PVwibWF0TWVudVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICAgICAgPGEgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY3JlYXRlU2VnbWVudFJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAgICAgW3RyYWNrXT1cIlsnY3JlYXRlIHNlZ21lbnQgY2xpY2snLCAnRmVhdHVyZSBmbGFncyAmIHNldHRpbmdzIFYyIHBhZ2UnXVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+PHNwYW4+Q3JlYXRlIG5ldyBzZWdtZW50PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxhIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm1hbmFnZVNlZ21lbnRzUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgICAgICBbdHJhY2tdPVwiWydtYW5hZ2Ugc2VnbWVudCBjbGljaycsICdGZWF0dXJlIGZsYWdzICYgc2V0dGluZ3MgVjIgcGFnZSddXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+cGllX2NoYXJ0PC9tYXQtaWNvbj48c3Bhbj5NYW5hZ2Ugc2VnbWVudHM8L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT4iXX0=
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import { UserComparator } from '../../../../../../../bootstrap';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/dialog";
|
|
6
|
-
import * as i2 from "@angular/common";
|
|
7
|
-
import * as i3 from "@angular/forms";
|
|
8
|
-
import * as i4 from "@angular/material/button";
|
|
9
|
-
import * as i5 from "@angular/material/icon";
|
|
10
|
-
import * as i6 from "@angular/material/tooltip";
|
|
11
|
-
import * as i7 from "@angular/cdk/drag-drop";
|
|
12
|
-
import * as i8 from "@angular/material/button-toggle";
|
|
13
|
-
import * as i9 from "@angular/material/radio";
|
|
14
|
-
var ComparatorGroup;
|
|
15
|
-
(function (ComparatorGroup) {
|
|
16
|
-
ComparatorGroup[ComparatorGroup["Text"] = 0] = "Text";
|
|
17
|
-
ComparatorGroup[ComparatorGroup["Number"] = 1] = "Number";
|
|
18
|
-
ComparatorGroup[ComparatorGroup["Semver"] = 2] = "Semver";
|
|
19
|
-
ComparatorGroup[ComparatorGroup["DateTime"] = 3] = "DateTime";
|
|
20
|
-
ComparatorGroup[ComparatorGroup["Array"] = 4] = "Array";
|
|
21
|
-
})(ComparatorGroup || (ComparatorGroup = {}));
|
|
22
|
-
export class ComparatorDialogComponent {
|
|
23
|
-
constructor(dialogRef, data) {
|
|
24
|
-
this.dialogRef = dialogRef;
|
|
25
|
-
this.data = data;
|
|
26
|
-
this.ComparatorGroup = ComparatorGroup;
|
|
27
|
-
this.selectedGroup = ComparatorGroup.Text;
|
|
28
|
-
this.selectedComparator = UserComparator.TextEquals;
|
|
29
|
-
this.isConfidential = true;
|
|
30
|
-
this.lastConfidentialValue = true;
|
|
31
|
-
this.confidentialEnabled = true;
|
|
32
|
-
this.UserComparator = UserComparator;
|
|
33
|
-
this.comparisonAttributeTooltip = "User Object's value passed to the SDK (Comparison attribute)";
|
|
34
|
-
this.comparisonValueTooltip = "Comparison value set on the ConfigCat Dashboard";
|
|
35
|
-
this.comparators = [
|
|
36
|
-
{ value: UserComparator.TextEquals, sensitiveValue: UserComparator.SensitiveTextEquals, group: ComparatorGroup.Text, label: 'EQUALS', description: "Checks whether the User Object's comparison attribute passed to the SDK is equal to the comparison value set on the ConfigCat Dashboard" },
|
|
37
|
-
{ value: UserComparator.TextDoesNotEqual, sensitiveValue: UserComparator.SensitiveTextDoesNotEqual, group: ComparatorGroup.Text, label: 'NOT EQUALS', description: "Checks whether the User Object's comparison attribute passed to the SDK is not equal to the comparison value" },
|
|
38
|
-
{ value: UserComparator.IsOneOf, sensitiveValue: UserComparator.SensitiveIsOneOf, group: ComparatorGroup.Text, label: 'IS ONE OF', description: "Checks whether the User Object's comparison attribute passed to the SDK is equal to any of the comparison values" },
|
|
39
|
-
{ value: UserComparator.IsNotOneOf, sensitiveValue: UserComparator.SensitiveIsNotOneOf, group: ComparatorGroup.Text, label: 'IS NOT ONE OF', description: "Checks whether the User Object's comparison attribute passed to the SDK is not equal to any of the comparison values" },
|
|
40
|
-
{ value: UserComparator.TextStartsWithAnyOf, sensitiveValue: UserComparator.SensitiveTextStartsWithAnyOf, group: ComparatorGroup.Text, label: 'STARTS WITH ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK starts with any of the comparison values" },
|
|
41
|
-
{ value: UserComparator.TextNotStartsWithAnyOf, sensitiveValue: UserComparator.SensitiveTextNotStartsWithAnyOf, group: ComparatorGroup.Text, label: 'NOT STARTS WITH ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK does not start with any of the comparison values" },
|
|
42
|
-
{ value: UserComparator.TextEndsWithAnyOf, sensitiveValue: UserComparator.SensitiveTextEndsWithAnyOf, group: ComparatorGroup.Text, label: 'ENDS WITH ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK ends with any of the comparison values" },
|
|
43
|
-
{ value: UserComparator.TextNotEndsWithAnyOf, sensitiveValue: UserComparator.SensitiveTextNotEndsWithAnyOf, group: ComparatorGroup.Text, label: 'NOT ENDS WITH ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK does not end with any of the comparison values" },
|
|
44
|
-
{ value: UserComparator.ContainsAnyOf, group: ComparatorGroup.Text, label: 'CONTAINS ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK contains any comparison values as a substring" },
|
|
45
|
-
{ value: UserComparator.DoesNotContainAnyOf, group: ComparatorGroup.Text, label: 'DOES NOT CONTAIN ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK does not contain any comparison values as a substring" },
|
|
46
|
-
{ value: UserComparator.NumberEquals, group: ComparatorGroup.Number, label: '= (EQUALS)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is equal to the comparison value" },
|
|
47
|
-
{ value: UserComparator.NumberDoesNotEqual, group: ComparatorGroup.Number, label: '!= (NOT EQUALS)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is not equal to the comparison value" },
|
|
48
|
-
{ value: UserComparator.NumberLess, group: ComparatorGroup.Number, label: '< (LESS THAN)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is less than the comparison value" },
|
|
49
|
-
{ value: UserComparator.NumberLessOrEquals, group: ComparatorGroup.Number, label: '<= (LESS THAN OR EQUAL)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is less than or equal to the comparison value" },
|
|
50
|
-
{ value: UserComparator.NumberGreater, group: ComparatorGroup.Number, label: '> (GREATER THAN)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is greater than the comparison value" },
|
|
51
|
-
{ value: UserComparator.NumberGreaterOrEquals, group: ComparatorGroup.Number, label: '>= (GRATER THAN OR EQUAL)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a decimal number) is greater than or equal to the comparison value" },
|
|
52
|
-
{ value: UserComparator.SemVerIsOneOf, group: ComparatorGroup.Semver, label: 'IS ONE OF', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is equal to any of the comparison values" },
|
|
53
|
-
{ value: UserComparator.SemVerIsNotOneOf, group: ComparatorGroup.Semver, label: 'IS NOT ONE OF', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is not equal to any of the comparison values" },
|
|
54
|
-
{ value: UserComparator.SemVerLess, group: ComparatorGroup.Semver, label: '< (LESS THAN)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is less than the comparison value" },
|
|
55
|
-
{ value: UserComparator.SemVerLessOrEquals, group: ComparatorGroup.Semver, label: '<= (LESS THAN OR EQUAL)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is less than or equal to the comparison value" },
|
|
56
|
-
{ value: UserComparator.SemVerGreater, group: ComparatorGroup.Semver, label: '> (GREATER THAN)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is greater than the comparison value" },
|
|
57
|
-
{ value: UserComparator.SemVerGreaterOrEquals, group: ComparatorGroup.Semver, label: '>= (GRATER THAN OR EQUAL)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a semantic version) is greater than or equal to the comparison value" },
|
|
58
|
-
{ value: UserComparator.DateTimeBefore, group: ComparatorGroup.DateTime, label: 'BEFORE (UTC)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as the seconds elapsed since Unix Epoch) is less than the comparison value" },
|
|
59
|
-
{ value: UserComparator.DateTimeAfter, group: ComparatorGroup.DateTime, label: 'AFTER (UTC)', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as the seconds elapsed since Unix Epoch) is greater than the comparison value.value" },
|
|
60
|
-
{ value: UserComparator.ArrayContainsAnyOf, group: ComparatorGroup.Array, sensitiveValue: UserComparator.SensitiveArrayContainsAnyOf, label: 'ARRAY CONTAINS ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a string list) contains any of the comparison values" },
|
|
61
|
-
{ value: UserComparator.ArrayDoesNotContainAnyOf, group: ComparatorGroup.Array, sensitiveValue: UserComparator.SensitiveArrayDoesNotContainAnyOf, label: 'ARRAY NOT CONTAINS ANY OF', description: "Checks whether the User Object's comparison attribute passed to the SDK (interpreted as a string list) does not contain any of the comparison values" },
|
|
62
|
-
];
|
|
63
|
-
}
|
|
64
|
-
ngOnInit() {
|
|
65
|
-
const selected = this.comparators.find(c => c.value === this.data.selectedComparator || c.sensitiveValue === this.data.selectedComparator);
|
|
66
|
-
this.selectedGroup = selected.group;
|
|
67
|
-
this.selectedComparator = selected.value;
|
|
68
|
-
this.isConfidential = this.data.selectedComparator === selected.sensitiveValue;
|
|
69
|
-
this.lastConfidentialValue = !selected.sensitiveValue ? true : this.isConfidential;
|
|
70
|
-
this.confidentialEnabled = !!selected.sensitiveValue;
|
|
71
|
-
}
|
|
72
|
-
listComparators(group) {
|
|
73
|
-
return this.comparators.filter(c => c.group === group);
|
|
74
|
-
}
|
|
75
|
-
changeGroup(group) {
|
|
76
|
-
this.selectedGroup = group;
|
|
77
|
-
}
|
|
78
|
-
confidentialChange(confidential) {
|
|
79
|
-
if (!this.confidentialEnabled || this.data.readOnly) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
this.isConfidential = this.lastConfidentialValue = confidential;
|
|
83
|
-
}
|
|
84
|
-
comparatorChange(comp) {
|
|
85
|
-
if (this.data.readOnly) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
this.selectedComparator = comp;
|
|
89
|
-
const selected = this.comparators.find(c => c.value === comp || c.sensitiveValue === comp);
|
|
90
|
-
this.confidentialEnabled = !!selected.sensitiveValue;
|
|
91
|
-
if (!this.confidentialEnabled) {
|
|
92
|
-
this.isConfidential = false;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this.isConfidential = this.lastConfidentialValue;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
set() {
|
|
99
|
-
const selected = this.comparators.find(c => c.value === this.selectedComparator || c.sensitiveValue === this.selectedComparator);
|
|
100
|
-
const result = this.isConfidential && selected.sensitiveValue ? selected.sensitiveValue : selected.value;
|
|
101
|
-
this.dialogRef.close(result);
|
|
102
|
-
}
|
|
103
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComparatorDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
104
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ComparatorDialogComponent, selector: "app-comparator-dialog", ngImport: i0, template: "<h2 mat-dialog-title cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle class=\"draggable\">Comparator selector</h2>\n<div class=\"tabs\">\n <mat-button-toggle-group [ngModel]=\"selectedGroup\" (ngModelChange)=\"changeGroup($event)\">\n <mat-button-toggle [value]=\"ComparatorGroup.Text\">Text</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Number\">Number</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Semver\">Semantic version</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.DateTime\">Datetime</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Array\">Array</mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<div mat-dialog-content class=\"container\" [ngSwitch]=\"selectedGroup\">\n <div *ngSwitchCase=\"ComparatorGroup.Text\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain string/text.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Text}\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"confidential\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Number\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain numbers.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Number}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Semver\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain semantic versions.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Semver}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.DateTime\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain datetimes.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.DateTime}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Array\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain items of a string/text list.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Array}\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"confidential\"></ng-container>\n </div>\n</div>\n<div mat-dialog-actions>\n <button *ngIf=\"!data.readOnly\" type=\"button\" mat-flat-button color=\"primary\" (click)=\"set()\">Set</button>\n <button *ngIf=\"!data.readOnly\" type=\"button\" mat-stroked-button mat-dialog-close>Cancel</button>\n <button *ngIf=\"data.readOnly\" type=\"button\" mat-stroked-button color=\"primary\" mat-dialog-close>Close</button>\n</div>\n\n<ng-template #comparators let-group=\"group\">\n <div>\n <mat-radio-group (change)=\"comparatorChange($event.value)\">\n <div class=\"comparator-container\">\n <div class=\"item\" [ngClass]=\"'col-' + i % 2\" [class.selected]=\"comparator.value === selectedComparator\" \n *ngFor=\"let comparator of listComparators(group); let i = index\" (click)=\"comparatorChange(comparator.value)\"> \n <mat-radio-button color=\"primary\" [value]=\"comparator.value\" [disabled]=\"data.readOnly\"\n [checked]=\"comparator.value === selectedComparator\" [matTooltip]=\"comparator.description\">\n <div class=\"title\">\n {{comparator.label}}\n </div>\n </mat-radio-button>\n <div class=\"description\">\n <div class=\"example\">\n <ng-container [ngSwitch]=\"comparator.value\">\n\n <!-- TEXT -->\n <ng-container *ngSwitchCase=\"UserComparator.TextEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> EQUALS <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">bob@foo.com</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextDoesNotEqual\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">alice@foo.com</span> NOT EQUALS <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">bob@foo.com</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.IsOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">iOS</span> IS ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Android, macOS, <span class=\"match-val\">iOS</span> ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.IsNotOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">iOS</span> IS NOT ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Android, macOS, Windows ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextStartsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> STARTS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">bob</span>, jane ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextNotStartsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">alice@foo.com</span> NOT STARTS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ bob, jane ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextEndsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> ENDS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">@foo.com</span>, @bar.com ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextNotEndsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@example.com</span> NOT ENDS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ @foo.com, @bar.com ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.ContainsAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">https://test-app.foo.com</span> CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">test</span>, localhost ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.DoesNotContainAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">https://app.foo.com</span> NOT CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ test, localhost ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- NUMBER -->\n\n <ng-container *ngSwitchCase=\"UserComparator.NumberEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">42</span> = <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberDoesNotEqual\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">42</span> != <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">3.14</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberLess\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">3.14</span> < <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberLessOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">3.14</span> <= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberGreater\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">69</span> > <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberGreaterOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">69</span> >= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n\n <!-- SEMVER -->\n\n <ng-container *ngSwitchCase=\"UserComparator.SemVerIsOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> IS ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">1.0.0</span>, 4.3.5 ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerIsNotOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2.1.0</span> IS NOT ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ 1.0.0, 4.3.5 ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerLess\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> < <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.2.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerLessOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> <= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.2.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerGreater\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> > <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.0.0-alpha</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerGreaterOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.2.0</span> >= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.1.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- DATETIME -->\n\n <ng-container *ngSwitchCase=\"UserComparator.DateTimeBefore\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2020.11.05 10:36:24</span> BEFORE <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">2020.11.05 12:00:00</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.DateTimeAfter\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2020.11.05 15:41:06</span> AFTER <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">2020.11.05 12:00:00</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- ARRAY -->\n\n <ng-container *ngSwitchCase=\"UserComparator.ArrayContainsAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">[ Writer, Reader ]</span> ARRAY CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">Writer</span>, Admin ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.ArrayDoesNotContainAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">[ Guest, Reader ]</span> ARRAY NOT CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Writer, Admin ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </mat-radio-group>\n </div>\n</ng-template>\n\n<ng-template #confidential>\n <p>Select how the <i>comparison values</i> should be persisted:</p>\n <div matTooltip=\"The currently selected comparator does not support hashed comparison values, they will be presented as cleartext in the config JSON.\"\n [matTooltipDisabled]=\"confidentialEnabled\">\n <mat-radio-group class=\"confidential-container\" (change)=\"confidentialChange($event.value)\">\n <div class=\"confidential item\" (click)=\"confidentialChange(true)\">\n <mat-radio-button color=\"primary\" [value]=\"true\" [checked]=\"isConfidential\" [disabled]=\"!confidentialEnabled || data.readOnly\">\n <div class=\"title\">\n <div class=\"text\">Hashed</div>\n <div class=\"icon\"><mat-icon>lock</mat-icon></div>\n </div>\n </mat-radio-button>\n <div class=\"description\">\n We recommend using this option in case of frontend applications targeting users based on sensitive data (like email addresses, names, etc). \n \n </div>\n </div>\n <div class=\"cleartext item\" (click)=\"confidentialChange(false)\">\n <mat-radio-button color=\"primary\" [value]=\"false\" [checked]=\"!isConfidential\" [disabled]=\"!confidentialEnabled || data.readOnly\">\n <div class=\"title\">\n <div class=\"text\">Cleartext</div>\n <div class=\"icon\"><mat-icon>lock_open_right</mat-icon></div>\n </div>\n </mat-radio-button>\n <div class=\"description\">\n You can use this option when you target users based on non-sensitive data. Comparison values will be presented as plain text in the <i>config JSON</i>.\n </div>\n </div>\n </mat-radio-group>\n </div>\n</ng-template>", styles: [".container{width:100%;padding:0 24px!important}.container .confidential-container{display:flex;flex-direction:row;margin-bottom:15px}.container .confidential-container .item{flex:50%;border:1px solid rgb(224,224,224);cursor:pointer;padding:5px 5px 10px;border-radius:5px}.container .confidential-container .confidential{margin-right:5px}.container .confidential-container .cleartext{margin-left:5px}.container .confidential-container .title{cursor:pointer;display:flex;flex-direction:row;align-items:center}.container .confidential-container .title .text{font-weight:700}.container .confidential-container .title .icon{margin-left:3px}.container .confidential-container .title .icon mat-icon{font-size:18px;width:18px;height:18px}.container .confidential-container .description{font-size:12px;padding-left:10px;line-height:16px}.container .comparator-container{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.container .comparator-container .item{flex:0 0 calc(50% - 17px);border:1px solid rgb(224,224,224);cursor:pointer;padding:5px 5px 10px;border-radius:5px;margin-bottom:10px}.container .comparator-container .col-0{margin-right:5px}.container .comparator-container .col-1{margin-left:5px}.container .comparator-container .title{cursor:pointer;font-weight:700}.container .comparator-container .description{font-size:12px;line-height:16px;padding-left:10px;cursor:pointer}.container .comparator-container .description .example{background-color:#f1f1f1;opacity:.8;padding:3px 5px;border-radius:5px;display:inline-block}.container .comparator-container .description .example .comp-attr{font-weight:600;font-style:italic;padding-right:3px}.container .comparator-container .description .example .comp-val{padding-left:3px;padding-right:3px;font-style:italic}.container .comparator-container .description .example .match-val{font-weight:600}.container .comparator-container .description .example .arrow{color:#636363}.container .comparator-container .selected{border-color:#f7a224}.tabs{margin:0 24px}.mat-button-toggle-group{flex-wrap:wrap}@media (max-width: 500px){.container .comparator-container .item{flex:100%}.container .comparator-container .col-0{margin-right:0}.container .comparator-container .col-1{margin-left:0}.container .confidential-container{flex-wrap:wrap}.container .confidential-container .item{flex:100%}.container .confidential-container .confidential{margin-right:0;margin-bottom:10px}.container .confidential-container .cleartext{margin-left:0}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i8.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i8.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: i9.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i9.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }] }); }
|
|
105
|
-
}
|
|
106
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComparatorDialogComponent, decorators: [{
|
|
107
|
-
type: Component,
|
|
108
|
-
args: [{ selector: 'app-comparator-dialog', template: "<h2 mat-dialog-title cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle class=\"draggable\">Comparator selector</h2>\n<div class=\"tabs\">\n <mat-button-toggle-group [ngModel]=\"selectedGroup\" (ngModelChange)=\"changeGroup($event)\">\n <mat-button-toggle [value]=\"ComparatorGroup.Text\">Text</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Number\">Number</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Semver\">Semantic version</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.DateTime\">Datetime</mat-button-toggle>\n <mat-button-toggle [value]=\"ComparatorGroup.Array\">Array</mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<div mat-dialog-content class=\"container\" [ngSwitch]=\"selectedGroup\">\n <div *ngSwitchCase=\"ComparatorGroup.Text\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain string/text.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Text}\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"confidential\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Number\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain numbers.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Number}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Semver\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain semantic versions.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Semver}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.DateTime\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain datetimes.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.DateTime}\"></ng-container>\n </div>\n\n <div *ngSwitchCase=\"ComparatorGroup.Array\">\n <p>The following comparators assume that the <i>comparison attribute's</i> value (set on the SDK's <a href=\"https://configcat.com/docs/targeting/user-object\" target=\"_blank\" rel=\"noopener noreferrer\">User Object</a>) and the <i>comparison value</i> contain items of a string/text list.</p>\n <ng-container [ngTemplateOutlet]=\"comparators\" [ngTemplateOutletContext]=\"{group:ComparatorGroup.Array}\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"confidential\"></ng-container>\n </div>\n</div>\n<div mat-dialog-actions>\n <button *ngIf=\"!data.readOnly\" type=\"button\" mat-flat-button color=\"primary\" (click)=\"set()\">Set</button>\n <button *ngIf=\"!data.readOnly\" type=\"button\" mat-stroked-button mat-dialog-close>Cancel</button>\n <button *ngIf=\"data.readOnly\" type=\"button\" mat-stroked-button color=\"primary\" mat-dialog-close>Close</button>\n</div>\n\n<ng-template #comparators let-group=\"group\">\n <div>\n <mat-radio-group (change)=\"comparatorChange($event.value)\">\n <div class=\"comparator-container\">\n <div class=\"item\" [ngClass]=\"'col-' + i % 2\" [class.selected]=\"comparator.value === selectedComparator\" \n *ngFor=\"let comparator of listComparators(group); let i = index\" (click)=\"comparatorChange(comparator.value)\"> \n <mat-radio-button color=\"primary\" [value]=\"comparator.value\" [disabled]=\"data.readOnly\"\n [checked]=\"comparator.value === selectedComparator\" [matTooltip]=\"comparator.description\">\n <div class=\"title\">\n {{comparator.label}}\n </div>\n </mat-radio-button>\n <div class=\"description\">\n <div class=\"example\">\n <ng-container [ngSwitch]=\"comparator.value\">\n\n <!-- TEXT -->\n <ng-container *ngSwitchCase=\"UserComparator.TextEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> EQUALS <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">bob@foo.com</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextDoesNotEqual\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">alice@foo.com</span> NOT EQUALS <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">bob@foo.com</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.IsOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">iOS</span> IS ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Android, macOS, <span class=\"match-val\">iOS</span> ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.IsNotOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">iOS</span> IS NOT ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Android, macOS, Windows ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextStartsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> STARTS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">bob</span>, jane ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextNotStartsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">alice@foo.com</span> NOT STARTS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ bob, jane ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextEndsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@foo.com</span> ENDS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">@foo.com</span>, @bar.com ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.TextNotEndsWithAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">bob@example.com</span> NOT ENDS WITH ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ @foo.com, @bar.com ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.ContainsAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">https://test-app.foo.com</span> CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">test</span>, localhost ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.DoesNotContainAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">https://app.foo.com</span> NOT CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ test, localhost ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- NUMBER -->\n\n <ng-container *ngSwitchCase=\"UserComparator.NumberEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">42</span> = <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberDoesNotEqual\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">42</span> != <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">3.14</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberLess\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">3.14</span> < <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberLessOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">3.14</span> <= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberGreater\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">69</span> > <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.NumberGreaterOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">69</span> >= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">42</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n\n <!-- SEMVER -->\n\n <ng-container *ngSwitchCase=\"UserComparator.SemVerIsOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> IS ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">1.0.0</span>, 4.3.5 ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerIsNotOneOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2.1.0</span> IS NOT ONE OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ 1.0.0, 4.3.5 ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerLess\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> < <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.2.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerLessOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> <= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.2.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerGreater\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.0.0</span> > <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.0.0-alpha</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.SemVerGreaterOrEquals\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">1.2.0</span> >= <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">1.1.0</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- DATETIME -->\n\n <ng-container *ngSwitchCase=\"UserComparator.DateTimeBefore\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2020.11.05 10:36:24</span> BEFORE <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">2020.11.05 12:00:00</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.DateTimeAfter\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">2020.11.05 15:41:06</span> AFTER <span class=\"comp-val match-val\" [matTooltip]=\"comparisonValueTooltip\">2020.11.05 12:00:00</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n <!-- ARRAY -->\n\n <ng-container *ngSwitchCase=\"UserComparator.ArrayContainsAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">[ Writer, Reader ]</span> ARRAY CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ <span class=\"match-val\">Writer</span>, Admin ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n <ng-container *ngSwitchCase=\"UserComparator.ArrayDoesNotContainAnyOf\">\n <span class=\"comp-attr\" [matTooltip]=\"comparisonAttributeTooltip\">[ Guest, Reader ]</span> ARRAY NOT CONTAINS ANY OF <span class=\"comp-val\" [matTooltip]=\"comparisonValueTooltip\">[ Writer, Admin ]</span> <span class=\"arrow\">\u2794</span> true\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </mat-radio-group>\n </div>\n</ng-template>\n\n<ng-template #confidential>\n <p>Select how the <i>comparison values</i> should be persisted:</p>\n <div matTooltip=\"The currently selected comparator does not support hashed comparison values, they will be presented as cleartext in the config JSON.\"\n [matTooltipDisabled]=\"confidentialEnabled\">\n <mat-radio-group class=\"confidential-container\" (change)=\"confidentialChange($event.value)\">\n <div class=\"confidential item\" (click)=\"confidentialChange(true)\">\n <mat-radio-button color=\"primary\" [value]=\"true\" [checked]=\"isConfidential\" [disabled]=\"!confidentialEnabled || data.readOnly\">\n <div class=\"title\">\n <div class=\"text\">Hashed</div>\n <div class=\"icon\"><mat-icon>lock</mat-icon></div>\n </div>\n </mat-radio-button>\n <div class=\"description\">\n We recommend using this option in case of frontend applications targeting users based on sensitive data (like email addresses, names, etc). \n \n </div>\n </div>\n <div class=\"cleartext item\" (click)=\"confidentialChange(false)\">\n <mat-radio-button color=\"primary\" [value]=\"false\" [checked]=\"!isConfidential\" [disabled]=\"!confidentialEnabled || data.readOnly\">\n <div class=\"title\">\n <div class=\"text\">Cleartext</div>\n <div class=\"icon\"><mat-icon>lock_open_right</mat-icon></div>\n </div>\n </mat-radio-button>\n <div class=\"description\">\n You can use this option when you target users based on non-sensitive data. Comparison values will be presented as plain text in the <i>config JSON</i>.\n </div>\n </div>\n </mat-radio-group>\n </div>\n</ng-template>", styles: [".container{width:100%;padding:0 24px!important}.container .confidential-container{display:flex;flex-direction:row;margin-bottom:15px}.container .confidential-container .item{flex:50%;border:1px solid rgb(224,224,224);cursor:pointer;padding:5px 5px 10px;border-radius:5px}.container .confidential-container .confidential{margin-right:5px}.container .confidential-container .cleartext{margin-left:5px}.container .confidential-container .title{cursor:pointer;display:flex;flex-direction:row;align-items:center}.container .confidential-container .title .text{font-weight:700}.container .confidential-container .title .icon{margin-left:3px}.container .confidential-container .title .icon mat-icon{font-size:18px;width:18px;height:18px}.container .confidential-container .description{font-size:12px;padding-left:10px;line-height:16px}.container .comparator-container{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.container .comparator-container .item{flex:0 0 calc(50% - 17px);border:1px solid rgb(224,224,224);cursor:pointer;padding:5px 5px 10px;border-radius:5px;margin-bottom:10px}.container .comparator-container .col-0{margin-right:5px}.container .comparator-container .col-1{margin-left:5px}.container .comparator-container .title{cursor:pointer;font-weight:700}.container .comparator-container .description{font-size:12px;line-height:16px;padding-left:10px;cursor:pointer}.container .comparator-container .description .example{background-color:#f1f1f1;opacity:.8;padding:3px 5px;border-radius:5px;display:inline-block}.container .comparator-container .description .example .comp-attr{font-weight:600;font-style:italic;padding-right:3px}.container .comparator-container .description .example .comp-val{padding-left:3px;padding-right:3px;font-style:italic}.container .comparator-container .description .example .match-val{font-weight:600}.container .comparator-container .description .example .arrow{color:#636363}.container .comparator-container .selected{border-color:#f7a224}.tabs{margin:0 24px}.mat-button-toggle-group{flex-wrap:wrap}@media (max-width: 500px){.container .comparator-container .item{flex:100%}.container .comparator-container .col-0{margin-right:0}.container .comparator-container .col-1{margin-left:0}.container .confidential-container{flex-wrap:wrap}.container .confidential-container .item{flex:100%}.container .confidential-container .confidential{margin-right:0;margin-bottom:10px}.container .confidential-container .cleartext{margin-left:0}}\n"] }]
|
|
109
|
-
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
110
|
-
type: Inject,
|
|
111
|
-
args: [MAT_DIALOG_DATA]
|
|
112
|
-
}] }] });
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFyYXRvci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy9ldmFsdWF0aW9uLWZvcm11bGEvdGFyZ2V0aW5nLXJ1bGUvY29uZGl0aW9ucy91c2VyLWNvbmRpdGlvbi9jb21wYXJhdG9yLWRpYWxvZy9jb21wYXJhdG9yLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS90YXJnZXRpbmctcnVsZS9jb25kaXRpb25zL3VzZXItY29uZGl0aW9uL2NvbXBhcmF0b3ItZGlhbG9nL2NvbXBhcmF0b3ItZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7OztBQUVoRSxJQUFLLGVBTUo7QUFORCxXQUFLLGVBQWU7SUFDbEIscURBQVEsQ0FBQTtJQUNSLHlEQUFVLENBQUE7SUFDVix5REFBVSxDQUFBO0lBQ1YsNkRBQVksQ0FBQTtJQUNaLHVEQUFTLENBQUE7QUFDWCxDQUFDLEVBTkksZUFBZSxLQUFmLGVBQWUsUUFNbkI7QUFlRCxNQUFNLE9BQU8seUJBQXlCO0lBOENwQyxZQUNTLFNBQWtELEVBQ3pCLElBQVM7UUFEbEMsY0FBUyxHQUFULFNBQVMsQ0FBeUM7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBSztRQTlDM0Msb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ3JDLHVCQUFrQixHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFDL0MsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUMzQixtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUVoQywrQkFBMEIsR0FBRyw4REFBOEQsQ0FBQztRQUM1RiwyQkFBc0IsR0FBRyxpREFBaUQsQ0FBQztRQUUzRSxnQkFBVyxHQUFxQjtZQUM5QixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUseUlBQXlJLEVBQUU7WUFDOVIsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsOEdBQThHLEVBQUU7WUFDblIsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGtIQUFrSCxFQUFFO1lBQ3BRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxzSEFBc0gsRUFBRTtZQUNsUixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGtIQUFrSCxFQUFFO1lBQ3JTLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLCtCQUErQixFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsMEhBQTBILEVBQUU7WUFDdlQsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxnSEFBZ0gsRUFBRTtZQUM3UixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLHdIQUF3SCxFQUFFO1lBQy9TLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSx1SEFBdUgsRUFBRTtZQUNwTyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLHlCQUF5QixFQUFFLFdBQVcsRUFBRSwrSEFBK0gsRUFBRTtZQUUxUCxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLDRJQUE0SSxFQUFFO1lBQ3JQLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGdKQUFnSixFQUFFO1lBQ3BRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsNklBQTZJLEVBQUU7WUFDdlAsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUseUpBQXlKLEVBQUU7WUFDclIsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGdKQUFnSixFQUFFO1lBQ2hRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsV0FBVyxFQUFFLDRKQUE0SixFQUFFO1lBRTdSLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0pBQXNKLEVBQUU7WUFDL1AsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLDBKQUEwSixFQUFFO1lBQzFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsK0lBQStJLEVBQUU7WUFDelAsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUsMkpBQTJKLEVBQUU7WUFDdlIsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGtKQUFrSixFQUFFO1lBQ2xRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsV0FBVyxFQUFFLDhKQUE4SixFQUFFO1lBRS9SLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsaUtBQWlLLEVBQUU7WUFDaFIsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSwwS0FBMEssRUFBRTtZQUV2UixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLDhJQUE4SSxFQUFFO1lBQ25VLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxXQUFXLEVBQUUsc0pBQXNKLEVBQUU7U0FDNVYsQ0FBQTtJQUk4QyxDQUFDO0lBRWhELFFBQVE7UUFDTixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzSSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDL0UsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ25GLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQXNCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxXQUFXLENBQUMsS0FBc0I7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELGtCQUFrQixDQUFDLFlBQXFCO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFlBQVksQ0FBQztJQUNsRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBb0I7UUFDbkMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqSSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDekcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQzsrR0E3RlUseUJBQXlCLDhDQWdEMUIsZUFBZTttR0FoRGQseUJBQXlCLDZEQ3pCdEMsczVqQkFpTWM7OzRGRHhLRCx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCOzswQkFvRDlCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFVzZXJDb21wYXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vLi4vYm9vdHN0cmFwJztcblxuZW51bSBDb21wYXJhdG9yR3JvdXAge1xuICBUZXh0ID0gMCxcbiAgTnVtYmVyID0gMSxcbiAgU2VtdmVyID0gMixcbiAgRGF0ZVRpbWUgPSAzLFxuICBBcnJheSA9IDRcbn1cblxuaW50ZXJmYWNlIENvbXBhcmF0b3JJdGVtIHtcbiAgdmFsdWU6IFVzZXJDb21wYXJhdG9yLFxuICBzZW5zaXRpdmVWYWx1ZT86IFVzZXJDb21wYXJhdG9yLFxuICBsYWJlbDogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICBncm91cDogQ29tcGFyYXRvckdyb3VwLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY29tcGFyYXRvci1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcGFyYXRvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wYXJhdG9yLWRpYWxvZy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBDb21wYXJhdG9yR3JvdXAgPSBDb21wYXJhdG9yR3JvdXA7XG4gIHNlbGVjdGVkR3JvdXAgPSBDb21wYXJhdG9yR3JvdXAuVGV4dDtcbiAgc2VsZWN0ZWRDb21wYXJhdG9yID0gVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFscztcbiAgaXNDb25maWRlbnRpYWwgPSB0cnVlO1xuICBsYXN0Q29uZmlkZW50aWFsVmFsdWUgPSB0cnVlO1xuICBjb25maWRlbnRpYWxFbmFibGVkID0gdHJ1ZTtcbiAgVXNlckNvbXBhcmF0b3IgPSBVc2VyQ29tcGFyYXRvcjtcblxuICBjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcCA9IFwiVXNlciBPYmplY3QncyB2YWx1ZSBwYXNzZWQgdG8gdGhlIFNESyAoQ29tcGFyaXNvbiBhdHRyaWJ1dGUpXCI7XG4gIGNvbXBhcmlzb25WYWx1ZVRvb2x0aXAgPSBcIkNvbXBhcmlzb24gdmFsdWUgc2V0IG9uIHRoZSBDb25maWdDYXQgRGFzaGJvYXJkXCI7XG5cbiAgY29tcGFyYXRvcnM6IENvbXBhcmF0b3JJdGVtW10gPSBbXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFscywgc2Vuc2l0aXZlVmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZVRleHRFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdFUVVBTFMnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBpcyBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiB2YWx1ZSBzZXQgb24gdGhlIENvbmZpZ0NhdCBEYXNoYm9hcmRcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHREb2VzTm90RXF1YWwsIHNlbnNpdGl2ZVZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RG9lc05vdEVxdWFsLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGxhYmVsOiAnTk9UIEVRVUFMUycsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIGlzIG5vdCBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuSXNPbmVPZiwgc2Vuc2l0aXZlVmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdJUyBPTkUgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBpcyBlcXVhbCB0byBhbnkgb2YgdGhlIGNvbXBhcmlzb24gdmFsdWVzXCIgfSxcbiAgICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Jc05vdE9uZU9mLCBzZW5zaXRpdmVWYWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBjb21wYXJpc29uIHZhbHVlc1wiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dFN0YXJ0c1dpdGhBbnlPZiwgc2Vuc2l0aXZlVmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZVRleHRTdGFydHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdTVEFSVFMgV0lUSCBBTlkgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBzdGFydHMgd2l0aCBhbnkgb2YgdGhlIGNvbXBhcmlzb24gdmFsdWVzXCIgfSxcbiAgICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBzZW5zaXRpdmVWYWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBsYWJlbDogJ05PVCBTVEFSVFMgV0lUSCBBTlkgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBkb2VzIG5vdCBzdGFydCB3aXRoIGFueSBvZiB0aGUgY29tcGFyaXNvbiB2YWx1ZXNcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHRFbmRzV2l0aEFueU9mLCBzZW5zaXRpdmVWYWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdFTkRTIFdJVEggQU5ZIE9GJywgZGVzY3JpcHRpb246IFwiQ2hlY2tzIHdoZXRoZXIgdGhlIFVzZXIgT2JqZWN0J3MgY29tcGFyaXNvbiBhdHRyaWJ1dGUgcGFzc2VkIHRvIHRoZSBTREsgZW5kcyB3aXRoIGFueSBvZiB0aGUgY29tcGFyaXNvbiB2YWx1ZXNcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHROb3RFbmRzV2l0aEFueU9mLCBzZW5zaXRpdmVWYWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdOT1QgRU5EUyBXSVRIIEFOWSBPRicsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIGRvZXMgbm90IGVuZCB3aXRoIGFueSBvZiB0aGUgY29tcGFyaXNvbiB2YWx1ZXNcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdDT05UQUlOUyBBTlkgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyBjb250YWlucyBhbnkgY29tcGFyaXNvbiB2YWx1ZXMgYXMgYSBzdWJzdHJpbmdcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkRvZXNOb3RDb250YWluQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgbGFiZWw6ICdET0VTIE5PVCBDT05UQUlOIEFOWSBPRicsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvbXBhcmlzb24gdmFsdWVzIGFzIGEgc3Vic3RyaW5nXCIgfSxcblxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckVxdWFscywgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5OdW1iZXIsIGxhYmVsOiAnPSAoRVFVQUxTKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIGRlY2ltYWwgbnVtYmVyKSBpcyBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyRG9lc05vdEVxdWFsLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgbGFiZWw6ICchPSAoTk9UIEVRVUFMUyknLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyAoaW50ZXJwcmV0ZWQgYXMgYSBkZWNpbWFsIG51bWJlcikgaXMgbm90IGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIHZhbHVlXCIgfSxcbiAgICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5OdW1iZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgbGFiZWw6ICc8IChMRVNTIFRIQU4pJywgZGVzY3JpcHRpb246IFwiQ2hlY2tzIHdoZXRoZXIgdGhlIFVzZXIgT2JqZWN0J3MgY29tcGFyaXNvbiBhdHRyaWJ1dGUgcGFzc2VkIHRvIHRoZSBTREsgKGludGVycHJldGVkIGFzIGEgZGVjaW1hbCBudW1iZXIpIGlzIGxlc3MgdGhhbiB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgbGFiZWw6ICc8PSAoTEVTUyBUSEFOIE9SIEVRVUFMKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIGRlY2ltYWwgbnVtYmVyKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvbXBhcmlzb24gdmFsdWVcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckdyZWF0ZXIsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBsYWJlbDogJz4gKEdSRUFURVIgVEhBTiknLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyAoaW50ZXJwcmV0ZWQgYXMgYSBkZWNpbWFsIG51bWJlcikgaXMgZ3JlYXRlciB0aGFuIHRoZSBjb21wYXJpc29uIHZhbHVlXCIgfSxcbiAgICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBsYWJlbDogJz49IChHUkFURVIgVEhBTiBPUiBFUVVBTCknLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyAoaW50ZXJwcmV0ZWQgYXMgYSBkZWNpbWFsIG51bWJlcikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIHZhbHVlXCIgfSxcblxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlcklzT25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuU2VtdmVyLCBsYWJlbDogJ0lTIE9ORSBPRicsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHZlcnNpb24pIGlzIGVxdWFsIHRvIGFueSBvZiB0aGUgY29tcGFyaXNvbiB2YWx1ZXNcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuU2VtdmVyLCBsYWJlbDogJ0lTIE5PVCBPTkUgT0YnLCBkZXNjcmlwdGlvbjogXCJDaGVja3Mgd2hldGhlciB0aGUgVXNlciBPYmplY3QncyBjb21wYXJpc29uIGF0dHJpYnV0ZSBwYXNzZWQgdG8gdGhlIFNESyAoaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyB2ZXJzaW9uKSBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBjb21wYXJpc29uIHZhbHVlc1wiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzcywgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW12ZXIsIGxhYmVsOiAnPCAoTEVTUyBUSEFOKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHZlcnNpb24pIGlzIGxlc3MgdGhhbiB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbXZlciwgbGFiZWw6ICc8PSAoTEVTUyBUSEFOIE9SIEVRVUFMKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHZlcnNpb24pIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlciwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW12ZXIsIGxhYmVsOiAnPiAoR1JFQVRFUiBUSEFOKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHZlcnNpb24pIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbXZlciwgbGFiZWw6ICc+PSAoR1JBVEVSIFRIQU4gT1IgRVFVQUwpJywgZGVzY3JpcHRpb246IFwiQ2hlY2tzIHdoZXRoZXIgdGhlIFVzZXIgT2JqZWN0J3MgY29tcGFyaXNvbiBhdHRyaWJ1dGUgcGFzc2VkIHRvIHRoZSBTREsgKGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgdmVyc2lvbikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIHZhbHVlXCIgfSxcblxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkRhdGVUaW1lQmVmb3JlLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBsYWJlbDogJ0JFRk9SRSAoVVRDKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyB0aGUgc2Vjb25kcyBlbGFwc2VkIHNpbmNlIFVuaXggRXBvY2gpIGlzIGxlc3MgdGhhbiB0aGUgY29tcGFyaXNvbiB2YWx1ZVwiIH0sXG4gICAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuRGF0ZVRpbWVBZnRlciwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5EYXRlVGltZSwgbGFiZWw6ICdBRlRFUiAoVVRDKScsIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB3aGV0aGVyIHRoZSBVc2VyIE9iamVjdCdzIGNvbXBhcmlzb24gYXR0cmlidXRlIHBhc3NlZCB0byB0aGUgU0RLIChpbnRlcnByZXRlZCBhcyB0aGUgc2Vjb25kcyBlbGFwc2VkIHNpbmNlIFVuaXggRXBvY2gpIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29tcGFyaXNvbiB2YWx1ZS52YWx1ZVwiIH0sXG5cbiAgICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5BcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQXJyYXksIHNlbnNpdGl2ZVZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVBcnJheUNvbnRhaW5zQW55T2YsIGxhYmVsOiAnQVJSQVkgQ09OVEFJTlMgQU5ZIE9GJywgZGVzY3JpcHRpb246IFwiQ2hlY2tzIHdoZXRoZXIgdGhlIFVzZXIgT2JqZWN0J3MgY29tcGFyaXNvbiBhdHRyaWJ1dGUgcGFzc2VkIHRvIHRoZSBTREsgKGludGVycHJldGVkIGFzIGEgc3RyaW5nIGxpc3QpIGNvbnRhaW5zIGFueSBvZiB0aGUgY29tcGFyaXNvbiB2YWx1ZXNcIiB9LFxuICAgIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkFycmF5RG9lc05vdENvbnRhaW5BbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5BcnJheSwgc2Vuc2l0aXZlVmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUFycmF5RG9lc05vdENvbnRhaW5BbnlPZiwgbGFiZWw6ICdBUlJBWSBOT1QgQ09OVEFJTlMgQU5ZIE9GJywgZGVzY3JpcHRpb246IFwiQ2hlY2tzIHdoZXRoZXIgdGhlIFVzZXIgT2JqZWN0J3MgY29tcGFyaXNvbiBhdHRyaWJ1dGUgcGFzc2VkIHRvIHRoZSBTREsgKGludGVycHJldGVkIGFzIGEgc3RyaW5nIGxpc3QpIGRvZXMgbm90IGNvbnRhaW4gYW55IG9mIHRoZSBjb21wYXJpc29uIHZhbHVlc1wiIH0sXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q29tcGFyYXRvckRpYWxvZ0NvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnkpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jb21wYXJhdG9ycy5maW5kKGMgPT4gYy52YWx1ZSA9PT0gdGhpcy5kYXRhLnNlbGVjdGVkQ29tcGFyYXRvciB8fCBjLnNlbnNpdGl2ZVZhbHVlID09PSB0aGlzLmRhdGEuc2VsZWN0ZWRDb21wYXJhdG9yKTtcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXAgPSBzZWxlY3RlZC5ncm91cDtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcGFyYXRvciA9IHNlbGVjdGVkLnZhbHVlO1xuICAgIHRoaXMuaXNDb25maWRlbnRpYWwgPSB0aGlzLmRhdGEuc2VsZWN0ZWRDb21wYXJhdG9yID09PSBzZWxlY3RlZC5zZW5zaXRpdmVWYWx1ZTtcbiAgICB0aGlzLmxhc3RDb25maWRlbnRpYWxWYWx1ZSA9ICFzZWxlY3RlZC5zZW5zaXRpdmVWYWx1ZSA/IHRydWUgOiB0aGlzLmlzQ29uZmlkZW50aWFsO1xuICAgIHRoaXMuY29uZmlkZW50aWFsRW5hYmxlZCA9ICEhc2VsZWN0ZWQuc2Vuc2l0aXZlVmFsdWU7XG4gIH1cblxuICBsaXN0Q29tcGFyYXRvcnMoZ3JvdXA6IENvbXBhcmF0b3JHcm91cCk6IENvbXBhcmF0b3JJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmF0b3JzLmZpbHRlcihjID0+IGMuZ3JvdXAgPT09IGdyb3VwKTtcbiAgfVxuXG4gIGNoYW5nZUdyb3VwKGdyb3VwOiBDb21wYXJhdG9yR3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXAgPSBncm91cDtcbiAgfVxuXG4gIGNvbmZpZGVudGlhbENoYW5nZShjb25maWRlbnRpYWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlkZW50aWFsRW5hYmxlZCB8fCB0aGlzLmRhdGEucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0NvbmZpZGVudGlhbCA9IHRoaXMubGFzdENvbmZpZGVudGlhbFZhbHVlID0gY29uZmlkZW50aWFsO1xuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZShjb21wOiBVc2VyQ29tcGFyYXRvcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkQ29tcGFyYXRvciA9IGNvbXA7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmNvbXBhcmF0b3JzLmZpbmQoYyA9PiBjLnZhbHVlID09PSBjb21wIHx8IGMuc2Vuc2l0aXZlVmFsdWUgPT09IGNvbXApO1xuICAgIHRoaXMuY29uZmlkZW50aWFsRW5hYmxlZCA9ICEhc2VsZWN0ZWQuc2Vuc2l0aXZlVmFsdWU7XG4gICAgaWYgKCF0aGlzLmNvbmZpZGVudGlhbEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNDb25maWRlbnRpYWwgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NvbmZpZGVudGlhbCA9IHRoaXMubGFzdENvbmZpZGVudGlhbFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuY29tcGFyYXRvcnMuZmluZChjID0+IGMudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRDb21wYXJhdG9yIHx8IGMuc2Vuc2l0aXZlVmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRDb21wYXJhdG9yKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzQ29uZmlkZW50aWFsICYmIHNlbGVjdGVkLnNlbnNpdGl2ZVZhbHVlID8gc2VsZWN0ZWQuc2Vuc2l0aXZlVmFsdWUgOiBzZWxlY3RlZC52YWx1ZTtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXN1bHQpO1xuICB9XG59XG4iLCI8aDIgbWF0LWRpYWxvZy10aXRsZSBjZGtEcmFnIGNka0RyYWdSb290RWxlbWVudD1cIi5jZGstb3ZlcmxheS1wYW5lXCIgY2RrRHJhZ0hhbmRsZSBjbGFzcz1cImRyYWdnYWJsZVwiPkNvbXBhcmF0b3Igc2VsZWN0b3I8L2gyPlxuPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgW25nTW9kZWxdPVwic2VsZWN0ZWRHcm91cFwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUdyb3VwKCRldmVudClcIj5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJDb21wYXJhdG9yR3JvdXAuVGV4dFwiPlRleHQ8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIkNvbXBhcmF0b3JHcm91cC5OdW1iZXJcIj5OdW1iZXI8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIkNvbXBhcmF0b3JHcm91cC5TZW12ZXJcIj5TZW1hbnRpYyB2ZXJzaW9uPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJDb21wYXJhdG9yR3JvdXAuRGF0ZVRpbWVcIj5EYXRldGltZTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiQ29tcGFyYXRvckdyb3VwLkFycmF5XCI+QXJyYXk8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG48L2Rpdj5cblxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJjb250YWluZXJcIiBbbmdTd2l0Y2hdPVwic2VsZWN0ZWRHcm91cFwiPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkNvbXBhcmF0b3JHcm91cC5UZXh0XCI+XG4gICAgICAgIDxwPlRoZSBmb2xsb3dpbmcgY29tcGFyYXRvcnMgYXNzdW1lIHRoYXQgdGhlIDxpPmNvbXBhcmlzb24gYXR0cmlidXRlJ3M8L2k+IHZhbHVlIChzZXQgb24gdGhlIFNESydzIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy90YXJnZXRpbmcvdXNlci1vYmplY3RcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+VXNlciBPYmplY3Q8L2E+KSBhbmQgdGhlIDxpPmNvbXBhcmlzb24gdmFsdWU8L2k+IGNvbnRhaW4gc3RyaW5nL3RleHQuPC9wPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBhcmF0b3JzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntncm91cDpDb21wYXJhdG9yR3JvdXAuVGV4dH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb25maWRlbnRpYWxcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkNvbXBhcmF0b3JHcm91cC5OdW1iZXJcIj5cbiAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb21wYXJhdG9ycyBhc3N1bWUgdGhhdCB0aGUgPGk+Y29tcGFyaXNvbiBhdHRyaWJ1dGUnczwvaT4gdmFsdWUgKHNldCBvbiB0aGUgU0RLJ3MgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL3RhcmdldGluZy91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5Vc2VyIE9iamVjdDwvYT4pIGFuZCB0aGUgPGk+Y29tcGFyaXNvbiB2YWx1ZTwvaT4gY29udGFpbiBudW1iZXJzLjwvcD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wYXJhdG9yc1wiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Z3JvdXA6Q29tcGFyYXRvckdyb3VwLk51bWJlcn1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkNvbXBhcmF0b3JHcm91cC5TZW12ZXJcIj5cbiAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb21wYXJhdG9ycyBhc3N1bWUgdGhhdCB0aGUgPGk+Y29tcGFyaXNvbiBhdHRyaWJ1dGUnczwvaT4gdmFsdWUgKHNldCBvbiB0aGUgU0RLJ3MgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL3RhcmdldGluZy91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5Vc2VyIE9iamVjdDwvYT4pIGFuZCB0aGUgPGk+Y29tcGFyaXNvbiB2YWx1ZTwvaT4gY29udGFpbiBzZW1hbnRpYyB2ZXJzaW9ucy48L3A+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29tcGFyYXRvcnNcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2dyb3VwOkNvbXBhcmF0b3JHcm91cC5TZW12ZXJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJDb21wYXJhdG9yR3JvdXAuRGF0ZVRpbWVcIj5cbiAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb21wYXJhdG9ycyBhc3N1bWUgdGhhdCB0aGUgPGk+Y29tcGFyaXNvbiBhdHRyaWJ1dGUnczwvaT4gdmFsdWUgKHNldCBvbiB0aGUgU0RLJ3MgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL3RhcmdldGluZy91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5Vc2VyIE9iamVjdDwvYT4pIGFuZCB0aGUgPGk+Y29tcGFyaXNvbiB2YWx1ZTwvaT4gY29udGFpbiBkYXRldGltZXMuPC9wPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBhcmF0b3JzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntncm91cDpDb21wYXJhdG9yR3JvdXAuRGF0ZVRpbWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJDb21wYXJhdG9yR3JvdXAuQXJyYXlcIj5cbiAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb21wYXJhdG9ycyBhc3N1bWUgdGhhdCB0aGUgPGk+Y29tcGFyaXNvbiBhdHRyaWJ1dGUnczwvaT4gdmFsdWUgKHNldCBvbiB0aGUgU0RLJ3MgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL3RhcmdldGluZy91c2VyLW9iamVjdFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5Vc2VyIE9iamVjdDwvYT4pIGFuZCB0aGUgPGk+Y29tcGFyaXNvbiB2YWx1ZTwvaT4gY29udGFpbiBpdGVtcyBvZiBhIHN0cmluZy90ZXh0IGxpc3QuPC9wPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBhcmF0b3JzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntncm91cDpDb21wYXJhdG9yR3JvdXAuQXJyYXl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29uZmlkZW50aWFsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b24gKm5nSWY9XCIhZGF0YS5yZWFkT25seVwiIHR5cGU9XCJidXR0b25cIiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNldCgpXCI+U2V0PC9idXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIiFkYXRhLnJlYWRPbmx5XCIgdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJkYXRhLnJlYWRPbmx5XCIgdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXQtZGlhbG9nLWNsb3NlPkNsb3NlPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb21wYXJhdG9ycyBsZXQtZ3JvdXA9XCJncm91cFwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgKGNoYW5nZSk9XCJjb21wYXJhdG9yQ2hhbmdlKCRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wYXJhdG9yLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCIgW25nQ2xhc3NdPVwiJ2NvbC0nICsgaSAlIDJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiY29tcGFyYXRvci52YWx1ZSA9PT0gc2VsZWN0ZWRDb21wYXJhdG9yXCIgXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIGxpc3RDb21wYXJhdG9ycyhncm91cCk7IGxldCBpID0gaW5kZXhcIiAoY2xpY2spPVwiY29tcGFyYXRvckNoYW5nZShjb21wYXJhdG9yLnZhbHVlKVwiPiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFt2YWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCIgW2Rpc2FibGVkXT1cImRhdGEucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjb21wYXJhdG9yLnZhbHVlID09PSBzZWxlY3RlZENvbXBhcmF0b3JcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJhdG9yLmRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBhcmF0b3IudmFsdWVcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRFWFQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlRleHRFcXVhbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj5ib2ImIzY0O2Zvby5jb208L3NwYW4+IEVRVUFMUyA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj5ib2ImIzY0O2Zvby5jb208L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlRleHREb2VzTm90RXF1YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj5hbGljZSYjNjQ7Zm9vLmNvbTwvc3Bhbj4gTk9UIEVRVUFMUyA8c3BhbiBjbGFzcz1cImNvbXAtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPmJvYiYjNjQ7Zm9vLmNvbTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJhcnJvd1wiPuKelDwvc3Bhbj4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuSXNPbmVPZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPmlPUzwvc3Bhbj4gSVMgT05FIE9GIDxzcGFuIGNsYXNzPVwiY29tcC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+WyBBbmRyb2lkLCBtYWNPUywgPHNwYW4gY2xhc3M9XCJtYXRjaC12YWxcIj5pT1M8L3NwYW4+IF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLklzTm90T25lT2ZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj5pT1M8L3NwYW4+IElTIE5PVCBPTkUgT0YgPHNwYW4gY2xhc3M9XCJjb21wLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj5bIEFuZHJvaWQsIG1hY09TLCBXaW5kb3dzIF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlRleHRTdGFydHNXaXRoQW55T2ZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj5ib2ImIzY0O2Zvby5jb208L3NwYW4+IFNUQVJUUyBXSVRIIEFOWSBPRiA8c3BhbiBjbGFzcz1cImNvbXAtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPlsgPHNwYW4gY2xhc3M9XCJtYXRjaC12YWxcIj5ib2I8L3NwYW4+LCBqYW5lIF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlRleHROb3RTdGFydHNXaXRoQW55T2ZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj5hbGljZSYjNjQ7Zm9vLmNvbTwvc3Bhbj4gTk9UIFNUQVJUUyBXSVRIIEFOWSBPRiA8c3BhbiBjbGFzcz1cImNvbXAtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPlsgYm9iLCBqYW5lIF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlRleHRFbmRzV2l0aEFueU9mXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+Ym9iJiM2NDtmb28uY29tPC9zcGFuPiBFTkRTIFdJVEggQU5ZIE9GIDxzcGFuIGNsYXNzPVwiY29tcC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+WyA8c3BhbiBjbGFzcz1cIm1hdGNoLXZhbFwiPiYjNjQ7Zm9vLmNvbTwvc3Bhbj4sICYjNjQ7YmFyLmNvbSBdPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5UZXh0Tm90RW5kc1dpdGhBbnlPZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPmJvYiYjNjQ7ZXhhbXBsZS5jb208L3NwYW4+IE5PVCBFTkRTIFdJVEggQU5ZIE9GIDxzcGFuIGNsYXNzPVwiY29tcC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+WyAmIzY0O2Zvby5jb20sICYjNjQ7YmFyLmNvbSBdPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5Db250YWluc0FueU9mXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+aHR0cHM6Ly90ZXN0LWFwcC5mb28uY29tPC9zcGFuPiBDT05UQUlOUyBBTlkgT0YgPHNwYW4gY2xhc3M9XCJjb21wLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj5bIDxzcGFuIGNsYXNzPVwibWF0Y2gtdmFsXCI+dGVzdDwvc3Bhbj4sIGxvY2FsaG9zdCBdPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbkFueU9mXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+aHR0cHM6Ly9hcHAuZm9vLmNvbTwvc3Bhbj4gTk9UIENPTlRBSU5TIEFOWSBPRiA8c3BhbiBjbGFzcz1cImNvbXAtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPlsgdGVzdCwgbG9jYWxob3N0IF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOVU1CRVIgLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuTnVtYmVyRXF1YWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+NDI8L3NwYW4+ID0gPHNwYW4gY2xhc3M9XCJjb21wLXZhbCBtYXRjaC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+NDI8L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPjQyPC9zcGFuPiAhPSA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj4zLjE0PC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5OdW1iZXJMZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+My4xNDwvc3Bhbj4gJmx0OyA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj40Mjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJhcnJvd1wiPuKelDwvc3Bhbj4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+My4xNDwvc3Bhbj4gJmx0Oz0gPHNwYW4gY2xhc3M9XCJjb21wLXZhbCBtYXRjaC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+NDI8L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj42OTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj40Mjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJhcnJvd1wiPuKelDwvc3Bhbj4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+Njk8L3NwYW4+ICZndDs9IDxzcGFuIGNsYXNzPVwiY29tcC12YWwgbWF0Y2gtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPjQyPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTRU1WRVIgLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPjEuMC4wPC9zcGFuPiBJUyBPTkUgT0YgPHNwYW4gY2xhc3M9XCJjb21wLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj5bIDxzcGFuIGNsYXNzPVwibWF0Y2gtdmFsXCI+MS4wLjA8L3NwYW4+LCA0LjMuNSBdPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+Mi4xLjA8L3NwYW4+IElTIE5PVCBPTkUgT0YgPHNwYW4gY2xhc3M9XCJjb21wLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj5bIDEuMC4wLCA0LjMuNSBdPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5TZW1WZXJMZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+MS4wLjA8L3NwYW4+ICZsdDsgPHNwYW4gY2xhc3M9XCJjb21wLXZhbCBtYXRjaC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+MS4yLjA8L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLlNlbVZlckxlc3NPckVxdWFsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPjEuMC4wPC9zcGFuPiAmbHQ7PSA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj4xLjIuMDwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJhcnJvd1wiPuKelDwvc3Bhbj4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVXNlckNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPjEuMC4wPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPVwiY29tcC12YWwgbWF0Y2gtdmFsXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvblZhbHVlVG9vbHRpcFwiPjEuMC4wLWFscGhhPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5TZW1WZXJHcmVhdGVyT3JFcXVhbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcC1hdHRyXCIgW21hdFRvb2x0aXBdPVwiY29tcGFyaXNvbkF0dHJpYnV0ZVRvb2x0aXBcIj4xLjIuMDwvc3Bhbj4gJmd0Oz0gPHNwYW4gY2xhc3M9XCJjb21wLXZhbCBtYXRjaC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+MS4xLjA8L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEQVRFVElNRSAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5EYXRlVGltZUJlZm9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPjIwMjAuMTEuMDUgMTA6MzY6MjQ8L3NwYW4+IEJFRk9SRSA8c3BhbiBjbGFzcz1cImNvbXAtdmFsIG1hdGNoLXZhbFwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25WYWx1ZVRvb2x0aXBcIj4yMDIwLjExLjA1IDEyOjAwOjAwPC9zcGFuPiA8c3BhbiBjbGFzcz1cImFycm93XCI+4p6UPC9zcGFuPiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJVc2VyQ29tcGFyYXRvci5EYXRlVGltZUFmdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXAtYXR0clwiIFttYXRUb29sdGlwXT1cImNvbXBhcmlzb25BdHRyaWJ1dGVUb29sdGlwXCI+MjAyMC4xMS4wNSAxNTo0MTowNjwvc3Bhbj4gQUZURVIgPHNwYW4gY2xhc3M9XCJjb21wLXZhbCBtYXRjaC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+MjAyMC4xMS4wNSAxMjowMDowMDwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJhcnJvd1wiPuKelDwvc3Bhbj4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFSUkFZIC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLkFycmF5Q29udGFpbnNBbnlPZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPlsgV3JpdGVyLCBSZWFkZXIgXTwvc3Bhbj4gQVJSQVkgQ09OVEFJTlMgQU5ZIE9GIDxzcGFuIGNsYXNzPVwiY29tcC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+WyA8c3BhbiBjbGFzcz1cIm1hdGNoLXZhbFwiPldyaXRlcjwvc3Bhbj4sIEFkbWluIF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlVzZXJDb21wYXJhdG9yLkFycmF5RG9lc05vdENvbnRhaW5BbnlPZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wLWF0dHJcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uQXR0cmlidXRlVG9vbHRpcFwiPlsgR3Vlc3QsIFJlYWRlciBdPC9zcGFuPiBBUlJBWSBOT1QgQ09OVEFJTlMgQU5ZIE9GIDxzcGFuIGNsYXNzPVwiY29tcC12YWxcIiBbbWF0VG9vbHRpcF09XCJjb21wYXJpc29uVmFsdWVUb29sdGlwXCI+WyBXcml0ZXIsIEFkbWluIF08L3NwYW4+IDxzcGFuIGNsYXNzPVwiYXJyb3dcIj7inpQ8L3NwYW4+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29uZmlkZW50aWFsPlxuICAgIDxwPlNlbGVjdCBob3cgdGhlIDxpPmNvbXBhcmlzb24gdmFsdWVzPC9pPiBzaG91bGQgYmUgcGVyc2lzdGVkOjwvcD5cbiAgICA8ZGl2IG1hdFRvb2x0aXA9XCJUaGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbXBhcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCBoYXNoZWQgY29tcGFyaXNvbiB2YWx1ZXMsIHRoZXkgd2lsbCBiZSBwcmVzZW50ZWQgYXMgY2xlYXJ0ZXh0IGluIHRoZSBjb25maWcgSlNPTi5cIlxuICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cImNvbmZpZGVudGlhbEVuYWJsZWRcIj5cbiAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImNvbmZpZGVudGlhbC1jb250YWluZXJcIiAoY2hhbmdlKT1cImNvbmZpZGVudGlhbENoYW5nZSgkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlkZW50aWFsIGl0ZW1cIiAoY2xpY2spPVwiY29uZmlkZW50aWFsQ2hhbmdlKHRydWUpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW3ZhbHVlXT1cInRydWVcIiBbY2hlY2tlZF09XCJpc0NvbmZpZGVudGlhbFwiIFtkaXNhYmxlZF09XCIhY29uZmlkZW50aWFsRW5hYmxlZCB8fCBkYXRhLnJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRcIj5IYXNoZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uPmxvY2s8L21hdC1pY29uPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIG9wdGlvbiBpbiBjYXNlIG9mIGZyb250ZW5kIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgdXNlcnMgYmFzZWQgb24gc2Vuc2l0aXZlIGRhdGEgKGxpa2UgZW1haWwgYWRkcmVzc2VzLCBuYW1lcywgZXRjKS4gXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJ0ZXh0IGl0ZW1cIiAoY2xpY2spPVwiY29uZmlkZW50aWFsQ2hhbmdlKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFt2YWx1ZV09XCJmYWxzZVwiIFtjaGVja2VkXT1cIiFpc0NvbmZpZGVudGlhbFwiIFtkaXNhYmxlZF09XCIhY29uZmlkZW50aWFsRW5hYmxlZCB8fCBkYXRhLnJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRcIj5DbGVhcnRleHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uPmxvY2tfb3Blbl9yaWdodDwvbWF0LWljb24+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gd2hlbiB5b3UgdGFyZ2V0IHVzZXJzIGJhc2VkIG9uIG5vbi1zZW5zaXRpdmUgZGF0YS4gQ29tcGFyaXNvbiB2YWx1ZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGxhaW4gdGV4dCBpbiB0aGUgPGk+Y29uZmlnIEpTT048L2k+LlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|