carbon-components-angular
Version:
Next generation components
370 lines • 30.6 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostBinding, HostListener } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/common";
import * as i3 from "../cell/table-data.component";
import * as i4 from "../cell/table-checkbox.component";
import * as i5 from "../cell/table-radio.component";
import * as i6 from "../cell/table-expand-button.component";
export class TableRowComponent {
constructor(i18n) {
this.i18n = i18n;
this.expanded = false;
this.expandable = false;
this.selected = false;
/**
* Size of the table rows.
*/
this.size = "md";
/**
* Controls whether to enable multiple or single row selection.
*/
this.enableSingleSelect = false;
/**
* Controls whether to show the selection checkboxes column or not.
*/
this.showSelectionColumn = true;
/**
* Shows or hide the checkbox in the selection column when `showSelectionColumn`
* is set to true
*/
this.showSelectionColumnCheckbox = true;
this.skeleton = false;
/**
* Emits when the row is selected.
*/
this.selectRow = new EventEmitter();
/**
* Emits when the row is deselected.
*/
this.deselectRow = new EventEmitter();
/**
* Emits when the row is expanded
*/
this.expandRow = new EventEmitter();
/**
* Emits when a row is clicked regardless of `enableSingleSelect` or `showSelectionColumn`.
* Should only get emitted when a row item is selected excluding expand buttons,
* checkboxes, or radios.
*/
this.rowClick = new EventEmitter();
/**
* When true (and the row carries an AI decorator), applies Carbon AI row classes.
*/
this.withRowAILabels = false;
this._checkboxLabel = this.i18n.getOverridable("TABLE.CHECKBOX_ROW");
this._expandButtonAriaLabel = this.i18n.getOverridable("TABLE.EXPAND_BUTTON");
}
set expandButtonAriaLabel(value) {
this._expandButtonAriaLabel.override(value);
}
get expandButtonAriaLabel() {
return this._expandButtonAriaLabel.value;
}
set checkboxLabel(value) {
this._checkboxLabel.override(value);
}
get checkboxLabel() {
return this._checkboxLabel.value;
}
get selectedClass() {
return this.selected;
}
get aiLabelRowClass() {
return this.withRowAILabels && this.row?.[0]?.hasAILabelDecorator === true;
}
get slugRowClass() {
return this.withRowAILabels && this.row?.[0]?.hasAILabelDecorator === true;
}
get parentRowClass() {
return this.expandable;
}
get expandableRowClass() {
return this.expanded;
}
get selectableClass() {
return false; // this.singleSelect
}
get isParentRow() {
return this.expandable ? true : null;
}
get isAccessible() {
return this.enableSingleSelect && !this.showSelectionColumn ? 0 : null;
}
onHostClick() {
if (this.enableSingleSelect && !this.showSelectionColumn) {
this.onSelectionChange();
}
}
onRowClick() {
this.rowClick.emit();
}
onSelectionChange() {
if (this.selected) {
this.deselectRow.emit();
}
else {
this.selectRow.emit();
}
}
getCheckboxLabel() {
return this._checkboxLabel.subject;
}
getExpandButtonAriaLabel() {
return this._expandButtonAriaLabel.subject;
}
cellClassNames(j, item) {
const header = this.model.getHeader(j);
const parts = [header?.className, item?.cellClassName].filter(Boolean);
if (header?.hasAILabelHeader) {
parts.push("cds--table-cell--column-slug");
}
return parts.join(" ");
}
}
TableRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableRowComponent, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component });
TableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableRowComponent, selector: "[cdsTableRow], [ibmTableRow]", inputs: { model: "model", row: "row", expanded: "expanded", expandable: "expandable", selected: "selected", size: "size", enableSingleSelect: "enableSingleSelect", expandButtonAriaLabel: "expandButtonAriaLabel", checkboxLabel: "checkboxLabel", showSelectionColumn: "showSelectionColumn", showSelectionColumnCheckbox: "showSelectionColumnCheckbox", selectionLabelColumn: "selectionLabelColumn", skeleton: "skeleton", withRowAILabels: "withRowAILabels" }, outputs: { selectRow: "selectRow", deselectRow: "deselectRow", expandRow: "expandRow", rowClick: "rowClick" }, host: { listeners: { "click": "onHostClick()" }, properties: { "class.cds--data-table--selected": "this.selectedClass", "class.cds--data-table--ai-label-row": "this.aiLabelRowClass", "class.cds--data-table--slug-row": "this.slugRowClass", "class.cds--parent-row": "this.parentRowClass", "class.cds--expandable-row": "this.expandableRowClass", "class.tbody_row--selectable": "this.selectableClass", "attr.data-parent-row": "this.isParentRow", "attr.tabindex": "this.isAccessible" } }, ngImport: i0, template: `
<ng-container *ngIf="model">
<td
*ngIf="withRowAILabels && row[0] && model.getHeader(0) && model.getHeader(0).visible"
cdsTableData
[]="model.getHeaderId(0, row[0].colSpan)"
[]="row[0]"
[]="row[0].title"
[]="cellClassNames(0, row[0])"
[]="model.getHeader(0).style"
[]="skeleton"
[]="row[0].colSpan"
[]="row[0].rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="model.hasExpandableRows()"
cdsTableExpandButton
class="cds--table-expand-v2"
[]="expanded"
[]="expandable"
[]="skeleton"
[]="getExpandButtonAriaLabel()"
[]="model.getHeaderId('expand')"
(expandRow)="expandRow.emit()">
</td>
<ng-container *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect">
<td
*ngIf="!showSelectionColumnCheckbox; else tableCheckboxTemplate">
</td>
<ng-template
<td
cdsTableCheckbox
class="cds--table-column-checkbox"
[]="size"
[]="selected"
[]="getCheckboxLabel()"
[]="row"
[]="skeleton"
[]="model.getHeaderId('select')"
(selectedChange)="onSelectionChange()">
</td>
</ng-template>
</ng-container>
<td
*ngIf="!skeleton && showSelectionColumn && enableSingleSelect"
cdsTableRadio
[]="selected"
[]="getCheckboxLabel()"
[]="row"
[]="skeleton"
[]="model.getHeaderId('select')"
(change)="onSelectionChange()">
</td>
<ng-container *ngFor="let item of row; let j = index">
<td
*ngIf="(!withRowAILabels || j > 0) && item && model.getHeader(j) && model.getHeader(j).visible"
cdsTableData
[]="model.getHeaderId(j, item.colSpan)"
[]="item"
[]="item.title"
[]="cellClassNames(j, item)"
[]="model.getHeader(j).style"
[]="skeleton"
[]="item.colSpan"
[]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="(!withRowAILabels || j > 0) && item && model.getHeader(j) == null"
cdsTableData
[]="model.getHeaderId(j, item.colSpan)"
[]="item"
[]="item.title"
[]="cellClassNames(j, item)"
[]="skeleton"
[]="item.colSpan"
[]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
</ng-container>
</ng-container>
<ng-content></ng-content>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.TableData, selector: "[cdsTableData], [ibmTableData]", inputs: ["item", "skeleton"] }, { kind: "component", type: i4.TableCheckbox, selector: "[cdsTableCheckbox], [ibmTableCheckbox]", inputs: ["row", "selected", "name", "size", "label", "selectionLabelColumn", "skeleton"], outputs: ["selectedChange"] }, { kind: "component", type: i5.TableRadio, selector: "[cdsTableRadio], [ibmTableRadio]", inputs: ["row", "selected", "label", "selectionLabelColumn", "skeleton"], outputs: ["change"] }, { kind: "component", type: i6.TableExpandButton, selector: "[cdsTableExpandButton], [ibmTableExpandButton]", inputs: ["expanded", "expandable", "ariaLabel", "skeleton"], outputs: ["expandRow"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableRowComponent, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line: component-selector
selector: "[cdsTableRow], [ibmTableRow]",
template: `
<ng-container *ngIf="model">
<td
*ngIf="withRowAILabels && row[0] && model.getHeader(0) && model.getHeader(0).visible"
cdsTableData
[]="model.getHeaderId(0, row[0].colSpan)"
[]="row[0]"
[]="row[0].title"
[]="cellClassNames(0, row[0])"
[]="model.getHeader(0).style"
[]="skeleton"
[]="row[0].colSpan"
[]="row[0].rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="model.hasExpandableRows()"
cdsTableExpandButton
class="cds--table-expand-v2"
[]="expanded"
[]="expandable"
[]="skeleton"
[]="getExpandButtonAriaLabel()"
[]="model.getHeaderId('expand')"
(expandRow)="expandRow.emit()">
</td>
<ng-container *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect">
<td
*ngIf="!showSelectionColumnCheckbox; else tableCheckboxTemplate">
</td>
<ng-template
<td
cdsTableCheckbox
class="cds--table-column-checkbox"
[]="size"
[]="selected"
[]="getCheckboxLabel()"
[]="row"
[]="skeleton"
[]="model.getHeaderId('select')"
(selectedChange)="onSelectionChange()">
</td>
</ng-template>
</ng-container>
<td
*ngIf="!skeleton && showSelectionColumn && enableSingleSelect"
cdsTableRadio
[]="selected"
[]="getCheckboxLabel()"
[]="row"
[]="skeleton"
[]="model.getHeaderId('select')"
(change)="onSelectionChange()">
</td>
<ng-container *ngFor="let item of row; let j = index">
<td
*ngIf="(!withRowAILabels || j > 0) && item && model.getHeader(j) && model.getHeader(j).visible"
cdsTableData
[]="model.getHeaderId(j, item.colSpan)"
[]="item"
[]="item.title"
[]="cellClassNames(j, item)"
[]="model.getHeader(j).style"
[]="skeleton"
[]="item.colSpan"
[]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="(!withRowAILabels || j > 0) && item && model.getHeader(j) == null"
cdsTableData
[]="model.getHeaderId(j, item.colSpan)"
[]="item"
[]="item.title"
[]="cellClassNames(j, item)"
[]="skeleton"
[]="item.colSpan"
[]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
</ng-container>
</ng-container>
<ng-content></ng-content>
`
}]
}], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { model: [{
type: Input
}], row: [{
type: Input
}], expanded: [{
type: Input
}], expandable: [{
type: Input
}], selected: [{
type: Input
}], size: [{
type: Input
}], enableSingleSelect: [{
type: Input
}], expandButtonAriaLabel: [{
type: Input
}], checkboxLabel: [{
type: Input
}], showSelectionColumn: [{
type: Input
}], showSelectionColumnCheckbox: [{
type: Input
}], selectionLabelColumn: [{
type: Input
}], skeleton: [{
type: Input
}], selectRow: [{
type: Output
}], deselectRow: [{
type: Output
}], expandRow: [{
type: Output
}], rowClick: [{
type: Output
}], selectedClass: [{
type: HostBinding,
args: ["class.cds--data-table--selected"]
}], withRowAILabels: [{
type: Input
}], aiLabelRowClass: [{
type: HostBinding,
args: ["class.cds--data-table--ai-label-row"]
}], slugRowClass: [{
type: HostBinding,
args: ["class.cds--data-table--slug-row"]
}], parentRowClass: [{
type: HostBinding,
args: ["class.cds--parent-row"]
}], expandableRowClass: [{
type: HostBinding,
args: ["class.cds--expandable-row"]
}], selectableClass: [{
type: HostBinding,
args: ["class.tbody_row--selectable"]
}], isParentRow: [{
type: HostBinding,
args: ["attr.data-parent-row"]
}], isAccessible: [{
type: HostBinding,
args: ["attr.tabindex"]
}], onHostClick: [{
type: HostListener,
args: ["click"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90YWJsZS9ib2R5L3RhYmxlLXJvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWtHdkIsTUFBTSxPQUFPLGlCQUFpQjtJQWlJN0IsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUF6SHZCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sU0FBSSxHQUFpQixJQUFJLENBQUM7UUFFbkM7O1dBRUc7UUFDTSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFvQnBDOztXQUVHO1FBQ00sd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRXBDOzs7V0FHRztRQUNNLGdDQUEyQixHQUFHLElBQUksQ0FBQztRQWNuQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekM7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0M7O1dBRUc7UUFDTyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6Qzs7OztXQUlHO1FBQ08sYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFNeEM7O1dBRUc7UUFDTSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQThCdkIsbUJBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hFLDJCQUFzQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFL0MsQ0FBQztJQXpHckMsSUFDSSxxQkFBcUIsQ0FBQyxLQUFrQztRQUMzRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN4QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQ0ksYUFBYSxDQUFDLEtBQWtDO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDaEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBaURELElBQW9ELGFBQWE7UUFDaEUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7SUFPRCxJQUF3RCxlQUFlO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLEtBQUssSUFBSSxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFvRCxZQUFZO1FBQy9ELE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLEtBQUssSUFBSSxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUEwQyxjQUFjO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBOEMsa0JBQWtCO1FBQy9ELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBZ0QsZUFBZTtRQUM5RCxPQUFPLEtBQUssQ0FBQyxDQUFDLG9CQUFvQjtJQUNuQyxDQUFDO0lBRUQsSUFBeUMsV0FBVztRQUNuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFrQyxZQUFZO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RSxDQUFDO0lBUUQsV0FBVztRQUNWLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3pELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQ3pCO0lBQ0YsQ0FBQztJQUVELFVBQVU7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxpQkFBaUI7UUFDaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDeEI7YUFBTTtZQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdEI7SUFDRixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQsd0JBQXdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBRUQsY0FBYyxDQUFDLENBQVMsRUFBRSxJQUFlO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxFQUFFLGdCQUFnQixFQUFFO1lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUMzQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDOzs4R0FyS1csaUJBQWlCO2tHQUFqQixpQkFBaUIsNmxDQXhGbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0ZUOzJGQUVXLGlCQUFpQjtrQkEzRjdCLFNBQVM7bUJBQUM7b0JBQ1YsK0NBQStDO29CQUMvQyxRQUFRLEVBQUUsOEJBQThCO29CQUN4QyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0ZUO2lCQUNEOzJGQUtTLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBVUYsYUFBYTtzQkFEaEIsS0FBSztnQkFZRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBTUcsMkJBQTJCO3NCQUFuQyxLQUFLO2dCQVlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxTQUFTO3NCQUFsQixNQUFNO2dCQU9HLFFBQVE7c0JBQWpCLE1BQU07Z0JBRTZDLGFBQWE7c0JBQWhFLFdBQVc7dUJBQUMsaUNBQWlDO2dCQU9yQyxlQUFlO3NCQUF2QixLQUFLO2dCQUVrRCxlQUFlO3NCQUF0RSxXQUFXO3VCQUFDLHFDQUFxQztnQkFJRSxZQUFZO3NCQUEvRCxXQUFXO3VCQUFDLGlDQUFpQztnQkFJSixjQUFjO3NCQUF2RCxXQUFXO3VCQUFDLHVCQUF1QjtnQkFJVSxrQkFBa0I7c0JBQS9ELFdBQVc7dUJBQUMsMkJBQTJCO2dCQUlRLGVBQWU7c0JBQTlELFdBQVc7dUJBQUMsNkJBQTZCO2dCQUlELFdBQVc7c0JBQW5ELFdBQVc7dUJBQUMsc0JBQXNCO2dCQUlELFlBQVk7c0JBQTdDLFdBQVc7dUJBQUMsZUFBZTtnQkFVNUIsV0FBVztzQkFEVixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gXCIuLi90YWJsZS1tb2RlbC5jbGFzc1wiO1xuaW1wb3J0IHsgSTE4biwgT3ZlcnJpZGFibGUgfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBUYWJsZUl0ZW0gfSBmcm9tIFwiLi4vdGFibGUtaXRlbS5jbGFzc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBUYWJsZVJvd1NpemUgfSBmcm9tIFwiLi4vdGFibGUudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZVJvd10sIFtpYm1UYWJsZVJvd11cIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWxcIj5cblx0XHRcdDx0ZFxuXHRcdFx0XHQqbmdJZj1cIndpdGhSb3dBSUxhYmVscyAmJiByb3dbMF0gJiYgbW9kZWwuZ2V0SGVhZGVyKDApICYmIG1vZGVsLmdldEhlYWRlcigwKS52aXNpYmxlXCJcblx0XHRcdFx0Y2RzVGFibGVEYXRhXG5cdFx0XHRcdFtoZWFkZXJzXT1cIm1vZGVsLmdldEhlYWRlcklkKDAsIHJvd1swXS5jb2xTcGFuKVwiXG5cdFx0XHRcdFtpdGVtXT1cInJvd1swXVwiXG5cdFx0XHRcdFt0aXRsZV09XCJyb3dbMF0udGl0bGVcIlxuXHRcdFx0XHRbY2xhc3NdPVwiY2VsbENsYXNzTmFtZXMoMCwgcm93WzBdKVwiXG5cdFx0XHRcdFtuZ1N0eWxlXT1cIm1vZGVsLmdldEhlYWRlcigwKS5zdHlsZVwiXG5cdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFthdHRyLmNvbHNwYW5dPVwicm93WzBdLmNvbFNwYW5cIlxuXHRcdFx0XHRbYXR0ci5yb3dzcGFuXT1cInJvd1swXS5yb3dTcGFuXCJcblx0XHRcdFx0KGNsaWNrKT1cIm9uUm93Q2xpY2soKVwiXG5cdFx0XHRcdChrZXlkb3duLmVudGVyKT1cIm9uUm93Q2xpY2soKVwiPlxuXHRcdFx0PC90ZD5cblx0XHRcdDx0ZFxuXHRcdFx0XHQqbmdJZj1cIm1vZGVsLmhhc0V4cGFuZGFibGVSb3dzKClcIlxuXHRcdFx0XHRjZHNUYWJsZUV4cGFuZEJ1dHRvblxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtZXhwYW5kLXYyXCJcblx0XHRcdFx0W2V4cGFuZGVkXT1cImV4cGFuZGVkXCJcblx0XHRcdFx0W2V4cGFuZGFibGVdPVwiZXhwYW5kYWJsZVwiXG5cdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFthcmlhTGFiZWxdPVwiZ2V0RXhwYW5kQnV0dG9uQXJpYUxhYmVsKClcIlxuXHRcdFx0XHRbaGVhZGVyc109XCJtb2RlbC5nZXRIZWFkZXJJZCgnZXhwYW5kJylcIlxuXHRcdFx0XHQoZXhwYW5kUm93KT1cImV4cGFuZFJvdy5lbWl0KClcIj5cblx0XHRcdDwvdGQ+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uICYmIHNob3dTZWxlY3Rpb25Db2x1bW4gJiYgIWVuYWJsZVNpbmdsZVNlbGVjdFwiPlxuXHRcdFx0XHQ8dGRcblx0XHRcdFx0XHQqbmdJZj1cIiFzaG93U2VsZWN0aW9uQ29sdW1uQ2hlY2tib3g7IGVsc2UgdGFibGVDaGVja2JveFRlbXBsYXRlXCI+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAjdGFibGVDaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdDx0ZFxuXHRcdFx0XHRcdFx0Y2RzVGFibGVDaGVja2JveFxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLWNvbHVtbi1jaGVja2JveFwiXG5cdFx0XHRcdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFx0XHRcdFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG5cdFx0XHRcdFx0XHRbbGFiZWxdPVwiZ2V0Q2hlY2tib3hMYWJlbCgpXCJcblx0XHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFx0XHRbaGVhZGVyc109XCJtb2RlbC5nZXRIZWFkZXJJZCgnc2VsZWN0JylcIlxuXHRcdFx0XHRcdFx0KHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKClcIj5cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8dGRcblx0XHRcdFx0Km5nSWY9XCIhc2tlbGV0b24gJiYgc2hvd1NlbGVjdGlvbkNvbHVtbiAmJiBlbmFibGVTaW5nbGVTZWxlY3RcIlxuXHRcdFx0XHRjZHNUYWJsZVJhZGlvXG5cdFx0XHRcdFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG5cdFx0XHRcdFtsYWJlbF09XCJnZXRDaGVja2JveExhYmVsKClcIlxuXHRcdFx0XHRbcm93XT1cInJvd1wiXG5cdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFtoZWFkZXJzXT1cIm1vZGVsLmdldEhlYWRlcklkKCdzZWxlY3QnKVwiXG5cdFx0XHRcdChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoKVwiPlxuXHRcdFx0PC90ZD5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93OyBsZXQgaiA9IGluZGV4XCI+XG5cdFx0XHRcdDx0ZFxuXHRcdFx0XHRcdCpuZ0lmPVwiKCF3aXRoUm93QUlMYWJlbHMgfHwgaiA+IDApICYmIGl0ZW0gJiYgbW9kZWwuZ2V0SGVhZGVyKGopICYmIG1vZGVsLmdldEhlYWRlcihqKS52aXNpYmxlXCJcblx0XHRcdFx0XHRjZHNUYWJsZURhdGFcblx0XHRcdFx0XHRbaGVhZGVyc109XCJtb2RlbC5nZXRIZWFkZXJJZChqLCBpdGVtLmNvbFNwYW4pXCJcblx0XHRcdFx0XHRbaXRlbV09XCJpdGVtXCJcblx0XHRcdFx0XHRbdGl0bGVdPVwiaXRlbS50aXRsZVwiXG5cdFx0XHRcdFx0W2NsYXNzXT1cImNlbGxDbGFzc05hbWVzKGosIGl0ZW0pXCJcblx0XHRcdFx0XHRbbmdTdHlsZV09XCJtb2RlbC5nZXRIZWFkZXIoaikuc3R5bGVcIlxuXHRcdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFx0W2F0dHIuY29sc3Bhbl09XCJpdGVtLmNvbFNwYW5cIlxuXHRcdFx0XHRcdFthdHRyLnJvd3NwYW5dPVwiaXRlbS5yb3dTcGFuXCJcblx0XHRcdFx0XHQoY2xpY2spPVwib25Sb3dDbGljaygpXCJcblx0XHRcdFx0XHQoa2V5ZG93bi5lbnRlcik9XCJvblJvd0NsaWNrKClcIj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkXG5cdFx0XHRcdFx0Km5nSWY9XCIoIXdpdGhSb3dBSUxhYmVscyB8fCBqID4gMCkgJiYgaXRlbSAmJiBtb2RlbC5nZXRIZWFkZXIoaikgPT0gbnVsbFwiXG5cdFx0XHRcdFx0Y2RzVGFibGVEYXRhXG5cdFx0XHRcdFx0W2hlYWRlcnNdPVwibW9kZWwuZ2V0SGVhZGVySWQoaiwgaXRlbS5jb2xTcGFuKVwiXG5cdFx0XHRcdFx0W2l0ZW1dPVwiaXRlbVwiXG5cdFx0XHRcdFx0W3RpdGxlXT1cIml0ZW0udGl0bGVcIlxuXHRcdFx0XHRcdFtjbGFzc109XCJjZWxsQ2xhc3NOYW1lcyhqLCBpdGVtKVwiXG5cdFx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCJcblx0XHRcdFx0XHRbYXR0ci5jb2xzcGFuXT1cIml0ZW0uY29sU3BhblwiXG5cdFx0XHRcdFx0W2F0dHIucm93c3Bhbl09XCJpdGVtLnJvd1NwYW5cIlxuXHRcdFx0XHRcdChjbGljayk9XCJvblJvd0NsaWNrKClcIlxuXHRcdFx0XHRcdChrZXlkb3duLmVudGVyKT1cIm9uUm93Q2xpY2soKVwiPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUm93Q29tcG9uZW50IHtcblx0LyoqXG5cdCAqIGBUYWJsZU1vZGVsYCB3aXRoIGRhdGEgdGhlIHRhYmxlIGlzIHRvIGRpc3BsYXkuXG5cdCAqL1xuXHRASW5wdXQoKSBtb2RlbDogVGFibGVNb2RlbDtcblxuXHRASW5wdXQoKSByb3c6IFRhYmxlSXRlbVtdO1xuXG5cdEBJbnB1dCgpIGV4cGFuZGVkID0gZmFsc2U7XG5cblx0QElucHV0KCkgZXhwYW5kYWJsZSA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHNlbGVjdGVkID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFNpemUgb2YgdGhlIHRhYmxlIHJvd3MuXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBUYWJsZVJvd1NpemUgPSBcIm1kXCI7XG5cblx0LyoqXG5cdCAqIENvbnRyb2xzIHdoZXRoZXIgdG8gZW5hYmxlIG11bHRpcGxlIG9yIHNpbmdsZSByb3cgc2VsZWN0aW9uLlxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlU2luZ2xlU2VsZWN0ID0gZmFsc2U7XG5cblx0QElucHV0KClcblx0c2V0IGV4cGFuZEJ1dHRvbkFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fZXhwYW5kQnV0dG9uQXJpYUxhYmVsLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBleHBhbmRCdXR0b25BcmlhTGFiZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbkFyaWFMYWJlbC52YWx1ZTtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCBjaGVja2JveExhYmVsKHZhbHVlOiBzdHJpbmcgfCBPYnNlcnZhYmxlPHN0cmluZz4pIHtcblx0XHR0aGlzLl9jaGVja2JveExhYmVsLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBjaGVja2JveExhYmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9jaGVja2JveExhYmVsLnZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnRyb2xzIHdoZXRoZXIgdG8gc2hvdyB0aGUgc2VsZWN0aW9uIGNoZWNrYm94ZXMgY29sdW1uIG9yIG5vdC5cblx0ICovXG5cdEBJbnB1dCgpIHNob3dTZWxlY3Rpb25Db2x1bW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBTaG93cyBvciBoaWRlIHRoZSBjaGVja2JveCBpbiB0aGUgc2VsZWN0aW9uIGNvbHVtbiB3aGVuIGBzaG93U2VsZWN0aW9uQ29sdW1uYFxuXHQgKiBpcyBzZXQgdG8gdHJ1ZVxuXHQgKi9cblx0QElucHV0KCkgc2hvd1NlbGVjdGlvbkNvbHVtbkNoZWNrYm94ID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVXNlZCB0byBwb3B1bGF0ZSB0aGUgcm93IHNlbGVjdGlvbiBjaGVja2JveCBsYWJlbCB3aXRoIGEgdXNlZnVsIHZhbHVlIGlmIHNldC5cblx0ICpcblx0ICogRXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIDxjZHMtdGFibGUgW3NlbGVjdGlvbkxhYmVsQ29sdW1uXT1cIjBcIj48L2Nkcy10YWJsZT5cblx0ICogPCEtLSByZXN1bHRzIGluIGFyaWEtbGFiZWw9XCJTZWxlY3QgZmlyc3QgY29sdW1uIHZhbHVlXCJcblx0ICogKHdoZXJlIFwiZmlyc3QgY29sdW1uIHZhbHVlXCIgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIHJvdyAtLT5cblx0ICogYGBgXG5cdCAqL1xuXHRASW5wdXQoKSBzZWxlY3Rpb25MYWJlbENvbHVtbjogbnVtYmVyO1xuXG5cdEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEVtaXRzIHdoZW4gdGhlIHJvdyBpcyBzZWxlY3RlZC5cblx0ICovXG5cdEBPdXRwdXQoKSBzZWxlY3RSb3cgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEVtaXRzIHdoZW4gdGhlIHJvdyBpcyBkZXNlbGVjdGVkLlxuXHQgKi9cblx0QE91dHB1dCgpIGRlc2VsZWN0Um93ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyB3aGVuIHRoZSByb3cgaXMgZXhwYW5kZWRcblx0ICovXG5cdEBPdXRwdXQoKSBleHBhbmRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEVtaXRzIHdoZW4gYSByb3cgaXMgY2xpY2tlZCByZWdhcmRsZXNzIG9mIGBlbmFibGVTaW5nbGVTZWxlY3RgIG9yIGBzaG93U2VsZWN0aW9uQ29sdW1uYC5cblx0ICogU2hvdWxkIG9ubHkgZ2V0IGVtaXR0ZWQgd2hlbiBhIHJvdyBpdGVtIGlzIHNlbGVjdGVkIGV4Y2x1ZGluZyBleHBhbmQgYnV0dG9ucyxcblx0ICogY2hlY2tib3hlcywgb3IgcmFkaW9zLlxuXHQgKi9cblx0QE91dHB1dCgpIHJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tZGF0YS10YWJsZS0tc2VsZWN0ZWRcIikgZ2V0IHNlbGVjdGVkQ2xhc3MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiB0cnVlIChhbmQgdGhlIHJvdyBjYXJyaWVzIGFuIEFJIGRlY29yYXRvciksIGFwcGxpZXMgQ2FyYm9uIEFJIHJvdyBjbGFzc2VzLlxuXHQgKi9cblx0QElucHV0KCkgd2l0aFJvd0FJTGFiZWxzID0gZmFsc2U7XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1kYXRhLXRhYmxlLS1haS1sYWJlbC1yb3dcIikgZ2V0IGFpTGFiZWxSb3dDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy53aXRoUm93QUlMYWJlbHMgJiYgdGhpcy5yb3c/LlswXT8uaGFzQUlMYWJlbERlY29yYXRvciA9PT0gdHJ1ZTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tZGF0YS10YWJsZS0tc2x1Zy1yb3dcIikgZ2V0IHNsdWdSb3dDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy53aXRoUm93QUlMYWJlbHMgJiYgdGhpcy5yb3c/LlswXT8uaGFzQUlMYWJlbERlY29yYXRvciA9PT0gdHJ1ZTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tcGFyZW50LXJvd1wiKSBnZXQgcGFyZW50Um93Q2xhc3MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhwYW5kYWJsZTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tZXhwYW5kYWJsZS1yb3dcIikgZ2V0IGV4cGFuZGFibGVSb3dDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy5leHBhbmRlZDtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLnRib2R5X3Jvdy0tc2VsZWN0YWJsZVwiKSBnZXQgc2VsZWN0YWJsZUNsYXNzKCkge1xuXHRcdHJldHVybiBmYWxzZTsgLy8gdGhpcy5zaW5nbGVTZWxlY3Rcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImF0dHIuZGF0YS1wYXJlbnQtcm93XCIpIGdldCBpc1BhcmVudFJvdygpIHtcblx0XHRyZXR1cm4gdGhpcy5leHBhbmRhYmxlID8gdHJ1ZSA6IG51bGw7XG5cdH1cblxuXHRASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIGdldCBpc0FjY2Vzc2libGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlU2luZ2xlU2VsZWN0ICYmICF0aGlzLnNob3dTZWxlY3Rpb25Db2x1bW4gPyAwIDogbnVsbDtcblx0fVxuXG5cdHByb3RlY3RlZCBfY2hlY2tib3hMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLkNIRUNLQk9YX1JPV1wiKTtcblx0cHJvdGVjdGVkIF9leHBhbmRCdXR0b25BcmlhTGFiZWwgPSB0aGlzLmkxOG4uZ2V0T3ZlcnJpZGFibGUoXCJUQUJMRS5FWFBBTkRfQlVUVE9OXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7IH1cblxuXHRASG9zdExpc3RlbmVyKFwiY2xpY2tcIilcblx0b25Ib3N0Q2xpY2soKSB7XG5cdFx0aWYgKHRoaXMuZW5hYmxlU2luZ2xlU2VsZWN0ICYmICF0aGlzLnNob3dTZWxlY3Rpb25Db2x1bW4pIHtcblx0XHRcdHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHRvblJvd0NsaWNrKCkge1xuXHRcdHRoaXMucm93Q2xpY2suZW1pdCgpO1xuXHR9XG5cblx0b25TZWxlY3Rpb25DaGFuZ2UoKSB7XG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWQpIHtcblx0XHRcdHRoaXMuZGVzZWxlY3RSb3cuZW1pdCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNlbGVjdFJvdy5lbWl0KCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q2hlY2tib3hMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9jaGVja2JveExhYmVsLnN1YmplY3Q7XG5cdH1cblxuXHRnZXRFeHBhbmRCdXR0b25BcmlhTGFiZWwoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kQnV0dG9uQXJpYUxhYmVsLnN1YmplY3Q7XG5cdH1cblxuXHRjZWxsQ2xhc3NOYW1lcyhqOiBudW1iZXIsIGl0ZW06IFRhYmxlSXRlbSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaGVhZGVyID0gdGhpcy5tb2RlbC5nZXRIZWFkZXIoaik7XG5cdFx0Y29uc3QgcGFydHMgPSBbaGVhZGVyPy5jbGFzc05hbWUsIGl0ZW0/LmNlbGxDbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKTtcblx0XHRpZiAoaGVhZGVyPy5oYXNBSUxhYmVsSGVhZGVyKSB7XG5cdFx0XHRwYXJ0cy5wdXNoKFwiY2RzLS10YWJsZS1jZWxsLS1jb2x1bW4tc2x1Z1wiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhcnRzLmpvaW4oXCIgXCIpO1xuXHR9XG59XG4iXX0=