igniteui-angular 18.2.0-alpha.1 → 18.2.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/data-operations/filtering-condition.mjs +16 -3
- package/esm2022/lib/grids/filtering/grid-filtering.service.mjs +2 -2
- package/esm2022/lib/query-builder/public_api.mjs +2 -2
- package/esm2022/lib/query-builder/query-builder-tree.component.mjs +26 -20
- package/esm2022/lib/query-builder/query-builder.component.mjs +36 -2
- package/esm2022/lib/query-builder/query-builder.directives.mjs +3 -3
- package/fesm2022/igniteui-angular.mjs +79 -26
- package/fesm2022/igniteui-angular.mjs.map +1 -1
- package/lib/data-operations/filtering-condition.d.ts +14 -4
- package/lib/query-builder/query-builder-tree.component.d.ts +1 -1
- package/lib/query-builder/query-builder.component.d.ts +12 -1
- package/lib/query-builder/query-builder.directives.d.ts +2 -2
- package/package.json +1 -1
|
@@ -141,7 +141,6 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
141
141
|
this._selectedEntity = null;
|
|
142
142
|
this._selectedReturnFields = [];
|
|
143
143
|
}
|
|
144
|
-
this.init();
|
|
145
144
|
}
|
|
146
145
|
/**
|
|
147
146
|
* Gets the `locale` of the query builder.
|
|
@@ -301,6 +300,11 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
301
300
|
* @hidden @internal
|
|
302
301
|
*/
|
|
303
302
|
ngAfterViewInit() {
|
|
303
|
+
this.clearSelection();
|
|
304
|
+
this.cancelOperandAdd();
|
|
305
|
+
this.cancelOperandEdit();
|
|
306
|
+
this.rootGroup = this.createExpressionGroupItem(this.expressionTree);
|
|
307
|
+
this.currentGroup = this.rootGroup;
|
|
304
308
|
this._overlaySettings.outlet = this.overlayOutlet;
|
|
305
309
|
this.entitySelectOverlaySettings.outlet = this.overlayOutlet;
|
|
306
310
|
this.fieldSelectOverlaySettings.outlet = this.overlayOutlet;
|
|
@@ -353,10 +357,10 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
353
357
|
}
|
|
354
358
|
this.fields = this._entityNewValue ? this._entityNewValue.fields : [];
|
|
355
359
|
this._selectedReturnFields = this._entityNewValue.fields?.map(f => f.field);
|
|
356
|
-
if (this.
|
|
357
|
-
this.
|
|
358
|
-
this.
|
|
359
|
-
this.
|
|
360
|
+
if (this._expressionTree) {
|
|
361
|
+
this._expressionTree.entity = this._selectedEntity.name;
|
|
362
|
+
this._expressionTree.returnFields = [];
|
|
363
|
+
this._expressionTree.filteringOperands = [];
|
|
360
364
|
this._editedExpression = null;
|
|
361
365
|
this.expressionTreeChange.emit(this._expressionTree);
|
|
362
366
|
this.addAndGroup();
|
|
@@ -475,10 +479,11 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
475
479
|
* @hidden @internal
|
|
476
480
|
*/
|
|
477
481
|
commitOperandEdit() {
|
|
482
|
+
const actualSearchValue = this.searchValueTemplate ? this._editedExpression.expression.searchVal : this.searchValue;
|
|
478
483
|
if (this._editedExpression) {
|
|
479
484
|
this._editedExpression.expression.field = this.selectedField.field;
|
|
480
485
|
this._editedExpression.expression.condition = this.selectedField.filters.condition(this.selectedCondition);
|
|
481
|
-
this._editedExpression.expression.searchVal = DataUtil.parseValue(this.selectedField.dataType,
|
|
486
|
+
this._editedExpression.expression.searchVal = DataUtil.parseValue(this.selectedField.dataType, actualSearchValue);
|
|
482
487
|
this._editedExpression.fieldLabel = this.selectedField.label
|
|
483
488
|
? this.selectedField.label
|
|
484
489
|
: this.selectedField.header
|
|
@@ -537,7 +542,7 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
537
542
|
operandCanBeCommitted() {
|
|
538
543
|
const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
|
|
539
544
|
return this.selectedField && this.selectedCondition &&
|
|
540
|
-
(((!!this.searchValue || !!this.searchValueTemplate) && !(this.selectedCondition === 'in' || this.selectedCondition === 'notIn')) ||
|
|
545
|
+
(((!!this.searchValue || (!!this.searchValueTemplate && !!this._editedExpression.expression.searchVal)) && !(this.selectedCondition === 'in' || this.selectedCondition === 'notIn')) ||
|
|
541
546
|
(innerQuery && !!innerQuery.expressionTree) ||
|
|
542
547
|
this.selectedField.filters.condition(this.selectedCondition).isUnary);
|
|
543
548
|
}
|
|
@@ -812,11 +817,12 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
812
817
|
* @hidden @internal
|
|
813
818
|
*/
|
|
814
819
|
getConditionList() {
|
|
815
|
-
|
|
820
|
+
if (!this.selectedField)
|
|
821
|
+
return [];
|
|
816
822
|
if (this.entities.length === 1 && !this.entities[0].name) {
|
|
817
|
-
|
|
823
|
+
return this.selectedField.filters.conditionList();
|
|
818
824
|
}
|
|
819
|
-
return
|
|
825
|
+
return this.selectedField.filters.extendedConditionList();
|
|
820
826
|
}
|
|
821
827
|
/**
|
|
822
828
|
* @hidden @internal
|
|
@@ -912,6 +918,13 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
912
918
|
this.selectedReturnFieldsCombo.selectAllItems();
|
|
913
919
|
}
|
|
914
920
|
}
|
|
921
|
+
getSearchValueTemplateContext() {
|
|
922
|
+
const ctx = {
|
|
923
|
+
$implicit: this.searchValue,
|
|
924
|
+
expression: this._editedExpression.expression
|
|
925
|
+
};
|
|
926
|
+
return ctx;
|
|
927
|
+
}
|
|
915
928
|
setFormat(field) {
|
|
916
929
|
if (!field.pipeArgs) {
|
|
917
930
|
field.pipeArgs = { digitsInfo: DEFAULT_PIPE_DIGITS_INFO };
|
|
@@ -1188,15 +1201,8 @@ export class IgxQueryBuilderTreeComponent {
|
|
|
1188
1201
|
container.scrollTop = targetOffset + target.offsetHeight + delta - container.clientHeight;
|
|
1189
1202
|
}
|
|
1190
1203
|
}
|
|
1191
|
-
init() {
|
|
1192
|
-
this.clearSelection();
|
|
1193
|
-
this.cancelOperandAdd();
|
|
1194
|
-
this.cancelOperandEdit();
|
|
1195
|
-
this.rootGroup = this.createExpressionGroupItem(this.expressionTree);
|
|
1196
|
-
this.currentGroup = this.rootGroup;
|
|
1197
|
-
}
|
|
1198
1204
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: IgxQueryBuilderTreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PlatformUtil }, { token: i0.ElementRef }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1199
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: IgxQueryBuilderTreeComponent, isStandalone: true, selector: "igx-query-builder-tree", inputs: { entities: "entities", searchValueTemplate: "searchValueTemplate", parentExpression: "parentExpression", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange", inEditModeChange: "inEditModeChange" }, host: { properties: { "class": "this.getClass" }, classAttribute: "igx-query-builder-tree" }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "entitySelect", first: true, predicate: ["entitySelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "selectedReturnFieldsCombo", first: true, predicate: ["selectedReturnFieldsCombo"], descendants: true, read: IgxComboComponent }, { propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "entityChangeDialog", first: true, predicate: ["entityChangeDialog"], descendants: true, read: IgxDialogComponent }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }, { propertyName: "innerQueries", predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.field}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.field)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.field\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.field\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.searchVal ?\n expressionItem.expression.searchVal :\n null\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n family=\"default\"\n name=\"edit\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n <igx-icon\n family=\"default\"\n name=\"add\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container \n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: { $implicit: searchValue, field: selectedField, condition: selectedCondition }\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n \n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n \n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n \n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"check\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div class=\"igx-drop-down__item\">\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n (click)=\"onSelectAllClicked($event)\"\n class=\"igx-combo__checkbox\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </igx-checkbox>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"Confirmation\"\n message=\"By changing the entity, you will lose your current settings. Are you sure you want to do that?\"\n leftButtonLabel=\"Cancel\"\n rightButtonLabel=\"Confirm\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n</igx-dialog>\n", dependencies: [{ kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }, { kind: "component", type: IgxComboComponent, selector: "igx-combo", inputs: ["autoFocusSearch", "filterable", "searchPlaceholder"], outputs: ["selectionChanging"] }, { kind: "directive", type: IgxLabelDirective, selector: "[igxLabel]", inputs: ["id"] }, { kind: "directive", type: IgxComboHeaderDirective, selector: "[igxComboHeader]" }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: IgxDialogComponent, selector: "igx-dialog", inputs: ["id", "isModal", "closeOnEscape", "focusTrap", "title", "message", "leftButtonLabel", "leftButtonType", "leftButtonRipple", "rightButtonLabel", "rightButtonType", "rightButtonRipple", "closeOnOutsideSelect", "positionSettings", "isOpen", "role", "titleId"], outputs: ["opening", "opened", "closing", "closed", "leftButtonSelect", "rightButtonSelect", "isOpenChange"] }, { kind: "directive", type: IgxTooltipTargetDirective, selector: "[igxTooltipTarget]", inputs: ["showDelay", "hideDelay", "tooltipDisabled", "igxTooltipTarget", "tooltip"], outputs: ["tooltipShow", "tooltipHide"], exportAs: ["tooltipTarget"] }, { kind: "directive", type: IgxTooltipDirective, selector: "[igxTooltip]", inputs: ["context", "id"], exportAs: ["tooltip"] }] }); }
|
|
1205
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: IgxQueryBuilderTreeComponent, isStandalone: true, selector: "igx-query-builder-tree", inputs: { entities: "entities", searchValueTemplate: "searchValueTemplate", parentExpression: "parentExpression", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange", inEditModeChange: "inEditModeChange" }, host: { properties: { "class": "this.getClass" }, classAttribute: "igx-query-builder-tree" }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "entitySelect", first: true, predicate: ["entitySelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "selectedReturnFieldsCombo", first: true, predicate: ["selectedReturnFieldsCombo"], descendants: true, read: IgxComboComponent }, { propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "entityChangeDialog", first: true, predicate: ["entityChangeDialog"], descendants: true, read: IgxDialogComponent }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }, { propertyName: "innerQueries", predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.field}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.field)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.field\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.field\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n family=\"default\"\n name=\"edit\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n <igx-icon\n family=\"default\"\n name=\"add\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container \n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext()\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n \n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n \n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n \n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"check\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div class=\"igx-drop-down__item\">\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n (click)=\"onSelectAllClicked($event)\"\n class=\"igx-combo__checkbox\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </igx-checkbox>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"Confirmation\"\n message=\"By changing the entity, you will lose your current settings. Are you sure you want to do that?\"\n leftButtonLabel=\"Cancel\"\n rightButtonLabel=\"Confirm\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n</igx-dialog>\n", dependencies: [{ kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }, { kind: "component", type: IgxComboComponent, selector: "igx-combo", inputs: ["autoFocusSearch", "filterable", "searchPlaceholder"], outputs: ["selectionChanging"] }, { kind: "directive", type: IgxLabelDirective, selector: "[igxLabel]", inputs: ["id"] }, { kind: "directive", type: IgxComboHeaderDirective, selector: "[igxComboHeader]" }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: IgxDialogComponent, selector: "igx-dialog", inputs: ["id", "isModal", "closeOnEscape", "focusTrap", "title", "message", "leftButtonLabel", "leftButtonType", "leftButtonRipple", "rightButtonLabel", "rightButtonType", "rightButtonRipple", "closeOnOutsideSelect", "positionSettings", "isOpen", "role", "titleId"], outputs: ["opening", "opened", "closing", "closed", "leftButtonSelect", "rightButtonSelect", "isOpenChange"] }, { kind: "directive", type: IgxTooltipTargetDirective, selector: "[igxTooltipTarget]", inputs: ["showDelay", "hideDelay", "tooltipDisabled", "igxTooltipTarget", "tooltip"], outputs: ["tooltipShow", "tooltipHide"], exportAs: ["tooltipTarget"] }, { kind: "directive", type: IgxTooltipDirective, selector: "[igxTooltip]", inputs: ["context", "id"], exportAs: ["tooltip"] }] }); }
|
|
1200
1206
|
}
|
|
1201
1207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: IgxQueryBuilderTreeComponent, decorators: [{
|
|
1202
1208
|
type: Component,
|
|
@@ -1235,7 +1241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
|
|
|
1235
1241
|
IgxDialogComponent,
|
|
1236
1242
|
IgxTooltipTargetDirective,
|
|
1237
1243
|
IgxTooltipDirective
|
|
1238
|
-
], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.field}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.field)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.field\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.field\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.searchVal ?\n expressionItem.expression.searchVal :\n null\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n family=\"default\"\n name=\"edit\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n <igx-icon\n family=\"default\"\n name=\"add\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container \n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: { $implicit: searchValue, field: selectedField, condition: selectedCondition }\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n \n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n \n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n \n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"check\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div class=\"igx-drop-down__item\">\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n (click)=\"onSelectAllClicked($event)\"\n class=\"igx-combo__checkbox\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </igx-checkbox>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"Confirmation\"\n message=\"By changing the entity, you will lose your current settings. Are you sure you want to do that?\"\n leftButtonLabel=\"Cancel\"\n rightButtonLabel=\"Confirm\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n</igx-dialog>\n" }]
|
|
1244
|
+
], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <div class=\"igx-query-builder__root\">\n <div class=\"igx-query-builder__root-actions\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </div>\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n [selected]=\"expressionItem.selected && isInEditMode()\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"isInEditMode() ? onChipClick(expressionItem) : null\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.field}}\n </span>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong> / {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.field)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.field\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.field\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n {{\n expressionItem.expression.searchTree ?\n expressionItem.expression.searchTree.returnFields :\n expressionItem.expression.condition.isUnary ?\n getConditionFriendlyName(expressionItem.expression.condition.name) :\n expressionItem.expression.searchVal\n }}\n </div>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n family=\"default\"\n name=\"edit\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n </igx-icon>\n <igx-icon\n family=\"default\"\n name=\"add\"\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n </igx-icon>\n </div>\n <div igxButton class=\"igx-filter-tree__details-button\" *ngIf=\"!expressionItem.inEditMode && expressionItem.expression.searchTree\"\n (click)=\"expanderClick($event, expressionItem)\">\n <span>{{this.resourceStrings.igx_query_builder_details}}</span>\n <igx-icon *ngIf=\"!expressionItem.expanded\" family=\"default\" name=\"unfold_less\" role=\"button\"></igx-icon>\n <igx-icon *ngIf=\"expressionItem.expanded\" family=\"default\" name=\"unfold_more\" role=\"button\"></igx-icon>\n </div>\n\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_column_placeholder}}</label>\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_condition_placeholder}}</label>\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container \n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext()\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_value_placeholder}}</label>\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary) ||\n selectedCondition === 'in' ||\n selectedCondition === 'notIn'\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n \n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n \n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <label igxLabel>{{this.resourceStrings.igx_query_builder_time_placeholder}}</label>\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n \n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <label igxLabel>{{this.resourceStrings.igx_query_builder_date_placeholder}}</label>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"check\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"(!expressionItem.inEditMode && expressionItem.expression.searchTree) || (expressionItem.inEditMode && (selectedCondition === 'in' || selectedCondition === 'notIn'))\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\">\n </igx-query-builder-tree>\n </ng-container>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem?.operator === 0,\n 'igx-filter-tree__line--or': expressionItem?.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem?.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && this.entities.length > 0 && this.entities[0].name) ? 'flex' : 'none'\">\n <ng-container *ngIf=\"!expressionItem.parent\">\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_entity }}</label>\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n\n <igx-combo\n #selectedReturnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n >\n <ng-template igxComboHeader>\n <div class=\"igx-drop-down__item\">\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n (click)=\"onSelectAllClicked($event)\"\n class=\"igx-combo__checkbox\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </igx-checkbox>\n </div>\n </ng-template>\n <label igxLabel>{{ this.resourceStrings.igx_query_builder_select_return_fields }}</label>\n </igx-combo>\n </ng-container>\n </div>\n\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem && isInEditMode()\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"Confirmation\"\n message=\"By changing the entity, you will lose your current settings. Are you sure you want to do that?\"\n leftButtonLabel=\"Cancel\"\n rightButtonLabel=\"Confirm\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n</igx-dialog>\n" }]
|
|
1239
1245
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.PlatformUtil }, { type: i0.ElementRef }, { type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
1240
1246
|
type: Inject,
|
|
1241
1247
|
args: [LOCALE_ID]
|
|
@@ -1315,4 +1321,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
|
|
|
1315
1321
|
type: ViewChildren,
|
|
1316
1322
|
args: [IgxQueryBuilderTreeComponent]
|
|
1317
1323
|
}] } });
|
|
1318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFlBQVksRUFFWixZQUFZLEVBRVosU0FBUyxFQUNULE1BQU0sRUFDTixJQUFJLEVBR1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF5Qix1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBZ0MsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuSCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFB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RSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUloRCxrQkFBa0I7c0JBRHpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUk3QyxrQkFBa0I7c0JBRHpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBT3RELGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsOEJBQThCO2dCQUk5QixzQkFBc0I7c0JBRG5DLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQWtCM0MsZ0JBQWdCO3NCQUQ3QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFrQnJDLDRCQUE0QjtzQkFEekMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBa0J2RCxpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUlyQixLQUFLO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUl0QixvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUl6QixhQUFhO3NCQURwQixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUlyRSxZQUFZO3NCQURuQixZQUFZO3VCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIExPQ0FMRV9JRCxcbiAgICBPdXRwdXQsXG4gICAgUGlwZSxcbiAgICBQaXBlVHJhbnNmb3JtLFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssIE5nSWYsIE5nRm9yLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElCdXR0b25Hcm91cEV2ZW50QXJncywgSWd4QnV0dG9uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9idXR0b25Hcm91cC9idXR0b25Hcm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q2hpcENvbXBvbmVudCB9IGZyb20gJy4uL2NoaXBzL2NoaXAuY29tcG9uZW50JztcbmltcG9ydCB7IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3MsIFF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5nc0VOIH0gZnJvbSAnLi4vY29yZS9pMThuL3F1ZXJ5LWJ1aWxkZXItcmVzb3VyY2VzJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIERhdGFVdGlsIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsIElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSWd4VGltZUZpbHRlcmluZ09wZXJhbmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYywgSUZpbHRlcmluZ0V4cHJlc3Npb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUV4cHJlc3Npb25UcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IElneERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBJZ3hCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneERhdGVUaW1lRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kYXRlLXRpbWUtZWRpdG9yL2RhdGUtdGltZS1lZGl0b3IuZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgSWd4VG9nZ2xlQWN0aW9uRGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpZWxkVHlwZSwgRW50aXR5VHlwZSB9IGZyb20gJy4uL2dyaWRzL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIb3Jpem9udGFsQWxpZ25tZW50LCBPdmVybGF5U2V0dGluZ3MsIFBvaW50LCBWZXJ0aWNhbEFsaWdubWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3ksIEF1dG9Qb3NpdGlvblN0cmF0ZWd5LCBDbG9zZVNjcm9sbFN0cmF0ZWd5LCBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGltZS1waWNrZXIvdGltZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneFBpY2tlclRvZ2dsZUNvbXBvbmVudCwgSWd4UGlja2VyQ2xlYXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi9waWNrZXItaWNvbnMuY29tbW9uJztcbmltcG9ydCB7IElneElucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LWdyb3VwL2lucHV0LWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTdWZmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFByZWZpeERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSWd4SWNvbkJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2ljb24tYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hDb21ib0NvbXBvbmVudCB9IGZyb20gXCIuLi9jb21iby9jb21iby5jb21wb25lbnRcIjtcbmltcG9ydCB7IElneExhYmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbWJvL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJZ3hEaWFsb2dDb21wb25lbnQgfSBmcm9tIFwiLi4vZGlhbG9nL2RpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7IElTZWxlY3Rpb25FdmVudEFyZ3MgfSBmcm9tICcuLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFRvb2x0aXBUYXJnZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3Rvb2x0aXAvdG9vbHRpcC10YXJnZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFF1ZXJ5QnVpbGRlclNlYXJjaFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIuZGlyZWN0aXZlcyc7XG5cbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX0ZPUk1BVCA9ICdtZWRpdW1EYXRlJztcbmNvbnN0IERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA9ICdtZWRpdW1UaW1lJztcbmNvbnN0IERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gPSAnMS4wLTMnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ2RkL01NL3l5eXkgSEg6bW06c3MgYSc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ2hoOm1tOnNzIGEnO1xuXG5AUGlwZSh7XG4gICAgbmFtZTogJ2ZpZWxkRm9ybWF0dGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneEZpZWxkRm9ybWF0dGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gICAgcHVibGljIHRyYW5zZm9ybSh2YWx1ZTogYW55LCBmb3JtYXR0ZXI6ICh2OiBhbnksIGRhdGE6IGFueSwgZmllbGREYXRhPzogYW55KSA9PiBhbnksIHJvd0RhdGE6IGFueSwgZmllbGREYXRhPzogYW55KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIodmFsdWUsIHJvd0RhdGEsIGZpZWxkRGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW4gQGludGVybmFsXG4gKlxuICogSW50ZXJuYWwgY2xhc3MgdXNhZ2VcbiAqL1xuY2xhc3MgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG4gICAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHB1YmxpYyBleHBhbmRlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGluRWRpdE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGluQWRkTW9kZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaG92ZXJlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZmllbGRMYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uLCBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaG9zdDogeyAnY2xhc3MnOiAnaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZScgfSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBJZ3hCdXR0b25EaXJlY3RpdmUsXG4gICAgICAgIElneEljb25Db21wb25lbnQsXG4gICAgICAgIElneENoaXBDb21wb25lbnQsXG4gICAgICAgIElneFByZWZpeERpcmVjdGl2ZSxcbiAgICAgICAgSWd4U3VmZml4RGlyZWN0aXZlLFxuICAgICAgICBJZ3hTZWxlY3RDb21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXREaXJlY3RpdmUsXG4gICAgICAgIElneERhdGVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgIElneFBpY2tlclRvZ2dsZUNvbXBvbmVudCxcbiAgICAgICAgSWd4UGlja2VyQ2xlYXJDb21wb25lbnQsXG4gICAgICAgIElneFRpbWVQaWNrZXJDb21wb25lbnQsXG4gICAgICAgIElneERhdGVUaW1lRWRpdG9yRGlyZWN0aXZlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBJZ3hUb2dnbGVEaXJlY3RpdmUsXG4gICAgICAgIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50LFxuICAgICAgICBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLFxuICAgICAgICBEYXRlUGlwZSxcbiAgICAgICAgSWd4RmllbGRGb3JtYXR0ZXJQaXBlLFxuICAgICAgICBJZ3hJY29uQnV0dG9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hUb2dnbGVBY3Rpb25EaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvQ29tcG9uZW50LFxuICAgICAgICBJZ3hMYWJlbERpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBJZ3hEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIElneFRvb2x0aXBUYXJnZXREaXJlY3RpdmUsXG4gICAgICAgIElneFRvb2x0aXBEaXJlY3RpdmVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneFF1ZXJ5QnVpbGRlclRyZWVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIHB1YmxpYyBnZXQgZ2V0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBgaWd4LXF1ZXJ5LWJ1aWxkZXItdHJlZS0tbGV2ZWwtJHt0aGlzLmxldmVsfWA7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW50aXRpZXM6IEVudGl0eVR5cGVbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaFZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneFF1ZXJ5QnVpbGRlclNlYXJjaFZhbHVlVGVtcGxhdGVEaXJlY3RpdmU+ID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYXJlbnRFeHByZXNzaW9uKCk6IEV4cHJlc3Npb25PcGVyYW5kSXRlbSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRFeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFyZW50RXhwcmVzc2lvbih2YWx1ZTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudEV4cHJlc3Npb24gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIGZpZWxkcy5cbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmllbGRzKCk6IEZpZWxkVHlwZVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maWVsZHMgJiYgdGhpcy5lbnRpdGllcy5sZW5ndGggPT09IDEgJiYgIXRoaXMuZW50aXRpZXNbMF0ubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZmllbGRzID0gdGhpcy5lbnRpdGllc1swXS5maWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpZWxkcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGRzKGZpZWxkczogRmllbGRUeXBlW10pIHtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLl9maWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlcnMoZmllbGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybWF0KGZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRyZWUuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4cHJlc3Npb25UcmVlKCk6IElFeHByZXNzaW9uVHJlZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHByZXNzaW9uVHJlZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBleHByZXNzaW9uIHRyZWUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGV4cHJlc3Npb25UcmVlKGV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBleHByZXNzaW9uVHJlZTtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uJ3MgbG9jYWxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBFeHBlY3RzIGEgdmFsaWQgQkNQIDQ3IGxhbmd1YWdlIHRhZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAvLyBpZiB2YWx1ZSBpcyBpbnZhbGlkLCBzZXQgaXQgYmFjayB0byBfbG9jYWxlSWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuX2xvY2FsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZUlkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCBhcyB0aGUgZXhwcmVzc2lvbiB0cmVlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtcXVlcnktYnVpbGRlciAoZXhwcmVzc2lvblRyZWVDaGFuZ2UpPSdvbkV4cHJlc3Npb25UcmVlQ2hhbmdlKCknPjwvaWd4LXF1ZXJ5LWJ1aWxkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cHJlc3Npb25UcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRXhwcmVzc2lvblRyZWU+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaW5FZGl0TW9kZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwcmVzc2lvbk9wZXJhbmRJdGVtPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnZW50aXR5U2VsZWN0JywgeyByZWFkOiBJZ3hTZWxlY3RDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgZW50aXR5U2VsZWN0OiBJZ3hTZWxlY3RDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvJywgeyByZWFkOiBJZ3hDb21ib0NvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ibzogSWd4Q29tYm9Db21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdmaWVsZFNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBmaWVsZFNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnY29uZGl0aW9uU2VsZWN0JywgeyByZWFkOiBJZ3hTZWxlY3RDb21wb25lbnQgfSlcbiAgICBwcml2YXRlIGNvbmRpdGlvblNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoVmFsdWVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgc2VhcmNoVmFsdWVJbnB1dDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlcicpXG4gICAgcHJpdmF0ZSBwaWNrZXI6IElneERhdGVQaWNrZXJDb21wb25lbnQgfCBJZ3hUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkUm9vdEFuZEdyb3VwQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBhZGRSb290QW5kR3JvdXBCdXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdhZGRDb25kaXRpb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIGFkZENvbmRpdGlvbkJ1dHRvbjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ2VudGl0eUNoYW5nZURpYWxvZycsIHsgcmVhZDogSWd4RGlhbG9nQ29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBlbnRpdHlDaGFuZ2VEaWFsb2c6IElneERpYWxvZ0NvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQpXG4gICAgcHVibGljIGhlYWRlckNvbnRlbnQ6IElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2VkaXRpbmdJbnB1dHNDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyICYmIHRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgZWRpdGluZ0lucHV0c0NvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnYWRkTW9kZUNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgYWRkTW9kZUNvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9hZGRNb2RlQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIgJiYgdGhpcy5fYWRkTW9kZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWRkTW9kZUNvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBhZGRNb2RlQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTW9kZUNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lciAmJiB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGN1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoSWd4VG9nZ2xlRGlyZWN0aXZlKVxuICAgIHByaXZhdGUgY29udGV4dE1lbnVUb2dnbGU6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Q2hpcENvbXBvbmVudClcbiAgICBwcml2YXRlIGNoaXBzOiBRdWVyeUxpc3Q8SWd4Q2hpcENvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkKCdleHByZXNzaW9uc0NvbnRhaW5lcicpXG4gICAgcHJpdmF0ZSBleHByZXNzaW9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ292ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgb3ZlcmxheU91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4UXVlcnlCdWlsZGVyVHJlZUNvbXBvbmVudClcbiAgICBwcml2YXRlIGlubmVyUXVlcmllczogUXVlcnlMaXN0PElneFF1ZXJ5QnVpbGRlclRyZWVDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm9vdEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRFeHByZXNzaW9uczogRXhwcmVzc2lvbk9wZXJhbmRJdGVtW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnRHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHR1YWxHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcmluZ0xvZ2ljcztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29uZGl0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlja2VyT3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJldHVybkZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHByaXZhdGUgX3BhcmVudEV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9pbml0aWFsRXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEVudGl0eTogRW50aXR5VHlwZTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZFJldHVybkZpZWxkczogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRGaWVsZDogRmllbGRUeXBlO1xuICAgIHByaXZhdGUgX2NsaWNrVGltZXI7XG4gICAgcHJpdmF0ZSBfZGJsQ2xpY2tEZWxheSA9IDIwMDtcbiAgICBwcml2YXRlIF9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZWRpdGluZ0lucHV0c0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9hZGRNb2RlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9lZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRHcm91cHM6IEV4cHJlc3Npb25Hcm91cEl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgX2V4cGFuZGVkRXhwcmVzc2lvbnM6IElGaWx0ZXJpbmdFeHByZXNzaW9uW10gPSBbXTtcbiAgICBwcml2YXRlIF9maWVsZHM6IEZpZWxkVHlwZVtdO1xuICAgIHByaXZhdGUgX2V4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfbG9jYWxlO1xuICAgIHByaXZhdGUgX2VudGl0eU5ld1ZhbHVlOiBFbnRpdHlUeXBlO1xuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzRU4pO1xuXG4gICAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGxldCBfbGV2ZWwgPSAwO1xuICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LmxvY2FsTmFtZSA9PT0gJ2lneC1xdWVyeS1idWlsZGVyLXRyZWUnKSB7XG4gICAgICAgICAgICAgICAgX2xldmVsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2xldmVsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LlRvcFxuICAgIH07XG5cbiAgICBwcml2YXRlIF9vdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQ2xvc2VTY3JvbGxTdHJhdGVneSgpXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJvdGVjdGVkIF9sb2NhbGVJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5fbG9jYWxlSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICAvLyBUcmlnZ2VyIGFkZGl0aW9uYWwgY2hhbmdlIGRldGVjdGlvbiBjeWNsZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEVudGl0eSgpOiBFbnRpdHlUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5U2VsZWN0Q2hhbmdpbmcoZXZlbnQ6IElTZWxlY3Rpb25FdmVudEFyZ3MpIHtcbiAgICAgICAgZXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW50aXR5TmV3VmFsdWUgPSBldmVudC5uZXdTZWxlY3Rpb24udmFsdWU7XG4gICAgICAgIGlmIChldmVudC5vbGRTZWxlY3Rpb24udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25FbnRpdHlDaGFuZ2VDb25maXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5Q2hhbmdlQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmVudGl0eUNoYW5nZURpYWxvZy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdC5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9lbnRpdHlOZXdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkVudGl0eUNoYW5nZUNvbmZpcm0oKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5ID0gdGhpcy5fZW50aXR5TmV3VmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRFbnRpdHkuZmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuX2VudGl0eU5ld1ZhbHVlID8gdGhpcy5fZW50aXR5TmV3VmFsdWUuZmllbGRzIDogW107XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPSB0aGlzLl9lbnRpdHlOZXdWYWx1ZS5maWVsZHM/Lm1hcChmID0+IGYuZmllbGQpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlLmVudGl0eSA9IHRoaXMuX3NlbGVjdGVkRW50aXR5Lm5hbWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCh0aGlzLl9leHByZXNzaW9uVHJlZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkQW5kR3JvdXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRmllbGQgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VEaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3QuY2xvc2UoKTtcblxuICAgICAgICB0aGlzLl9lbnRpdHlOZXdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkUmV0dXJuRmllbGRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyAhPT0gdmFsdWUgJiYgb2xkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkUmV0dXJuRmllbGRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcyA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkc107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZEZpZWxkKHZhbHVlOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZEZpZWxkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEZpZWxkICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGaWVsZCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICYmIHRoaXMuX3NlbGVjdGVkRmllbGQgJiYgdGhpcy5fc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gb2xkVmFsdWUuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRGaWVsZCgpOiBGaWVsZFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQaWNrZXJPdXRsZXQob3V0bGV0PzogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5waWNrZXJPdXRsZXQgPSBvdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ29udGV4dE1lbnVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0ZWRFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBudWxsLFxuICAgICAgICAgICAgY29uZGl0aW9uTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uZmllbGQgPSB0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQ7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uY29uZGl0aW9uID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlLCB0aGlzLnNlYXJjaFZhbHVlKTsgLy9cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZmllbGRMYWJlbCA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkRmllbGQuaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEZpZWxkLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWVsZDtcblxuICAgICAgICAgICAgY29uc3QgaW5uZXJRdWVyeSA9IHRoaXMuaW5uZXJRdWVyaWVzLmZpbHRlcihxID0+IHEuaXNJbkVkaXRNb2RlKCkpWzBdXG4gICAgICAgICAgICBpZiAoaW5uZXJRdWVyeSAmJiAodGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9PT0gJ2luJyB8fCB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUub3BlcmF0b3IpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLmVudGl0eSA9IGlubmVyUXVlcnkuc2VsZWN0ZWRFbnRpdHkubmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5yZXR1cm5GaWVsZHMgPSBpbm5lclF1ZXJ5LnNlbGVjdGVkUmV0dXJuRmllbGRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLmZpbHRlcmluZ09wZXJhbmRzID0gaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcztcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5vcGVyYXRvciA9IGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUub3BlcmF0b3I7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUuZmllbGQgPSBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLmZpZWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKHRoaXMucm9vdEdyb3VwLCB0aGlzLnNlbGVjdGVkRW50aXR5Py5uYW1lLCB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2V4cHJlc3Npb25UcmVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxPcGVyYW5kQWRkKCkge1xuICAgICAgICBpZiAodGhpcy5fYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uLmluQWRkTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsT3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlubmVyUXVlcmllcykge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJRdWVyeSA9IHRoaXMuaW5uZXJRdWVyaWVzLmZpbHRlcihxID0+IHEuaXNJbkVkaXRNb2RlKCkpWzBdO1xuICAgICAgICAgICAgaWYgKGlubmVyUXVlcnkpIHtcbiAgICAgICAgICAgICAgICBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlID0gdGhpcy5faW5pdGlhbEV4cHJlc3Npb25UcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5maWVsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbSh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVyYW5kQ2FuQmVDb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlubmVyUXVlcnkgPSB0aGlzLmlubmVyUXVlcmllcy5maWx0ZXIocSA9PiBxLmlzSW5FZGl0TW9kZSgpKVswXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAoKCEhdGhpcy5zZWFyY2hWYWx1ZSB8fCAhIXRoaXMuc2VhcmNoVmFsdWVUZW1wbGF0ZSkgJiYgISh0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnaW4nIHx8IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKSB8fFxuICAgICAgICAgICAgICAgIChpbm5lclF1ZXJ5ICYmICEhaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24odGhpcy5zZWxlY3RlZENvbmRpdGlvbikuaXNVbmFyeVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBleGl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3BlcmFuZENhbkJlQ29tbWl0dGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwcmVzc2lvbkdyb3VwKGV4cHJlc3Npb246IEV4cHJlc3Npb25JdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBSZW1vdmUoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwQ2xpY2soZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLl9jbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ByZXZlbnRDaGlwQ2xpY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uVG9nZ2xlRXhwcmVzc2lvbihleHByZXNzaW9uSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgICAgIH0sIHRoaXMuX2RibENsaWNrRGVsYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcERibENsaWNrKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NsaWNrVGltZXIpO1xuICAgICAgICB0aGlzLl9wcmV2ZW50Q2hpcENsaWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBpZiAodGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluRWRpdE1vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhcmVudEV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuc2VsZWN0ZWRFbnRpdHkgPyB0aGlzLnNlbGVjdGVkRW50aXR5LmZpZWxkcyA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCA9XG4gICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkID9cbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9XG4gICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbiA/XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsO1xuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZmllbGRTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zZWFyY2hWYWx1ZUlucHV0Py5uYXRpdmVFbGVtZW50IHx8IHRoaXMucGlja2VyPy5nZXRFZGl0RWxlbWVudCgpO1xuICAgICAgICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9zZWxlY3RlZEdyb3Vwcykge1xuICAgICAgICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3VwcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGV4cHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluRWRpdE1vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhcmVudEV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSBncm91cEl0ZW0uY2hpbGRyZW5bMF0gYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjb25kaXRpb25MaXN0ID0gdGhpcy5zZWxlY3RlZEZpZWxkID8gdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uTGlzdCgpIDogW107XG4gICAgICAgIGlmICh0aGlzLmVudGl0aWVzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5lbnRpdGllc1swXS5uYW1lKSB7XG4gICAgICAgICAgICBjb25kaXRpb25MaXN0ID0gY29uZGl0aW9uTGlzdC5maWx0ZXIoYyA9PiBjICE9PSAnaW4nICYmIGMgIT09ICdub3RJbicpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpZWxkKS5mb3JtYXR0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0KGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpZWxkKS5waXBlQXJncy5mb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QWRkQnV0dG9uRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRSb290QW5kR3JvdXBCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENvbmRpdGlvbkJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb250ZXh0KGV4cHJlc3Npb246IEV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiBleHByZXNzaW9uLFxuICAgICAgICAgICAgYWZ0ZXJFeHByZXNzaW9uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwU2VsZWN0aW9uRW5kKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsR3JvdXAgPSB0aGlzLmZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk7XG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5vcGVuKHRoaXMuX292ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVUb2dnbGUucmVwb3NpdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRlckNsaWNrKGV2ZW50LCBleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID0gIWV4cHJlc3Npb25JdGVtLmV4cGFuZGVkO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5kZXggPSB0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLnNwbGljZShtYXRjaEluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0UmV0dXJuRmllbGRzKGlubmVyVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICBjb25zdCByZXR1cm5GaWVsZHMgPSBpbm5lclRyZWUucmV0dXJuRmllbGRzO1xuICAgICAgICBsZXQgdGV4dCA9IHJldHVybkZpZWxkcy5qb2luKCcsICcpO1xuICAgICAgICBjb25zdCBpbm5lclRyZWVFbnRpdHkgPSB0aGlzLmVudGl0aWVzLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gaW5uZXJUcmVlLmVudGl0eSk7XG4gICAgICAgIGlmIChyZXR1cm5GaWVsZHMubGVuZ3RoID09PSBpbm5lclRyZWVFbnRpdHkuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGV4dCA9IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FsbF9maWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gcmV0dXJuRmllbGRzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5sZW5ndGggPiAyNSA/IHRleHQuc3Vic3RyaW5nKDAsIDI1KSArICcgLi4uJyA6IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5FZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudEV4cHJlc3Npb24gfHwgKHRoaXMucGFyZW50RXhwcmVzc2lvbiAmJiB0aGlzLnBhcmVudEV4cHJlc3Npb24uaW5FZGl0TW9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5FZGl0TW9kZUNoYW5nZWQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3RBbGxDbGlja2VkKF9ldmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPCB0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMubGVuZ3RoKSB8fFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID09IHRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZGVzZWxlY3RBbGxJdGVtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvLnNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvcm1hdChmaWVsZDogRmllbGRUeXBlKSB7XG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzID0geyBkaWdpdHNJbmZvOiBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MuZm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5waXBlQXJncy5mb3JtYXQgPSBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUIDogZmllbGQuZGF0YVR5cGUgPT09IERhdGFUeXBlLkRhdGVUaW1lID9cbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgOiBERUZBVUxUX1BJUEVfREFURV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0ID0gREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdFRpbWVGb3JtYXQgPSBERUZBVUxUX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGaWx0ZXJzKGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgPSAhZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQ7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYywgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oZ3JvdXBJdGVtKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWUsIHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGVudGl0eU5hbWU/OiBzdHJpbmcpOiBFeHByZXNzaW9uR3JvdXBJdGVtIHtcbiAgICAgICAgbGV0IGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShleHByZXNzaW9uVHJlZS5vcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHIsIGdyb3VwSXRlbSwgZXhwcmVzc2lvblRyZWUuZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyaW5nRXhwciA9IGV4cHIgYXMgSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJDb3B5OiBJRmlsdGVyaW5nRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaWx0ZXJpbmdFeHByLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmaWx0ZXJpbmdFeHByLmNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbk5hbWU6IGZpbHRlcmluZ0V4cHIuY29uZGl0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWw6IGZpbHRlcmluZ0V4cHIuc2VhcmNoVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVHJlZTogZmlsdGVyaW5nRXhwci5zZWFyY2hUcmVlLCAvLyB0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZmlsdGVyaW5nRXhwci5zZWFyY2hUcmVlLCBncm91cEl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogZmlsdGVyaW5nRXhwci5pZ25vcmVDYXNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhbmRJdGVtID0gbmV3IEV4cHJlc3Npb25PcGVyYW5kSXRlbShleHByQ29weSwgZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25UcmVlLmVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IGV4cHJlc3Npb25UcmVlLmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0aWVzLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gZW50aXR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZW50aXR5LmZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzPy5maW5kKGVsID0+IGVsLmZpZWxkID09PSBmaWx0ZXJpbmdFeHByLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZmllbGRMYWJlbCA9IGZpZWxkPy5sYWJlbCB8fCBmaWVsZD8uaGVhZGVyIHx8IGZpZWxkPy5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMuZmlsdGVyKGUgPT4gZS5zZWFyY2hUcmVlID09IG9wZXJhbmRJdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSXRlbS5jaGlsZHJlbi5wdXNoKG9wZXJhbmRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbnRpdHkgPSB0aGlzLmVudGl0aWVzLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gZW50aXR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICFleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMgfHwgZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzLmluY2x1ZGVzKCcqJykgfHwgZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzLmluY2x1ZGVzKCdBbGwnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5maWVsZHM/Lm1hcChmID0+IGYuZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpZWxkcz8uZmlsdGVyKGYgPT4gZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzLmluZGV4T2YoZi5maWVsZCkgPj0gMCkubWFwKGYgPT4gZi5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtLCBlbnRpdHk/OiBzdHJpbmcsIHJldHVybkZpZWxkcz86IHN0cmluZ1tdKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFncm91cEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvblRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGdyb3VwSXRlbS5vcGVyYXRvciwgZW50aXR5LCByZXR1cm5GaWVsZHMpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBncm91cEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSgoaXRlbSBhcyBFeHByZXNzaW9uR3JvdXBJdGVtKSwgZW50aXR5LCByZXR1cm5GaWVsZHMpO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goc3ViVHJlZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goKGl0ZW0gYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByZXNzaW9uVHJlZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNvbnRleHRNZW51KCkge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsR3JvdXAgPSB0aGlzLmZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0xvZ2ljcyA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2ZpbHRlcl9vcGVyYXRvcl9hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5BbmRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2ZpbHRlcl9vcGVyYXRvcl9vcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBjb250ZXh0dWFsR3JvdXAub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLk9yXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGV4dE1lbnVUb2dnbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVUb2dnbGUuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTogRXhwcmVzc2lvbkdyb3VwSXRlbSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zQWxsU2VsZWN0ZWRFeHByZXNzaW9ucyA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5ldmVyeShvcCA9PiB0aGlzLmlzSW5zaWRlR3JvdXAob3AsIGdyb3VwKSk7XG5cbiAgICAgICAgICAgIGlmIChjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5zaWRlR3JvdXAoaXRlbTogRXhwcmVzc2lvbkl0ZW0sIGdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBncm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pc0luc2lkZUdyb3VwKGl0ZW0ucGFyZW50LCBncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtID09PSB0aGlzLmN1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLmN1cnJlbnRHcm91cC5wYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGV4cHJlc3Npb25JdGVtLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5leHByZXNzaW9uVHJlZSA/IHRoaXMuZXhwcmVzc2lvblRyZWUuZW50aXR5IDogbnVsbDtcbiAgICAgICAgY29uc3QgcmV0dXJuRmllbGRzID0gdGhpcy5leHByZXNzaW9uVHJlZSA/IHRoaXMuZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzIDogbnVsbDtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCwgZW50aXR5LCByZXR1cm5GaWVsZHMpOyAvLyBUT0RPOiBkb24ndCByZWNyZWF0ZSBpZiBub3QgbmVjZXNzYXJ5XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbS5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2V4cHJlc3Npb25UcmVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYykge1xuICAgICAgICBjb25zdCBjaGlwcyA9IHRoaXMuY2hpcHMudG9BcnJheSgpO1xuICAgICAgICBjb25zdCBtaW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5yZWR1Y2UoKGksIGUpID0+IE1hdGgubWluKGksIGNoaXBzLmZpbmRJbmRleChjID0+IGMuZGF0YSA9PT0gZSkpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgY29uc3QgZmlyc3RFeHByZXNzaW9uID0gY2hpcHNbbWluSW5kZXhdLmRhdGE7XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZmlyc3RFeHByZXNzaW9uLnBhcmVudDtcbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihmaXJzdEV4cHJlc3Npb24pO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBncm91cEl0ZW0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbS5jaGlsZHJlbi5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHIpO1xuICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVHcm91cChncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5jaGlsZHJlbiAmJiBncm91cEl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUdyb3VwUmVjdXJzaXZlKGdyb3VwSXRlbSwgIWdyb3VwSXRlbS5zZWxlY3RlZCk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUoZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlR3JvdXBSZWN1cnNpdmUoZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICAgICAgZ3JvdXBJdGVtLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG5cbiAgICAgICAgICAgIGlmIChncm91cEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRHcm91cHMuaW5kZXhPZihncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZ3JvdXBJdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUdyb3VwUmVjdXJzaXZlKGV4cHIsIHNlbGVjdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEV4cHJlc3Npb24gPSBleHByIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmFuZEV4cHJlc3Npb24uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRXhwcmVzc2lvbihvcGVyYW5kRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZXhwcmVzc2lvbkl0ZW0ucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RQYXJlbnRSZWN1cnNpdmUocGFyZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29udGV4dE1lbnVUYXJnZXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmV4cHJlc3Npb25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNoaXBzID0gdGhpcy5jaGlwcy5maWx0ZXIoYyA9PiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMuaW5kZXhPZihjLmRhdGEpICE9PSAtMSk7XG4gICAgICAgIGxldCBtaW5Ub3AgPSBjaGlwcy5yZWR1Y2UoKHQsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1pbih0LCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWF4KGNvbnRhaW5lclJlY3QudG9wLCBtaW5Ub3ApO1xuICAgICAgICBtaW5Ub3AgPSBNYXRoLm1pbihjb250YWluZXJSZWN0LmJvdHRvbSwgbWluVG9wKTtcbiAgICAgICAgbGV0IG1heFJpZ2h0ID0gY2hpcHMucmVkdWNlKChyLCBjKSA9PlxuICAgICAgICAgICAgTWF0aC5tYXgociwgYy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSwgMCk7XG4gICAgICAgIG1heFJpZ2h0ID0gTWF0aC5tYXgobWF4UmlnaHQsIGNvbnRhaW5lclJlY3QubGVmdCk7XG4gICAgICAgIG1heFJpZ2h0ID0gTWF0aC5taW4obWF4UmlnaHQsIGNvbnRhaW5lclJlY3QucmlnaHQpO1xuICAgICAgICB0aGlzLl9vdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gbmV3IFBvaW50KG1heFJpZ2h0LCBtaW5Ub3ApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsRWxlbWVudEludG9WaWV3KHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5leHByZXNzaW9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSB0YXJnZXQub2Zmc2V0VG9wIC0gY29udGFpbmVyLm9mZnNldFRvcDtcbiAgICAgICAgY29uc3QgZGVsdGEgPSAxMDtcblxuICAgICAgICBpZiAoY29udGFpbmVyLnNjcm9sbFRvcCArIGRlbHRhID4gdGFyZ2V0T2Zmc2V0KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gdGFyZ2V0T2Zmc2V0IC0gZGVsdGE7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLnNjcm9sbFRvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgPCB0YXJnZXRPZmZzZXQgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0ICsgZGVsdGEpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0YXJnZXRPZmZzZXQgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0ICsgZGVsdGEgLSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0KCkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIHRoaXMucm9vdEdyb3VwID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKHRoaXMuZXhwcmVzc2lvblRyZWUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IHRoaXMucm9vdEdyb3VwO1xuICAgIH1cbn1cblxuIiwiPG5nLXRlbXBsYXRlICNhZGRJY29uPlxuICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImFkZFwiPjwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlSWNvbj5cbiAgICA8aWd4LWljb24gZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJjbG9zZVwiPjwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gICAgI2V4cHJlc3Npb25zQ29udGFpbmVyXG4gICAgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fbWFpblwiXG4gICAgKHNjcm9sbCk9XCJvbkV4cHJlc3Npb25zU2Nyb2xsZWQoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb290R3JvdXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19yb290XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX3Jvb3QtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAjYWRkUm9vdEFuZEdyb3VwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItZW1wdHlcIj5cbiAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5X190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9pbml0aWFsX3RleHQgfX1cbiAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNhZGRFeHByZXNzaW9uc1RlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbSBsZXQtYWZ0ZXJFeHByZXNzaW9uPVwiYWZ0ZXJFeHByZXNzaW9uXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAjYWRkQ29uZGl0aW9uQnV0dG9uXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29uZGl0aW9uKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYWRkX2NvbmRpdGlvblxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYW5kX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI29wZXJhbmRUZW1wbGF0ZSBsZXQtZXhwcmVzc2lvbkl0ZW0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24taXRlbVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gdHJ1ZVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWNoaXBcbiAgICAgICAgICAgICAgICAjdGFyZ2V0PVwidG9vbHRpcFRhcmdldFwiXG4gICAgICAgICAgICAgICAgW2lneFRvb2x0aXBUYXJnZXRdPVwidG9vbHRpcFJlZlwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiZXhwcmVzc2lvbkl0ZW1cIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiaXNJbkVkaXRNb2RlKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgJiYgaXNJbkVkaXRNb2RlKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0luRWRpdE1vZGUoKSA/IG9uQ2hpcENsaWNrKGV4cHJlc3Npb25JdGVtKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCJvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoaXBTZWxlY3Rpb25FbmQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWd4UHJlZml4IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICB7e2V4cHJlc3Npb25JdGVtLmZpZWxkTGFiZWwgfHwgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbmRpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgaWd4U3VmZml4XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e2V4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5lbnRpdHl9fTwvc3Ryb25nPiZuYnNwOy8ge3tmb3JtYXRSZXR1cm5GaWVsZHMoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZEZvcm1hdHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMubG9jYWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9pZ3gtY2hpcD5cbiAgICAgICAgICAgIDxkaXYgI3Rvb2x0aXBSZWY9XCJ0b29sdGlwXCIgaWd4VG9vbHRpcD5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLnJldHVybkZpZWxkcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tYWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZWRpdFwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICBmYW1pbHk9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0ucGFyZW50ICE9PSBjdXJyZW50R3JvdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZ3hCdXR0b24gY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2RldGFpbHMtYnV0dG9uXCIgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRlckNsaWNrKCRldmVudCwgZXhwcmVzc2lvbkl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kZXRhaWxzfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmV4cGFuZGVkXCIgZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJ1bmZvbGRfbGVzc1wiIHJvbGU9XCJidXR0b25cIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmV4cGFuZGVkXCIgZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJ1bmZvbGRfbW9yZVwiIHJvbGU9XCJidXR0b25cIj48L2lneC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlXCJcbiAgICAgICAgICAgICNlZGl0aW5nSW5wdXRzQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9faW5wdXRzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1zZWxlY3RcbiAgICAgICAgICAgICAgICAjZmllbGRTZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmllbGRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmllbGRzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jb2x1bW5fcGxhY2Vob2xkZXJ9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbSAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW3ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmhlYWRlciB8fCBmaWVsZC5maWVsZCB9fVxuICAgICAgICAgICAgICAgIDwvaWd4LXNlbGVjdC1pdGVtPlxuICAgICAgICAgICAgPC9pZ3gtc2VsZWN0PlxuXG4gICAgICAgICAgICA8aWd4LXNlbGVjdFxuICAgICAgICAgICAgICAgICNjb25kaXRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jb25kaXRpb25fcGxhY2Vob2xkZXJ9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlneC1wcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblNlbGVjdC52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihjb25kaXRpb25TZWxlY3QudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5pY29uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvaWd4LXByZWZpeD5cblxuICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbmRpdGlvbiBvZiBnZXRDb25kaXRpb25MaXN0KClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKGNvbmRpdGlvbilcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctZHJvcGRvd24taXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsdWVUZW1wbGF0ZSA/IHNlYXJjaFZhbHVlVGVtcGxhdGUgOiBkZWZhdWx0U2VhcmNoVmFsdWVUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHNlYXJjaFZhbHVlLCBmaWVsZDogc2VsZWN0ZWRGaWVsZCwgY29uZGl0aW9uOiBzZWxlY3RlZENvbmRpdGlvbiB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ3RpbWUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGVUaW1lJylcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl92YWx1ZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjc2VhcmNoVmFsdWVJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbiA9PT0gJ2luJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQnXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgXG4gICAgICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW291dGxldF09XCJwaWNrZXJPdXRsZXRcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla1N0YXJ0XT1cInNlbGVjdGVkRmllbGQucGlwZUFyZ3Mud2Vla1N0YXJ0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci10b2dnbGU+PC9pZ3gtcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuICAgIFxuICAgICAgICAgICAgICAgIDxpZ3gtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ3RpbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXR0ZXJdPVwic2VsZWN0ZWRGaWVsZC5mb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdGltZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgICAgICA8L2lneC10aW1lLXBpY2tlcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgICAgICNpbnB1dEdyb3VwXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVUaW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lneERhdGVUaW1lRWRpdG9yXT1cInNlbGVjdGVkRmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2lucHV0cy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWd4SWNvbkJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbW1pdE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiY2hlY2tcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgJiYgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB8fCAoZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiAoc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKVwiPlxuICAgICAgICAgICAgPGlneC1xdWVyeS1idWlsZGVyLXRyZWVcbiAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlIHx8IGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW2VudGl0aWVzXT1cImVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICBbcGFyZW50RXhwcmVzc2lvbl09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW2V4cHJlc3Npb25UcmVlXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGluRWRpdE1vZGVDaGFuZ2UpPVwib25JbkVkaXRNb2RlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2lneC1xdWVyeS1idWlsZGVyLXRyZWU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRBZGQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25Hcm91cFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2xpbmVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tYW5kJzogZXhwcmVzc2lvbkl0ZW0/Lm9wZXJhdG9yID09PSAwLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1vcic6IGV4cHJlc3Npb25JdGVtPy5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbT8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIiBbc3R5bGUuZGlzcGxheV09XCIoaXNJbkVkaXRNb2RlKCkgJiYgdGhpcy5lbnRpdGllcy5sZW5ndGggPiAwICYmIHRoaXMuZW50aXRpZXNbMF0ubmFtZSkgPyAnZmxleCcgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5wYXJlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0ICNlbnRpdHlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25FbnRpdHlTZWxlY3RDaGFuZ2luZygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW5FZGl0TW9kZSgpID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9lbnRpdHkgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0LWl0ZW0gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBlbnRpdGllc1wiIFt2YWx1ZV09XCJlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbnRpdHkubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY29tYm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ib1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc01heEhlaWdodF09XCIyNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlLZXldPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5XT1cIidmaWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXR1cm5GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwicmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwie3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VhcmNoIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc0luRWRpdE1vZGUoKSA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1kcm9wLWRvd25fX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGhpcy5zZWxlY3RlZEVudGl0eSAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzICYmIHRoaXMuc2VsZWN0ZWRFbnRpdHkuZmllbGRzLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJ0aGlzLnNlbGVjdGVkRW50aXR5ICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMgJiYgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoIDwgdGhpcy5zZWxlY3RlZEVudGl0eS5maWVsZHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdEFsbENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWNvbWJvX19jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9hbGwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9zZWxlY3RfcmV0dXJuX2ZpZWxkcyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jb21ibz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBleHByIG9mIGV4cHJlc3Npb25JdGVtPy5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwcmVzc2lvbkdyb3VwKGV4cHIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXhwcmVzc2lvbkdyb3VwVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYW5kVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEdyb3VwID09PSBleHByZXNzaW9uSXRlbSAmJiBpc0luRWRpdE1vZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICNjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0gIT09IHJvb3RHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRWRpdGVkRXhwcmVzc2lvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmNoaWxkcmVuLmxlbmd0aCA8IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9lbmRfZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvb3RHcm91cFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Hcm91cFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQocm9vdEdyb3VwKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdlxuICAgICAgICBpZ3hUb2dnbGVcbiAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsb3NlZCk9XCJjb250ZXh0TWVudUNsb3NlZCgpXCJcbiAgICA+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19jbG9zZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0dWFsR3JvdXBcIj5cbiAgICAgICAgICAgIDxpZ3gtYnV0dG9uZ3JvdXBcbiAgICAgICAgICAgICAgICBbdmFsdWVzXT1cImZpbHRlcmluZ0xvZ2ljc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RGaWx0ZXJpbmdMb2dpYygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaWd4LWJ1dHRvbmdyb3VwPlxuXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbnRleHR1YWxHcm91cC5wYXJlbnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bmdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZ3JvdXBcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3VuZ3JvdXBcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUdyb3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImRlbGV0ZVwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZUFuZEdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NyZWF0ZV9hbmRfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZU9yR3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfY3JlYXRlX29yX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZV9maWx0ZXJzIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICAgICNvdmVybGF5T3V0bGV0XG4gICAgaWd4T3ZlcmxheU91dGxldFxuICAgIGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX291dGxldFwiXG4gICAgKHBvaW50ZXJkb3duKT1cIm9uT3V0bGV0UG9pbnRlckRvd24oJGV2ZW50KVwiXG4+PC9kaXY+XG5cbjxpZ3gtZGlhbG9nXG4gICAgI2VudGl0eUNoYW5nZURpYWxvZ1xuICAgIHRpdGxlPVwiQ29uZmlybWF0aW9uXCJcbiAgICBtZXNzYWdlPVwiQnkgY2hhbmdpbmcgdGhlIGVudGl0eSwgeW91IHdpbGwgbG9zZSB5b3VyIGN1cnJlbnQgc2V0dGluZ3MuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGF0P1wiXG4gICAgbGVmdEJ1dHRvbkxhYmVsPVwiQ2FuY2VsXCJcbiAgICByaWdodEJ1dHRvbkxhYmVsPVwiQ29uZmlybVwiXG4gICAgKGxlZnRCdXR0b25TZWxlY3QpPVwib25FbnRpdHlDaGFuZ2VDYW5jZWwoKVwiXG4gICAgKHJpZ2h0QnV0dG9uU2VsZWN0KT1cIm9uRW50aXR5Q2hhbmdlQ29uZmlybSgpXCI+XG48L2lneC1kaWFsb2c+XG4iXX0=
|
|
1324
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXItdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULE1BQU0sRUFDTixJQUFJLEVBR1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF5Qix1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBZ0MsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuSCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFB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dENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBMT0NBTEVfSUQsXG4gICAgT3V0cHV0LFxuICAgIFBpcGUsXG4gICAgUGlwZVRyYW5zZm9ybSxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBOZ0lmLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQnV0dG9uR3JvdXBFdmVudEFyZ3MsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uR3JvdXAvYnV0dG9uR3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzLCBRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3NFTiB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEVudGl0eVR5cGUgfSBmcm9tICcuLi9ncmlkcy9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzLCBQb2ludCwgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgQ2xvc2VTY3JvbGxTdHJhdGVneSwgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXItaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJUb2dnbGVDb21wb25lbnQsIElneFBpY2tlckNsZWFyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9zdWZmaXgvc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IElneEljb25CdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9pY29uLWJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29tYm9Db21wb25lbnQgfSBmcm9tIFwiLi4vY29tYm8vY29tYm8uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJZ3hMYWJlbERpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9jb21iby9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSWd4RGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIi4uL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4VG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUb29sdGlwVGFyZ2V0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b29sdGlwL3Rvb2x0aXAtdGFyZ2V0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJTZWFyY2hWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyLmRpcmVjdGl2ZXMnO1xuXG5jb25zdCBERUZBVUxUX1BJUEVfREFURV9GT1JNQVQgPSAnbWVkaXVtRGF0ZSc7XG5jb25zdCBERUZBVUxUX1BJUEVfVElNRV9GT1JNQVQgPSAnbWVkaXVtVGltZSc7XG5jb25zdCBERUZBVUxUX1BJUEVfREFURV9USU1FX0ZPUk1BVCA9ICdtZWRpdW0nO1xuY29uc3QgREVGQVVMVF9QSVBFX0RJR0lUU19JTkZPID0gJzEuMC0zJztcbmNvbnN0IERFRkFVTFRfREFURV9USU1FX0ZPUk1BVCA9ICdkZC9NTS95eXl5IEhIOm1tOnNzIGEnO1xuY29uc3QgREVGQVVMVF9USU1FX0ZPUk1BVCA9ICdoaDptbTpzcyBhJztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdmaWVsZEZvcm1hdHRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hGaWVsZEZvcm1hdHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAgIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0dGVyOiAodjogYW55LCBkYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkgPT4gYW55LCByb3dEYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVyKHZhbHVlLCByb3dEYXRhLCBmaWVsZERhdGEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIHB1YmxpYyBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqXG4gKiBJbnRlcm5hbCBjbGFzcyB1c2FnZVxuICovXG5jbGFzcyBFeHByZXNzaW9uR3JvdXBJdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICAgIHB1YmxpYyBvcGVyYXRvcjogRmlsdGVyaW5nTG9naWM7XG4gICAgcHVibGljIGNoaWxkcmVuOiBFeHByZXNzaW9uSXRlbVtdO1xuICAgIGNvbnN0cnVjdG9yKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYywgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICBzdXBlcihwYXJlbnQpO1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqXG4gKiBJbnRlcm5hbCBjbGFzcyB1c2FnZVxuICovXG5jbGFzcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBpbkVkaXRNb2RlOiBib29sZWFuO1xuICAgIHB1YmxpYyBpbkFkZE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGhvdmVyZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGZpZWxkTGFiZWw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBJRmlsdGVyaW5nRXhwcmVzc2lvbiwgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1xdWVyeS1idWlsZGVyLXRyZWUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1idWlsZGVyLXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGhvc3Q6IHsgJ2NsYXNzJzogJ2lneC1xdWVyeS1idWlsZGVyLXRyZWUnIH0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIElneFF1ZXJ5QnVpbGRlckhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgSWd4QnV0dG9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hJY29uQ29tcG9uZW50LFxuICAgICAgICBJZ3hDaGlwQ29tcG9uZW50LFxuICAgICAgICBJZ3hQcmVmaXhEaXJlY3RpdmUsXG4gICAgICAgIElneFN1ZmZpeERpcmVjdGl2ZSxcbiAgICAgICAgSWd4U2VsZWN0Q29tcG9uZW50LFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIElneFNlbGVjdEl0ZW1Db21wb25lbnQsXG4gICAgICAgIElneElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgICAgIElneElucHV0RGlyZWN0aXZlLFxuICAgICAgICBJZ3hEYXRlUGlja2VyQ29tcG9uZW50LFxuICAgICAgICBJZ3hQaWNrZXJUb2dnbGVDb21wb25lbnQsXG4gICAgICAgIElneFBpY2tlckNsZWFyQ29tcG9uZW50LFxuICAgICAgICBJZ3hUaW1lUGlja2VyQ29tcG9uZW50LFxuICAgICAgICBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgSWd4VG9nZ2xlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVBpcGUsXG4gICAgICAgIElneEZpZWxkRm9ybWF0dGVyUGlwZSxcbiAgICAgICAgSWd4SWNvbkJ1dHRvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4VG9nZ2xlQWN0aW9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0NvbXBvbmVudCxcbiAgICAgICAgSWd4TGFiZWxEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvSGVhZGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgSWd4RGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBJZ3hUb29sdGlwVGFyZ2V0RGlyZWN0aXZlLFxuICAgICAgICBJZ3hUb29sdGlwRGlyZWN0aXZlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hRdWVyeUJ1aWxkZXJUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBwdWJsaWMgZ2V0IGdldENsYXNzKCkge1xuICAgICAgICByZXR1cm4gYGlneC1xdWVyeS1idWlsZGVyLXRyZWUtLWxldmVsLSR7dGhpcy5sZXZlbH1gO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVudGl0aWVzOiBFbnRpdHlUeXBlW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hRdWVyeUJ1aWxkZXJTZWFyY2hWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlPiA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFyZW50RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50RXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhcmVudEV4cHJlc3Npb24odmFsdWU6IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLl9wYXJlbnRFeHByZXNzaW9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaWVsZHMuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBGaWVsZFR5cGVbXSB7XG4gICAgICAgIGlmICghdGhpcy5fZmllbGRzICYmIHRoaXMuZW50aXRpZXMubGVuZ3RoID09PSAxICYmICF0aGlzLmVudGl0aWVzWzBdLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuZW50aXRpZXNbMF0uZmllbGRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmaWVsZHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGZpZWxkcyhmaWVsZHM6IEZpZWxkVHlwZVtdKSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IGZpZWxkcztcblxuICAgICAgICBpZiAodGhpcy5fZmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLl9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1hdChmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICovXG4gICAgcHVibGljIGdldCBleHByZXNzaW9uVHJlZSgpOiBJRXhwcmVzc2lvblRyZWUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBleHByZXNzaW9uVHJlZShleHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gZXhwcmVzc2lvblRyZWU7XG4gICAgICAgIGlmICghZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmV0dXJuRmllbGRzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBhcHBsaWNhdGlvbidzIGxvY2FsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogRXhwZWN0cyBhIHZhbGlkIEJDUCA0NyBsYW5ndWFnZSB0YWcuXG4gICAgICovXG4gICAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgaW52YWxpZCwgc2V0IGl0IGJhY2sgdG8gX2xvY2FsZUlkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBnZXRMb2NhbGVGaXJzdERheU9mV2Vlayh0aGlzLl9sb2NhbGUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB0aGlzLl9sb2NhbGVJZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgYXMgdGhlIGV4cHJlc3Npb24gdHJlZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXF1ZXJ5LWJ1aWxkZXIgKGV4cHJlc3Npb25UcmVlQ2hhbmdlKT0nb25FeHByZXNzaW9uVHJlZUNoYW5nZSgpJz48L2lneC1xdWVyeS1idWlsZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHByZXNzaW9uVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUV4cHJlc3Npb25UcmVlPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGluRWRpdE1vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cHJlc3Npb25PcGVyYW5kSXRlbT4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2VudGl0eVNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJvdGVjdGVkIGVudGl0eVNlbGVjdDogSWd4U2VsZWN0Q29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ibycsIHsgcmVhZDogSWd4Q29tYm9Db21wb25lbnQgfSlcbiAgICBwcml2YXRlIHNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm86IElneENvbWJvQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZmllbGRTZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbmRpdGlvblNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaFZhbHVlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByaXZhdGUgcGlja2VyOiBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IHwgSWd4VGltZVBpY2tlckNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZFJvb3RBbmRHcm91cEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQ29uZGl0aW9uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBhZGRDb25kaXRpb25CdXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdlbnRpdHlDaGFuZ2VEaWFsb2cnLCB7IHJlYWQ6IElneERpYWxvZ0NvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZW50aXR5Q2hhbmdlRGlhbG9nOiBJZ3hEaWFsb2dDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJDb250ZW50OiBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2FkZE1vZGVDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGFkZE1vZGVDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fYWRkTW9kZUNvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZE1vZGVDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgYWRkTW9kZUNvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZE1vZGVDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgJiYgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIGNvbnRleHRNZW51VG9nZ2xlOiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneENoaXBDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByaXZhdGUgZXhwcmVzc2lvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdvdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIG92ZXJsYXlPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFF1ZXJ5QnVpbGRlclRyZWVDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBpbm5lclF1ZXJpZXM6IFF1ZXJ5TGlzdDxJZ3hRdWVyeUJ1aWxkZXJUcmVlQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvb3RHcm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PcGVyYW5kSXRlbVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW50R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb250ZXh0dWFsR3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdMb2dpY3M7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENvbmRpdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VhcmNoVmFsdWU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpY2tlck91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIF9wYXJlbnRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfaW5pdGlhbEV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRFbnRpdHk6IEVudGl0eVR5cGU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRSZXR1cm5GaWVsZHM6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkRmllbGQ6IEZpZWxkVHlwZTtcbiAgICBwcml2YXRlIF9jbGlja1RpbWVyO1xuICAgIHByaXZhdGUgX2RibENsaWNrRGVsYXkgPSAyMDA7XG4gICAgcHJpdmF0ZSBfcHJldmVudENoaXBDbGljayA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2VkaXRpbmdJbnB1dHNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2FkZE1vZGVFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfZWRpdGVkRXhwcmVzc2lvbjogRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkR3JvdXBzOiBFeHByZXNzaW9uR3JvdXBJdGVtW10gPSBbXTtcbiAgICBwcml2YXRlIF9leHBhbmRlZEV4cHJlc3Npb25zOiBJRmlsdGVyaW5nRXhwcmVzc2lvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZmllbGRzOiBGaWVsZFR5cGVbXTtcbiAgICBwcml2YXRlIF9leHByZXNzaW9uVHJlZTogSUV4cHJlc3Npb25UcmVlO1xuICAgIHByaXZhdGUgX2xvY2FsZTtcbiAgICBwcml2YXRlIF9lbnRpdHlOZXdWYWx1ZTogRW50aXR5VHlwZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKFF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5nc0VOKTtcblxuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBsZXQgX2xldmVsID0gMDtcbiAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudC5sb2NhbE5hbWUgPT09ICdpZ3gtcXVlcnktYnVpbGRlci10cmVlJykge1xuICAgICAgICAgICAgICAgIF9sZXZlbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9sZXZlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Ub3BcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IENsb3NlU2Nyb2xsU3RyYXRlZ3koKVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByb3RlY3RlZCBfbG9jYWxlSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnJvb3RHcm91cCA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvbkdyb3VwSXRlbSh0aGlzLmV4cHJlc3Npb25UcmVlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSB0aGlzLnJvb3RHcm91cDtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICAvLyBUcmlnZ2VyIGFkZGl0aW9uYWwgY2hhbmdlIGRldGVjdGlvbiBjeWNsZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEVudGl0eSgpOiBFbnRpdHlUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5U2VsZWN0Q2hhbmdpbmcoZXZlbnQ6IElTZWxlY3Rpb25FdmVudEFyZ3MpIHtcbiAgICAgICAgZXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW50aXR5TmV3VmFsdWUgPSBldmVudC5uZXdTZWxlY3Rpb24udmFsdWU7XG4gICAgICAgIGlmIChldmVudC5vbGRTZWxlY3Rpb24udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25FbnRpdHlDaGFuZ2VDb25maXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uRW50aXR5Q2hhbmdlQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmVudGl0eUNoYW5nZURpYWxvZy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmVudGl0eVNlbGVjdC5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9lbnRpdHlOZXdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkVudGl0eUNoYW5nZUNvbmZpcm0oKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRW50aXR5ID0gdGhpcy5fZW50aXR5TmV3VmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRFbnRpdHkuZmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuX2VudGl0eU5ld1ZhbHVlID8gdGhpcy5fZW50aXR5TmV3VmFsdWUuZmllbGRzIDogW107XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPSB0aGlzLl9lbnRpdHlOZXdWYWx1ZS5maWVsZHM/Lm1hcChmID0+IGYuZmllbGQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9leHByZXNzaW9uVHJlZSkge1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUuZW50aXR5ID0gdGhpcy5fc2VsZWN0ZWRFbnRpdHkubmFtZTtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBbXTtcblxuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEFuZEdyb3VwKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZWxlY3RlZEZpZWxkID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlRGlhbG9nLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0LmNsb3NlKCk7XG5cbiAgICAgICAgdGhpcy5fZW50aXR5TmV3VmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZFJldHVybkZpZWxkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcztcblxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgIT09IHZhbHVlICYmIG9sZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2V4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUucmV0dXJuRmllbGRzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2V4cHJlc3Npb25UcmVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJldHVybkZpZWxkcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRGaWVsZCh2YWx1ZTogRmllbGRUeXBlKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcblxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRGaWVsZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAmJiB0aGlzLl9zZWxlY3RlZEZpZWxkICYmIHRoaXMuX3NlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09IG9sZFZhbHVlLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkRmllbGQoKTogRmllbGRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGlja2VyT3V0bGV0KG91dGxldD86IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfCBFbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMucGlja2VyT3V0bGV0ID0gb3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0NvbnRleHRNZW51VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRWRpdGVkRXhwcmVzc2lvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZENvbmRpdGlvbihwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhbmRJdGVtID0gbmV3IEV4cHJlc3Npb25PcGVyYW5kSXRlbSh7XG4gICAgICAgICAgICBmaWVsZDogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbk5hbWU6IG51bGwsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsXG4gICAgICAgIH0sIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCArIDEsIDAsIG9wZXJhbmRJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG9wZXJhbmRJdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChvcGVyYW5kSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQW5kR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQsIHBhcmVudCwgYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPckdyb3VwKHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHRoaXMuYWRkR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IsIHBhcmVudCwgYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRHcm91cChncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW0ucGFyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbW1pdE9wZXJhbmRFZGl0KCkge1xuICAgICAgICBjb25zdCBhY3R1YWxTZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWVUZW1wbGF0ZSA/IHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgOiB0aGlzLnNlYXJjaFZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBEYXRhVXRpbC5wYXJzZVZhbHVlKHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgYWN0dWFsU2VhcmNoVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5maWVsZExhYmVsID0gdGhpcy5zZWxlY3RlZEZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmllbGQuaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuXG4gICAgICAgICAgICBjb25zdCBpbm5lclF1ZXJ5ID0gdGhpcy5pbm5lclF1ZXJpZXMuZmlsdGVyKHEgPT4gcS5pc0luRWRpdE1vZGUoKSlbMF1cbiAgICAgICAgICAgIGlmIChpbm5lclF1ZXJ5ICYmICh0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnaW4nIHx8IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZS5vcGVyYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUuZW50aXR5ID0gaW5uZXJRdWVyeS5zZWxlY3RlZEVudGl0eS5uYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLnJldHVybkZpZWxkcyA9IGlubmVyUXVlcnkuc2VsZWN0ZWRSZXR1cm5GaWVsZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLnNlYXJjaFRyZWUuZmlsdGVyaW5nT3BlcmFuZHMgPSBpbm5lclF1ZXJ5LmV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlLm9wZXJhdG9yID0gaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZS5vcGVyYXRvcjtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5maWVsZCA9IGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUuZmllbGQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hUcmVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0odGhpcy5yb290R3JvdXAsIHRoaXMuc2VsZWN0ZWRFbnRpdHk/Lm5hbWUsIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRBZGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5uZXJRdWVyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lclF1ZXJ5ID0gdGhpcy5pbm5lclF1ZXJpZXMuZmlsdGVyKHEgPT4gcS5pc0luRWRpdE1vZGUoKSlbMF07XG4gICAgICAgICAgICBpZiAoaW5uZXJRdWVyeSkge1xuICAgICAgICAgICAgICAgIGlubmVyUXVlcnkuZXhwcmVzc2lvblRyZWUgPSB0aGlzLl9pbml0aWFsRXhwcmVzc2lvblRyZWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVJdGVtKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5uZXJRdWVyeSA9IHRoaXMuaW5uZXJRdWVyaWVzLmZpbHRlcihxID0+IHEuaXNJbkVkaXRNb2RlKCkpWzBdO1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAoKCEhdGhpcy5zZWFyY2hWYWx1ZSB8fCAoISF0aGlzLnNlYXJjaFZhbHVlVGVtcGxhdGUgJiYgISF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uc2VhcmNoVmFsKSkgJiYgISh0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID09PSAnaW4nIHx8IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKSB8fFxuICAgICAgICAgICAgICAgIChpbm5lclF1ZXJ5ICYmICEhaW5uZXJRdWVyeS5leHByZXNzaW9uVHJlZSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24odGhpcy5zZWxlY3RlZENvbmRpdGlvbikuaXNVbmFyeVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBleGl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3BlcmFuZENhbkJlQ29tbWl0dGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwcmVzc2lvbkdyb3VwKGV4cHJlc3Npb246IEV4cHJlc3Npb25JdGVtKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBSZW1vdmUoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwQ2xpY2soZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLl9jbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ByZXZlbnRDaGlwQ2xpY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uVG9nZ2xlRXhwcmVzc2lvbihleHByZXNzaW9uSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgICAgIH0sIHRoaXMuX2RibENsaWNrRGVsYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcERibENsaWNrKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NsaWNrVGltZXIpO1xuICAgICAgICB0aGlzLl9wcmV2ZW50Q2hpcENsaWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBpZiAodGhpcy5fZWRpdGVkRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5pbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluRWRpdE1vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhcmVudEV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuc2VsZWN0ZWRFbnRpdHkgPyB0aGlzLnNlbGVjdGVkRW50aXR5LmZpZWxkcyA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCA9XG4gICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkID9cbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9XG4gICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbiA/XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsO1xuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uID0gZXhwcmVzc2lvbkl0ZW07XG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxFeHByZXNzaW9uVHJlZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbnRpdHlTZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5lbnRpdHlTZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZW50aXR5U2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5yZXR1cm5GaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZ2V0RWRpdEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMucmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZmllbGRTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zZWFyY2hWYWx1ZUlucHV0Py5uYXRpdmVFbGVtZW50IHx8IHRoaXMucGlja2VyPy5nZXRFZGl0RWxlbWVudCgpO1xuICAgICAgICAgICAgaW5wdXQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9zZWxlY3RlZEdyb3Vwcykge1xuICAgICAgICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3VwcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGV4cHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluRWRpdE1vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhcmVudEV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSBncm91cEl0ZW0uY2hpbGRyZW5bMF0gYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KGZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkKSByZXR1cm4gW107XG5cbiAgICAgICAgaWYgKHRoaXMuZW50aXRpZXMubGVuZ3RoID09PSAxICYmICF0aGlzLmVudGl0aWVzWzBdLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb25MaXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuZXh0ZW5kZWRDb25kaXRpb25MaXN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpZWxkKS5mb3JtYXR0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0KGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpZWxkKS5waXBlQXJncy5mb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QWRkQnV0dG9uRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRSb290QW5kR3JvdXBCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENvbmRpdGlvbkJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb250ZXh0KGV4cHJlc3Npb246IEV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiBleHByZXNzaW9uLFxuICAgICAgICAgICAgYWZ0ZXJFeHByZXNzaW9uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwU2VsZWN0aW9uRW5kKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsR3JvdXAgPSB0aGlzLmZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk7XG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5vcGVuKHRoaXMuX292ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVUb2dnbGUucmVwb3NpdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRlckNsaWNrKGV2ZW50LCBleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID0gIWV4cHJlc3Npb25JdGVtLmV4cGFuZGVkO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5kZXggPSB0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRlZEV4cHJlc3Npb25zLnNwbGljZShtYXRjaEluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0UmV0dXJuRmllbGRzKGlubmVyVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICBjb25zdCByZXR1cm5GaWVsZHMgPSBpbm5lclRyZWUucmV0dXJuRmllbGRzO1xuICAgICAgICBsZXQgdGV4dCA9IHJldHVybkZpZWxkcy5qb2luKCcsICcpO1xuICAgICAgICBjb25zdCBpbm5lclRyZWVFbnRpdHkgPSB0aGlzLmVudGl0aWVzLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gaW5uZXJUcmVlLmVudGl0eSk7XG4gICAgICAgIGlmIChyZXR1cm5GaWVsZHMubGVuZ3RoID09PSBpbm5lclRyZWVFbnRpdHkuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGV4dCA9IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FsbF9maWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gcmV0dXJuRmllbGRzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5sZW5ndGggPiAyNSA/IHRleHQuc3Vic3RyaW5nKDAsIDI1KSArICcgLi4uJyA6IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5FZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudEV4cHJlc3Npb24gfHwgKHRoaXMucGFyZW50RXhwcmVzc2lvbiAmJiB0aGlzLnBhcmVudEV4cHJlc3Npb24uaW5FZGl0TW9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5FZGl0TW9kZUNoYW5nZWQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBpZiAoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3RBbGxDbGlja2VkKF9ldmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLl9zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPCB0aGlzLl9zZWxlY3RlZEVudGl0eS5maWVsZHMubGVuZ3RoKSB8fFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoID09IHRoaXMuX3NlbGVjdGVkRW50aXR5LmZpZWxkcy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzQ29tYm8uZGVzZWxlY3RBbGxJdGVtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkc0NvbWJvLnNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VhcmNoVmFsdWVUZW1wbGF0ZUNvbnRleHQoKTogYW55IHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGb3JtYXQoZmllbGQ6IEZpZWxkVHlwZSkge1xuICAgICAgICBpZiAoIWZpZWxkLnBpcGVBcmdzKSB7XG4gICAgICAgICAgICBmaWVsZC5waXBlQXJncyA9IHsgZGlnaXRzSW5mbzogREVGQVVMVF9QSVBFX0RJR0lUU19JTkZPIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLnBpcGVBcmdzLmZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQucGlwZUFyZ3MuZm9ybWF0ID0gZmllbGQuZGF0YVR5cGUgPT09IERhdGFUeXBlLlRpbWUgP1xuICAgICAgICAgICAgICAgIERFRkFVTFRfUElQRV9USU1FX0ZPUk1BVCA6IGZpZWxkLmRhdGFUeXBlID09PSBEYXRhVHlwZS5EYXRlVGltZSA/XG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUElQRV9EQVRFX1RJTUVfRk9STUFUIDogREVGQVVMVF9QSVBFX0RBVEVfRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdCA9IERFRkFVTFRfREFURV9USU1FX0ZPUk1BVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQuZGVmYXVsdFRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlZmF1bHRUaW1lRm9ybWF0ID0gREVGQVVMVF9USU1FX0ZPUk1BVDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RmlsdGVycyhmaWVsZDogRmllbGRUeXBlKSB7XG4gICAgICAgIGlmICghZmllbGQuZmlsdGVycykge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5kYXRhVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5QZXJjZW50OlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlRpbWU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlQ29udGV4dE1lbnUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBleHByZXNzaW9uSXRlbS5zZWxlY3RlZCA9ICFleHByZXNzaW9uSXRlbS5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmNhbmNlbE9wZXJhbmRBZGQoKTtcblxuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihhZnRlckV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXggKyAxLCAwLCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBncm91cEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihncm91cEl0ZW0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSwgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgZW50aXR5TmFtZT86IHN0cmluZyk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBsZXQgZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUpIHtcbiAgICAgICAgICAgIGdyb3VwSXRlbSA9IG5ldyBFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlLm9wZXJhdG9yLCBwYXJlbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cEl0ZW0uY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0oZXhwciwgZ3JvdXBJdGVtLCBleHByZXNzaW9uVHJlZS5lbnRpdHkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJpbmdFeHByID0gZXhwciBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwckNvcHk6IElGaWx0ZXJpbmdFeHByZXNzaW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGZpbHRlcmluZ0V4cHIuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZpbHRlcmluZ0V4cHIuY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uTmFtZTogZmlsdGVyaW5nRXhwci5jb25kaXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZmlsdGVyaW5nRXhwci5zZWFyY2hWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUcmVlOiBmaWx0ZXJpbmdFeHByLnNlYXJjaFRyZWUsIC8vIHRoaXMuY3JlYXRlRXhwcmVzc2lvbkdyb3VwSXRlbShmaWx0ZXJpbmdFeHByLnNlYXJjaFRyZWUsIGdyb3VwSXRlbSksXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmaWx0ZXJpbmdFeHByLmlnbm9yZUNhc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKGV4cHJDb3B5LCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvblRyZWUuZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlOYW1lID0gZXhwcmVzc2lvblRyZWUuZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZmluZChlbCA9PiBlbC5uYW1lID09PSBlbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBlbnRpdHkuZmllbGRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHM/LmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpbHRlcmluZ0V4cHIuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYW5kSXRlbS5maWVsZExhYmVsID0gZmllbGQ/LmxhYmVsIHx8IGZpZWxkPy5oZWFkZXIgfHwgZmllbGQ/LmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXhwYW5kZWRFeHByZXNzaW9ucy5maWx0ZXIoZSA9PiBlLnNlYXJjaFRyZWUgPT0gb3BlcmFuZEl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kSXRlbS5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVudGl0eSA9IHRoaXMuZW50aXRpZXMuZmluZChlbCA9PiBlbC5uYW1lID09PSBlbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZXR1cm5GaWVsZHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgIWV4cHJlc3Npb25UcmVlLnJldHVybkZpZWxkcyB8fCBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5jbHVkZXMoJyonKSB8fCBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5jbHVkZXMoJ0FsbCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmZpZWxkcz8ubWFwKGYgPT4gZi5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmllbGRzPy5maWx0ZXIoZiA9PiBleHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMuaW5kZXhPZihmLmZpZWxkKSA+PSAwKS5tYXAoZiA9PiBmLmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbShncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0sIGVudGl0eT86IHN0cmluZywgcmV0dXJuRmllbGRzPzogc3RyaW5nW10pOiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUge1xuICAgICAgICBpZiAoIWdyb3VwSXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHByZXNzaW9uVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoZ3JvdXBJdGVtLm9wZXJhdG9yLCBlbnRpdHksIHJldHVybkZpZWxkcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKChpdGVtIGFzIEV4cHJlc3Npb25Hcm91cEl0ZW0pLCBlbnRpdHksIHJldHVybkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaChzdWJUcmVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvblRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCgoaXRlbSBhcyBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25UcmVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlQ29udGV4dE1lbnUoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcblxuICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwIHx8IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cCA9IGNvbnRleHR1YWxHcm91cDtcblxuICAgICAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nTG9naWNzID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyX29wZXJhdG9yX2FuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBjb250ZXh0dWFsR3JvdXAub3BlcmF0b3IgPT09IEZpbHRlcmluZ0xvZ2ljLkFuZFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyX29wZXJhdG9yX29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuT3JcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpOiBFeHByZXNzaW9uR3JvdXBJdGVtIHtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9zZWxlY3RlZEdyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbnNBbGxTZWxlY3RlZEV4cHJlc3Npb25zID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmV2ZXJ5KG9wID0+IHRoaXMuaXNJbnNpZGVHcm91cChvcCwgZ3JvdXApKTtcblxuICAgICAgICAgICAgaWYgKGNvbnRhaW5zQWxsU2VsZWN0ZWRFeHByZXNzaW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbnNpZGVHcm91cChpdGVtOiBFeHByZXNzaW9uSXRlbSwgZ3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbS5wYXJlbnQgPT09IGdyb3VwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5zaWRlR3JvdXAoaXRlbS5wYXJlbnQsIGdyb3VwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbkl0ZW0ucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcm91cCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwcmVzc2lvbkl0ZW0gPT09IHRoaXMuY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IHRoaXMuY3VycmVudEdyb3VwLnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZXhwcmVzc2lvbkl0ZW0ucGFyZW50LmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmV4cHJlc3Npb25UcmVlID8gdGhpcy5leHByZXNzaW9uVHJlZS5lbnRpdHkgOiBudWxsO1xuICAgICAgICBjb25zdCByZXR1cm5GaWVsZHMgPSB0aGlzLmV4cHJlc3Npb25UcmVlID8gdGhpcy5leHByZXNzaW9uVHJlZS5yZXR1cm5GaWVsZHMgOiBudWxsO1xuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKHRoaXMucm9vdEdyb3VwLCBlbnRpdHksIHJldHVybkZpZWxkcyk7IC8vIFRPRE86IGRvbid0IHJlY3JlYXRlIGlmIG5vdCBuZWNlc3NhcnlcblxuICAgICAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtLnBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25UcmVlQ2hhbmdlLmVtaXQodGhpcy5fZXhwcmVzc2lvblRyZWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIGNvbnN0IGNoaXBzID0gdGhpcy5jaGlwcy50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnJlZHVjZSgoaSwgZSkgPT4gTWF0aC5taW4oaSwgY2hpcHMuZmluZEluZGV4KGMgPT4gYy5kYXRhID09PSBlKSksIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBjb25zdCBmaXJzdEV4cHJlc3Npb24gPSBjaGlwc1ttaW5JbmRleF0uZGF0YTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBmaXJzdEV4cHJlc3Npb24ucGFyZW50O1xuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGZpcnN0RXhwcmVzc2lvbik7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGdyb3VwSXRlbSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucykge1xuICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2goZXhwcik7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcik7XG4gICAgICAgICAgICBleHByLnBhcmVudCA9IGdyb3VwSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLmNoaWxkcmVuICYmIGdyb3VwSXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZ3JvdXBJdGVtLCAhZ3JvdXBJdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIGlmICghZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0sIHNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChncm91cEl0ZW0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBncm91cEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZXhwciwgc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kRXhwcmVzc2lvbiA9IGV4cHIgYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kRXhwcmVzc2lvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKG9wZXJhbmRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBleHByZXNzaW9uSXRlbS5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkR3JvdXBzLmluZGV4T2YocGFyZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGMuZGF0YSkgIT09IC0xKTtcbiAgICAgICAgbGV0IG1pblRvcCA9IGNoaXBzLnJlZHVjZSgodCwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWluKHQsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5tYXgoY29udGFpbmVyUmVjdC50b3AsIG1pblRvcCk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3QuYm90dG9tLCBtaW5Ub3ApO1xuICAgICAgICBsZXQgbWF4UmlnaHQgPSBjaGlwcy5yZWR1Y2UoKHIsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1heChyLCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpLCAwKTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgY29udGFpbmVyUmVjdC5sZWZ0KTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1pbihtYXhSaWdodCwgY29udGFpbmVyUmVjdC5yaWdodCk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSBuZXcgUG9pbnQobWF4UmlnaHQsIG1pblRvcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxFbGVtZW50SW50b1ZpZXcodGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmV4cHJlc3Npb25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldE9mZnNldCA9IHRhcmdldC5vZmZzZXRUb3AgLSBjb250YWluZXIub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBkZWx0YSA9IDEwO1xuXG4gICAgICAgIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgZGVsdGEgPiB0YXJnZXRPZmZzZXQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0YXJnZXRPZmZzZXQgLSBkZWx0YTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgY29udGFpbmVyLmNsaWVudEhlaWdodCA8IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsIjxuZy10ZW1wbGF0ZSAjYWRkSWNvbj5cbiAgICA8aWd4LWljb24gZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJhZGRcIj48L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjbG9zZUljb24+XG4gICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiY2xvc2VcIj48L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdlxuICAgICNleHByZXNzaW9uc0NvbnRhaW5lclxuICAgIGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX21haW5cIlxuICAgIChzY3JvbGwpPVwib25FeHByZXNzaW9uc1Njcm9sbGVkKClcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm9vdEdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtcXVlcnktYnVpbGRlcl9fcm9vdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19yb290LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgI2FkZFJvb3RBbmRHcm91cEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYW5kX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiaWd4LWZpbHRlci1lbXB0eV9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfaW5pdGlhbF90ZXh0IH19XG4gICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZSBsZXQtZXhwcmVzc2lvbkl0ZW0gbGV0LWFmdGVyRXhwcmVzc2lvbj1cImFmdGVyRXhwcmVzc2lvblwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgI2FkZENvbmRpdGlvbkJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbmRpdGlvbihleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FkZF9jb25kaXRpb25cbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhc0VkaXRlZEV4cHJlc3Npb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuZEdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FuZF9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX29yX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNvcGVyYW5kVGVtcGxhdGUgbGV0LWV4cHJlc3Npb25JdGVtPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWl0ZW1cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZCA9IHRydWVcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZCA9IGZhbHNlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1jaGlwXG4gICAgICAgICAgICAgICAgI3RhcmdldD1cInRvb2x0aXBUYXJnZXRcIlxuICAgICAgICAgICAgICAgIFtpZ3hUb29sdGlwVGFyZ2V0XT1cInRvb2x0aXBSZWZcIlxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImV4cHJlc3Npb25JdGVtXCJcbiAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cImlzSW5FZGl0TW9kZSgpID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImV4cHJlc3Npb25JdGVtLnNlbGVjdGVkICYmIGlzSW5FZGl0TW9kZSgpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNJbkVkaXRNb2RlKCkgPyBvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAoZGJsY2xpY2spPVwib25DaGlwRGJsQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uQ2hpcFJlbW92ZShleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwib25DaGlwU2VsZWN0aW9uRW5kKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlneFByZWZpeCBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAge3tleHByZXNzaW9uSXRlbS5maWVsZExhYmVsIHx8IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGR9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFRyZWUuZW50aXR5fX08L3N0cm9uZz4mbmJzcDsvIHt7Zm9ybWF0UmV0dXJuRmllbGRzKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZSl9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXRlKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0Rm9ybWF0dGVyKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmllbGRGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Rm9ybWF0dGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRGb3JtYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmxvY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICA8ZGl2ICN0b29sdGlwUmVmPVwidG9vbHRpcFwiIGlneFRvb2x0aXA+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZS5yZXR1cm5GaWVsZHMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLm5hbWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB8fFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5ob3ZlcmVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJlZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW52b2tlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbnRlckV4cHJlc3Npb25FZGl0KGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW52b2tlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbnRlckV4cHJlc3Npb25BZGQoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFleHByZXNzaW9uSXRlbS5pbkFkZE1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uSXRlbS5wYXJlbnQgIT09IGN1cnJlbnRHcm91cCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAuY2hpbGRyZW5bXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAuY2hpbGRyZW4ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlneEJ1dHRvbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZGV0YWlscy1idXR0b25cIiAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlICYmIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZGVyQ2xpY2soJGV2ZW50LCBleHByZXNzaW9uSXRlbSlcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RldGFpbHN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWRcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZm9sZF9sZXNzXCIgcm9sZT1cImJ1dHRvblwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uZXhwYW5kZWRcIiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZm9sZF9tb3JlXCIgcm9sZT1cImJ1dHRvblwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgI2VkaXRpbmdJbnB1dHNDb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LXNlbGVjdFxuICAgICAgICAgICAgICAgICNmaWVsZFNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRmllbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57e3RoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TZWxlY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9pZ3gtcHJlZml4PlxuXG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGdldENvbmRpdGlvbkxpc3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRDb25kaXRpb25GcmllbmRseU5hbWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctZHJvcGRvd24tdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3QtaXRlbT5cbiAgICAgICAgICAgIDwvaWd4LXNlbGVjdD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZVRlbXBsYXRlID8gc2VhcmNoVmFsdWVUZW1wbGF0ZSA6IGRlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRTZWFyY2hWYWx1ZVRlbXBsYXRlQ29udGV4dCgpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZWFyY2hWYWx1ZVRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ3RpbWUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGVUaW1lJylcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgaWd4TGFiZWw+e3t0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl92YWx1ZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjc2VhcmNoVmFsdWVJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbmRpdGlvbiA9PT0gJ2luJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29uZGl0aW9uID09PSAnbm90SW4nXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQnXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgXG4gICAgICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW291dGxldF09XCJwaWNrZXJPdXRsZXRcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla1N0YXJ0XT1cInNlbGVjdGVkRmllbGQucGlwZUFyZ3Mud2Vla1N0YXJ0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci10b2dnbGU+PC9pZ3gtcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuICAgIFxuICAgICAgICAgICAgICAgIDxpZ3gtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ3RpbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXR0ZXJdPVwic2VsZWN0ZWRGaWVsZC5mb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdGltZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgICAgICA8L2lneC10aW1lLXBpY2tlcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgICAgICNpbnB1dEdyb3VwXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVUaW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7dGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlcn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lneERhdGVUaW1lRWRpdG9yXT1cInNlbGVjdGVkRmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2lucHV0cy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWd4SWNvbkJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW9wZXJhbmRDYW5CZUNvbW1pdHRlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbW1pdE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwiY2hlY2tcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEljb25CdXR0b249XCJmbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGUgJiYgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hUcmVlKSB8fCAoZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZSAmJiAoc2VsZWN0ZWRDb25kaXRpb24gPT09ICdpbicgfHwgc2VsZWN0ZWRDb25kaXRpb24gPT09ICdub3RJbicpKVwiPlxuICAgICAgICAgICAgPGlneC1xdWVyeS1idWlsZGVyLXRyZWVcbiAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlIHx8IGV4cHJlc3Npb25JdGVtLmV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW2VudGl0aWVzXT1cImVudGl0aWVzXCJcbiAgICAgICAgICAgICAgICBbcGFyZW50RXhwcmVzc2lvbl09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW2V4cHJlc3Npb25UcmVlXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVHJlZVwiXG4gICAgICAgICAgICAgICAgKGluRWRpdE1vZGVDaGFuZ2UpPVwib25JbkVkaXRNb2RlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2lneC1xdWVyeS1idWlsZGVyLXRyZWU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlXCJcbiAgICAgICAgICAgICNhZGRNb2RlQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBhZGRFeHByZXNzaW9uc1RlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtLnBhcmVudCwgZXhwcmVzc2lvbkl0ZW0pXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRBZGQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNsb3NlSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25Hcm91cFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2xpbmVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tYW5kJzogZXhwcmVzc2lvbkl0ZW0/Lm9wZXJhdG9yID09PSAwLFxuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1vcic6IGV4cHJlc3Npb25JdGVtPy5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbT8uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHNcIiBbc3R5bGUuZGlzcGxheV09XCIoaXNJbkVkaXRNb2RlKCkgJiYgdGhpcy5lbnRpdGllcy5sZW5ndGggPiAwICYmIHRoaXMuZW50aXRpZXNbMF0ubmFtZSkgPyAnZmxleCcgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5wYXJlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0ICNlbnRpdHlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25FbnRpdHlTZWxlY3RDaGFuZ2luZygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImVudGl0eVNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzSW5FZGl0TW9kZSgpID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlneExhYmVsPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9lbnRpdHkgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtc2VsZWN0LWl0ZW0gKm5nRm9yPVwibGV0IGVudGl0eSBvZiBlbnRpdGllc1wiIFt2YWx1ZV09XCJlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbnRpdHkubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY29tYm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWRSZXR1cm5GaWVsZHNDb21ib1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc01heEhlaWdodF09XCIyNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlLZXldPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlS2V5XT1cIidmaWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXR1cm5GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwicmV0dXJuRmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyPVwie3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfc2VhcmNoIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc0luRWRpdE1vZGUoKSA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1kcm9wLWRvd25fX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGhpcy5zZWxlY3RlZEVudGl0eSAmJiB0aGlzLnNlbGVjdGVkUmV0dXJuRmllbGRzICYmIHRoaXMuc2VsZWN0ZWRFbnRpdHkuZmllbGRzLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJ0aGlzLnNlbGVjdGVkRW50aXR5ICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMgJiYgdGhpcy5zZWxlY3RlZFJldHVybkZpZWxkcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRSZXR1cm5GaWVsZHMubGVuZ3RoIDwgdGhpcy5zZWxlY3RlZEVudGl0eS5maWVsZHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdEFsbENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWNvbWJvX19jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3NlbGVjdF9hbGwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZ3hMYWJlbD57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9zZWxlY3RfcmV0dXJuX2ZpZWxkcyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1jb21ibz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBleHByIG9mIGV4cHJlc3Npb25JdGVtPy5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwcmVzc2lvbkdyb3VwKGV4cHIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXhwcmVzc2lvbkdyb3VwVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYW5kVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEdyb3VwID09PSBleHByZXNzaW9uSXRlbSAmJiBpc0luRWRpdE1vZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICNjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0gIT09IHJvb3RHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRWRpdGVkRXhwcmVzc2lvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmNoaWxkcmVuLmxlbmd0aCA8IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9lbmRfZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvb3RHcm91cFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Hcm91cFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQocm9vdEdyb3VwKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdlxuICAgICAgICBpZ3hUb2dnbGVcbiAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsb3NlZCk9XCJjb250ZXh0TWVudUNsb3NlZCgpXCJcbiAgICA+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hJY29uQnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51X19jbG9zZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0dWFsR3JvdXBcIj5cbiAgICAgICAgICAgIDxpZ3gtYnV0dG9uZ3JvdXBcbiAgICAgICAgICAgICAgICBbdmFsdWVzXT1cImZpbHRlcmluZ0xvZ2ljc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RGaWx0ZXJpbmdMb2dpYygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaWd4LWJ1dHRvbmdyb3VwPlxuXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbnRleHR1YWxHcm91cC5wYXJlbnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bmdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cInVuZ3JvdXBcIj48L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3VuZ3JvdXBcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUdyb3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImRlbGV0ZVwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZUFuZEdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NyZWF0ZV9hbmRfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZU9yR3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfY3JlYXRlX29yX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZV9maWx0ZXJzIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICAgICNvdmVybGF5T3V0bGV0XG4gICAgaWd4T3ZlcmxheU91dGxldFxuICAgIGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX291dGxldFwiXG4gICAgKHBvaW50ZXJkb3duKT1cIm9uT3V0bGV0UG9pbnRlckRvd24oJGV2ZW50KVwiXG4+PC9kaXY+XG5cbjxpZ3gtZGlhbG9nXG4gICAgI2VudGl0eUNoYW5nZURpYWxvZ1xuICAgIHRpdGxlPVwiQ29uZmlybWF0aW9uXCJcbiAgICBtZXNzYWdlPVwiQnkgY2hhbmdpbmcgdGhlIGVudGl0eSwgeW91IHdpbGwgbG9zZSB5b3VyIGN1cnJlbnQgc2V0dGluZ3MuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGF0P1wiXG4gICAgbGVmdEJ1dHRvbkxhYmVsPVwiQ2FuY2VsXCJcbiAgICByaWdodEJ1dHRvbkxhYmVsPVwiQ29uZmlybVwiXG4gICAgKGxlZnRCdXR0b25TZWxlY3QpPVwib25FbnRpdHlDaGFuZ2VDYW5jZWwoKVwiXG4gICAgKHJpZ2h0QnV0dG9uU2VsZWN0KT1cIm9uRW50aXR5Q2hhbmdlQ29uZmlybSgpXCI+XG48L2lneC1kaWFsb2c+XG4iXX0=
|