ngx-wapp-components 1.0.6 → 1.0.8

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.
@@ -342,10 +342,10 @@ export class WFilterPanelComponent {
342
342
  }
343
343
  }
344
344
  WFilterPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WFilterPanelComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ApiService }], target: i0.ɵɵFactoryTarget.Component });
345
- WFilterPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: WFilterPanelComponent, selector: "w-filter-panel", inputs: { authorizationApiUrl: ["apiUrl", "authorizationApiUrl"], commonDataApiUrl: "commonDataApiUrl", token: "token", commonDataToken: "commonDataToken", filterId: "filterId", dataIsLoadingSearchButton: "dataIsLoadingSearchButton", translationsObject: "translationsObject" }, outputs: { searchClicked: "searchClicked", clearClicked: "clearClicked" }, ngImport: i0, template: "<div *ngIf=\"queryConfigReady\" class=\"wapp-filter-panel-styles\">\r\n <div *ngIf=\"!filterPanelObject.allowAdvancedSearch; else baiscAndAdvanced\">\r\n <div class=\"filter-panel-container\">\r\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\r\n <div class=\"flex justify-content-end button-gap\">\r\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\r\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\"></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #baiscAndAdvanced>\r\n <div class=\"filter-panel-container\">\r\n <div *ngIf=\"!isAdvancedSearch; else advancedView\">\r\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\r\n </div>\r\n <ng-template #advancedView>\r\n <ng-container *ngTemplateOutlet=\"advanced\"></ng-container>\r\n </ng-template>\r\n\r\n <div class=\"flex justify-content-end button-gap\" [class.pt-3]=\"isAdvancedSearch\">\r\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\r\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\" [loading]=\"dataIsLoadingSearchButton\"></p-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #basic>\r\n <div *ngIf=\"filterPanelObject.allowAdvancedSearch\" class=\"flex justify-content-end flex-wrap\">\r\n <p-button [label]=\"translationsObject.advancedSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <div class=\"basic-filter-panel query-builder-style fadein animation-duration-500\">\r\n <query-builder [formControl]='queryCtrl' [config]='basicQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <ng-container *queryButtonGroup=\"let ruleset;\">\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small\" *ngIf=\"false\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small select-disabled\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" *ngIf=\"isAdvancedSearch\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-multiSelect class=\"field-gap\" [appendTo]=\"'body'\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" display=\"chip\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-multiSelect>\r\n </span>\r\n </ng-container>\r\n </query-builder>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!isAdvancedSearch && basicQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n\r\n <ng-template #advanced>\r\n <div [class.query-builder-style]=\"!filterPanelObject.allowRuleSet\" class=\"wapp-filter-panel-container fadein animation-duration-500\">\r\n <div *ngIf=\"filterPanelObject.allowRuleSet\" class=\"flex justify-content-end flex-wrap\">\r\n <p-button class=\"mb-2\" [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <query-builder [formControl]='advancedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <div *ngIf=\"filterPanelObject.allowRuleSet; else noRuleSet\">\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noRuleSet>\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <div class=\"flex justify-content-end flex-wrap\">\r\n <p-button [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <span class=\"advanced-query-button-group gap-3\">\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-container *queryArrowIcon>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <div *ngIf=\"ruleset\" class=\"switch-group-padding\">\r\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown *ngIf=\"filterPanelObject.enityMode\" class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width field-gap\">\r\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n </query-builder>\r\n\r\n <ng-container *ngIf=\"isAdvancedSearch && advancedQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Grouped filter -->\r\n <div *ngIf=\"filterPanelObject.allowGrouped\">\r\n <div class=\"py-5\">\r\n <wapp-view-card-title-text [cardTitle]=\"translationsObject.groupedFilterTitle\"></wapp-view-card-title-text>\r\n </div>\r\n\r\n <query-builder [formControl]='groupedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <div class=\"flex gap-3 mb-3\">\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryArrowIcon>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <div *ngIf=\"ruleset\">\r\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" *ngIf=\"filterPanelObject.enityMode\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"mr-3\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"mr-3\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"mr-3 query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n\r\n </query-builder>\r\n\r\n <ng-container *ngIf=\"isAdvancedSearch && groupedQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #noQueryData>\r\n <div class=\"flex justify-content-center flex-wrap card-container surface-50 mb-3\">\r\n <div class=\"flex align-items-center justify-content-center w-full h-4rem text-gray-900 border-round m-2\">\r\n {{translationsObject.noRulesLabel}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n", styles: [".heading1{font-size:3.1428571429rem;line-height:3.4285714286rem;font-weight:700}.heading2{font-size:2.8571428571rem;line-height:3.1428571429rem;font-weight:700}.heading3{font-size:2.5714285714rem;line-height:2.8571428571rem;font-weight:700}.heading4{font-size:2.2857142857rem;line-height:2.5714285714rem;font-weight:700}.heading5{font-size:2rem;line-height:2.2857142857rem;font-weight:700}.heading6{font-size:1.7142857143rem;line-height:2rem;font-weight:700}.subtitle1{font-size:1.4285714286rem;line-height:1.7142857143rem;font-weight:700}.subtitle2{font-size:1.1428571429rem;line-height:1.4285714286rem;font-weight:700}.body,.input-generic-placeholder-small,.input-generic-small{font-size:1rem;line-height:1.1428571429rem;font-weight:600}.caption{font-size:.8571428571rem;line-height:1.1428571429rem;font-weight:600}.icon-small-size{font-size:8px}.icon-small-x-size{font-size:12px}.icon-medium-size{font-size:16px}.icon-large-size{font-size:24px}.spacingXXS{padding:4px}.spacingXSM{padding:6px}.spacingXS{padding:8px}.spacingS{padding:12px}.spacingM{padding:16px}.spacingL{padding:20px}.spacingXL{padding:24px}.spacingXXL{padding:28px}.spacingXXXL{padding:32px}.focus{box-shadow:0 0 8px #00a6e980}.hover{border-radius:8px;border:2px solid #0085c7}.button-large-typography{font-size:20px;line-height:24px;font-weight:700}.button-medium-typography{font-size:16px;line-height:16px;font-weight:700}.button-small-typography{font-size:12px;line-height:16px;font-weight:700}.button-text-typography,.input-generic-label{font-size:14px;line-height:16px;font-weight:700}.input-generic-placeholder,.input-generic{font-size:16px;line-height:24px;font-weight:600}.input-generic-placeholder-small{padding:8px 12px 12px}.input-generic-valid{border-radius:8px;border:2px solid #B3FFD3}.input-generic-valid-focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}.input-generic-warning{border-radius:8px;border:2px solid #FFECB8!important}.input-generic-warning-focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}.input-generic-error{border-radius:8px;border:2px solid #FFBDBD}.tag-generic{font-size:14px;line-height:16px;font-weight:700}.tag-generic-small{font-size:12px;line-height:16px;font-weight:700}.filter-panel-container{padding:16px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;margin-bottom:0}::ng-deep .basic-filter-panel .q-row{padding:0!important;margin-bottom:8px!important}::ng-deep .wapp-filter-panel-container .q-row{padding:0!important;margin-bottom:8px!important}.field-gap{margin-right:8px}.button-gap{gap:16px}.switch-group-padding{padding-bottom:8px}::ng-deep .query-builder-style ul li{border:none!important;background:transparent!important;padding-left:0!important}::ng-deep .query-builder-style .q-connector:before{content:none!important}::ng-deep .query-builder-style .q-connector:after{border-width:0px!important}::ng-deep .query-builder-style .q-tree{padding:0!important}::ng-deep .query-builder-field-width .p-dropdown{width:20%}::ng-deep .query-builder-operator-width .p-dropdown{width:10%}.query-builder-input-width{width:40%}::ng-deep .query-builder-input-width .p-dropdown{width:40%}::ng-deep .query-builder-input-width .p-calendar{width:40%}.basic-filter-panel.query-builder-style,.wapp-filter-panel-container.query-builder-style{display:flex;flex-direction:column;justify-content:space-between;position:relative}.advanced-query-button-group{position:absolute;bottom:0;left:0;margin-bottom:-46px}.height-input{height:32px}.wapp-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::ng-deep .p-inputtext{padding:.75rem 12px}.wapp-input:hover{border:2px solid #0085c7!important}.wapp-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}::ng-deep .wapp-filter-panel-styles .p-button{height:32px;border-radius:8px;gap:8px}.toggle-button-align{display:inline-block;vertical-align:middle;margin-bottom:6px;margin-left:4px}::ng-deep .p-togglebutton.p-button{margin:4px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined,.p-buttonset.p-button-danger>.p-button.p-button-outlined,.p-splitbutton.p-button-danger>.p-button.p-button-outlined{background-color:transparent;color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined:enabled:hover,.p-buttonset.p-button-danger>.p-button.p-button-outlined:enabled:hover,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:enabled:hover{background:rgba(239,68,68,.04);color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .pi-times:before{padding-left:8px}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button{background:#ffffff;border:2px solid #e8eaed;color:#1e293b;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover{border:2px solid #0085c7}::ng-deep .wapp-filter-panel-styles .p-button:focus{box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown{font-weight:600;border-width:2px;border-radius:8px;border-color:#e8eaed;height:32px;margin:4px}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled):hover{border-width:2px;border:2px solid #0085c7!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 8px #00a6e980;border:2px solid #e0f5fc}:host ::ng-deep .w-edit-select-input-small .p-dropdown .p-placeholder{color:#bdc1c6}:host ::ng-deep .w-edit-select-input-small .p-inputtext{padding:6px 0 6px 12px}:host ::ng-deep .w-edit-select-input-small .p-dropdown .pi{font-size:.8rem}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel{padding:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items{padding:0}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:8px;margin-bottom:4px;font-weight:600}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item:hover{background:#e0f5fc;border-radius:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight{background:#e0f5fc;border-radius:8px;color:#000}:host ::ng-deep .w-edit-select-input-small .p-disabled{background:#ffffff;opacity:1}:host ::ng-deep .w-edit-select-input-small .p-disabled .p-inputtext{color:#bdc1c6}::ng-deep .select-disabled .p-dropdown .p-dropdown-trigger{display:none}:host ::ng-deep .height-input .p-inputnumber .p-inputnumber-input{height:32px!important}.wapp-input-number{width:40%!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:hover{border-radius:8px;border:2px solid #0085c7!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:disabled{background-color:#e8eaed}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #B3FFD3!important}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFECB8!important}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFBDBD}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFBDBD;box-shadow:0 0 2px 2px #ffbdbd!important;padding-left:16px}.success-alert-text{color:#00db5d;padding:8px}.warning-alert-text{color:#eeae00;padding:8px}.error-alert-text{color:#e50000;padding:8px}.alert-message-height{height:35px}\n"], dependencies: [{ kind: "directive", type: i3.InputText, selector: "[pInputText]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "component", type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i10.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i11.ToggleButton, selector: "p-toggleButton", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "iconPos"], outputs: ["onChange"] }, { kind: "component", type: i12.QueryBuilderComponent, selector: "query-builder", inputs: ["data", "allowRuleset", "allowCollapse", "emptyMessage", "config", "persistValueOnFieldChange", "value", "disabled", "classNames", "operatorMap", "parentValue", "parentArrowIconTemplate", "parentInputTemplates", "parentOperatorTemplate", "parentFieldTemplate", "parentEntityTemplate", "parentSwitchGroupTemplate", "parentButtonGroupTemplate", "parentRemoveButtonTemplate", "parentEmptyWarningTemplate", "parentChangeCallback", "parentTouchedCallback"] }, { kind: "directive", type: i12.QueryInputDirective, selector: "[queryInput]", inputs: ["queryInputType"] }, { kind: "directive", type: i12.QueryOperatorDirective, selector: "[queryOperator]" }, { kind: "directive", type: i12.QueryFieldDirective, selector: "[queryField]" }, { kind: "directive", type: i12.QueryEntityDirective, selector: "[queryEntity]" }, { kind: "directive", type: i12.QueryButtonGroupDirective, selector: "[queryButtonGroup]" }, { kind: "directive", type: i12.QuerySwitchGroupDirective, selector: "[querySwitchGroup]" }, { kind: "directive", type: i12.QueryRemoveButtonDirective, selector: "[queryRemoveButton]" }, { kind: "directive", type: i12.QueryArrowIconDirective, selector: "[queryArrowIcon]" }, { kind: "component", type: i13.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i14.WListFieldComponent, selector: "w-list-field", inputs: ["options", "operator", "placeholder", "onlyDropdown"] }, { kind: "component", type: i15.WappViewCardTitleTextComponent, selector: "wapp-view-card-title-text", inputs: ["cardTitle"] }] });
345
+ WFilterPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: WFilterPanelComponent, selector: "w-filter-panel", inputs: { authorizationApiUrl: ["apiUrl", "authorizationApiUrl"], commonDataApiUrl: "commonDataApiUrl", token: "token", commonDataToken: "commonDataToken", filterId: "filterId", dataIsLoadingSearchButton: "dataIsLoadingSearchButton", translationsObject: "translationsObject" }, outputs: { searchClicked: "searchClicked", clearClicked: "clearClicked" }, ngImport: i0, template: "<div *ngIf=\"queryConfigReady\" class=\"wapp-filter-panel-styles\">\n <div *ngIf=\"!filterPanelObject.allowAdvancedSearch; else baiscAndAdvanced\">\n <div class=\"filter-panel-container\">\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\n <div class=\"flex justify-content-end button-gap\">\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\"></p-button>\n </div>\n </div>\n </div>\n\n <ng-template #baiscAndAdvanced>\n <div class=\"filter-panel-container\">\n <div *ngIf=\"!isAdvancedSearch; else advancedView\">\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\n </div>\n <ng-template #advancedView>\n <ng-container *ngTemplateOutlet=\"advanced\"></ng-container>\n </ng-template>\n\n <div class=\"flex justify-content-end button-gap\" [class.pt-3]=\"isAdvancedSearch\">\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\" [loading]=\"dataIsLoadingSearchButton\"></p-button>\n </div>\n </div>\n </ng-template>\n </div>\n\n <ng-template #basic>\n <div *ngIf=\"filterPanelObject.allowAdvancedSearch\" class=\"flex justify-content-end flex-wrap\">\n <p-button [label]=\"translationsObject.advancedSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <div class=\"basic-filter-panel query-builder-style fadein animation-duration-500\">\n <query-builder [formControl]='queryCtrl' [config]='basicQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <ng-container *queryButtonGroup=\"let ruleset;\">\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small\" *ngIf=\"false\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small select-disabled\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" *ngIf=\"isAdvancedSearch\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-multiSelect class=\"field-gap\" [appendTo]=\"'body'\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" display=\"chip\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-multiSelect>\n </span>\n </ng-container>\n </query-builder>\n </div>\n\n <ng-container *ngIf=\"!isAdvancedSearch && basicQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n\n </ng-template>\n\n <ng-template #advanced>\n <div [class.query-builder-style]=\"!filterPanelObject.allowRuleSet\" class=\"wapp-filter-panel-container fadein animation-duration-500\">\n <div *ngIf=\"filterPanelObject.allowRuleSet\" class=\"flex justify-content-end flex-wrap\">\n <p-button class=\"mb-2\" [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <query-builder [formControl]='advancedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <div *ngIf=\"filterPanelObject.allowRuleSet; else noRuleSet\">\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </ng-container>\n </div>\n\n <ng-template #noRuleSet>\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <div class=\"flex justify-content-end flex-wrap\">\n <p-button [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <span class=\"advanced-query-button-group gap-3\">\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </span>\n </ng-container>\n </ng-template>\n <ng-container *queryArrowIcon>\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n <div *ngIf=\"ruleset\" class=\"switch-group-padding\">\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\n </div>\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown *ngIf=\"filterPanelObject.enityMode\" class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width field-gap\">\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n </query-builder>\n\n <ng-container *ngIf=\"isAdvancedSearch && advancedQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n\n <!-- Grouped filter -->\n <div *ngIf=\"filterPanelObject.allowGrouped\">\n <div class=\"py-5\">\n <wapp-view-card-title-text [cardTitle]=\"translationsObject.groupedFilterTitle\"></wapp-view-card-title-text>\n </div>\n\n <query-builder [formControl]='groupedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <div class=\"flex gap-3 mb-3\">\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </div>\n </ng-container>\n\n <ng-container *queryArrowIcon>\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n <div *ngIf=\"ruleset\">\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\n </div>\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" *ngIf=\"filterPanelObject.enityMode\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"mr-3\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"mr-3\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"mr-3 query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n\n </query-builder>\n\n <ng-container *ngIf=\"isAdvancedSearch && groupedQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n <ng-template #noQueryData>\n <div class=\"flex justify-content-center flex-wrap card-container surface-50 mb-3\">\n <div class=\"flex align-items-center justify-content-center w-full h-4rem text-gray-900 border-round m-2\">\n {{translationsObject.noRulesLabel}}\n </div>\n </div>\n </ng-template>\n", styles: [".heading1{font-size:3.1428571429rem;line-height:3.4285714286rem;font-weight:700}.heading2{font-size:2.8571428571rem;line-height:3.1428571429rem;font-weight:700}.heading3{font-size:2.5714285714rem;line-height:2.8571428571rem;font-weight:700}.heading4{font-size:2.2857142857rem;line-height:2.5714285714rem;font-weight:700}.heading5{font-size:2rem;line-height:2.2857142857rem;font-weight:700}.heading6{font-size:1.7142857143rem;line-height:2rem;font-weight:700}.subtitle1{font-size:1.4285714286rem;line-height:1.7142857143rem;font-weight:700}.subtitle2{font-size:1.1428571429rem;line-height:1.4285714286rem;font-weight:700}.body,.input-generic-placeholder-small,.input-generic-small{font-size:1rem;line-height:1.1428571429rem;font-weight:600}.caption{font-size:.8571428571rem;line-height:1.1428571429rem;font-weight:600}.icon-small-size{font-size:8px}.icon-small-x-size{font-size:12px}.icon-medium-size{font-size:16px}.icon-large-size{font-size:24px}.spacingXXS{padding:4px}.spacingXSM{padding:6px}.spacingXS{padding:8px}.spacingS{padding:12px}.spacingM{padding:16px}.spacingL{padding:20px}.spacingXL{padding:24px}.spacingXXL{padding:28px}.spacingXXXL{padding:32px}.focus{box-shadow:0 0 8px #00a6e980}.hover{border-radius:8px;border:2px solid #0085c7}.button-large-typography{font-size:20px;line-height:24px;font-weight:700}.button-medium-typography{font-size:16px;line-height:16px;font-weight:700}.button-small-typography{font-size:12px;line-height:16px;font-weight:700}.button-text-typography,.input-generic-label{font-size:14px;line-height:16px;font-weight:700}.input-generic-placeholder,.input-generic{font-size:16px;line-height:24px;font-weight:600}.input-generic-placeholder-small{padding:8px 12px 12px}.input-generic-valid{border-radius:8px;border:2px solid #B3FFD3}.input-generic-valid-focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}.input-generic-warning{border-radius:8px;border:2px solid #FFECB8!important}.input-generic-warning-focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}.input-generic-error{border-radius:8px;border:2px solid #FFBDBD}.tag-generic{font-size:14px;line-height:16px;font-weight:700}.tag-generic-small{font-size:12px;line-height:16px;font-weight:700}.filter-panel-container{padding:16px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;margin-bottom:0}::ng-deep .basic-filter-panel .q-row{padding:0!important;margin-bottom:8px!important}::ng-deep .wapp-filter-panel-container .q-row{padding:0!important;margin-bottom:8px!important}.field-gap{margin-right:8px}.button-gap{gap:16px}.switch-group-padding{padding-bottom:8px}::ng-deep .query-builder-style ul li{border:none!important;background:transparent!important;padding-left:0!important}::ng-deep .query-builder-style .q-connector:before{content:none!important}::ng-deep .query-builder-style .q-connector:after{border-width:0px!important}::ng-deep .query-builder-style .q-tree{padding:0!important}::ng-deep .query-builder-field-width .p-dropdown{width:20%}::ng-deep .query-builder-operator-width .p-dropdown{width:10%}.query-builder-input-width{width:40%}::ng-deep .query-builder-input-width .p-dropdown{width:40%}::ng-deep .query-builder-input-width .p-calendar{width:40%}.basic-filter-panel.query-builder-style,.wapp-filter-panel-container.query-builder-style{display:flex;flex-direction:column;justify-content:space-between;position:relative}.advanced-query-button-group{position:absolute;bottom:0;left:0;margin-bottom:-46px}.height-input{height:32px}.wapp-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::ng-deep .p-inputtext{padding:.75rem 12px}.wapp-input:hover{border:2px solid #0085c7!important}.wapp-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}::ng-deep .wapp-filter-panel-styles .p-button{height:32px;border-radius:8px;gap:8px}.toggle-button-align{display:inline-block;vertical-align:middle;margin-bottom:6px;margin-left:4px}::ng-deep .p-togglebutton.p-button{margin:4px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined,.p-buttonset.p-button-danger>.p-button.p-button-outlined,.p-splitbutton.p-button-danger>.p-button.p-button-outlined{background-color:transparent;color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined:enabled:hover,.p-buttonset.p-button-danger>.p-button.p-button-outlined:enabled:hover,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:enabled:hover{background:rgba(239,68,68,.04);color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .pi-times:before{padding-left:8px}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button{background:#ffffff;border:2px solid #e8eaed;color:#1e293b;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover{border:2px solid #0085c7}::ng-deep .wapp-filter-panel-styles .p-button:focus{box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown{font-weight:600;border-width:2px;border-radius:8px;border-color:#e8eaed;height:32px;margin:4px}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled):hover{border-width:2px;border:2px solid #0085c7!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 8px #00a6e980;border:2px solid #e0f5fc}:host ::ng-deep .w-edit-select-input-small .p-dropdown .p-placeholder{color:#bdc1c6}:host ::ng-deep .w-edit-select-input-small .p-inputtext{padding:6px 0 6px 12px}:host ::ng-deep .w-edit-select-input-small .p-dropdown .pi{font-size:.8rem}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel{padding:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items{padding:0}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:8px;margin-bottom:4px;font-weight:600}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item:hover{background:#e0f5fc;border-radius:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight{background:#e0f5fc;border-radius:8px;color:#000}:host ::ng-deep .w-edit-select-input-small .p-disabled{background:#ffffff;opacity:1}:host ::ng-deep .w-edit-select-input-small .p-disabled .p-inputtext{color:#bdc1c6}::ng-deep .select-disabled .p-dropdown .p-dropdown-trigger{display:none}:host ::ng-deep .height-input .p-inputnumber .p-inputnumber-input{height:32px!important}.wapp-input-number{width:40%!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:hover{border-radius:8px;border:2px solid #0085c7!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:disabled{background-color:#e8eaed}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #B3FFD3!important}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFECB8!important}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFBDBD}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFBDBD;box-shadow:0 0 2px 2px #ffbdbd!important;padding-left:16px}.success-alert-text{color:#00db5d;padding:8px}.warning-alert-text{color:#eeae00;padding:8px}.error-alert-text{color:#e50000;padding:8px}.alert-message-height{height:35px}\n"], dependencies: [{ kind: "directive", type: i3.InputText, selector: "[pInputText]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "component", type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i10.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i11.ToggleButton, selector: "p-toggleButton", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "iconPos"], outputs: ["onChange"] }, { kind: "component", type: i12.QueryBuilderComponent, selector: "query-builder", inputs: ["data", "allowRuleset", "allowCollapse", "emptyMessage", "config", "persistValueOnFieldChange", "value", "disabled", "classNames", "operatorMap", "parentValue", "parentArrowIconTemplate", "parentInputTemplates", "parentOperatorTemplate", "parentFieldTemplate", "parentEntityTemplate", "parentSwitchGroupTemplate", "parentButtonGroupTemplate", "parentRemoveButtonTemplate", "parentEmptyWarningTemplate", "parentChangeCallback", "parentTouchedCallback"] }, { kind: "directive", type: i12.QueryInputDirective, selector: "[queryInput]", inputs: ["queryInputType"] }, { kind: "directive", type: i12.QueryOperatorDirective, selector: "[queryOperator]" }, { kind: "directive", type: i12.QueryFieldDirective, selector: "[queryField]" }, { kind: "directive", type: i12.QueryEntityDirective, selector: "[queryEntity]" }, { kind: "directive", type: i12.QueryButtonGroupDirective, selector: "[queryButtonGroup]" }, { kind: "directive", type: i12.QuerySwitchGroupDirective, selector: "[querySwitchGroup]" }, { kind: "directive", type: i12.QueryRemoveButtonDirective, selector: "[queryRemoveButton]" }, { kind: "directive", type: i12.QueryArrowIconDirective, selector: "[queryArrowIcon]" }, { kind: "component", type: i13.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i14.WListFieldComponent, selector: "w-list-field", inputs: ["options", "operator", "placeholder", "onlyDropdown"] }, { kind: "component", type: i15.WappViewCardTitleTextComponent, selector: "wapp-view-card-title-text", inputs: ["cardTitle"] }] });
346
346
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WFilterPanelComponent, decorators: [{
347
347
  type: Component,
348
- args: [{ selector: 'w-filter-panel', template: "<div *ngIf=\"queryConfigReady\" class=\"wapp-filter-panel-styles\">\r\n <div *ngIf=\"!filterPanelObject.allowAdvancedSearch; else baiscAndAdvanced\">\r\n <div class=\"filter-panel-container\">\r\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\r\n <div class=\"flex justify-content-end button-gap\">\r\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\r\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\"></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #baiscAndAdvanced>\r\n <div class=\"filter-panel-container\">\r\n <div *ngIf=\"!isAdvancedSearch; else advancedView\">\r\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\r\n </div>\r\n <ng-template #advancedView>\r\n <ng-container *ngTemplateOutlet=\"advanced\"></ng-container>\r\n </ng-template>\r\n\r\n <div class=\"flex justify-content-end button-gap\" [class.pt-3]=\"isAdvancedSearch\">\r\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\r\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\" [loading]=\"dataIsLoadingSearchButton\"></p-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #basic>\r\n <div *ngIf=\"filterPanelObject.allowAdvancedSearch\" class=\"flex justify-content-end flex-wrap\">\r\n <p-button [label]=\"translationsObject.advancedSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <div class=\"basic-filter-panel query-builder-style fadein animation-duration-500\">\r\n <query-builder [formControl]='queryCtrl' [config]='basicQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <ng-container *queryButtonGroup=\"let ruleset;\">\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small\" *ngIf=\"false\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small select-disabled\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" *ngIf=\"isAdvancedSearch\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-multiSelect class=\"field-gap\" [appendTo]=\"'body'\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" display=\"chip\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-multiSelect>\r\n </span>\r\n </ng-container>\r\n </query-builder>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!isAdvancedSearch && basicQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n\r\n <ng-template #advanced>\r\n <div [class.query-builder-style]=\"!filterPanelObject.allowRuleSet\" class=\"wapp-filter-panel-container fadein animation-duration-500\">\r\n <div *ngIf=\"filterPanelObject.allowRuleSet\" class=\"flex justify-content-end flex-wrap\">\r\n <p-button class=\"mb-2\" [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <query-builder [formControl]='advancedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <div *ngIf=\"filterPanelObject.allowRuleSet; else noRuleSet\">\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noRuleSet>\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <div class=\"flex justify-content-end flex-wrap\">\r\n <p-button [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\r\n </div>\r\n <span class=\"advanced-query-button-group gap-3\">\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-container *queryArrowIcon>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <div *ngIf=\"ruleset\" class=\"switch-group-padding\">\r\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown *ngIf=\"filterPanelObject.enityMode\" class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width field-gap\">\r\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n </query-builder>\r\n\r\n <ng-container *ngIf=\"isAdvancedSearch && advancedQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Grouped filter -->\r\n <div *ngIf=\"filterPanelObject.allowGrouped\">\r\n <div class=\"py-5\">\r\n <wapp-view-card-title-text [cardTitle]=\"translationsObject.groupedFilterTitle\"></wapp-view-card-title-text>\r\n </div>\r\n\r\n <query-builder [formControl]='groupedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <div class=\"flex gap-3 mb-3\">\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\r\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryArrowIcon>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\r\n </ng-container>\r\n\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\r\n </ng-container>\r\n\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <div *ngIf=\"ruleset\">\r\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" *ngIf=\"filterPanelObject.enityMode\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </ng-container>\r\n\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\r\n <span class=\"query-builder-field-width\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\r\n <span class=\"query-builder-operator-width\">\r\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\r\n <p-toggleButton class=\"mr-3\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-calendar class=\"mr-3\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\r\n <span class=\"query-builder-input-width\">\r\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\r\n <input class=\"mr-3 query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\r\n </ng-container>\r\n\r\n </query-builder>\r\n\r\n <ng-container *ngIf=\"isAdvancedSearch && groupedQuery.rules.length==0\" >\r\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #noQueryData>\r\n <div class=\"flex justify-content-center flex-wrap card-container surface-50 mb-3\">\r\n <div class=\"flex align-items-center justify-content-center w-full h-4rem text-gray-900 border-round m-2\">\r\n {{translationsObject.noRulesLabel}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n", styles: [".heading1{font-size:3.1428571429rem;line-height:3.4285714286rem;font-weight:700}.heading2{font-size:2.8571428571rem;line-height:3.1428571429rem;font-weight:700}.heading3{font-size:2.5714285714rem;line-height:2.8571428571rem;font-weight:700}.heading4{font-size:2.2857142857rem;line-height:2.5714285714rem;font-weight:700}.heading5{font-size:2rem;line-height:2.2857142857rem;font-weight:700}.heading6{font-size:1.7142857143rem;line-height:2rem;font-weight:700}.subtitle1{font-size:1.4285714286rem;line-height:1.7142857143rem;font-weight:700}.subtitle2{font-size:1.1428571429rem;line-height:1.4285714286rem;font-weight:700}.body,.input-generic-placeholder-small,.input-generic-small{font-size:1rem;line-height:1.1428571429rem;font-weight:600}.caption{font-size:.8571428571rem;line-height:1.1428571429rem;font-weight:600}.icon-small-size{font-size:8px}.icon-small-x-size{font-size:12px}.icon-medium-size{font-size:16px}.icon-large-size{font-size:24px}.spacingXXS{padding:4px}.spacingXSM{padding:6px}.spacingXS{padding:8px}.spacingS{padding:12px}.spacingM{padding:16px}.spacingL{padding:20px}.spacingXL{padding:24px}.spacingXXL{padding:28px}.spacingXXXL{padding:32px}.focus{box-shadow:0 0 8px #00a6e980}.hover{border-radius:8px;border:2px solid #0085c7}.button-large-typography{font-size:20px;line-height:24px;font-weight:700}.button-medium-typography{font-size:16px;line-height:16px;font-weight:700}.button-small-typography{font-size:12px;line-height:16px;font-weight:700}.button-text-typography,.input-generic-label{font-size:14px;line-height:16px;font-weight:700}.input-generic-placeholder,.input-generic{font-size:16px;line-height:24px;font-weight:600}.input-generic-placeholder-small{padding:8px 12px 12px}.input-generic-valid{border-radius:8px;border:2px solid #B3FFD3}.input-generic-valid-focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}.input-generic-warning{border-radius:8px;border:2px solid #FFECB8!important}.input-generic-warning-focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}.input-generic-error{border-radius:8px;border:2px solid #FFBDBD}.tag-generic{font-size:14px;line-height:16px;font-weight:700}.tag-generic-small{font-size:12px;line-height:16px;font-weight:700}.filter-panel-container{padding:16px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;margin-bottom:0}::ng-deep .basic-filter-panel .q-row{padding:0!important;margin-bottom:8px!important}::ng-deep .wapp-filter-panel-container .q-row{padding:0!important;margin-bottom:8px!important}.field-gap{margin-right:8px}.button-gap{gap:16px}.switch-group-padding{padding-bottom:8px}::ng-deep .query-builder-style ul li{border:none!important;background:transparent!important;padding-left:0!important}::ng-deep .query-builder-style .q-connector:before{content:none!important}::ng-deep .query-builder-style .q-connector:after{border-width:0px!important}::ng-deep .query-builder-style .q-tree{padding:0!important}::ng-deep .query-builder-field-width .p-dropdown{width:20%}::ng-deep .query-builder-operator-width .p-dropdown{width:10%}.query-builder-input-width{width:40%}::ng-deep .query-builder-input-width .p-dropdown{width:40%}::ng-deep .query-builder-input-width .p-calendar{width:40%}.basic-filter-panel.query-builder-style,.wapp-filter-panel-container.query-builder-style{display:flex;flex-direction:column;justify-content:space-between;position:relative}.advanced-query-button-group{position:absolute;bottom:0;left:0;margin-bottom:-46px}.height-input{height:32px}.wapp-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::ng-deep .p-inputtext{padding:.75rem 12px}.wapp-input:hover{border:2px solid #0085c7!important}.wapp-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}::ng-deep .wapp-filter-panel-styles .p-button{height:32px;border-radius:8px;gap:8px}.toggle-button-align{display:inline-block;vertical-align:middle;margin-bottom:6px;margin-left:4px}::ng-deep .p-togglebutton.p-button{margin:4px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined,.p-buttonset.p-button-danger>.p-button.p-button-outlined,.p-splitbutton.p-button-danger>.p-button.p-button-outlined{background-color:transparent;color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined:enabled:hover,.p-buttonset.p-button-danger>.p-button.p-button-outlined:enabled:hover,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:enabled:hover{background:rgba(239,68,68,.04);color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .pi-times:before{padding-left:8px}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button{background:#ffffff;border:2px solid #e8eaed;color:#1e293b;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover{border:2px solid #0085c7}::ng-deep .wapp-filter-panel-styles .p-button:focus{box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown{font-weight:600;border-width:2px;border-radius:8px;border-color:#e8eaed;height:32px;margin:4px}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled):hover{border-width:2px;border:2px solid #0085c7!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 8px #00a6e980;border:2px solid #e0f5fc}:host ::ng-deep .w-edit-select-input-small .p-dropdown .p-placeholder{color:#bdc1c6}:host ::ng-deep .w-edit-select-input-small .p-inputtext{padding:6px 0 6px 12px}:host ::ng-deep .w-edit-select-input-small .p-dropdown .pi{font-size:.8rem}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel{padding:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items{padding:0}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:8px;margin-bottom:4px;font-weight:600}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item:hover{background:#e0f5fc;border-radius:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight{background:#e0f5fc;border-radius:8px;color:#000}:host ::ng-deep .w-edit-select-input-small .p-disabled{background:#ffffff;opacity:1}:host ::ng-deep .w-edit-select-input-small .p-disabled .p-inputtext{color:#bdc1c6}::ng-deep .select-disabled .p-dropdown .p-dropdown-trigger{display:none}:host ::ng-deep .height-input .p-inputnumber .p-inputnumber-input{height:32px!important}.wapp-input-number{width:40%!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:hover{border-radius:8px;border:2px solid #0085c7!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:disabled{background-color:#e8eaed}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #B3FFD3!important}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFECB8!important}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFBDBD}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFBDBD;box-shadow:0 0 2px 2px #ffbdbd!important;padding-left:16px}.success-alert-text{color:#00db5d;padding:8px}.warning-alert-text{color:#eeae00;padding:8px}.error-alert-text{color:#e50000;padding:8px}.alert-message-height{height:35px}\n"] }]
348
+ args: [{ selector: 'w-filter-panel', template: "<div *ngIf=\"queryConfigReady\" class=\"wapp-filter-panel-styles\">\n <div *ngIf=\"!filterPanelObject.allowAdvancedSearch; else baiscAndAdvanced\">\n <div class=\"filter-panel-container\">\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\n <div class=\"flex justify-content-end button-gap\">\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\"></p-button>\n </div>\n </div>\n </div>\n\n <ng-template #baiscAndAdvanced>\n <div class=\"filter-panel-container\">\n <div *ngIf=\"!isAdvancedSearch; else advancedView\">\n <ng-container *ngTemplateOutlet=\"basic\"></ng-container>\n </div>\n <ng-template #advancedView>\n <ng-container *ngTemplateOutlet=\"advanced\"></ng-container>\n </ng-template>\n\n <div class=\"flex justify-content-end button-gap\" [class.pt-3]=\"isAdvancedSearch\">\n <p-button [label]=\"translationsObject.clearButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"onClearClicked()\"></p-button>\n <p-button [label]=\"translationsObject.searchButtonLabel\" (click)=\"onSearchClicked()\" [loading]=\"dataIsLoadingSearchButton\"></p-button>\n </div>\n </div>\n </ng-template>\n </div>\n\n <ng-template #basic>\n <div *ngIf=\"filterPanelObject.allowAdvancedSearch\" class=\"flex justify-content-end flex-wrap\">\n <p-button [label]=\"translationsObject.advancedSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <div class=\"basic-filter-panel query-builder-style fadein animation-duration-500\">\n <query-builder [formControl]='queryCtrl' [config]='basicQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <ng-container *queryButtonGroup=\"let ruleset;\">\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small\" *ngIf=\"false\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown [disabled]=\"true\" class=\"field-gap w-edit-select-input-small select-disabled\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" *ngIf=\"isAdvancedSearch\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-multiSelect class=\"field-gap\" [appendTo]=\"'body'\" [options]=\"options\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" optionLabel=\"name\" optionValue=\"value\" display=\"chip\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></p-multiSelect>\n </span>\n </ng-container>\n </query-builder>\n </div>\n\n <ng-container *ngIf=\"!isAdvancedSearch && basicQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n\n </ng-template>\n\n <ng-template #advanced>\n <div [class.query-builder-style]=\"!filterPanelObject.allowRuleSet\" class=\"wapp-filter-panel-container fadein animation-duration-500\">\n <div *ngIf=\"filterPanelObject.allowRuleSet\" class=\"flex justify-content-end flex-wrap\">\n <p-button class=\"mb-2\" [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <query-builder [formControl]='advancedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <div *ngIf=\"filterPanelObject.allowRuleSet; else noRuleSet\">\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button class=\"mr-2\" [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </ng-container>\n </div>\n\n <ng-template #noRuleSet>\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <div class=\"flex justify-content-end flex-wrap\">\n <p-button [label]=\"translationsObject.basicSearchTabLabel\" styleClass=\"p-button-text\" (click)=\"updateSearchType()\"></p-button>\n </div>\n <span class=\"advanced-query-button-group gap-3\">\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </span>\n </ng-container>\n </ng-template>\n <ng-container *queryArrowIcon>\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n <div *ngIf=\"ruleset\" class=\"switch-group-padding\">\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\n </div>\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown *ngIf=\"filterPanelObject.enityMode\" class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"field-gap w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"field-gap toggle-button-align\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"field-gap\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width field-gap\">\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber inputStyleClass=\"flex flex-1\" styleClass=\"flex flex-1\" class=\"field-gap wapp-input-number height-input\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"field-gap query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n </query-builder>\n\n <ng-container *ngIf=\"isAdvancedSearch && advancedQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n\n <!-- Grouped filter -->\n <div *ngIf=\"filterPanelObject.allowGrouped\">\n <div class=\"py-5\">\n <wapp-view-card-title-text [cardTitle]=\"translationsObject.groupedFilterTitle\"></wapp-view-card-title-text>\n </div>\n\n <query-builder [formControl]='groupedQueryCtrl' [config]='advancedQueryConfig' [allowRuleset]='filterPanelObject.allowRuleSet' [allowCollapse]='filterPanelObject.allowColapse' [allowRuleset]=\"filterPanelObject.allowRuleSet\" [persistValueOnFieldChange]='persistValueOnFieldChange'>\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\n <div class=\"flex gap-3 mb-3\">\n <p-button [label]=\"translationsObject.advancedSearch.addRuleButtonLabel\" styleClass=\"p-button-outlined\" (click)=\"addRule()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.addRuleSetButtonLabel\" styleClass=\"p-button-outlined\" icon=\"pi pi-plus\" *ngIf=\"addRuleSet\" (click)=\"addRuleSet()\"></p-button>\n <p-button [label]=\"translationsObject.advancedSearch.removeRuleSetButtonLabel\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-minus\" *ngIf=\"removeRuleSet\" (click)=\"removeRuleSet()\"></p-button>\n </div>\n </ng-container>\n\n <ng-container *queryArrowIcon>\n <button pButton pRipple type=\"button\" icon=\"pi pi-angle-right\" class=\"p-button-rounded p-button-text\"></button>\n </ng-container>\n\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\n <p-button label=\"\" styleClass=\"p-button-outlined p-button-danger\" icon=\"pi pi-times\" (click)=\"removeRule(rule)\"></p-button>\n </ng-container>\n\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\n <div *ngIf=\"ruleset\">\n <p-selectButton *ngIf=\"filterPanelObject.allowLogicalRule\" [options]=\"stateOptions\" [(ngModel)]=\"ruleset.condition\" optionLabel=\"label\" optionValue=\"value\"></p-selectButton>\n </div>\n </ng-container>\n\n <ng-container *queryEntity=\"let rule; let entities=entities; let onChange=onChange\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" *ngIf=\"filterPanelObject.enityMode\" appendTo=\"body\" [options]=\"entities\" [(ngModel)]=\"rule.entity\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </ng-container>\n\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields = getFields\">\n <span class=\"query-builder-field-width\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [options]=\"getFields(rule.entity)\" [(ngModel)]=\"rule.field\" optionLabel=\"name\" optionValue=\"value\" (ngModelChange)=\"onChange($event, rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\">\n <span class=\"query-builder-operator-width\">\n <p-dropdown class=\"mr-3 w-edit-select-input-small\" appendTo=\"body\" [(ngModel)]=\"rule.operator\" [options]=\"operators\" (ngModelChange)=\"onChange(rule)\"></p-dropdown>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Boolean.toString(); let onChange=onChange\">\n <p-toggleButton class=\"mr-3\" [(ngModel)]=\"rule.value\" onLabel=\"True\" offLabel=\"False\" (ngModelChange)=\"onChange()\"></p-toggleButton>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; type: qbDataTypeEnum.Datetime.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-calendar class=\"mr-3\" appendTo=\"body\" [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [showTime]=\"true\" [showSeconds]=\"true\" [placeholder]=\"translationsObject.fieldsPlaceholders.datetime\"></p-calendar>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Decimal.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" mode=\"decimal\" [minFractionDigits]=\"2\" [maxFractionDigits]=\"5\" [min]=\"0\" [max]=\"100\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.decimal\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let options=options; type: qbDataTypeEnum.List.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <w-list-field [options]=\"options\" [(ngModel)]=\"rule.value\" [operator]=\"rule.operator\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.list\"></w-list-field>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Number.toString(); let onChange=onChange\">\n <span class=\"query-builder-input-width\">\n <p-inputNumber class=\"mr-3\" [(ngModel)]=\"rule.value\" inputId=\"minmax\" inputId=\"minmax\" [min]=\"0\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.number\"> </p-inputNumber>\n </span>\n </ng-container>\n\n <ng-container *queryInput=\"let rule; let field=field; type: qbDataTypeEnum.Text.toString(); let onChange=onChange\">\n <input class=\"mr-3 query-builder-input-width height-input wapp-input\" type=\"text\" pInputText [(ngModel)]=\"rule.value\" (ngModelChange)=\"onChange()\" [placeholder]=\"translationsObject.fieldsPlaceholders.text\"/>\n </ng-container>\n\n </query-builder>\n\n <ng-container *ngIf=\"isAdvancedSearch && groupedQuery.rules.length==0\" >\n <ng-container *ngTemplateOutlet=\"noQueryData\"></ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n <ng-template #noQueryData>\n <div class=\"flex justify-content-center flex-wrap card-container surface-50 mb-3\">\n <div class=\"flex align-items-center justify-content-center w-full h-4rem text-gray-900 border-round m-2\">\n {{translationsObject.noRulesLabel}}\n </div>\n </div>\n </ng-template>\n", styles: [".heading1{font-size:3.1428571429rem;line-height:3.4285714286rem;font-weight:700}.heading2{font-size:2.8571428571rem;line-height:3.1428571429rem;font-weight:700}.heading3{font-size:2.5714285714rem;line-height:2.8571428571rem;font-weight:700}.heading4{font-size:2.2857142857rem;line-height:2.5714285714rem;font-weight:700}.heading5{font-size:2rem;line-height:2.2857142857rem;font-weight:700}.heading6{font-size:1.7142857143rem;line-height:2rem;font-weight:700}.subtitle1{font-size:1.4285714286rem;line-height:1.7142857143rem;font-weight:700}.subtitle2{font-size:1.1428571429rem;line-height:1.4285714286rem;font-weight:700}.body,.input-generic-placeholder-small,.input-generic-small{font-size:1rem;line-height:1.1428571429rem;font-weight:600}.caption{font-size:.8571428571rem;line-height:1.1428571429rem;font-weight:600}.icon-small-size{font-size:8px}.icon-small-x-size{font-size:12px}.icon-medium-size{font-size:16px}.icon-large-size{font-size:24px}.spacingXXS{padding:4px}.spacingXSM{padding:6px}.spacingXS{padding:8px}.spacingS{padding:12px}.spacingM{padding:16px}.spacingL{padding:20px}.spacingXL{padding:24px}.spacingXXL{padding:28px}.spacingXXXL{padding:32px}.focus{box-shadow:0 0 8px #00a6e980}.hover{border-radius:8px;border:2px solid #0085c7}.button-large-typography{font-size:20px;line-height:24px;font-weight:700}.button-medium-typography{font-size:16px;line-height:16px;font-weight:700}.button-small-typography{font-size:12px;line-height:16px;font-weight:700}.button-text-typography,.input-generic-label{font-size:14px;line-height:16px;font-weight:700}.input-generic-placeholder,.input-generic{font-size:16px;line-height:24px;font-weight:600}.input-generic-placeholder-small{padding:8px 12px 12px}.input-generic-valid{border-radius:8px;border:2px solid #B3FFD3}.input-generic-valid-focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}.input-generic-warning{border-radius:8px;border:2px solid #FFECB8!important}.input-generic-warning-focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}.input-generic-error{border-radius:8px;border:2px solid #FFBDBD}.tag-generic{font-size:14px;line-height:16px;font-weight:700}.tag-generic-small{font-size:12px;line-height:16px;font-weight:700}.filter-panel-container{padding:16px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;margin-bottom:0}::ng-deep .basic-filter-panel .q-row{padding:0!important;margin-bottom:8px!important}::ng-deep .wapp-filter-panel-container .q-row{padding:0!important;margin-bottom:8px!important}.field-gap{margin-right:8px}.button-gap{gap:16px}.switch-group-padding{padding-bottom:8px}::ng-deep .query-builder-style ul li{border:none!important;background:transparent!important;padding-left:0!important}::ng-deep .query-builder-style .q-connector:before{content:none!important}::ng-deep .query-builder-style .q-connector:after{border-width:0px!important}::ng-deep .query-builder-style .q-tree{padding:0!important}::ng-deep .query-builder-field-width .p-dropdown{width:20%}::ng-deep .query-builder-operator-width .p-dropdown{width:10%}.query-builder-input-width{width:40%}::ng-deep .query-builder-input-width .p-dropdown{width:40%}::ng-deep .query-builder-input-width .p-calendar{width:40%}.basic-filter-panel.query-builder-style,.wapp-filter-panel-container.query-builder-style{display:flex;flex-direction:column;justify-content:space-between;position:relative}.advanced-query-button-group{position:absolute;bottom:0;left:0;margin-bottom:-46px}.height-input{height:32px}.wapp-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::ng-deep .p-inputtext{padding:.75rem 12px}.wapp-input:hover{border:2px solid #0085c7!important}.wapp-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}::ng-deep .wapp-filter-panel-styles .p-button{height:32px;border-radius:8px;gap:8px}.toggle-button-align{display:inline-block;vertical-align:middle;margin-bottom:6px;margin-left:4px}::ng-deep .p-togglebutton.p-button{margin:4px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined,.p-buttonset.p-button-danger>.p-button.p-button-outlined,.p-splitbutton.p-button-danger>.p-button.p-button-outlined{background-color:transparent;color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .p-button.p-button-danger.p-button-outlined:enabled:hover,.p-buttonset.p-button-danger>.p-button.p-button-outlined:enabled:hover,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:enabled:hover{background:rgba(239,68,68,.04);color:#ef4444;border:1px solid;width:32px;height:32px}::ng-deep .wapp-filter-panel-styles .pi-times:before{padding-left:8px}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button{background:#ffffff;border:2px solid #e8eaed;color:#1e293b;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}::ng-deep .wapp-filter-panel-styles .p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover{border:2px solid #0085c7}::ng-deep .wapp-filter-panel-styles .p-button:focus{box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown{font-weight:600;border-width:2px;border-radius:8px;border-color:#e8eaed;height:32px;margin:4px}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled):hover{border-width:2px;border:2px solid #0085c7!important}:host ::ng-deep .w-edit-select-input-small .p-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 8px #00a6e980;border:2px solid #e0f5fc}:host ::ng-deep .w-edit-select-input-small .p-dropdown .p-placeholder{color:#bdc1c6}:host ::ng-deep .w-edit-select-input-small .p-inputtext{padding:6px 0 6px 12px}:host ::ng-deep .w-edit-select-input-small .p-dropdown .pi{font-size:.8rem}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel{padding:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items{padding:0}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:8px;margin-bottom:4px;font-weight:600}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item:hover{background:#e0f5fc;border-radius:8px}:host ::ng-deep .w-edit-select-input-small .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight{background:#e0f5fc;border-radius:8px;color:#000}:host ::ng-deep .w-edit-select-input-small .p-disabled{background:#ffffff;opacity:1}:host ::ng-deep .w-edit-select-input-small .p-disabled .p-inputtext{color:#bdc1c6}::ng-deep .select-disabled .p-dropdown .p-dropdown-trigger{display:none}:host ::ng-deep .height-input .p-inputnumber .p-inputnumber-input{height:32px!important}.wapp-input-number{width:40%!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input{border-radius:8px;border-width:2px;border-color:#e8eaed;font-size:16px;line-height:5px;font-weight:600;gap:16px;margin:4px}::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:hover{border-radius:8px;border:2px solid #0085c7!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px #e0f5fc;box-shadow:0 0 3px 3px #00a6e940!important}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input::-webkit-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-ms-input-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:-moz-placeholder{font-size:1rem;line-height:1.1428571429rem;font-weight:600;color:#bdc1c6}:host ::ng-deep .wapp-input-number .p-inputnumber .p-inputnumber-input:disabled{background-color:#e8eaed}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #B3FFD3!important}:host ::ng-deep .wapp-input-number-valid .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #B3FFD3!important;box-shadow:0 0 2px 2px #b3ffd3!important;padding-left:16px}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFECB8!important}:host ::ng-deep .wapp-input-number-warning .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFECB8!important;box-shadow:0 0 2px 2px #ffecb8!important;padding-left:16px}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input{border-radius:8px;border:2px solid #FFBDBD}:host ::ng-deep .wapp-input-number-error .p-inputnumber .p-inputnumber-input:focus{border-radius:8px;border:2px solid #FFBDBD;box-shadow:0 0 2px 2px #ffbdbd!important;padding-left:16px}.success-alert-text{color:#00db5d;padding:8px}.warning-alert-text{color:#eeae00;padding:8px}.error-alert-text{color:#e50000;padding:8px}.alert-message-height{height:35px}\n"] }]
349
349
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ApiService }]; }, propDecorators: { authorizationApiUrl: [{
350
350
  type: Input,
351
351
  args: ['apiUrl']
@@ -374,4 +374,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
374
374
  type: Output,
375
375
  args: ['clearClicked']
376
376
  }] } });
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidy1maWx0ZXItcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FwcC1jb21wb25lbnRzL3NyYy9saWIvbWlzYy93LWZpbHRlci1wYW5lbC93LWZpbHRlci1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXBwLWNvbXBvbmVudHMvc3JjL2xpYi9taXNjL3ctZmlsdGVyLXBhbmVsL3ctZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSWpFLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVXJHLE1BQU0sT0FBTyxxQkFBcUI7SUE4RWhDLFlBQ1UsV0FBd0IsRUFDeEIsVUFBc0I7UUFEdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTVFekIsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBRWxELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsbUJBQWMsR0FBRyxjQUFjLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBUTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7UUFDRixpQkFBWSxHQUFRO1lBQ2xCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztRQUNGLGtCQUFhLEdBQVE7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QztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFO1lBQzNDLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBQztnQkFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2tIQWxYVSxxQkFBcUI7c0dBQXJCLHFCQUFxQix1WkNoQmxDLDRqc0JBaVNBOzJGRGpSYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0JBQWdCOzJIQWtDVCxtQkFBbUI7c0JBQW5DLEtBQUs7dUJBQUMsUUFBUTtnQkFDWSxnQkFBZ0I7c0JBQTFDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNULEtBQUs7c0JBQXBCLEtBQUs7dUJBQUMsT0FBTztnQkFDWSxlQUFlO3NCQUF4QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDTCxRQUFRO3NCQUExQixLQUFLO3VCQUFDLFVBQVU7Z0JBQ21CLHlCQUF5QjtzQkFBNUQsS0FBSzt1QkFBQywyQkFBMkI7Z0JBRUwsa0JBQWtCO3NCQUE5QyxLQUFLO3VCQUFDLG9CQUFvQjtnQkFvQ0YsYUFBYTtzQkFBckMsTUFBTTt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQW5DLE1BQU07dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUUJEYXRhVHlwZUVudW0gfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2VudW1zLm1vZGVsJztcclxuaW1wb3J0IHsgUWJQYW5lbEZpbHRlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZmlsdGVyLXBhbmVsL3FiLXBhbmVsLWZpbHRlci5tb2RlbCc7XHJcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5TWFwLCBGaWVsZCwgRmllbGRNYXAsIFF1ZXJ5QnVpbGRlckNvbmZpZywgUnVsZSwgUnVsZVNldCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZmlsdGVyLXBhbmVsL2ZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRmlsdGVyUGFuZWxUcmFuc2xhdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwtdHJhbnNsYXRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgUXVlcnlSZXN1bHRUeXBlLCBRdWVyeVJlc3VsdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9xdWVyeS1yZXN1bHRzLm1vZGVsJztcclxuaW1wb3J0IHsgRmlsdGVyRmllbGQgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9maWx0ZXItZmllbGQubW9kZWxzJztcclxuaW1wb3J0IHsgUWJGaWx0ZXJFbnRpdHkgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9xYi1maWx0ZXItZW50aXR5Lm1vZGVsJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlL2FwaS9hcGkuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ctZmlsdGVyLXBhbmVsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdy1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3ctZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFdGaWx0ZXJQYW5lbENvbXBvbmVudCB7XHJcbiAgcHVibGljIHF1ZXJ5Q3RybCE6IEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBhZHZhbmNlZFF1ZXJ5Q3RybCE6IEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBncm91cGVkUXVlcnlDdHJsITogRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIHBlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICBxdWVyeUNvbmZpZ1JlYWR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZHZhbmNlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHFiRGF0YVR5cGVFbnVtID0gUUJEYXRhVHlwZUVudW07XHJcbiAgcWJEYXRhRW51bXMgPSBPYmplY3QudmFsdWVzKFFCRGF0YVR5cGVFbnVtKTtcclxuICBiYXNpY1F1ZXJ5Q29uZmlnITogYW55O1xyXG4gIGFkdmFuY2VkUXVlcnlDb25maWchOiBhbnk7XHJcbiAgYmFzaWNRdWVyeTogYW55ID0ge1xyXG4gICAgY29uZGl0aW9uOiAnYW5kJyxcclxuICAgIHJ1bGVzOiBbXVxyXG4gIH07XHJcbiAgZ3JvdXBlZFF1ZXJ5OiBhbnkgPSB7XHJcbiAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgcnVsZXM6IFtdXHJcbiAgfTtcclxuICBhZHZhbmNlZFF1ZXJ5OiBhbnkgPSB7XHJcbiAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgcnVsZXM6IFtdXHJcbiAgfTtcclxuICBmaWx0ZXJQYW5lbE9iamVjdCE6IFFiUGFuZWxGaWx0ZXI7XHJcbiAgZW50aXR5Q29uZmlnR3JvdXBlZDogUXVlcnlCdWlsZGVyQ29uZmlnID0geyBmaWVsZHM6IHt9IH07XHJcbiAgZW50aXRpZXM6IGFueVtdID0gW107XHJcbiAgZGVmYXVsdFZhbHVlczogYW55W10gPSBbXTtcclxuICBkZWZhdWx0T3BlcmF0b3JzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoJ2FwaVVybCcpIGF1dGhvcml6YXRpb25BcGlVcmwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCdjb21tb25EYXRhQXBpVXJsJykgY29tbW9uRGF0YUFwaVVybCE6IHN0cmluZztcclxuICBASW5wdXQoJ3Rva2VuJykgdG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCdjb21tb25EYXRhVG9rZW4nKSBjb21tb25EYXRhVG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCdmaWx0ZXJJZCcpIGZpbHRlcklkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZGF0YUlzTG9hZGluZ1NlYXJjaEJ1dHRvbicpIGRhdGFJc0xvYWRpbmdTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCd0cmFuc2xhdGlvbnNPYmplY3QnKSB0cmFuc2xhdGlvbnNPYmplY3Q6IEZpbHRlclBhbmVsVHJhbnNsYXRpb25zID0ge1xyXG4gICAgYmFzaWNTZWFyY2hUYWJMYWJlbDogJ0Jhc2ljIHNlYXJjaCcsXHJcbiAgICBhZHZhbmNlZFNlYXJjaFRhYkxhYmVsOiAnQWR2YW5jZWQgc2VhcmNoJyxcclxuICAgIGdyb3VwZWRGaWx0ZXJUaXRsZTogJ0dyb3VwZWQgZmlsdGVyJyxcclxuICAgIGFkdmFuY2VkU2VhcmNoOiB7XHJcbiAgICAgIGFuZEJ1dHRvbkxhYmVsOiAnQW5kJyxcclxuICAgICAgb3JCdXR0b25MYWJlbDogJ09yJyxcclxuICAgICAgYWRkUnVsZUJ1dHRvbkxhYmVsOiAnQWRkIGZpbHRlcicsXHJcbiAgICAgIGFkZFJ1bGVTZXRCdXR0b25MYWJlbDogJ0FkZCBmaWx0ZXIgc2V0JyxcclxuICAgICAgcmVtb3ZlUnVsZVNldEJ1dHRvbkxhYmVsOiAnUmVtb3ZlIHJ1bGUgc2V0J1xyXG4gICAgfSxcclxuICAgIG5vUnVsZXNMYWJlbDogJ0FkZCBmaWx0ZXIgb3IgZmlsdGVyIHNldCB0byBzdGFydCcsXHJcbiAgICBzZWFyY2hCdXR0b25MYWJlbDogJ0NsZWFyJyxcclxuICAgIGNsZWFyQnV0dG9uTGFiZWw6ICdDbGVhcicsXHJcbiAgICBmaWVsZHNQbGFjZWhvbGRlcnM6IHtcclxuICAgICAgYm9vbGVhbjoge1xyXG4gICAgICAgICAgdHJ1ZTogJ1RydWUnLFxyXG4gICAgICAgICAgZmFsc2U6ICdGYWxzZSdcclxuICAgICAgfSxcclxuICAgICAgZGVjaW1hbDogJ0luc2VydCBkZWNpbWFsIG51bWJlcicsXHJcbiAgICAgIGxpc3Q6ICdTZWxlY3QgYW4gb3B0aW9uJyxcclxuICAgICAgbnVtYmVyOiAnSW5zZXJ0IGEgbnVtYmVyJyxcclxuICAgICAgdGV4dDogJ0luc2VydCB0ZXh0JyxcclxuICAgICAgZGF0ZXRpbWU6ICdTZWxlY3QgYSBkYXRlJ1xyXG4gICAgfSxcclxuICAgIG9wZXJhdG9yczoge1xyXG4gICAgICBjb250YWluczonY29udGFpbnMnXHJcbiAgICB9LFxyXG4gICAgZmllbGRzOiB7XHJcbiAgICAgIElkbGVEZWFkbGluZTogJ0lkJyxcclxuICAgICAgbmFtZTogJ05hbWUnLFxyXG4gICAgICBjb2RlOiAnQ29kZScsXHJcbiAgICAgIGRlbGV0ZTogJ0RlbGV0ZWQnXHJcbiAgICB9XHJcbiAgfTtcclxuICBcclxuICBAT3V0cHV0KCdzZWFyY2hDbGlja2VkJykgc2VhcmNoQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UXVlcnlSZXN1bHRzPigpO1xyXG4gIEBPdXRwdXQoJ2NsZWFyQ2xpY2tlZCcpIGNsZWFyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBcclxuICBzdGF0ZU9wdGlvbnM6IGFueVtdID0gW3sgbGFiZWw6IHRoaXMudHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFuZEJ1dHRvbkxhYmVsLCB2YWx1ZTogJ2FuZCcgfSwgeyBsYWJlbDogdGhpcy50cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2gub3JCdXR0b25MYWJlbCwgdmFsdWU6ICdvcicgfV07XHJcbiAgXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgXHJcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZ2V0UXVlcnlCdWlsZGVyRmlsdGVyUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIGluaXRRdWVyeUJ1aWxkZXJDb250cm9scygpIHtcclxuICAgIHRoaXMucXVlcnlDdHJsID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHRoaXMuYmFzaWNRdWVyeSk7XHJcbiAgICB0aGlzLmFkdmFuY2VkUXVlcnlDdHJsID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHRoaXMuYWR2YW5jZWRRdWVyeSk7XHJcbiAgICBpZih0aGlzLmZpbHRlclBhbmVsT2JqZWN0LmFsbG93R3JvdXBlZCkge1xyXG4gICAgICB0aGlzLmdyb3VwZWRRdWVyeUN0cmwgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodGhpcy5ncm91cGVkUXVlcnkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VhcmNoVHlwZSgpIHtcclxuICAgIHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA9ICF0aGlzLmlzQWR2YW5jZWRTZWFyY2g7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENsaWNrZWQoKSB7XHJcbiAgICBsZXQgcXVlcmllczogUXVlcnlSZXN1bHRzID0ge1xyXG4gICAgICB0eXBlOiB0aGlzLmdldFF1ZXJ5VHlwZSgpLFxyXG4gICAgICBiYXNpYzogdGhpcy5pc0FkdmFuY2VkU2VhcmNoID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucXVlcnlDdHJsLnZhbHVlKSxcclxuICAgICAgYWR2YW5jZWQ6IHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA/IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYWR2YW5jZWRRdWVyeUN0cmwudmFsdWUpIDogbnVsbCxcclxuICAgICAgZ3JvdXBlZDogdGhpcy5pc0FkdmFuY2VkU2VhcmNoICYmIHRoaXMuZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dHcm91cGVkID8gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5ncm91cGVkUXVlcnlDdHJsLnZhbHVlKSA6IG51bGxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEVudGl0eShxdWVyaWVzKTtcclxuXHJcbiAgICBxdWVyaWVzID0gdGhpcy5pbml0aWFsaXplT3BlcmF0b3JzKHF1ZXJpZXMpO1xyXG4gICAgcXVlcmllcyA9IHRoaXMuZGVsZXRlRmllbGRzV2l0aG91dFZhbHVlKHF1ZXJpZXMpO1xyXG4gICAgcXVlcmllcyA9IHRoaXMuaGFuZGxlRW1wdHlGaWVsZHNRdWVyeShxdWVyaWVzKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdChxdWVyaWVzKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXJDbGlja2VkKCkge1xyXG4gICAgdGhpcy5yZXNldEJhc2ljUXVlcnlWYWx1ZXMoKTtcclxuICAgIHRoaXMuYWR2YW5jZWRRdWVyeS5ydWxlcyA9IFtdO1xyXG4gICAgdGhpcy5ncm91cGVkUXVlcnkucnVsZXMgPSBbXTtcclxuICAgIHRoaXMuY2xlYXJDbGlja2VkLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFbXB0eUZpZWxkc1F1ZXJ5KHF1ZXJpZXM6IFF1ZXJ5UmVzdWx0cyk6IFF1ZXJ5UmVzdWx0cyB7XHJcbiAgICBpZihxdWVyaWVzLmFkdmFuY2VkICE9IG51bGwgJiYgcXVlcmllcy5hZHZhbmNlZD8ucnVsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgcXVlcmllcy50eXBlID0gMFxyXG4gICAgfVxyXG4gICAgaWYocXVlcmllcy5iYXNpYyAhPSBudWxsICYmIHF1ZXJpZXMuYmFzaWM/LnJ1bGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHF1ZXJpZXMudHlwZSA9IDBcclxuICAgIH1cclxuICAgIGlmKHF1ZXJpZXMuZ3JvdXBlZCAhPSBudWxsICYmIHF1ZXJpZXMuZ3JvdXBlZD8ucnVsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgcXVlcmllcy50eXBlID0gMFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHF1ZXJpZXM7XHJcbiAgfVxyXG5cclxuICBnZXRRdWVyeVR5cGUoKTogUXVlcnlSZXN1bHRUeXBlIHtcclxuICAgIGlmKCF0aGlzLmlzQWR2YW5jZWRTZWFyY2gpIHtcclxuICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5CYXNpYztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmKHRoaXMuaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmdyb3VwZWRRdWVyeUN0cmw/LnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5Hcm91cGVkXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5BZHZhbmNlZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RW50aXR5KHF1ZXJpZXM6IFF1ZXJ5UmVzdWx0cykge1xyXG4gICAgaWYodGhpcy5nZXRRdWVyeVR5cGUoKSA9PSBRdWVyeVJlc3VsdFR5cGUuQmFzaWMpIHtcclxuICAgICAgcXVlcmllcy5iYXNpYyEucnVsZXMgPSBxdWVyaWVzLmJhc2ljIS5ydWxlcy5tYXAoKHI6YW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGZpZWxkOiByLmZpZWxkLFxyXG4gICAgICAgICAgb3BlcmF0b3I6IHIub3BlcmF0b3IsXHJcbiAgICAgICAgICB2YWx1ZTogci52YWx1ZSxcclxuICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdGllcy5maW5kKGUgPT4gZS5maWVsZEpzb25OYW1lID09IHIuZmllbGQpLmVudGl0eVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFF1ZXJ5QnVpbGRlckZpbHRlclBhbmVsKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpbHRlclBhbmVsKHRoaXMuYXV0aG9yaXphdGlvbkFwaVVybCwgdGhpcy50b2tlbiwgdGhpcy5jb21tb25EYXRhQXBpVXJsLCB0aGlzLmNvbW1vbkRhdGFUb2tlbiwgdGhpcy5maWx0ZXJJZClcclxuICAgICAgLnN1YnNjcmliZSgocWJQYW5lbEZpbHRlcjogUWJQYW5lbEZpbHRlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFuZWxPYmplY3QgPSBxYlBhbmVsRmlsdGVyO1xyXG4gICAgICAgIGxldCBiYXNpY0ZpbHRlcklkczogbnVtYmVyW10gPSBxYlBhbmVsRmlsdGVyLnFicGFuZWxUb0ZpZWxkcy5maWx0ZXIocGFuZWxUb0ZpZWxkID0+IHBhbmVsVG9GaWVsZC5iYXNpYykubWFwKHBhbmVsVG9GaWVsZCA9PiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkKTtcclxuICAgICAgICBsZXQgYWR2YW5jZWRGaWx0ZXJJZHM6IG51bWJlcltdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMuZmlsdGVyKHBhbmVsVG9GaWVsZCA9PiAhcGFuZWxUb0ZpZWxkLmJhc2ljKS5tYXAocGFuZWxUb0ZpZWxkID0+IHBhbmVsVG9GaWVsZC5xYmZpbHRlckZpZWxkSWQpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlcyA9IHFiUGFuZWxGaWx0ZXIucWJwYW5lbFRvRmllbGRzLm1hcChwYW5lbFRvRmllbGQgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcWJmaWx0ZXJGaWVsZElkOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHBhbmVsVG9GaWVsZC5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IHFiUGFuZWxGaWx0ZXIucWJwYW5lbFRvRmllbGRzLm1hcChwYW5lbFRvRmllbGQgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcWJmaWx0ZXJGaWVsZElkOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkLFxyXG4gICAgICAgICAgICBxYmRlZmF1bHRPcGVyYXRvcjogcGFuZWxUb0ZpZWxkLnFiZGVmYXVsdE9wZXJhdG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgZmlsdGVyRW50aXR5OiBRYkZpbHRlckVudGl0eVtdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMubWFwKHBhbmVsVG9GaWVsZCA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogcGFuZWxUb0ZpZWxkLnFiZmlsdGVyRmllbGQucWJmaWx0ZXJFbnRpdHkuaWQsIFxyXG4gICAgICAgICAgICBiYXNpYzogcGFuZWxUb0ZpZWxkLmJhc2ljLFxyXG4gICAgICAgICAgICBuYW1lOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZC5xYmZpbHRlckVudGl0eS5uYW1lLCBcclxuICAgICAgICAgICAganNvbk5hbWU6IHBhbmVsVG9GaWVsZC5xYmZpbHRlckZpZWxkLnFiZmlsdGVyRW50aXR5Lmpzb25OYW1lLCBcclxuICAgICAgICAgICAgZmllbGRzOiBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMubWFwKHAgPT4gcC5xYmZpbHRlckZpZWxkKTtcclxuICAgICAgICBmaWx0ZXJFbnRpdHkuZm9yRWFjaCgoZW50aXR5OiBRYkZpbHRlckVudGl0eSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgIGxldCBmaWVsZHMgPSBmaWx0ZXJGaWVsZHMuZmlsdGVyKGUgPT4gZS5xYmZpbHRlckVudGl0eS5pZCA9PSBlbnRpdHkuaWQpO1xyXG4gICAgICAgICAgIGZpbHRlckVudGl0eVtpbmRleF0uZmllbGRzID0gZmllbGRzIDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYmFzaWNRdWVyeUNvbmZpZyA9IHRoaXMuaW5pdFF1ZXJ5QnVpbGRlcihmaWx0ZXJFbnRpdHkpO1xyXG4gICAgICAgIHRoaXMuYmFzaWNRdWVyeUNvbmZpZyA9IHRoaXMuZmlsdGVyRmllbGRzQnlJZCh0aGlzLmJhc2ljUXVlcnlDb25maWcsIGJhc2ljRmlsdGVySWRzKTtcclxuICAgICAgICB0aGlzLmJhc2ljUXVlcnlDb25maWcuZmllbGRzID0gdGhpcy50cmFuc2xhdGVGaWVsZHModGhpcy5iYXNpY1F1ZXJ5Q29uZmlnLmZpZWxkcyk7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlZFF1ZXJ5Q29uZmlnID0gdGhpcy5pbml0UXVlcnlCdWlsZGVyKGZpbHRlckVudGl0eSk7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlZFF1ZXJ5Q29uZmlnID0gdGhpcy5maWx0ZXJGaWVsZHNCeUlkKHRoaXMuYWR2YW5jZWRRdWVyeUNvbmZpZywgYWR2YW5jZWRGaWx0ZXJJZHMpO1xyXG4gICAgICAgIHRoaXMuYWR2YW5jZWRRdWVyeUNvbmZpZy5maWVsZHMgPSB0aGlzLnRyYW5zbGF0ZUZpZWxkcyh0aGlzLmFkdmFuY2VkUXVlcnlDb25maWcuZmllbGRzKTtcclxuICAgICAgICBsZXQgcnVsZXMgPSBPYmplY3Qua2V5cyh0aGlzLmJhc2ljUXVlcnlDb25maWcuZmllbGRzKVxyXG4gICAgICAgICAgLm1hcChmaWVsZEtleSA9PiB7IFxyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdE9wZXJhdG9yID0gdGhpcy5kZWZhdWx0T3BlcmF0b3JzLmZpbmQob3BlcmF0b3IgPT4gb3BlcmF0b3IucWJmaWx0ZXJGaWVsZElkID09IHRoaXMuYmFzaWNRdWVyeUNvbmZpZy5maWVsZHNbZmllbGRLZXldLmlkICYmIG9wZXJhdG9yLnFiZGVmYXVsdE9wZXJhdG9yICE9IG51bGwpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZEtleSwgXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmFzaWNRdWVyeUNvbmZpZy5maWVsZHNbZmllbGRLZXldLmRlZmF1bHRWYWx1ZSEsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IGRlZmF1bHRPcGVyYXRvciA/IGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvci5zeW1ib2wgOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICB0aGlzLmJhc2ljUXVlcnkgPSB7XHJcbiAgICAgICAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgICAgICAgcnVsZXM6IHJ1bGVzXHJcbiAgICAgICAgIH07XHJcbiAgICAgICAgIHRoaXMuYWR2YW5jZWRRdWVyeSA9IHtcclxuICAgICAgICAgIGNvbmRpdGlvbjogJ2FuZCcsXHJcbiAgICAgICAgICBydWxlczogW11cclxuICAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnF1ZXJ5Q29uZmlnUmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW5pdFF1ZXJ5QnVpbGRlckNvbnRyb2xzKCk7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0UXVlcnlCdWlsZGVyKGZpbHRlckVudGl0aWVzOiBRYkZpbHRlckVudGl0eVtdKSB7XHJcbiAgICBsZXQgZW50aXR5Q29uZmlnQXV4OiBRdWVyeUJ1aWxkZXJDb25maWcgPSB7IGZpZWxkczoge30gfTtcclxuICAgIGxldCBlbnRpdGllc0FycmF5OiBFbnRpdHlNYXBbXSA9IFtdO1xyXG4gICAgZmlsdGVyRW50aXRpZXMubWFwKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgZW50aXR5OiBFbnRpdHkgPSB7IG5hbWU6IGUuanNvbk5hbWUgfTtcclxuICAgICAgcmV0dXJuIGVudGl0aWVzQXJyYXlbaW5kZXhdID0geyBbZS5qc29uTmFtZV06IGVudGl0eSB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGVudGl0aWVzTWFwOiBFbnRpdHlNYXAgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllc0FycmF5KSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkpO1xyXG5cclxuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgZW50aXRpZXNNYXBba2V5XSA9IGVudGl0eVtrZXldXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZW50aXR5Q29uZmlnQXV4LmVudGl0aWVzID0gZW50aXRpZXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpZWxkczogRmllbGRNYXBbXSA9IFtdO1xyXG4gICAgZmlsdGVyRW50aXRpZXMuZm9yRWFjaCgoZmlsdGVyRW50aXR5KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXJFbnRpdHkuZmllbGRzLmZpbHRlcigoZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkKSA9PiB7XHJcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBmaWVsZHMubGVuZ3RoID8/IDA7XHJcbiAgICAgICAgbGV0IG9wZXJhdG9yc0ZsYXRBcnJheSA9IGZpbHRlckZpZWxkLm9wZXJhdG9ycy5tYXAoKG86YW55KSA9PiBvLnN5bWJvbCk7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRPcGVyYXRvciA9IHRoaXMuZGVmYXVsdE9wZXJhdG9ycy5maW5kKG9wZXJhdG9yID0+IG9wZXJhdG9yLnFiZmlsdGVyRmllbGRJZCA9PSBmaWx0ZXJGaWVsZC5pZCk7XHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IHtcclxuICAgICAgICAgIGlkOiBmaWx0ZXJGaWVsZC5pZCxcclxuICAgICAgICAgIG5hbWU6IGZpbHRlckZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBvcGVyYXRvcnM6IGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvcj8uc3ltYm9sID8gdGhpcy5tb3ZlRWxlbWVudFRvRmlyc3RQbGFjZShvcGVyYXRvcnNGbGF0QXJyYXksIGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvcj8uc3ltYm9sKSA6IG9wZXJhdG9yc0ZsYXRBcnJheSxcclxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0RGF0YVR5cGUoZmlsdGVyRmllbGQuZGF0YVR5cGUpLFxyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmZvcm1hdERlZmF1bHRWYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5xYmZpbHRlckZpZWxkSWQgPT0gZmlsdGVyRmllbGQuaWQpLmRlZmF1bHRWYWx1ZSwgZmlsdGVyRmllbGQuZGF0YVR5cGUpLFxyXG4gICAgICAgICAgZGVmYXVsdE9wZXJhdG9yOiBkZWZhdWx0T3BlcmF0b3IucWJkZWZhdWx0T3BlcmF0b3I/LnN5bWJvbCxcclxuICAgICAgICAgIGVudGl0eTogZmlsdGVyRW50aXR5Lmpzb25OYW1lLFxyXG4gICAgICAgICAgb3B0aW9uczogZmlsdGVyRmllbGQubGlzdE9mVmFsdWVzLFxyXG4gICAgICAgICAgdmFsaWRhdG9yOiAocnVsZTogUnVsZSwgcGFyZW50OiBSdWxlU2V0KTogYW55IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydWxlLm9wZXJhdG9yICE9PSBcImlzIG51bGxcIiAmJiBydWxlLm9wZXJhdG9yICE9PSBcImlzIG5vdCBudWxsXCIpIHtcclxuICAgICAgICAgICAgICBpZiAocnVsZS52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJ1bGUudmFsdWUgPT09IG51bGwgfHwgcnVsZS52YWx1ZSA9PT0gJycgfHwgcnVsZS52YWx1ZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVxdWlyZWQ6ICdlbXB0eSBmaWVsZCcgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW50aXRpZXMucHVzaCh7ZmllbGRKc29uTmFtZTogZmlsdGVyRmllbGQuanNvbk5hbWUsIGVudGl0eTogZmllbGQuZW50aXR5fSk7XHJcbiAgICAgICAgZmllbGRzW2luZGV4XSA9IHsgW2ZpbHRlckZpZWxkLmpzb25OYW1lXTogZmllbGQgfTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgZmllbGRzTWFwOiBGaWVsZE1hcCA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaWVsZCk7XHJcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGZpZWxkc01hcFtrZXldID0gZmllbGRba2V5XTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBlbnRpdHlDb25maWdBdXguZmllbGRzID0gZmllbGRzTWFwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudGl0eUNvbmZpZ0F1eDtcclxuICB9XHJcblxyXG4gIGZpbHRlckZpZWxkc0J5SWQoZmllbGRzT2JqOiBhbnksIGlkQXJyYXk6IG51bWJlcltdKTogYW55IHtcclxuICAgIGNvbnN0IGZpbHRlcmVkRmllbGRzOiBhbnkgPSB7fTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzT2JqLmZpZWxkcykge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc09iai5maWVsZHNba2V5XTtcclxuICAgICAgaWYgKGlkQXJyYXkuaW5jbHVkZXMoZmllbGQuaWQpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRGaWVsZHNba2V5XSA9IGZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmZpZWxkc09iaixcclxuICAgICAgZmllbGRzOiBmaWx0ZXJlZEZpZWxkcyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGVGaWVsZHMoZmllbGRzOiBGaWVsZE1hcCkge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzKSB7XHJcbiAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGZpZWxkc1trZXldLm5hbWUgPSB0aGlzLnRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG4gIG1vdmVFbGVtZW50VG9GaXJzdFBsYWNlKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvRmlyc3RQbGFjZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvRmlyc3RQbGFjZSk7XHJcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIGFycmF5LnVuc2hpZnQoZWxlbWVudFRvRmlyc3RQbGFjZSk7IFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGVmYXVsdFZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IFFCRGF0YVR5cGVFbnVtKSB7XHJcbiAgICBpZih2YWx1ZSkge1xyXG4gICAgICBpZih0eXBlID09IFFCRGF0YVR5cGVFbnVtLkJvb2xlYW4pIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHR5cGUgPT0gdGhpcy5xYkRhdGFUeXBlRW51bS5OdW1iZXIgfHwgdHlwZSA9PSB0aGlzLnFiRGF0YVR5cGVFbnVtLkRlY2ltYWwgfHwgdHlwZSA9PSB0aGlzLnFiRGF0YVR5cGVFbnVtLkxpc3Qpe1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9IFxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YVR5cGUoaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMucWJEYXRhRW51bXMuZmluZCh2YWx1ZSA9PiB2YWx1ZSA9PT0gaWQpPy50b1N0cmluZygpID8/IFwiXCI7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaWVsZHNXaXRob3V0VmFsdWUoanNvbjogYW55KSB7XHJcbiAgICBpZiAoanNvbi5iYXNpYyAmJiBqc29uLmJhc2ljLnJ1bGVzKSB7XHJcbiAgICAgIGpzb24uYmFzaWMucnVsZXMgPSBqc29uLmJhc2ljLnJ1bGVzLmZpbHRlcigocnVsZTogYW55KSA9PiBydWxlLnZhbHVlICE9IG51bGwpO1xyXG4gICAgICBqc29uLmJhc2ljLnJ1bGVzID0ganNvbi5iYXNpYy5ydWxlcy5maWx0ZXIoKHJ1bGU6IGFueSkgPT4gcnVsZS52YWx1ZSAhPSB1bmRlZmluZWQpO1xyXG4gICAgICBqc29uLmJhc2ljLnJ1bGVzID0ganNvbi5iYXNpYy5ydWxlcy5maWx0ZXIoKHJ1bGU6IGFueSkgPT4gcnVsZS52YWx1ZSAhPT0gXCJcIik7XHJcbiAgICB9XHJcbiAgICBpZihqc29uLmFkdmFuY2VkICYmIGpzb24uYWR2YW5jZWQucnVsZXM/Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIGpzb24uYWR2YW5jZWQucnVsZXMgPSBqc29uLmFkdmFuY2VkLnJ1bGVzLmZpbHRlcigocnVsZTogYW55KSA9PiBydWxlLnJ1bGVzPy5sZW5ndGggIT0gMCk7XHJcbiAgICB9XHJcbiAgICBpZihqc29uLmdyb3VwZWQgJiYganNvbi5ncm91cGVkPy5ydWxlcy5sZW5ndGggIT0gMCkge1xyXG4gICAgICBqc29uLmdyb3VwZWQucnVsZXMgPSBqc29uLmdyb3VwZWQucnVsZXMuZmlsdGVyKChydWxlOiBhbnkpID0+IHJ1bGUucnVsZXM/Lmxlbmd0aCAhPSAwKTtcclxuICAgIH1cclxuICAgIGlmKGpzb24uZ3JvdXBlZCAmJiBqc29uLmdyb3VwZWQ/LnJ1bGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIGpzb24uZ3JvdXBlZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ganNvbjtcclxuICB9XHJcbiAgXHJcbiAgaW5pdGlhbGl6ZU9wZXJhdG9ycyhqc29uOiBhbnkpIHtcclxuICAgIGlmIChqc29uLmJhc2ljICYmIGpzb24uYmFzaWMucnVsZXMpIHtcclxuICAgICAganNvbi5iYXNpYy5ydWxlcy5mb3JFYWNoKChydWxlOmFueSkgPT4ge1xyXG4gICAgICAgIGlmKCFydWxlLm9wZXJhdG9yKSB7XHJcbiAgICAgICAgICBydWxlLm9wZXJhdG9yID0gXCI9XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRCYXNpY1F1ZXJ5VmFsdWVzKCkge1xyXG4gICAgdGhpcy5iYXNpY1F1ZXJ5LnJ1bGVzLmZvckVhY2goKHJ1bGU6IFJ1bGUpID0+IHtcclxuICAgICAgaWYocnVsZS52YWx1ZSB8fCBydWxlLnZhbHVlID09IDApe1xyXG4gICAgICAgIHJ1bGUudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwicXVlcnlDb25maWdSZWFkeVwiIGNsYXNzPVwid2FwcC1maWx0ZXItcGFuZWwtc3R5bGVzXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlclBhbmVsT2JqZWN0LmFsbG93QWR2YW5jZWRTZWFyY2g7IGVsc2UgYmFpc2NBbmRBZHZhbmNlZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJiYXNpY1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYnV0dG9uLWdhcFwiPlxyXG4gICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuY2xlYXJCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2tlZCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LnNlYXJjaEJ1dHRvbkxhYmVsXCIgKGNsaWNrKT1cIm9uU2VhcmNoQ2xpY2tlZCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2JhaXNjQW5kQWR2YW5jZWQ+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItcGFuZWwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWR2YW5jZWRTZWFyY2g7IGVsc2UgYWR2YW5jZWRWaWV3XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJiYXNpY1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2FkdmFuY2VkVmlldz5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkdmFuY2VkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYnV0dG9uLWdhcFwiIFtjbGFzcy5wdC0zXT1cImlzQWR2YW5jZWRTZWFyY2hcIj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuY2xlYXJCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2tlZCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3Quc2VhcmNoQnV0dG9uTGFiZWxcIiAoY2xpY2spPVwib25TZWFyY2hDbGlja2VkKClcIiBbbG9hZGluZ109XCJkYXRhSXNMb2FkaW5nU2VhcmNoQnV0dG9uXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjYmFzaWM+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dBZHZhbmNlZFNlYXJjaFwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGZsZXgtd3JhcFwiPlxyXG4gICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaFRhYkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXRleHRcIiAoY2xpY2spPVwidXBkYXRlU2VhcmNoVHlwZSgpXCI+PC9wLWJ1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImJhc2ljLWZpbHRlci1wYW5lbCBxdWVyeS1idWlsZGVyLXN0eWxlIGZhZGVpbiBhbmltYXRpb24tZHVyYXRpb24tNTAwXCI+XHJcbiAgICAgIDxxdWVyeS1idWlsZGVyIFtmb3JtQ29udHJvbF09J3F1ZXJ5Q3RybCcgW2NvbmZpZ109J2Jhc2ljUXVlcnlDb25maWcnIFthbGxvd1J1bGVzZXRdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXQnIFthbGxvd1J1bGVzZXRdPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0XCIgW3BlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2VdPSdwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlJz5cclxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUJ1dHRvbkdyb3VwPVwibGV0IHJ1bGVzZXQ7XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5UmVtb3ZlQnV0dG9uPVwibGV0IHJ1bGU7IGxldCByZW1vdmVSdWxlPXJlbW92ZVJ1bGVcIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlTd2l0Y2hHcm91cD1cImxldCBydWxlc2V0OyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlFbnRpdHk9XCJsZXQgcnVsZTsgbGV0IGVudGl0aWVzPWVudGl0aWVzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgIDxwLWRyb3Bkb3duIFtkaXNhYmxlZF09XCJ0cnVlXCIgY2xhc3M9XCJmaWVsZC1nYXAgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiICpuZ0lmPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIiBbb3B0aW9uc109XCJlbnRpdGllc1wiIFsobmdNb2RlbCldPVwicnVsZS5lbnRpdHlcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlGaWVsZD1cImxldCBydWxlOyBsZXQgZmllbGRzPWZpZWxkczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlOyBsZXQgZ2V0RmllbGRzID0gZ2V0RmllbGRzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1maWVsZC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtkaXNhYmxlZF09XCJ0cnVlXCIgIGNsYXNzPVwiZmllbGQtZ2FwIHctZWRpdC1zZWxlY3QtaW5wdXQtc21hbGwgc2VsZWN0LWRpc2FibGVkXCIgYXBwZW5kVG89XCJib2R5XCIgW29wdGlvbnNdPVwiZ2V0RmllbGRzKHJ1bGUuZW50aXR5KVwiIFsobmdNb2RlbCldPVwicnVsZS5maWVsZFwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIHJ1bGUpXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5T3BlcmF0b3I9XCJsZXQgcnVsZTsgbGV0IG9wZXJhdG9ycz1vcGVyYXRvcnM7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItb3BlcmF0b3Itd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgKm5nSWY9XCJpc0FkdmFuY2VkU2VhcmNoXCIgYXBwZW5kVG89XCJib2R5XCIgWyhuZ01vZGVsKV09XCJydWxlLm9wZXJhdG9yXCIgW29wdGlvbnNdPVwib3BlcmF0b3JzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UocnVsZSlcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5Cb29sZWFuLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8cC10b2dnbGVCdXR0b24gY2xhc3M9XCJmaWVsZC1nYXAgdG9nZ2xlLWJ1dHRvbi1hbGlnblwiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIG9uTGFiZWw9XCJUcnVlXCIgb2ZmTGFiZWw9XCJGYWxzZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIj48L3AtdG9nZ2xlQnV0dG9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRhdGV0aW1lLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8cC1jYWxlbmRhciBjbGFzcz1cImZpZWxkLWdhcFwiIGFwcGVuZFRvPVwiYm9keVwiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbc2hvd1RpbWVdPVwidHJ1ZVwiIFtzaG93U2Vjb25kc109XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMuZGF0ZXRpbWVcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRlY2ltYWwudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGlucHV0U3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgc3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgY2xhc3M9XCJmaWVsZC1nYXAgd2FwcC1pbnB1dC1udW1iZXIgaGVpZ2h0LWlucHV0XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgaW5wdXRJZD1cIm1pbm1heFwiIGlucHV0SWQ9XCJtaW5tYXhcIiBtb2RlPVwiZGVjaW1hbFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCIyXCIgW21heEZyYWN0aW9uRGlnaXRzXT1cIjVcIiBbbWluXT1cIjBcIiBbbWF4XT1cIjEwMFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5kZWNpbWFsXCI+IDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkxpc3QudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGNsYXNzPVwiZmllbGQtZ2FwIHctZWRpdC1zZWxlY3QtaW5wdXQtc21hbGxcIiBhcHBlbmRUbz1cImJvZHlcIiBbb3B0aW9uc109XCJvcHRpb25zXCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5saXN0XCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5OdW1iZXIudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgaW5wdXRTdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBzdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBjbGFzcz1cImZpZWxkLWdhcCB3YXBwLWlucHV0LW51bWJlciBoZWlnaHQtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIFttaW5dPVwiMFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5udW1iZXJcIj4gPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uVGV4dC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpZWxkLWdhcCBxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoIGhlaWdodC1pbnB1dCB3YXBwLWlucHV0XCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy50ZXh0XCIvPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkxpc3QudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IGNsYXNzPVwiZmllbGQtZ2FwXCIgW2FwcGVuZFRvXT1cIidib2R5J1wiIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIGRpc3BsYXk9XCJjaGlwXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubGlzdFwiPjwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3F1ZXJ5LWJ1aWxkZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQWR2YW5jZWRTZWFyY2ggJiYgYmFzaWNRdWVyeS5ydWxlcy5sZW5ndGg9PTBcIiA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub1F1ZXJ5RGF0YVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjYWR2YW5jZWQ+XHJcbiAgICA8ZGl2IFtjbGFzcy5xdWVyeS1idWlsZGVyLXN0eWxlXT1cIiFmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXRcIiBjbGFzcz1cIndhcHAtZmlsdGVyLXBhbmVsLWNvbnRhaW5lciBmYWRlaW4gYW5pbWF0aW9uLWR1cmF0aW9uLTUwMFwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0XCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgZmxleC13cmFwXCI+XHJcbiAgICAgICAgPHAtYnV0dG9uIGNsYXNzPVwibWItMlwiIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuYmFzaWNTZWFyY2hUYWJMYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCIgKGNsaWNrKT1cInVwZGF0ZVNlYXJjaFR5cGUoKVwiPjwvcC1idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8cXVlcnktYnVpbGRlciBbZm9ybUNvbnRyb2xdPSdhZHZhbmNlZFF1ZXJ5Q3RybCcgW2NvbmZpZ109J2FkdmFuY2VkUXVlcnlDb25maWcnIFthbGxvd1J1bGVzZXRdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXQnIFthbGxvd0NvbGxhcHNlXT0nZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dDb2xhcHNlJyBbYWxsb3dSdWxlc2V0XT1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldFwiIFtwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlXT0ncGVyc2lzdFZhbHVlT25GaWVsZENoYW5nZSc+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0OyBlbHNlIG5vUnVsZVNldFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUJ1dHRvbkdyb3VwPVwibGV0IHJ1bGVzZXQ7IGxldCBhZGRSdWxlPWFkZFJ1bGU7IGxldCBhZGRSdWxlU2V0PWFkZFJ1bGVTZXQ7IGxldCByZW1vdmVSdWxlU2V0PXJlbW92ZVJ1bGVTZXRcIj5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFkZFJ1bGVCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJhZGRSdWxlKClcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPHAtYnV0dG9uIGNsYXNzPVwibXItMlwiIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2guYWRkUnVsZVNldEJ1dHRvbkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cInBpIHBpLXBsdXNcIiAqbmdJZj1cImFkZFJ1bGVTZXRcIiAoY2xpY2spPVwiYWRkUnVsZVNldCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLnJlbW92ZVJ1bGVTZXRCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXJcIiBpY29uPVwicGkgcGktbWludXNcIiAqbmdJZj1cInJlbW92ZVJ1bGVTZXRcIiAoY2xpY2spPVwicmVtb3ZlUnVsZVNldCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vUnVsZVNldD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlCdXR0b25Hcm91cD1cImxldCBydWxlc2V0OyBsZXQgYWRkUnVsZT1hZGRSdWxlOyBsZXQgYWRkUnVsZVNldD1hZGRSdWxlU2V0OyBsZXQgcmVtb3ZlUnVsZVNldD1yZW1vdmVSdWxlU2V0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmJhc2ljU2VhcmNoVGFiTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dFwiIChjbGljayk9XCJ1cGRhdGVTZWFyY2hUeXBlKClcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWR2YW5jZWQtcXVlcnktYnV0dG9uLWdyb3VwIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5hZGRSdWxlQnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkUnVsZSgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFkZFJ1bGVTZXRCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJwaSBwaS1wbHVzXCIgKm5nSWY9XCJhZGRSdWxlU2V0XCIgKGNsaWNrKT1cImFkZFJ1bGVTZXQoKVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5yZW1vdmVSdWxlU2V0QnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgaWNvbj1cInBpIHBpLW1pbnVzXCIgKm5nSWY9XCJyZW1vdmVSdWxlU2V0XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGVTZXQoKVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUFycm93SWNvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hbmdsZS1yaWdodFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeVJlbW92ZUJ1dHRvbj1cImxldCBydWxlOyBsZXQgcmVtb3ZlUnVsZT1yZW1vdmVSdWxlXCI+XHJcbiAgICAgICAgICAgIDxwLWJ1dHRvbiBsYWJlbD1cIlwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXJcIiBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShydWxlKVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeVN3aXRjaEdyb3VwPVwibGV0IHJ1bGVzZXQ7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicnVsZXNldFwiIGNsYXNzPVwic3dpdGNoLWdyb3VwLXBhZGRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiAqbmdJZj1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93TG9naWNhbFJ1bGVcIiBbb3B0aW9uc109XCJzdGF0ZU9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGVzZXQuY29uZGl0aW9uXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5RW50aXR5PVwibGV0IHJ1bGU7IGxldCBlbnRpdGllcz1lbnRpdGllczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5lbml0eU1vZGVcIiBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgYXBwZW5kVG89XCJib2R5XCIgW29wdGlvbnNdPVwiZW50aXRpZXNcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZW50aXR5XCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgcnVsZSlcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUZpZWxkPVwibGV0IHJ1bGU7IGxldCBmaWVsZHM9ZmllbGRzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2U7IGxldCBnZXRGaWVsZHMgPSBnZXRGaWVsZHNcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWZpZWxkLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gY2xhc3M9XCJmaWVsZC1nYXAgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cImdldEZpZWxkcyhydWxlLmVudGl0eSlcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZmllbGRcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlPcGVyYXRvcj1cImxldCBydWxlOyBsZXQgb3BlcmF0b3JzPW9wZXJhdG9yczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1vcGVyYXRvci13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGNsYXNzPVwiZmllbGQtZ2FwIHctZWRpdC1zZWxlY3QtaW5wdXQtc21hbGxcIiBhcHBlbmRUbz1cImJvZHlcIiBbKG5nTW9kZWwpXT1cInJ1bGUub3BlcmF0b3JcIiBbb3B0aW9uc109XCJvcGVyYXRvcnNcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZShydWxlKVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5Cb29sZWFuLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8cC10b2dnbGVCdXR0b24gY2xhc3M9XCJmaWVsZC1nYXAgdG9nZ2xlLWJ1dHRvbi1hbGlnblwiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIG9uTGFiZWw9XCJUcnVlXCIgb2ZmTGFiZWw9XCJGYWxzZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIj48L3AtdG9nZ2xlQnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5EYXRldGltZS50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgY2xhc3M9XCJmaWVsZC1nYXBcIiBhcHBlbmRUbz1cImJvZHlcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1NlY29uZHNdPVwidHJ1ZVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRhdGV0aW1lXCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uRGVjaW1hbC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgaW5wdXRTdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBzdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBjbGFzcz1cImZpZWxkLWdhcCB3YXBwLWlucHV0LW51bWJlciBoZWlnaHQtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIG1vZGU9XCJkZWNpbWFsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTAwXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRlY2ltYWxcIj4gPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkxpc3QudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aCBmaWVsZC1nYXBcIj5cclxuICAgICAgICAgICAgICA8dy1saXN0LWZpZWxkIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBbb3BlcmF0b3JdPVwicnVsZS5vcGVyYXRvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5saXN0XCI+PC93LWxpc3QtZmllbGQ+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5OdW1iZXIudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGlucHV0U3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgc3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgY2xhc3M9XCJmaWVsZC1nYXAgd2FwcC1pbnB1dC1udW1iZXIgaGVpZ2h0LWlucHV0XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgaW5wdXRJZD1cIm1pbm1heFwiIGlucHV0SWQ9XCJtaW5tYXhcIiBbbWluXT1cIjBcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubnVtYmVyXCI+IDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLlRleHQudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpZWxkLWdhcCBxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoIGhlaWdodC1pbnB1dCB3YXBwLWlucHV0XCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy50ZXh0XCIvPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvcXVlcnktYnVpbGRlcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FkdmFuY2VkU2VhcmNoICYmIGFkdmFuY2VkUXVlcnkucnVsZXMubGVuZ3RoPT0wXCIgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub1F1ZXJ5RGF0YVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwhLS0gR3JvdXBlZCBmaWx0ZXIgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd0dyb3VwZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHktNVwiPlxyXG4gICAgICAgICAgPHdhcHAtdmlldy1jYXJkLXRpdGxlLXRleHQgW2NhcmRUaXRsZV09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZ3JvdXBlZEZpbHRlclRpdGxlXCI+PC93YXBwLXZpZXctY2FyZC10aXRsZS10ZXh0PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cXVlcnktYnVpbGRlciBbZm9ybUNvbnRyb2xdPSdncm91cGVkUXVlcnlDdHJsJyBbY29uZmlnXT0nYWR2YW5jZWRRdWVyeUNvbmZpZycgW2FsbG93UnVsZXNldF09J2ZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldCcgW2FsbG93Q29sbGFwc2VdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd0NvbGFwc2UnIFthbGxvd1J1bGVzZXRdPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0XCIgW3BlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2VdPSdwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlJz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5QnV0dG9uR3JvdXA9XCJsZXQgcnVsZXNldDsgbGV0IGFkZFJ1bGU9YWRkUnVsZTsgbGV0IGFkZFJ1bGVTZXQ9YWRkUnVsZVNldDsgbGV0IHJlbW92ZVJ1bGVTZXQ9cmVtb3ZlUnVsZVNldFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2guYWRkUnVsZUJ1dHRvbkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCIgKGNsaWNrKT1cImFkZFJ1bGUoKVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2guYWRkUnVsZVNldEJ1dHRvbkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cInBpIHBpLXBsdXNcIiAqbmdJZj1cImFkZFJ1bGVTZXRcIiAoY2xpY2spPVwiYWRkUnVsZVNldCgpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5yZW1vdmVSdWxlU2V0QnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgaWNvbj1cInBpIHBpLW1pbnVzXCIgKm5nSWY9XCJyZW1vdmVSdWxlU2V0XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGVTZXQoKVwiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlBcnJvd0ljb24+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktYW5nbGUtcmlnaHRcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlSZW1vdmVCdXR0b249XCJsZXQgcnVsZTsgbGV0IHJlbW92ZVJ1bGU9cmVtb3ZlUnVsZVwiPlxyXG4gICAgICAgICAgICA8cC1idXR0b24gbGFiZWw9XCJcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cInJlbW92ZVJ1bGUocnVsZSlcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlTd2l0Y2hHcm91cD1cImxldCBydWxlc2V0OyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJ1bGVzZXRcIj5cclxuICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiAqbmdJZj1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93TG9naWNhbFJ1bGVcIiBbb3B0aW9uc109XCJzdGF0ZU9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGVzZXQuY29uZGl0aW9uXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5RW50aXR5PVwibGV0IHJ1bGU7IGxldCBlbnRpdGllcz1lbnRpdGllczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxwLWRyb3Bkb3duIGNsYXNzPVwibXItMyB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5lbml0eU1vZGVcIiBhcHBlbmRUbz1cImJvZHlcIiBbb3B0aW9uc109XCJlbnRpdGllc1wiIFsobmdNb2RlbCldPVwicnVsZS5lbnRpdHlcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5RmllbGQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkcz1maWVsZHM7IGxldCBvbkNoYW5nZT1vbkNoYW5nZTsgbGV0IGdldEZpZWxkcyA9IGdldEZpZWxkc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItZmllbGQtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cIm1yLTMgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cImdldEZpZWxkcyhydWxlLmVudGl0eSlcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZmllbGRcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlPcGVyYXRvcj1cImxldCBydWxlOyBsZXQgb3BlcmF0b3JzPW9wZXJhdG9yczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1vcGVyYXRvci13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGNsYXNzPVwibXItMyB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgYXBwZW5kVG89XCJib2R5XCIgWyhuZ01vZGVsKV09XCJydWxlLm9wZXJhdG9yXCIgW29wdGlvbnNdPVwib3BlcmF0b3JzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UocnVsZSlcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgdHlwZTogcWJEYXRhVHlwZUVudW0uQm9vbGVhbi50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIGNsYXNzPVwibXItM1wiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIG9uTGFiZWw9XCJUcnVlXCIgb2ZmTGFiZWw9XCJGYWxzZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIj48L3AtdG9nZ2xlQnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5EYXRldGltZS50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgY2xhc3M9XCJtci0zXCIgYXBwZW5kVG89XCJib2R5XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3Nob3dTZWNvbmRzXT1cInRydWVcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5kYXRldGltZVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRlY2ltYWwudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGNsYXNzPVwibXItM1wiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIGlucHV0SWQ9XCJtaW5tYXhcIiBpbnB1dElkPVwibWlubWF4XCIgbW9kZT1cImRlY2ltYWxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiMlwiIFttYXhGcmFjdGlvbkRpZ2l0c109XCI1XCIgW21pbl09XCIwXCIgW21heF09XCIxMDBcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMuZGVjaW1hbFwiPiA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IG9wdGlvbnM9b3B0aW9uczsgdHlwZTogcWJEYXRhVHlwZUVudW0uTGlzdC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHctbGlzdC1maWVsZCBbb3B0aW9uc109XCJvcHRpb25zXCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgW29wZXJhdG9yXT1cInJ1bGUub3BlcmF0b3JcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubGlzdFwiPjwvdy1saXN0LWZpZWxkPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uTnVtYmVyLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBjbGFzcz1cIm1yLTNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIFttaW5dPVwiMFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5udW1iZXJcIj4gPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uVGV4dC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibXItMyBxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoIGhlaWdodC1pbnB1dCB3YXBwLWlucHV0XCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy50ZXh0XCIvPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvcXVlcnktYnVpbGRlcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQWR2YW5jZWRTZWFyY2ggJiYgZ3JvdXBlZFF1ZXJ5LnJ1bGVzLmxlbmd0aD09MFwiID5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub1F1ZXJ5RGF0YVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjbm9RdWVyeURhdGE+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtd3JhcCBjYXJkLWNvbnRhaW5lciBzdXJmYWNlLTUwIG1iLTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdy1mdWxsIGgtNHJlbSB0ZXh0LWdyYXktOTAwIGJvcmRlci1yb3VuZCBtLTJcIj5cclxuICAgICAgICB7e3RyYW5zbGF0aW9uc09iamVjdC5ub1J1bGVzTGFiZWx9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidy1maWx0ZXItcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FwcC1jb21wb25lbnRzL3NyYy9saWIvbWlzYy93LWZpbHRlci1wYW5lbC93LWZpbHRlci1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXBwLWNvbXBvbmVudHMvc3JjL2xpYi9taXNjL3ctZmlsdGVyLXBhbmVsL3ctZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSWpFLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVXJHLE1BQU0sT0FBTyxxQkFBcUI7SUE4RWhDLFlBQ1UsV0FBd0IsRUFDeEIsVUFBc0I7UUFEdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTVFekIsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBRWxELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsbUJBQWMsR0FBRyxjQUFjLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBUTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7UUFDRixpQkFBWSxHQUFRO1lBQ2xCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztRQUNGLGtCQUFhLEdBQVE7WUFDbkIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBRUYsd0JBQW1CLEdBQXVCLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3pELGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFDMUIscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBT08sOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBRWxELHVCQUFrQixHQUE0QjtZQUN6RSxtQkFBbUIsRUFBRSxjQUFjO1lBQ25DLHNCQUFzQixFQUFFLGlCQUFpQjtZQUN6QyxrQkFBa0IsRUFBRSxnQkFBZ0I7WUFDcEMsY0FBYyxFQUFFO2dCQUNkLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixhQUFhLEVBQUUsSUFBSTtnQkFDbkIsa0JBQWtCLEVBQUUsWUFBWTtnQkFDaEMscUJBQXFCLEVBQUUsZ0JBQWdCO2dCQUN2Qyx3QkFBd0IsRUFBRSxpQkFBaUI7YUFDNUM7WUFDRCxZQUFZLEVBQUUsbUNBQW1DO1lBQ2pELGlCQUFpQixFQUFFLE9BQU87WUFDMUIsZ0JBQWdCLEVBQUUsT0FBTztZQUN6QixrQkFBa0IsRUFBRTtnQkFDbEIsT0FBTyxFQUFFO29CQUNMLElBQUksRUFBRSxNQUFNO29CQUNaLEtBQUssRUFBRSxPQUFPO2lCQUNqQjtnQkFDRCxPQUFPLEVBQUUsdUJBQXVCO2dCQUNoQyxJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsUUFBUSxFQUFFLGVBQWU7YUFDMUI7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsUUFBUSxFQUFDLFVBQVU7YUFDcEI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxNQUFNO2dCQUNaLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1NBQ0YsQ0FBQztRQUV1QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQ2xELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVuRSxpQkFBWSxHQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBS2pMLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksT0FBTyxHQUFpQjtZQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzdFLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN4RixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUM5SCxDQUFBO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QixPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQXFCO1FBQzFDLElBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNsRSxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUNqQjtRQUNELElBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUM1RCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUNqQjtRQUNELElBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNoRSxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUNqQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUM7U0FDOUI7YUFBTTtZQUNMLElBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUU7Z0JBQ3hELE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQTthQUMvQjtpQkFBTTtnQkFDTCxPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQUM7YUFDakM7U0FDRjtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsT0FBcUI7UUFDN0IsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRTtZQUMvQyxPQUFPLENBQUMsS0FBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRTtnQkFDeEQsT0FBTztvQkFDTCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7b0JBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO29CQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7b0JBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtpQkFDbkUsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDN0gsU0FBUyxDQUFDLENBQUMsYUFBNEIsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUM7WUFDdkMsSUFBSSxjQUFjLEdBQWEsYUFBYSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzFKLElBQUksaUJBQWlCLEdBQWEsYUFBYSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDOUosSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDcEUsT0FBTztvQkFDTCxlQUFlLEVBQUUsWUFBWSxDQUFDLGVBQWU7b0JBQzdDLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWTtpQkFDeEMsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN2RSxPQUFPO29CQUNMLGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZTtvQkFDN0MsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLGlCQUFpQjtpQkFDbEQsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxZQUFZLEdBQXFCLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNwRixPQUFPO29CQUNMLEVBQUUsRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNoRCxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7b0JBQ3pCLElBQUksRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJO29CQUNwRCxRQUFRLEVBQUUsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsUUFBUTtvQkFDNUQsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxZQUFZLEdBQWtCLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFGLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFzQixFQUFFLEtBQWEsRUFBRSxFQUFFO2dCQUM1RCxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBRTtZQUN4QyxDQUFDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7aUJBQ2xELEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDZCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzFLLE9BQU87b0JBQ0wsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBYTtvQkFDM0QsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDNUUsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRztnQkFDakIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLEtBQUssRUFBRSxLQUFLO2FBQ1osQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ3BCLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixLQUFLLEVBQUUsRUFBRTthQUNULENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLGNBQWdDO1FBQy9DLElBQUksZUFBZSxHQUF1QixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN6RCxJQUFJLGFBQWEsR0FBZ0IsRUFBRSxDQUFDO1FBQ3BDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxNQUFNLEdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFDLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFdBQVcsR0FBYyxFQUFFLENBQUM7UUFFaEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxhQUFhLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVqQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsZUFBZSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7U0FDeEM7UUFFRCxJQUFJLE1BQU0sR0FBZSxFQUFFLENBQUM7UUFDNUIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3RDLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUF3QixFQUFFLEVBQUU7Z0JBQzdELElBQUksS0FBSyxHQUFXLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekcsSUFBSSxLQUFLLEdBQVU7b0JBQ2pCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO29CQUN0QixTQUFTLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO29CQUN2SyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUM1QyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUM7b0JBQ25KLGVBQWUsRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsTUFBTTtvQkFDMUQsTUFBTSxFQUFFLFlBQVksQ0FBQyxRQUFRO29CQUM3QixPQUFPLEVBQUUsV0FBVyxDQUFDLFlBQVk7b0JBQ2pDLFNBQVMsRUFBRSxDQUFDLElBQVUsRUFBRSxNQUFlLEVBQWMsRUFBRTt3QkFDckQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFBRTs0QkFDbEUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0NBQ2xHLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUM7NkJBQ3BDO3lCQUNGO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7aUJBQ0YsQ0FBQTtnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztnQkFDaEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUU3QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUMxQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFFSCxlQUFlLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUNwQztRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFjLEVBQUUsT0FBaUI7UUFDaEQsTUFBTSxjQUFjLEdBQVEsRUFBRSxDQUFDO1FBRS9CLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzlCLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDN0I7U0FDRjtRQUVELE9BQU87WUFDTCxHQUFHLFNBQVM7WUFDWixNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFnQjtRQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUN4QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4RDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQVksRUFBRSxtQkFBMkI7UUFDL0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQVUsRUFBRSxJQUFvQjtRQUNqRCxJQUFHLEtBQUssRUFBRTtZQUNSLElBQUcsSUFBSSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQzthQUN2QztZQUNELElBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUM7Z0JBQy9HLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4RSxDQUFDO0lBRUQsd0JBQXdCLENBQUMsSUFBUztRQUNoQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzFGO1FBQ0QsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN4RjtRQUNELElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBUztRQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUSxFQUFFLEVBQUU7Z0JBQ3BDLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztpQkFDckI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFO1lBQzNDLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBQztnQkFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2tIQWxYVSxxQkFBcUI7c0dBQXJCLHFCQUFxQix1WkNoQmxDLDAvcUJBaVNBOzJGRGpSYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0JBQWdCOzJIQWtDVCxtQkFBbUI7c0JBQW5DLEtBQUs7dUJBQUMsUUFBUTtnQkFDWSxnQkFBZ0I7c0JBQTFDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNULEtBQUs7c0JBQXBCLEtBQUs7dUJBQUMsT0FBTztnQkFDWSxlQUFlO3NCQUF4QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDTCxRQUFRO3NCQUExQixLQUFLO3VCQUFDLFVBQVU7Z0JBQ21CLHlCQUF5QjtzQkFBNUQsS0FBSzt1QkFBQywyQkFBMkI7Z0JBRUwsa0JBQWtCO3NCQUE5QyxLQUFLO3VCQUFDLG9CQUFvQjtnQkFvQ0YsYUFBYTtzQkFBckMsTUFBTTt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQW5DLE1BQU07dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUUJEYXRhVHlwZUVudW0gfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2VudW1zLm1vZGVsJztcclxuaW1wb3J0IHsgUWJQYW5lbEZpbHRlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZmlsdGVyLXBhbmVsL3FiLXBhbmVsLWZpbHRlci5tb2RlbCc7XHJcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5TWFwLCBGaWVsZCwgRmllbGRNYXAsIFF1ZXJ5QnVpbGRlckNvbmZpZywgUnVsZSwgUnVsZVNldCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZmlsdGVyLXBhbmVsL2ZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRmlsdGVyUGFuZWxUcmFuc2xhdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwtdHJhbnNsYXRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgUXVlcnlSZXN1bHRUeXBlLCBRdWVyeVJlc3VsdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9xdWVyeS1yZXN1bHRzLm1vZGVsJztcclxuaW1wb3J0IHsgRmlsdGVyRmllbGQgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9maWx0ZXItZmllbGQubW9kZWxzJztcclxuaW1wb3J0IHsgUWJGaWx0ZXJFbnRpdHkgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2ZpbHRlci1wYW5lbC9xYi1maWx0ZXItZW50aXR5Lm1vZGVsJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlL2FwaS9hcGkuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ctZmlsdGVyLXBhbmVsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdy1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3ctZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFdGaWx0ZXJQYW5lbENvbXBvbmVudCB7XHJcbiAgcHVibGljIHF1ZXJ5Q3RybCE6IEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBhZHZhbmNlZFF1ZXJ5Q3RybCE6IEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBncm91cGVkUXVlcnlDdHJsITogRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIHBlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICBxdWVyeUNvbmZpZ1JlYWR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZHZhbmNlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHFiRGF0YVR5cGVFbnVtID0gUUJEYXRhVHlwZUVudW07XHJcbiAgcWJEYXRhRW51bXMgPSBPYmplY3QudmFsdWVzKFFCRGF0YVR5cGVFbnVtKTtcclxuICBiYXNpY1F1ZXJ5Q29uZmlnITogYW55O1xyXG4gIGFkdmFuY2VkUXVlcnlDb25maWchOiBhbnk7XHJcbiAgYmFzaWNRdWVyeTogYW55ID0ge1xyXG4gICAgY29uZGl0aW9uOiAnYW5kJyxcclxuICAgIHJ1bGVzOiBbXVxyXG4gIH07XHJcbiAgZ3JvdXBlZFF1ZXJ5OiBhbnkgPSB7XHJcbiAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgcnVsZXM6IFtdXHJcbiAgfTtcclxuICBhZHZhbmNlZFF1ZXJ5OiBhbnkgPSB7XHJcbiAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgcnVsZXM6IFtdXHJcbiAgfTtcclxuICBmaWx0ZXJQYW5lbE9iamVjdCE6IFFiUGFuZWxGaWx0ZXI7XHJcbiAgZW50aXR5Q29uZmlnR3JvdXBlZDogUXVlcnlCdWlsZGVyQ29uZmlnID0geyBmaWVsZHM6IHt9IH07XHJcbiAgZW50aXRpZXM6IGFueVtdID0gW107XHJcbiAgZGVmYXVsdFZhbHVlczogYW55W10gPSBbXTtcclxuICBkZWZhdWx0T3BlcmF0b3JzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoJ2FwaVVybCcpIGF1dGhvcml6YXRpb25BcGlVcmwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCdjb21tb25EYXRhQXBpVXJsJykgY29tbW9uRGF0YUFwaVVybCE6IHN0cmluZztcclxuICBASW5wdXQoJ3Rva2VuJykgdG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCdjb21tb25EYXRhVG9rZW4nKSBjb21tb25EYXRhVG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCdmaWx0ZXJJZCcpIGZpbHRlcklkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZGF0YUlzTG9hZGluZ1NlYXJjaEJ1dHRvbicpIGRhdGFJc0xvYWRpbmdTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCd0cmFuc2xhdGlvbnNPYmplY3QnKSB0cmFuc2xhdGlvbnNPYmplY3Q6IEZpbHRlclBhbmVsVHJhbnNsYXRpb25zID0ge1xyXG4gICAgYmFzaWNTZWFyY2hUYWJMYWJlbDogJ0Jhc2ljIHNlYXJjaCcsXHJcbiAgICBhZHZhbmNlZFNlYXJjaFRhYkxhYmVsOiAnQWR2YW5jZWQgc2VhcmNoJyxcclxuICAgIGdyb3VwZWRGaWx0ZXJUaXRsZTogJ0dyb3VwZWQgZmlsdGVyJyxcclxuICAgIGFkdmFuY2VkU2VhcmNoOiB7XHJcbiAgICAgIGFuZEJ1dHRvbkxhYmVsOiAnQW5kJyxcclxuICAgICAgb3JCdXR0b25MYWJlbDogJ09yJyxcclxuICAgICAgYWRkUnVsZUJ1dHRvbkxhYmVsOiAnQWRkIGZpbHRlcicsXHJcbiAgICAgIGFkZFJ1bGVTZXRCdXR0b25MYWJlbDogJ0FkZCBmaWx0ZXIgc2V0JyxcclxuICAgICAgcmVtb3ZlUnVsZVNldEJ1dHRvbkxhYmVsOiAnUmVtb3ZlIHJ1bGUgc2V0J1xyXG4gICAgfSxcclxuICAgIG5vUnVsZXNMYWJlbDogJ0FkZCBmaWx0ZXIgb3IgZmlsdGVyIHNldCB0byBzdGFydCcsXHJcbiAgICBzZWFyY2hCdXR0b25MYWJlbDogJ0NsZWFyJyxcclxuICAgIGNsZWFyQnV0dG9uTGFiZWw6ICdDbGVhcicsXHJcbiAgICBmaWVsZHNQbGFjZWhvbGRlcnM6IHtcclxuICAgICAgYm9vbGVhbjoge1xyXG4gICAgICAgICAgdHJ1ZTogJ1RydWUnLFxyXG4gICAgICAgICAgZmFsc2U6ICdGYWxzZSdcclxuICAgICAgfSxcclxuICAgICAgZGVjaW1hbDogJ0luc2VydCBkZWNpbWFsIG51bWJlcicsXHJcbiAgICAgIGxpc3Q6ICdTZWxlY3QgYW4gb3B0aW9uJyxcclxuICAgICAgbnVtYmVyOiAnSW5zZXJ0IGEgbnVtYmVyJyxcclxuICAgICAgdGV4dDogJ0luc2VydCB0ZXh0JyxcclxuICAgICAgZGF0ZXRpbWU6ICdTZWxlY3QgYSBkYXRlJ1xyXG4gICAgfSxcclxuICAgIG9wZXJhdG9yczoge1xyXG4gICAgICBjb250YWluczonY29udGFpbnMnXHJcbiAgICB9LFxyXG4gICAgZmllbGRzOiB7XHJcbiAgICAgIElkbGVEZWFkbGluZTogJ0lkJyxcclxuICAgICAgbmFtZTogJ05hbWUnLFxyXG4gICAgICBjb2RlOiAnQ29kZScsXHJcbiAgICAgIGRlbGV0ZTogJ0RlbGV0ZWQnXHJcbiAgICB9XHJcbiAgfTtcclxuICBcclxuICBAT3V0cHV0KCdzZWFyY2hDbGlja2VkJykgc2VhcmNoQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UXVlcnlSZXN1bHRzPigpO1xyXG4gIEBPdXRwdXQoJ2NsZWFyQ2xpY2tlZCcpIGNsZWFyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBcclxuICBzdGF0ZU9wdGlvbnM6IGFueVtdID0gW3sgbGFiZWw6IHRoaXMudHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFuZEJ1dHRvbkxhYmVsLCB2YWx1ZTogJ2FuZCcgfSwgeyBsYWJlbDogdGhpcy50cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2gub3JCdXR0b25MYWJlbCwgdmFsdWU6ICdvcicgfV07XHJcbiAgXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgXHJcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZ2V0UXVlcnlCdWlsZGVyRmlsdGVyUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIGluaXRRdWVyeUJ1aWxkZXJDb250cm9scygpIHtcclxuICAgIHRoaXMucXVlcnlDdHJsID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHRoaXMuYmFzaWNRdWVyeSk7XHJcbiAgICB0aGlzLmFkdmFuY2VkUXVlcnlDdHJsID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHRoaXMuYWR2YW5jZWRRdWVyeSk7XHJcbiAgICBpZih0aGlzLmZpbHRlclBhbmVsT2JqZWN0LmFsbG93R3JvdXBlZCkge1xyXG4gICAgICB0aGlzLmdyb3VwZWRRdWVyeUN0cmwgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodGhpcy5ncm91cGVkUXVlcnkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VhcmNoVHlwZSgpIHtcclxuICAgIHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA9ICF0aGlzLmlzQWR2YW5jZWRTZWFyY2g7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENsaWNrZWQoKSB7XHJcbiAgICBsZXQgcXVlcmllczogUXVlcnlSZXN1bHRzID0ge1xyXG4gICAgICB0eXBlOiB0aGlzLmdldFF1ZXJ5VHlwZSgpLFxyXG4gICAgICBiYXNpYzogdGhpcy5pc0FkdmFuY2VkU2VhcmNoID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucXVlcnlDdHJsLnZhbHVlKSxcclxuICAgICAgYWR2YW5jZWQ6IHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA/IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYWR2YW5jZWRRdWVyeUN0cmwudmFsdWUpIDogbnVsbCxcclxuICAgICAgZ3JvdXBlZDogdGhpcy5pc0FkdmFuY2VkU2VhcmNoICYmIHRoaXMuZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dHcm91cGVkID8gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5ncm91cGVkUXVlcnlDdHJsLnZhbHVlKSA6IG51bGxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEVudGl0eShxdWVyaWVzKTtcclxuXHJcbiAgICBxdWVyaWVzID0gdGhpcy5pbml0aWFsaXplT3BlcmF0b3JzKHF1ZXJpZXMpO1xyXG4gICAgcXVlcmllcyA9IHRoaXMuZGVsZXRlRmllbGRzV2l0aG91dFZhbHVlKHF1ZXJpZXMpO1xyXG4gICAgcXVlcmllcyA9IHRoaXMuaGFuZGxlRW1wdHlGaWVsZHNRdWVyeShxdWVyaWVzKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdChxdWVyaWVzKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXJDbGlja2VkKCkge1xyXG4gICAgdGhpcy5yZXNldEJhc2ljUXVlcnlWYWx1ZXMoKTtcclxuICAgIHRoaXMuYWR2YW5jZWRRdWVyeS5ydWxlcyA9IFtdO1xyXG4gICAgdGhpcy5ncm91cGVkUXVlcnkucnVsZXMgPSBbXTtcclxuICAgIHRoaXMuY2xlYXJDbGlja2VkLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFbXB0eUZpZWxkc1F1ZXJ5KHF1ZXJpZXM6IFF1ZXJ5UmVzdWx0cyk6IFF1ZXJ5UmVzdWx0cyB7XHJcbiAgICBpZihxdWVyaWVzLmFkdmFuY2VkICE9IG51bGwgJiYgcXVlcmllcy5hZHZhbmNlZD8ucnVsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgcXVlcmllcy50eXBlID0gMFxyXG4gICAgfVxyXG4gICAgaWYocXVlcmllcy5iYXNpYyAhPSBudWxsICYmIHF1ZXJpZXMuYmFzaWM/LnJ1bGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHF1ZXJpZXMudHlwZSA9IDBcclxuICAgIH1cclxuICAgIGlmKHF1ZXJpZXMuZ3JvdXBlZCAhPSBudWxsICYmIHF1ZXJpZXMuZ3JvdXBlZD8ucnVsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgcXVlcmllcy50eXBlID0gMFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHF1ZXJpZXM7XHJcbiAgfVxyXG5cclxuICBnZXRRdWVyeVR5cGUoKTogUXVlcnlSZXN1bHRUeXBlIHtcclxuICAgIGlmKCF0aGlzLmlzQWR2YW5jZWRTZWFyY2gpIHtcclxuICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5CYXNpYztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmKHRoaXMuaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmdyb3VwZWRRdWVyeUN0cmw/LnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5Hcm91cGVkXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0VHlwZS5BZHZhbmNlZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RW50aXR5KHF1ZXJpZXM6IFF1ZXJ5UmVzdWx0cykge1xyXG4gICAgaWYodGhpcy5nZXRRdWVyeVR5cGUoKSA9PSBRdWVyeVJlc3VsdFR5cGUuQmFzaWMpIHtcclxuICAgICAgcXVlcmllcy5iYXNpYyEucnVsZXMgPSBxdWVyaWVzLmJhc2ljIS5ydWxlcy5tYXAoKHI6YW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGZpZWxkOiByLmZpZWxkLFxyXG4gICAgICAgICAgb3BlcmF0b3I6IHIub3BlcmF0b3IsXHJcbiAgICAgICAgICB2YWx1ZTogci52YWx1ZSxcclxuICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdGllcy5maW5kKGUgPT4gZS5maWVsZEpzb25OYW1lID09IHIuZmllbGQpLmVudGl0eVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFF1ZXJ5QnVpbGRlckZpbHRlclBhbmVsKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZpbHRlclBhbmVsKHRoaXMuYXV0aG9yaXphdGlvbkFwaVVybCwgdGhpcy50b2tlbiwgdGhpcy5jb21tb25EYXRhQXBpVXJsLCB0aGlzLmNvbW1vbkRhdGFUb2tlbiwgdGhpcy5maWx0ZXJJZClcclxuICAgICAgLnN1YnNjcmliZSgocWJQYW5lbEZpbHRlcjogUWJQYW5lbEZpbHRlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFuZWxPYmplY3QgPSBxYlBhbmVsRmlsdGVyO1xyXG4gICAgICAgIGxldCBiYXNpY0ZpbHRlcklkczogbnVtYmVyW10gPSBxYlBhbmVsRmlsdGVyLnFicGFuZWxUb0ZpZWxkcy5maWx0ZXIocGFuZWxUb0ZpZWxkID0+IHBhbmVsVG9GaWVsZC5iYXNpYykubWFwKHBhbmVsVG9GaWVsZCA9PiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkKTtcclxuICAgICAgICBsZXQgYWR2YW5jZWRGaWx0ZXJJZHM6IG51bWJlcltdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMuZmlsdGVyKHBhbmVsVG9GaWVsZCA9PiAhcGFuZWxUb0ZpZWxkLmJhc2ljKS5tYXAocGFuZWxUb0ZpZWxkID0+IHBhbmVsVG9GaWVsZC5xYmZpbHRlckZpZWxkSWQpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlcyA9IHFiUGFuZWxGaWx0ZXIucWJwYW5lbFRvRmllbGRzLm1hcChwYW5lbFRvRmllbGQgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcWJmaWx0ZXJGaWVsZElkOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHBhbmVsVG9GaWVsZC5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdG9ycyA9IHFiUGFuZWxGaWx0ZXIucWJwYW5lbFRvRmllbGRzLm1hcChwYW5lbFRvRmllbGQgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcWJmaWx0ZXJGaWVsZElkOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZElkLFxyXG4gICAgICAgICAgICBxYmRlZmF1bHRPcGVyYXRvcjogcGFuZWxUb0ZpZWxkLnFiZGVmYXVsdE9wZXJhdG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgZmlsdGVyRW50aXR5OiBRYkZpbHRlckVudGl0eVtdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMubWFwKHBhbmVsVG9GaWVsZCA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogcGFuZWxUb0ZpZWxkLnFiZmlsdGVyRmllbGQucWJmaWx0ZXJFbnRpdHkuaWQsIFxyXG4gICAgICAgICAgICBiYXNpYzogcGFuZWxUb0ZpZWxkLmJhc2ljLFxyXG4gICAgICAgICAgICBuYW1lOiBwYW5lbFRvRmllbGQucWJmaWx0ZXJGaWVsZC5xYmZpbHRlckVudGl0eS5uYW1lLCBcclxuICAgICAgICAgICAganNvbk5hbWU6IHBhbmVsVG9GaWVsZC5xYmZpbHRlckZpZWxkLnFiZmlsdGVyRW50aXR5Lmpzb25OYW1lLCBcclxuICAgICAgICAgICAgZmllbGRzOiBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyRmllbGRzOiBGaWx0ZXJGaWVsZFtdID0gcWJQYW5lbEZpbHRlci5xYnBhbmVsVG9GaWVsZHMubWFwKHAgPT4gcC5xYmZpbHRlckZpZWxkKTtcclxuICAgICAgICBmaWx0ZXJFbnRpdHkuZm9yRWFjaCgoZW50aXR5OiBRYkZpbHRlckVudGl0eSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgIGxldCBmaWVsZHMgPSBmaWx0ZXJGaWVsZHMuZmlsdGVyKGUgPT4gZS5xYmZpbHRlckVudGl0eS5pZCA9PSBlbnRpdHkuaWQpO1xyXG4gICAgICAgICAgIGZpbHRlckVudGl0eVtpbmRleF0uZmllbGRzID0gZmllbGRzIDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYmFzaWNRdWVyeUNvbmZpZyA9IHRoaXMuaW5pdFF1ZXJ5QnVpbGRlcihmaWx0ZXJFbnRpdHkpO1xyXG4gICAgICAgIHRoaXMuYmFzaWNRdWVyeUNvbmZpZyA9IHRoaXMuZmlsdGVyRmllbGRzQnlJZCh0aGlzLmJhc2ljUXVlcnlDb25maWcsIGJhc2ljRmlsdGVySWRzKTtcclxuICAgICAgICB0aGlzLmJhc2ljUXVlcnlDb25maWcuZmllbGRzID0gdGhpcy50cmFuc2xhdGVGaWVsZHModGhpcy5iYXNpY1F1ZXJ5Q29uZmlnLmZpZWxkcyk7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlZFF1ZXJ5Q29uZmlnID0gdGhpcy5pbml0UXVlcnlCdWlsZGVyKGZpbHRlckVudGl0eSk7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlZFF1ZXJ5Q29uZmlnID0gdGhpcy5maWx0ZXJGaWVsZHNCeUlkKHRoaXMuYWR2YW5jZWRRdWVyeUNvbmZpZywgYWR2YW5jZWRGaWx0ZXJJZHMpO1xyXG4gICAgICAgIHRoaXMuYWR2YW5jZWRRdWVyeUNvbmZpZy5maWVsZHMgPSB0aGlzLnRyYW5zbGF0ZUZpZWxkcyh0aGlzLmFkdmFuY2VkUXVlcnlDb25maWcuZmllbGRzKTtcclxuICAgICAgICBsZXQgcnVsZXMgPSBPYmplY3Qua2V5cyh0aGlzLmJhc2ljUXVlcnlDb25maWcuZmllbGRzKVxyXG4gICAgICAgICAgLm1hcChmaWVsZEtleSA9PiB7IFxyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdE9wZXJhdG9yID0gdGhpcy5kZWZhdWx0T3BlcmF0b3JzLmZpbmQob3BlcmF0b3IgPT4gb3BlcmF0b3IucWJmaWx0ZXJGaWVsZElkID09IHRoaXMuYmFzaWNRdWVyeUNvbmZpZy5maWVsZHNbZmllbGRLZXldLmlkICYmIG9wZXJhdG9yLnFiZGVmYXVsdE9wZXJhdG9yICE9IG51bGwpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZEtleSwgXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmFzaWNRdWVyeUNvbmZpZy5maWVsZHNbZmllbGRLZXldLmRlZmF1bHRWYWx1ZSEsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IGRlZmF1bHRPcGVyYXRvciA/IGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvci5zeW1ib2wgOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICB0aGlzLmJhc2ljUXVlcnkgPSB7XHJcbiAgICAgICAgICBjb25kaXRpb246ICdhbmQnLFxyXG4gICAgICAgICAgcnVsZXM6IHJ1bGVzXHJcbiAgICAgICAgIH07XHJcbiAgICAgICAgIHRoaXMuYWR2YW5jZWRRdWVyeSA9IHtcclxuICAgICAgICAgIGNvbmRpdGlvbjogJ2FuZCcsXHJcbiAgICAgICAgICBydWxlczogW11cclxuICAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnF1ZXJ5Q29uZmlnUmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW5pdFF1ZXJ5QnVpbGRlckNvbnRyb2xzKCk7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0UXVlcnlCdWlsZGVyKGZpbHRlckVudGl0aWVzOiBRYkZpbHRlckVudGl0eVtdKSB7XHJcbiAgICBsZXQgZW50aXR5Q29uZmlnQXV4OiBRdWVyeUJ1aWxkZXJDb25maWcgPSB7IGZpZWxkczoge30gfTtcclxuICAgIGxldCBlbnRpdGllc0FycmF5OiBFbnRpdHlNYXBbXSA9IFtdO1xyXG4gICAgZmlsdGVyRW50aXRpZXMubWFwKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgZW50aXR5OiBFbnRpdHkgPSB7IG5hbWU6IGUuanNvbk5hbWUgfTtcclxuICAgICAgcmV0dXJuIGVudGl0aWVzQXJyYXlbaW5kZXhdID0geyBbZS5qc29uTmFtZV06IGVudGl0eSB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGVudGl0aWVzTWFwOiBFbnRpdHlNYXAgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllc0FycmF5KSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkpO1xyXG5cclxuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgZW50aXRpZXNNYXBba2V5XSA9IGVudGl0eVtrZXldXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZW50aXR5Q29uZmlnQXV4LmVudGl0aWVzID0gZW50aXRpZXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpZWxkczogRmllbGRNYXBbXSA9IFtdO1xyXG4gICAgZmlsdGVyRW50aXRpZXMuZm9yRWFjaCgoZmlsdGVyRW50aXR5KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXJFbnRpdHkuZmllbGRzLmZpbHRlcigoZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkKSA9PiB7XHJcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBmaWVsZHMubGVuZ3RoID8/IDA7XHJcbiAgICAgICAgbGV0IG9wZXJhdG9yc0ZsYXRBcnJheSA9IGZpbHRlckZpZWxkLm9wZXJhdG9ycy5tYXAoKG86YW55KSA9PiBvLnN5bWJvbCk7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRPcGVyYXRvciA9IHRoaXMuZGVmYXVsdE9wZXJhdG9ycy5maW5kKG9wZXJhdG9yID0+IG9wZXJhdG9yLnFiZmlsdGVyRmllbGRJZCA9PSBmaWx0ZXJGaWVsZC5pZCk7XHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IHtcclxuICAgICAgICAgIGlkOiBmaWx0ZXJGaWVsZC5pZCxcclxuICAgICAgICAgIG5hbWU6IGZpbHRlckZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBvcGVyYXRvcnM6IGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvcj8uc3ltYm9sID8gdGhpcy5tb3ZlRWxlbWVudFRvRmlyc3RQbGFjZShvcGVyYXRvcnNGbGF0QXJyYXksIGRlZmF1bHRPcGVyYXRvci5xYmRlZmF1bHRPcGVyYXRvcj8uc3ltYm9sKSA6IG9wZXJhdG9yc0ZsYXRBcnJheSxcclxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0RGF0YVR5cGUoZmlsdGVyRmllbGQuZGF0YVR5cGUpLFxyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmZvcm1hdERlZmF1bHRWYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5xYmZpbHRlckZpZWxkSWQgPT0gZmlsdGVyRmllbGQuaWQpLmRlZmF1bHRWYWx1ZSwgZmlsdGVyRmllbGQuZGF0YVR5cGUpLFxyXG4gICAgICAgICAgZGVmYXVsdE9wZXJhdG9yOiBkZWZhdWx0T3BlcmF0b3IucWJkZWZhdWx0T3BlcmF0b3I/LnN5bWJvbCxcclxuICAgICAgICAgIGVudGl0eTogZmlsdGVyRW50aXR5Lmpzb25OYW1lLFxyXG4gICAgICAgICAgb3B0aW9uczogZmlsdGVyRmllbGQubGlzdE9mVmFsdWVzLFxyXG4gICAgICAgICAgdmFsaWRhdG9yOiAocnVsZTogUnVsZSwgcGFyZW50OiBSdWxlU2V0KTogYW55IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydWxlLm9wZXJhdG9yICE9PSBcImlzIG51bGxcIiAmJiBydWxlLm9wZXJhdG9yICE9PSBcImlzIG5vdCBudWxsXCIpIHtcclxuICAgICAgICAgICAgICBpZiAocnVsZS52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJ1bGUudmFsdWUgPT09IG51bGwgfHwgcnVsZS52YWx1ZSA9PT0gJycgfHwgcnVsZS52YWx1ZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVxdWlyZWQ6ICdlbXB0eSBmaWVsZCcgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW50aXRpZXMucHVzaCh7ZmllbGRKc29uTmFtZTogZmlsdGVyRmllbGQuanNvbk5hbWUsIGVudGl0eTogZmllbGQuZW50aXR5fSk7XHJcbiAgICAgICAgZmllbGRzW2luZGV4XSA9IHsgW2ZpbHRlckZpZWxkLmpzb25OYW1lXTogZmllbGQgfTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgZmllbGRzTWFwOiBGaWVsZE1hcCA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaWVsZCk7XHJcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGZpZWxkc01hcFtrZXldID0gZmllbGRba2V5XTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBlbnRpdHlDb25maWdBdXguZmllbGRzID0gZmllbGRzTWFwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudGl0eUNvbmZpZ0F1eDtcclxuICB9XHJcblxyXG4gIGZpbHRlckZpZWxkc0J5SWQoZmllbGRzT2JqOiBhbnksIGlkQXJyYXk6IG51bWJlcltdKTogYW55IHtcclxuICAgIGNvbnN0IGZpbHRlcmVkRmllbGRzOiBhbnkgPSB7fTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzT2JqLmZpZWxkcykge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc09iai5maWVsZHNba2V5XTtcclxuICAgICAgaWYgKGlkQXJyYXkuaW5jbHVkZXMoZmllbGQuaWQpKSB7XHJcbiAgICAgICAgZmlsdGVyZWRGaWVsZHNba2V5XSA9IGZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmZpZWxkc09iaixcclxuICAgICAgZmllbGRzOiBmaWx0ZXJlZEZpZWxkcyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGVGaWVsZHMoZmllbGRzOiBGaWVsZE1hcCkge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzKSB7XHJcbiAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGZpZWxkc1trZXldLm5hbWUgPSB0aGlzLnRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG4gIG1vdmVFbGVtZW50VG9GaXJzdFBsYWNlKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvRmlyc3RQbGFjZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvRmlyc3RQbGFjZSk7XHJcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIGFycmF5LnVuc2hpZnQoZWxlbWVudFRvRmlyc3RQbGFjZSk7IFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGVmYXVsdFZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IFFCRGF0YVR5cGVFbnVtKSB7XHJcbiAgICBpZih2YWx1ZSkge1xyXG4gICAgICBpZih0eXBlID09IFFCRGF0YVR5cGVFbnVtLkJvb2xlYW4pIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHR5cGUgPT0gdGhpcy5xYkRhdGFUeXBlRW51bS5OdW1iZXIgfHwgdHlwZSA9PSB0aGlzLnFiRGF0YVR5cGVFbnVtLkRlY2ltYWwgfHwgdHlwZSA9PSB0aGlzLnFiRGF0YVR5cGVFbnVtLkxpc3Qpe1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9IFxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YVR5cGUoaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMucWJEYXRhRW51bXMuZmluZCh2YWx1ZSA9PiB2YWx1ZSA9PT0gaWQpPy50b1N0cmluZygpID8/IFwiXCI7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaWVsZHNXaXRob3V0VmFsdWUoanNvbjogYW55KSB7XHJcbiAgICBpZiAoanNvbi5iYXNpYyAmJiBqc29uLmJhc2ljLnJ1bGVzKSB7XHJcbiAgICAgIGpzb24uYmFzaWMucnVsZXMgPSBqc29uLmJhc2ljLnJ1bGVzLmZpbHRlcigocnVsZTogYW55KSA9PiBydWxlLnZhbHVlICE9IG51bGwpO1xyXG4gICAgICBqc29uLmJhc2ljLnJ1bGVzID0ganNvbi5iYXNpYy5ydWxlcy5maWx0ZXIoKHJ1bGU6IGFueSkgPT4gcnVsZS52YWx1ZSAhPSB1bmRlZmluZWQpO1xyXG4gICAgICBqc29uLmJhc2ljLnJ1bGVzID0ganNvbi5iYXNpYy5ydWxlcy5maWx0ZXIoKHJ1bGU6IGFueSkgPT4gcnVsZS52YWx1ZSAhPT0gXCJcIik7XHJcbiAgICB9XHJcbiAgICBpZihqc29uLmFkdmFuY2VkICYmIGpzb24uYWR2YW5jZWQucnVsZXM/Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIGpzb24uYWR2YW5jZWQucnVsZXMgPSBqc29uLmFkdmFuY2VkLnJ1bGVzLmZpbHRlcigocnVsZTogYW55KSA9PiBydWxlLnJ1bGVzPy5sZW5ndGggIT0gMCk7XHJcbiAgICB9XHJcbiAgICBpZihqc29uLmdyb3VwZWQgJiYganNvbi5ncm91cGVkPy5ydWxlcy5sZW5ndGggIT0gMCkge1xyXG4gICAgICBqc29uLmdyb3VwZWQucnVsZXMgPSBqc29uLmdyb3VwZWQucnVsZXMuZmlsdGVyKChydWxlOiBhbnkpID0+IHJ1bGUucnVsZXM/Lmxlbmd0aCAhPSAwKTtcclxuICAgIH1cclxuICAgIGlmKGpzb24uZ3JvdXBlZCAmJiBqc29uLmdyb3VwZWQ/LnJ1bGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIGpzb24uZ3JvdXBlZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ganNvbjtcclxuICB9XHJcbiAgXHJcbiAgaW5pdGlhbGl6ZU9wZXJhdG9ycyhqc29uOiBhbnkpIHtcclxuICAgIGlmIChqc29uLmJhc2ljICYmIGpzb24uYmFzaWMucnVsZXMpIHtcclxuICAgICAganNvbi5iYXNpYy5ydWxlcy5mb3JFYWNoKChydWxlOmFueSkgPT4ge1xyXG4gICAgICAgIGlmKCFydWxlLm9wZXJhdG9yKSB7XHJcbiAgICAgICAgICBydWxlLm9wZXJhdG9yID0gXCI9XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRCYXNpY1F1ZXJ5VmFsdWVzKCkge1xyXG4gICAgdGhpcy5iYXNpY1F1ZXJ5LnJ1bGVzLmZvckVhY2goKHJ1bGU6IFJ1bGUpID0+IHtcclxuICAgICAgaWYocnVsZS52YWx1ZSB8fCBydWxlLnZhbHVlID09IDApe1xyXG4gICAgICAgIHJ1bGUudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwicXVlcnlDb25maWdSZWFkeVwiIGNsYXNzPVwid2FwcC1maWx0ZXItcGFuZWwtc3R5bGVzXCI+XG4gICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd0FkdmFuY2VkU2VhcmNoOyBlbHNlIGJhaXNjQW5kQWR2YW5jZWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItcGFuZWwtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJiYXNpY1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGJ1dHRvbi1nYXBcIj5cbiAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5jbGVhckJ1dHRvbkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uQ2xlYXJDbGlja2VkKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LnNlYXJjaEJ1dHRvbkxhYmVsXCIgKGNsaWNrKT1cIm9uU2VhcmNoQ2xpY2tlZCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjYmFpc2NBbmRBZHZhbmNlZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItcGFuZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0FkdmFuY2VkU2VhcmNoOyBlbHNlIGFkdmFuY2VkVmlld1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2ljXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhZHZhbmNlZFZpZXc+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWR2YW5jZWRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBidXR0b24tZ2FwXCIgW2NsYXNzLnB0LTNdPVwiaXNBZHZhbmNlZFNlYXJjaFwiPlxuICAgICAgICAgICAgPHAtYnV0dG9uIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuY2xlYXJCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2tlZCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LnNlYXJjaEJ1dHRvbkxhYmVsXCIgKGNsaWNrKT1cIm9uU2VhcmNoQ2xpY2tlZCgpXCIgW2xvYWRpbmddPVwiZGF0YUlzTG9hZGluZ1NlYXJjaEJ1dHRvblwiPjwvcC1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2Jhc2ljPlxuICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd0FkdmFuY2VkU2VhcmNoXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgZmxleC13cmFwXCI+XG4gICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaFRhYkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXRleHRcIiAoY2xpY2spPVwidXBkYXRlU2VhcmNoVHlwZSgpXCI+PC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtZmlsdGVyLXBhbmVsIHF1ZXJ5LWJ1aWxkZXItc3R5bGUgZmFkZWluIGFuaW1hdGlvbi1kdXJhdGlvbi01MDBcIj5cbiAgICAgIDxxdWVyeS1idWlsZGVyIFtmb3JtQ29udHJvbF09J3F1ZXJ5Q3RybCcgW2NvbmZpZ109J2Jhc2ljUXVlcnlDb25maWcnIFthbGxvd1J1bGVzZXRdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXQnIFthbGxvd1J1bGVzZXRdPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0XCIgW3BlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2VdPSdwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlJz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlCdXR0b25Hcm91cD1cImxldCBydWxlc2V0O1wiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeVJlbW92ZUJ1dHRvbj1cImxldCBydWxlOyBsZXQgcmVtb3ZlUnVsZT1yZW1vdmVSdWxlXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5U3dpdGNoR3JvdXA9XCJsZXQgcnVsZXNldDsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5RW50aXR5PVwibGV0IHJ1bGU7IGxldCBlbnRpdGllcz1lbnRpdGllczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgPHAtZHJvcGRvd24gW2Rpc2FibGVkXT1cInRydWVcIiBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgKm5nSWY9XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cImVudGl0aWVzXCIgWyhuZ01vZGVsKV09XCJydWxlLmVudGl0eVwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIHJ1bGUpXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUZpZWxkPVwibGV0IHJ1bGU7IGxldCBmaWVsZHM9ZmllbGRzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2U7IGxldCBnZXRGaWVsZHMgPSBnZXRGaWVsZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICA8cC1kcm9wZG93biBbZGlzYWJsZWRdPVwidHJ1ZVwiICBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsIHNlbGVjdC1kaXNhYmxlZFwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cImdldEZpZWxkcyhydWxlLmVudGl0eSlcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZmllbGRcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlPcGVyYXRvcj1cImxldCBydWxlOyBsZXQgb3BlcmF0b3JzPW9wZXJhdG9yczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItb3BlcmF0b3Itd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gY2xhc3M9XCJmaWVsZC1nYXAgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiICpuZ0lmPVwiaXNBZHZhbmNlZFNlYXJjaFwiIGFwcGVuZFRvPVwiYm9keVwiIFsobmdNb2RlbCldPVwicnVsZS5vcGVyYXRvclwiIFtvcHRpb25zXT1cIm9wZXJhdG9yc1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKHJ1bGUpXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkJvb2xlYW4udG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8cC10b2dnbGVCdXR0b24gY2xhc3M9XCJmaWVsZC1nYXAgdG9nZ2xlLWJ1dHRvbi1hbGlnblwiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIG9uTGFiZWw9XCJUcnVlXCIgb2ZmTGFiZWw9XCJGYWxzZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIj48L3AtdG9nZ2xlQnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRhdGV0aW1lLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxwLWNhbGVuZGFyIGNsYXNzPVwiZmllbGQtZ2FwXCIgYXBwZW5kVG89XCJib2R5XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3Nob3dTZWNvbmRzXT1cInRydWVcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5kYXRldGltZVwiPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRlY2ltYWwudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgaW5wdXRTdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBzdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBjbGFzcz1cImZpZWxkLWdhcCB3YXBwLWlucHV0LW51bWJlciBoZWlnaHQtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIG1vZGU9XCJkZWNpbWFsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTAwXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRlY2ltYWxcIj4gPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkxpc3QudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gY2xhc3M9XCJmaWVsZC1nYXAgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmxpc3RcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5OdW1iZXIudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGlucHV0U3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgc3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgY2xhc3M9XCJmaWVsZC1nYXAgd2FwcC1pbnB1dC1udW1iZXIgaGVpZ2h0LWlucHV0XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgaW5wdXRJZD1cIm1pbm1heFwiIGlucHV0SWQ9XCJtaW5tYXhcIiBbbWluXT1cIjBcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubnVtYmVyXCI+IDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLlRleHQudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmllbGQtZ2FwIHF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGggaGVpZ2h0LWlucHV0IHdhcHAtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLnRleHRcIi8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IG9wdGlvbnM9b3B0aW9uczsgdHlwZTogcWJEYXRhVHlwZUVudW0uTGlzdC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxuICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBjbGFzcz1cImZpZWxkLWdhcFwiIFthcHBlbmRUb109XCInYm9keSdcIiBbb3B0aW9uc109XCJvcHRpb25zXCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiBkaXNwbGF5PVwiY2hpcFwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmxpc3RcIj48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9xdWVyeS1idWlsZGVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0FkdmFuY2VkU2VhcmNoICYmIGJhc2ljUXVlcnkucnVsZXMubGVuZ3RoPT0wXCIgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vUXVlcnlEYXRhXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI2FkdmFuY2VkPlxuICAgIDxkaXYgW2NsYXNzLnF1ZXJ5LWJ1aWxkZXItc3R5bGVdPVwiIWZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldFwiIGNsYXNzPVwid2FwcC1maWx0ZXItcGFuZWwtY29udGFpbmVyIGZhZGVpbiBhbmltYXRpb24tZHVyYXRpb24tNTAwXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dSdWxlU2V0XCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgZmxleC13cmFwXCI+XG4gICAgICAgIDxwLWJ1dHRvbiBjbGFzcz1cIm1iLTJcIiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmJhc2ljU2VhcmNoVGFiTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dFwiIChjbGljayk9XCJ1cGRhdGVTZWFyY2hUeXBlKClcIj48L3AtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8cXVlcnktYnVpbGRlciBbZm9ybUNvbnRyb2xdPSdhZHZhbmNlZFF1ZXJ5Q3RybCcgW2NvbmZpZ109J2FkdmFuY2VkUXVlcnlDb25maWcnIFthbGxvd1J1bGVzZXRdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXQnIFthbGxvd0NvbGxhcHNlXT0nZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dDb2xhcHNlJyBbYWxsb3dSdWxlc2V0XT1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldFwiIFtwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlXT0ncGVyc2lzdFZhbHVlT25GaWVsZENoYW5nZSc+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldDsgZWxzZSBub1J1bGVTZXRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5QnV0dG9uR3JvdXA9XCJsZXQgcnVsZXNldDsgbGV0IGFkZFJ1bGU9YWRkUnVsZTsgbGV0IGFkZFJ1bGVTZXQ9YWRkUnVsZVNldDsgbGV0IHJlbW92ZVJ1bGVTZXQ9cmVtb3ZlUnVsZVNldFwiPlxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFkZFJ1bGVCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJhZGRSdWxlKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFkZFJ1bGVTZXRCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJwaSBwaS1wbHVzXCIgKm5nSWY9XCJhZGRSdWxlU2V0XCIgKGNsaWNrKT1cImFkZFJ1bGVTZXQoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPHAtYnV0dG9uIGNsYXNzPVwibXItMlwiIFtsYWJlbF09XCJ0cmFuc2xhdGlvbnNPYmplY3QuYWR2YW5jZWRTZWFyY2gucmVtb3ZlUnVsZVNldEJ1dHRvbkxhYmVsXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWRhbmdlclwiIGljb249XCJwaSBwaS1taW51c1wiICpuZ0lmPVwicmVtb3ZlUnVsZVNldFwiIChjbGljayk9XCJyZW1vdmVSdWxlU2V0KClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vUnVsZVNldD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5QnV0dG9uR3JvdXA9XCJsZXQgcnVsZXNldDsgbGV0IGFkZFJ1bGU9YWRkUnVsZTsgbGV0IGFkZFJ1bGVTZXQ9YWRkUnVsZVNldDsgbGV0IHJlbW92ZVJ1bGVTZXQ9cmVtb3ZlUnVsZVNldFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmJhc2ljU2VhcmNoVGFiTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dFwiIChjbGljayk9XCJ1cGRhdGVTZWFyY2hUeXBlKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZHZhbmNlZC1xdWVyeS1idXR0b24tZ3JvdXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5hZGRSdWxlQnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkUnVsZSgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5hZGRSdWxlU2V0QnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwicGkgcGktcGx1c1wiICpuZ0lmPVwiYWRkUnVsZVNldFwiIChjbGljayk9XCJhZGRSdWxlU2V0KClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLnJlbW92ZVJ1bGVTZXRCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXJcIiBpY29uPVwicGkgcGktbWludXNcIiAqbmdJZj1cInJlbW92ZVJ1bGVTZXRcIiAoY2xpY2spPVwicmVtb3ZlUnVsZVNldCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUFycm93SWNvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktYW5nbGUtcmlnaHRcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlSZW1vdmVCdXR0b249XCJsZXQgcnVsZTsgbGV0IHJlbW92ZVJ1bGU9cmVtb3ZlUnVsZVwiPlxuICAgICAgICAgICAgPHAtYnV0dG9uIGxhYmVsPVwiXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWRhbmdlclwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJyZW1vdmVSdWxlKHJ1bGUpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5U3dpdGNoR3JvdXA9XCJsZXQgcnVsZXNldDsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicnVsZXNldFwiIGNsYXNzPVwic3dpdGNoLWdyb3VwLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICA8cC1zZWxlY3RCdXR0b24gKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd0xvZ2ljYWxSdWxlXCIgW29wdGlvbnNdPVwic3RhdGVPcHRpb25zXCIgWyhuZ01vZGVsKV09XCJydWxlc2V0LmNvbmRpdGlvblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCI+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlFbnRpdHk9XCJsZXQgcnVsZTsgbGV0IGVudGl0aWVzPWVudGl0aWVzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJmaWx0ZXJQYW5lbE9iamVjdC5lbml0eU1vZGVcIiBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgYXBwZW5kVG89XCJib2R5XCIgW29wdGlvbnNdPVwiZW50aXRpZXNcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZW50aXR5XCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgcnVsZSlcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUZpZWxkPVwibGV0IHJ1bGU7IGxldCBmaWVsZHM9ZmllbGRzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2U7IGxldCBnZXRGaWVsZHMgPSBnZXRGaWVsZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cImZpZWxkLWdhcCB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgYXBwZW5kVG89XCJib2R5XCIgW29wdGlvbnNdPVwiZ2V0RmllbGRzKHJ1bGUuZW50aXR5KVwiIFsobmdNb2RlbCldPVwicnVsZS5maWVsZFwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIHJ1bGUpXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlPcGVyYXRvcj1cImxldCBydWxlOyBsZXQgb3BlcmF0b3JzPW9wZXJhdG9yczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItb3BlcmF0b3Itd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd24gY2xhc3M9XCJmaWVsZC1nYXAgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiIGFwcGVuZFRvPVwiYm9keVwiIFsobmdNb2RlbCldPVwicnVsZS5vcGVyYXRvclwiIFtvcHRpb25zXT1cIm9wZXJhdG9yc1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKHJ1bGUpXCI+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5Cb29sZWFuLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIGNsYXNzPVwiZmllbGQtZ2FwIHRvZ2dsZS1idXR0b24tYWxpZ25cIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBvbkxhYmVsPVwiVHJ1ZVwiIG9mZkxhYmVsPVwiRmFsc2VcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCI+PC9wLXRvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgdHlwZTogcWJEYXRhVHlwZUVudW0uRGF0ZXRpbWUudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgY2xhc3M9XCJmaWVsZC1nYXBcIiBhcHBlbmRUbz1cImJvZHlcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1NlY29uZHNdPVwidHJ1ZVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRhdGV0aW1lXCI+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRlY2ltYWwudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgaW5wdXRTdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBzdHlsZUNsYXNzPVwiZmxleCBmbGV4LTFcIiBjbGFzcz1cImZpZWxkLWdhcCB3YXBwLWlucHV0LW51bWJlciBoZWlnaHQtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIG1vZGU9XCJkZWNpbWFsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTAwXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRlY2ltYWxcIj4gPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgb3B0aW9ucz1vcHRpb25zOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5MaXN0LnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoIGZpZWxkLWdhcFwiPlxuICAgICAgICAgICAgICA8dy1saXN0LWZpZWxkIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBbb3BlcmF0b3JdPVwicnVsZS5vcGVyYXRvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy5saXN0XCI+PC93LWxpc3QtZmllbGQ+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uTnVtYmVyLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGlucHV0U3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgc3R5bGVDbGFzcz1cImZsZXggZmxleC0xXCIgY2xhc3M9XCJmaWVsZC1nYXAgd2FwcC1pbnB1dC1udW1iZXIgaGVpZ2h0LWlucHV0XCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgaW5wdXRJZD1cIm1pbm1heFwiIGlucHV0SWQ9XCJtaW5tYXhcIiBbbWluXT1cIjBcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubnVtYmVyXCI+IDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5UZXh0LnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmllbGQtZ2FwIHF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGggaGVpZ2h0LWlucHV0IHdhcHAtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLnRleHRcIi8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3F1ZXJ5LWJ1aWxkZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FkdmFuY2VkU2VhcmNoICYmIGFkdmFuY2VkUXVlcnkucnVsZXMubGVuZ3RoPT0wXCIgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9RdWVyeURhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEdyb3VwZWQgZmlsdGVyIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93R3JvdXBlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHktNVwiPlxuICAgICAgICAgIDx3YXBwLXZpZXctY2FyZC10aXRsZS10ZXh0IFtjYXJkVGl0bGVdPVwidHJhbnNsYXRpb25zT2JqZWN0Lmdyb3VwZWRGaWx0ZXJUaXRsZVwiPjwvd2FwcC12aWV3LWNhcmQtdGl0bGUtdGV4dD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHF1ZXJ5LWJ1aWxkZXIgW2Zvcm1Db250cm9sXT0nZ3JvdXBlZFF1ZXJ5Q3RybCcgW2NvbmZpZ109J2FkdmFuY2VkUXVlcnlDb25maWcnIFthbGxvd1J1bGVzZXRdPSdmaWx0ZXJQYW5lbE9iamVjdC5hbGxvd1J1bGVTZXQnIFthbGxvd0NvbGxhcHNlXT0nZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dDb2xhcHNlJyBbYWxsb3dSdWxlc2V0XT1cImZpbHRlclBhbmVsT2JqZWN0LmFsbG93UnVsZVNldFwiIFtwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlXT0ncGVyc2lzdFZhbHVlT25GaWVsZENoYW5nZSc+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlCdXR0b25Hcm91cD1cImxldCBydWxlc2V0OyBsZXQgYWRkUnVsZT1hZGRSdWxlOyBsZXQgYWRkUnVsZVNldD1hZGRSdWxlU2V0OyBsZXQgcmVtb3ZlUnVsZVNldD1yZW1vdmVSdWxlU2V0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMyBtYi0zXCI+XG4gICAgICAgICAgICAgIDxwLWJ1dHRvbiBbbGFiZWxdPVwidHJhbnNsYXRpb25zT2JqZWN0LmFkdmFuY2VkU2VhcmNoLmFkZFJ1bGVCdXR0b25MYWJlbFwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJhZGRSdWxlKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5hZGRSdWxlU2V0QnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwicGkgcGktcGx1c1wiICpuZ0lmPVwiYWRkUnVsZVNldFwiIChjbGljayk9XCJhZGRSdWxlU2V0KClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICA8cC1idXR0b24gW2xhYmVsXT1cInRyYW5zbGF0aW9uc09iamVjdC5hZHZhbmNlZFNlYXJjaC5yZW1vdmVSdWxlU2V0QnV0dG9uTGFiZWxcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgaWNvbj1cInBpIHBpLW1pbnVzXCIgKm5nSWY9XCJyZW1vdmVSdWxlU2V0XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGVTZXQoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5QXJyb3dJY29uPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hbmdsZS1yaWdodFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeVJlbW92ZUJ1dHRvbj1cImxldCBydWxlOyBsZXQgcmVtb3ZlUnVsZT1yZW1vdmVSdWxlXCI+XG4gICAgICAgICAgICA8cC1idXR0b24gbGFiZWw9XCJcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cInJlbW92ZVJ1bGUocnVsZSlcIj48L3AtYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlTd2l0Y2hHcm91cD1cImxldCBydWxlc2V0OyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJydWxlc2V0XCI+XG4gICAgICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuYWxsb3dMb2dpY2FsUnVsZVwiIFtvcHRpb25zXT1cInN0YXRlT3B0aW9uc1wiIFsobmdNb2RlbCldPVwicnVsZXNldC5jb25kaXRpb25cIiBvcHRpb25MYWJlbD1cImxhYmVsXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5RW50aXR5PVwibGV0IHJ1bGU7IGxldCBlbnRpdGllcz1lbnRpdGllczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cIm1yLTMgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiICpuZ0lmPVwiZmlsdGVyUGFuZWxPYmplY3QuZW5pdHlNb2RlXCIgYXBwZW5kVG89XCJib2R5XCIgW29wdGlvbnNdPVwiZW50aXRpZXNcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZW50aXR5XCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgcnVsZSlcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUZpZWxkPVwibGV0IHJ1bGU7IGxldCBmaWVsZHM9ZmllbGRzOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2U7IGxldCBnZXRGaWVsZHMgPSBnZXRGaWVsZHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICA8cC1kcm9wZG93biBjbGFzcz1cIm1yLTMgdy1lZGl0LXNlbGVjdC1pbnB1dC1zbWFsbFwiIGFwcGVuZFRvPVwiYm9keVwiIFtvcHRpb25zXT1cImdldEZpZWxkcyhydWxlLmVudGl0eSlcIiBbKG5nTW9kZWwpXT1cInJ1bGUuZmllbGRcIiBvcHRpb25MYWJlbD1cIm5hbWVcIiBvcHRpb25WYWx1ZT1cInZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5T3BlcmF0b3I9XCJsZXQgcnVsZTsgbGV0IG9wZXJhdG9ycz1vcGVyYXRvcnM7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLW9wZXJhdG9yLXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGNsYXNzPVwibXItMyB3LWVkaXQtc2VsZWN0LWlucHV0LXNtYWxsXCIgYXBwZW5kVG89XCJib2R5XCIgWyhuZ01vZGVsKV09XCJydWxlLm9wZXJhdG9yXCIgW29wdGlvbnNdPVwib3BlcmF0b3JzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UocnVsZSlcIj48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkJvb2xlYW4udG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8cC10b2dnbGVCdXR0b24gY2xhc3M9XCJtci0zXCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgb25MYWJlbD1cIlRydWVcIiBvZmZMYWJlbD1cIkZhbHNlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiPjwvcC10b2dnbGVCdXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6IHFiRGF0YVR5cGVFbnVtLkRhdGV0aW1lLnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxwLWNhbGVuZGFyIGNsYXNzPVwibXItM1wiIGFwcGVuZFRvPVwiYm9keVwiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbc2hvd1RpbWVdPVwidHJ1ZVwiIFtzaG93U2Vjb25kc109XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMuZGF0ZXRpbWVcIj48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBmaWVsZD1maWVsZDsgdHlwZTogcWJEYXRhVHlwZUVudW0uRGVjaW1hbC50b1N0cmluZygpOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVlcnktYnVpbGRlci1pbnB1dC13aWR0aFwiPlxuICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBjbGFzcz1cIm1yLTNcIiBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIiBpbnB1dElkPVwibWlubWF4XCIgaW5wdXRJZD1cIm1pbm1heFwiIG1vZGU9XCJkZWNpbWFsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiIFttaW5dPVwiMFwiIFttYXhdPVwiMTAwXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmRlY2ltYWxcIj4gPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgb3B0aW9ucz1vcHRpb25zOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5MaXN0LnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDx3LWxpc3QtZmllbGQgW29wdGlvbnNdPVwib3B0aW9uc1wiIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIFtvcGVyYXRvcl09XCJydWxlLm9wZXJhdG9yXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGlvbnNPYmplY3QuZmllbGRzUGxhY2Vob2xkZXJzLmxpc3RcIj48L3ctbGlzdC1maWVsZD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5OdW1iZXIudG9TdHJpbmcoKTsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgY2xhc3M9XCJtci0zXCIgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCIgaW5wdXRJZD1cIm1pbm1heFwiIGlucHV0SWQ9XCJtaW5tYXhcIiBbbWluXT1cIjBcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCIgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0aW9uc09iamVjdC5maWVsZHNQbGFjZWhvbGRlcnMubnVtYmVyXCI+IDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiBxYkRhdGFUeXBlRW51bS5UZXh0LnRvU3RyaW5nKCk7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibXItMyBxdWVyeS1idWlsZGVyLWlucHV0LXdpZHRoIGhlaWdodC1pbnB1dCB3YXBwLWlucHV0XCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIiBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRpb25zT2JqZWN0LmZpZWxkc1BsYWNlaG9sZGVycy50ZXh0XCIvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvcXVlcnktYnVpbGRlcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBZHZhbmNlZFNlYXJjaCAmJiBncm91cGVkUXVlcnkucnVsZXMubGVuZ3RoPT0wXCIgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub1F1ZXJ5RGF0YVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjbm9RdWVyeURhdGE+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LXdyYXAgY2FyZC1jb250YWluZXIgc3VyZmFjZS01MCBtYi0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciB3LWZ1bGwgaC00cmVtIHRleHQtZ3JheS05MDAgYm9yZGVyLXJvdW5kIG0tMlwiPlxuICAgICAgICB7e3RyYW5zbGF0aW9uc09iamVjdC5ub1J1bGVzTGFiZWx9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG4iXX0=