@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
234 lines • 32.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager';
import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level';
import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { DataTableRenderedItemType, DataTableSortMode } from './data-table-contract';
/**
* Intention is to minimize data table component code size
* Eventually will move all the data table related accessibility functions here
*/
export class DataTableAccessibilityManager {
constructor() { }
onContentTableKeyUp(event, contentElement, editable) {
// if editable datatable and focus is already inside of a form field,
// then do not clear text selection
const fieldControl = this.isSmeFormField(event.target);
if (fieldControl && editable) {
return;
}
switch (event.keyCode) {
case KeyCode.Ctrl:
if (event.altKey) {
break;
}
this.stopKeyboardMultipleSelect(contentElement);
event.preventDefault();
event.stopPropagation();
break;
case KeyCode.Shift:
if (event.altKey) {
break;
}
this.stopKeyboardMultipleSelect(contentElement);
event.preventDefault();
event.stopPropagation();
break;
}
}
stopKeyboardMultipleSelect(contentElement) {
contentElement.nativeElement.classList.remove('sme-user-select-none');
this.clearTextSelection();
}
clearTextSelection() {
if (window.getSelection) {
if (window.getSelection().empty) { // Chrome, Edge
window.getSelection().empty();
}
else if (window.getSelection().removeAllRanges) { // Firefox
window.getSelection().removeAllRanges();
}
}
}
getRoleAttributeForTreeTableRow(renderedItem, showHeader) {
let result;
switch (renderedItem.type) {
case DataTableRenderedItemType.TreeNode:
result = 'treeitem';
break;
default:
result = 'presentation';
break;
}
return result;
}
getAriaSortAttributeValue(column) {
let result = 'none';
switch (column.sortMode) {
case DataTableSortMode.Ascend:
result = 'ascending';
break;
case DataTableSortMode.Descend:
result = 'descending';
break;
}
return result;
}
/**
* It helps check if the html element is a data table checkbox
*/
isDataTableCheckBoxHTMLElement(targetElement) {
return targetElement && targetElement.tagName === 'INPUT'
&& targetElement.parentElement.classList.contains('sme-table-checkbox');
}
/**
* This is the editable data table handler on tab is pressed handler
*/
editableDataTableOnContentTablePressedHandler(event, targetElement, currentRow, lastFocusableShadowElement) {
let res = false;
const fieldControl = this.isSmeFormField(targetElement);
const isCheckBoxControl = this.isDataTableCheckBoxHTMLElement(targetElement);
if (fieldControl || isCheckBoxControl) {
// Override the left arrow, right arrow and tab function
// Fixes when typing inside of the datatable row's form field
if ([KeyCode.Tab, KeyCode.LeftArrow, KeyCode.RightArrow].includes(event.keyCode) ||
[KeyCode.Home, KeyCode.End].includes(event.keyCode) && fieldControl) {
event.stopPropagation();
}
if ([KeyCode.Space, KeyCode.Enter].includes(event.keyCode) && isCheckBoxControl) {
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
const input = targetElement;
input.checked = !input.checked;
}
res = true;
}
else {
const isFocusingOutFromLastColumn = this.getIsFocusingOutFromLastColumnInEditableDataTableRow(targetElement);
if (isFocusingOutFromLastColumn) {
if (event.keyCode === KeyCode.Tab) {
if (event.shiftKey) {
const previousItem = Dom.getPreviousFocusableElement(targetElement);
previousItem.focus();
}
else {
currentRow.focus();
}
event.preventDefault();
event.stopPropagation();
}
}
else if (this.isDataTableCheckBoxHTMLElement(targetElement)) {
// This handles when the focus is on the select row checkbox
if (event.shiftKey) {
// Since this is the first column from the data table row
// Focus on the row element instead
currentRow.focus();
}
else {
// focus on the next focusable element from the row
const nextElement = Dom.getNextFocusableElement(targetElement);
nextElement.focus();
}
event.preventDefault();
event.stopPropagation();
}
else {
// It handles so that 'tab' press on the row should always go to the next focusable or previous element outside of
// the editable data table
if (event.keyCode && event.keyCode === KeyCode.Tab) {
let field;
if (event.shiftKey) {
if (targetElement && targetElement.classList && targetElement.classList.contains('sme-table-row')) {
field = Dom.getPreviousZoneElement(lastFocusableShadowElement.nativeElement);
}
else {
field = Dom.getPreviousFocusableElement(targetElement);
}
}
else {
if (targetElement && targetElement.classList && targetElement.classList.contains('sme-table-row')) {
field = Dom.getNextZoneElement(lastFocusableShadowElement.nativeElement);
}
else {
field = Dom.getNextFocusableElement(targetElement);
}
}
if (field) {
field.focus();
event.preventDefault();
event.stopPropagation();
}
}
}
}
return res;
}
/**
* Dispatch focus in to the sme-table-cell to trigger tooltip handler.
*/
focusInTableCell(event) {
const targetElement = event.target;
const elem = targetElement.querySelector('.sme-table-cell');
const focusinEvent = new Event('focusin', { 'bubbles': true, cancelable: false });
if (!!elem) {
elem.dispatchEvent(focusinEvent);
}
}
/**
* Dispatch focus out to the sme-table-cell to trigger tooltip handler.
*/
focusOutTableCell(event) {
const targetElement = event.target;
const elem = targetElement.querySelector('.sme-table-cell');
const focusoutEvent = new Event('focusout', { 'bubbles': true, cancelable: false });
if (!!elem) {
elem.dispatchEvent(focusoutEvent);
}
}
/**
* Shouldn't allow to add sme-focus-zone to table cell template. Navigation inside of the table cell should be using arrow key.
* @param event The focus event.
*/
verifyDataTableColumnsViolation(event) {
if (event.nativeEvent.key === 'Tab') {
const parentTableCell = Dom.getAncestor(event.targetElement, e => e.className.includes('sme-table-cell'));
if (!parentTableCell) {
return;
}
if (!!parentTableCell.querySelector('.sme-focus-zone')) {
Logging.log({
level: LogLevel.Error,
message: 'Not allowed to add sme-focus-zone to table cell, if you want to navigate in between table cells, please use arrow key.',
source: 'DataTableComponent.onElementFocusing'
});
}
}
}
/**
* This is to check if the this is the last item which is the delete button from the editable
* data table row
*/
getIsFocusingOutFromLastColumnInEditableDataTableRow(targetElement) {
// TODO: add more selector
if (targetElement && targetElement.tagName === 'BUTTON') {
return true;
}
return false;
}
/**
* This checks if the current Html element is inside of a sme-form-field
*/
isSmeFormField(targetElement) {
return Dom.getSpecificAncestor(targetElement, element => element.tagName === 'SME-FORM-FIELD');
}
}
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [FocusEvent]),
__metadata("design:returntype", void 0)
], DataTableAccessibilityManager.prototype, "focusInTableCell", null);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1hY2Nlc3NpYmlsaXR5LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUtYWNjZXNzaWJpbGl0eS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUF3QixPQUFPLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUV2RSxPQUFPLEVBRUgseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBRS9COzs7R0FHRztBQUNILE1BQU0sT0FBTyw2QkFBNkI7SUFDdEMsZ0JBQWdCLENBQUM7SUFFVixtQkFBbUIsQ0FBQyxLQUFvQixFQUFFLGNBQTBCLEVBQUUsUUFBaUI7UUFDMUYscUVBQXFFO1FBQ3JFLG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFjLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxJQUFJLFlBQVksSUFBSSxRQUFRLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBQ0QsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25CLEtBQUssT0FBTyxDQUFDLElBQUk7Z0JBQ2IsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUNkLE1BQU07aUJBQ1Q7Z0JBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZC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UyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFFMUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDbEIsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUNSLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztvQkFDckIsT0FBTyxFQUFFLHdIQUF3SDtvQkFDakksTUFBTSxFQUFFLHNDQUFzQztpQkFDakQsQ0FBQyxDQUFDO2FBQ047U0FDSjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxvREFBb0QsQ0FBQyxhQUEwQjtRQUNuRiwwQkFBMEI7UUFDMUIsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDckQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxhQUEwQjtRQUM1QyxPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLGdCQUFnQixDQUFDLENBQUM7SUFDbkcsQ0FBQztDQUNKO0FBOURHO0lBQUMsUUFBUSxFQUFFOztxQ0FDb0IsVUFBVTs7cUVBT3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBFbGVtZW50Rm9jdXNpbmdFdmVudCwgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUsXHJcbiAgICBEYXRhVGFibGVTb3J0TW9kZVxyXG59IGZyb20gJy4vZGF0YS10YWJsZS1jb250cmFjdCc7XHJcblxyXG4vKipcclxuICogSW50ZW50aW9uIGlzIHRvIG1pbmltaXplIGRhdGEgdGFibGUgY29tcG9uZW50IGNvZGUgc2l6ZVxyXG4gKiBFdmVudHVhbGx5IHdpbGwgbW92ZSBhbGwgdGhlIGRhdGEgdGFibGUgcmVsYXRlZCBhY2Nlc3NpYmlsaXR5IGZ1bmN0aW9ucyBoZXJlXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50VGFibGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCwgY29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWYsIGVkaXRhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gaWYgZWRpdGFibGUgZGF0YXRhYmxlIGFuZCBmb2N1cyBpcyBhbHJlYWR5IGluc2lkZSBvZiBhIGZvcm0gZmllbGQsXHJcbiAgICAgICAgLy8gdGhlbiBkbyBub3QgY2xlYXIgdGV4dCBzZWxlY3Rpb25cclxuICAgICAgICBjb25zdCBmaWVsZENvbnRyb2wgPSB0aGlzLmlzU21lRm9ybUZpZWxkKDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQpO1xyXG4gICAgICAgIGlmIChmaWVsZENvbnRyb2wgJiYgZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkN0cmw6XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BLZXlib2FyZE11bHRpcGxlU2VsZWN0KGNvbnRlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuU2hpZnQ6XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BLZXlib2FyZE11bHRpcGxlU2VsZWN0KGNvbnRlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0b3BLZXlib2FyZE11bHRpcGxlU2VsZWN0KGNvbnRlbnRFbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XHJcbiAgICAgICAgY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzbWUtdXNlci1zZWxlY3Qtbm9uZScpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJUZXh0U2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KSB7ICAvLyBDaHJvbWUsIEVkZ2VcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMpIHsgIC8vIEZpcmVmb3hcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9sZUF0dHJpYnV0ZUZvclRyZWVUYWJsZVJvdyhyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgc2hvd0hlYWRlcjogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgICAgIHN3aXRjaCAocmVuZGVyZWRJdGVtLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlOlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3RyZWVpdGVtJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3ByZXNlbnRhdGlvbic7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICdub25lJztcclxuICAgICAgICBzd2l0Y2ggKGNvbHVtbi5zb3J0TW9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDpcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdhc2NlbmRpbmcnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDpcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdkZXNjZW5kaW5nJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGVscHMgY2hlY2sgaWYgdGhlIGh0bWwgZWxlbWVudCBpcyBhIGRhdGEgdGFibGUgY2hlY2tib3hcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRGF0YVRhYmxlQ2hlY2tCb3hIVE1MRWxlbWVudCh0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0YXJnZXRFbGVtZW50ICYmIHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJ1xyXG4gICAgICAgICAgICAmJiB0YXJnZXRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtY2hlY2tib3gnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgdGhlIGVkaXRhYmxlIGRhdGEgdGFibGUgaGFuZGxlciBvbiB0YWIgaXMgcHJlc3NlZCBoYW5kbGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlZGl0YWJsZURhdGFUYWJsZU9uQ29udGVudFRhYmxlUHJlc3NlZEhhbmRsZXIoXHJcbiAgICAgICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXHJcbiAgICAgICAgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgY3VycmVudFJvdzogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgbGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQ6IEVsZW1lbnRSZWYpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbnRyb2wgPSB0aGlzLmlzU21lRm9ybUZpZWxkKHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IGlzQ2hlY2tCb3hDb250cm9sID0gdGhpcy5pc0RhdGFUYWJsZUNoZWNrQm94SFRNTEVsZW1lbnQodGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGZpZWxkQ29udHJvbCB8fCBpc0NoZWNrQm94Q29udHJvbCkge1xyXG4gICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgbGVmdCBhcnJvdywgcmlnaHQgYXJyb3cgYW5kIHRhYiBmdW5jdGlvblxyXG4gICAgICAgICAgICAvLyBGaXhlcyB3aGVuIHR5cGluZyBpbnNpZGUgb2YgdGhlIGRhdGF0YWJsZSByb3cncyBmb3JtIGZpZWxkXHJcbiAgICAgICAgICAgIGlmIChbS2V5Q29kZS5UYWIsIEtleUNvZGUuTGVmdEFycm93LCBLZXlDb2RlLlJpZ2h0QXJyb3ddLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpIHx8XHJcbiAgICAgICAgICAgICAgICBbS2V5Q29kZS5Ib21lLCBLZXlDb2RlLkVuZF0uaW5jbHVkZXMoZXZlbnQua2V5Q29kZSkgJiYgZmllbGRDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFtLZXlDb2RlLlNwYWNlLCBLZXlDb2RlLkVudGVyXS5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSAmJiBpc0NoZWNrQm94Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IDxIVE1MSW5wdXRFbGVtZW50PnRhcmdldEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIWlucHV0LmNoZWNrZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RDb2x1bW4gPSB0aGlzLmdldElzRm9jdXNpbmdPdXRGcm9tTGFzdENvbHVtbkluRWRpdGFibGVEYXRhVGFibGVSb3codGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChpc0ZvY3VzaW5nT3V0RnJvbUxhc3RDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlRhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBEb20uZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0l0ZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0RhdGFUYWJsZUNoZWNrQm94SFRNTEVsZW1lbnQodGFyZ2V0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB3aGVuIHRoZSBmb2N1cyBpcyBvbiB0aGUgc2VsZWN0IHJvdyBjaGVja2JveFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgY29sdW1uIGZyb20gdGhlIGRhdGEgdGFibGUgcm93XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9jdXMgb24gdGhlIHJvdyBlbGVtZW50IGluc3RlYWRcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvY3VzIG9uIHRoZSBuZXh0IGZvY3VzYWJsZSBlbGVtZW50IGZyb20gdGhlIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJdCBoYW5kbGVzIHNvIHRoYXQgJ3RhYicgcHJlc3Mgb24gdGhlIHJvdyBzaG91bGQgYWx3YXlzIGdvIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSBvciBwcmV2aW91cyBlbGVtZW50IG91dHNpZGUgb2ZcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBlZGl0YWJsZSBkYXRhIHRhYmxlXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlRhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QgJiYgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBEb20uZ2V0UHJldmlvdXNab25lRWxlbWVudChsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gRG9tLmdldFByZXZpb3VzRm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbGVtZW50ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gRG9tLmdldE5leHRab25lRWxlbWVudChsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIERpc3BhdGNoIGZvY3VzIGluIHRvIHRoZSBzbWUtdGFibGUtY2VsbCB0byB0cmlnZ2VyIHRvb2x0aXAgaGFuZGxlci5cclxuICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIGZvY3VzSW5UYWJsZUNlbGwoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGFyZ2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc21lLXRhYmxlLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBmb2N1c2luRXZlbnQgPSBuZXcgRXZlbnQoJ2ZvY3VzaW4nLCB7J2J1YmJsZXMnOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZX0pO1xyXG4gICAgICAgIGlmICghIWVsZW0pIHtcclxuICAgICAgICAgICAgZWxlbS5kaXNwYXRjaEV2ZW50KGZvY3VzaW5FdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2ggZm9jdXMgb3V0IHRvIHRoZSBzbWUtdGFibGUtY2VsbCB0byB0cmlnZ2VyIHRvb2x0aXAgaGFuZGxlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGZvY3VzT3V0VGFibGVDZWxsKGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRhcmdldEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNtZS10YWJsZS1jZWxsJyk7XHJcbiAgICAgICAgY29uc3QgZm9jdXNvdXRFdmVudCA9IG5ldyBFdmVudCgnZm9jdXNvdXQnLCB7J2J1YmJsZXMnOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZX0pO1xyXG4gICAgICAgIGlmICghIWVsZW0pIHtcclxuICAgICAgICAgICAgZWxlbS5kaXNwYXRjaEV2ZW50KGZvY3Vzb3V0RXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3VsZG4ndCBhbGxvdyB0byBhZGQgc21lLWZvY3VzLXpvbmUgdG8gdGFibGUgY2VsbCB0ZW1wbGF0ZS4gTmF2aWdhdGlvbiBpbnNpZGUgb2YgdGhlIHRhYmxlIGNlbGwgc2hvdWxkIGJlIHVzaW5nIGFycm93IGtleS5cclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZm9jdXMgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2ZXJpZnlEYXRhVGFibGVDb2x1bW5zVmlvbGF0aW9uKGV2ZW50OiBFbGVtZW50Rm9jdXNpbmdFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC5uYXRpdmVFdmVudC5rZXkgPT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRhYmxlQ2VsbCA9IERvbS5nZXRBbmNlc3RvcihldmVudC50YXJnZXRFbGVtZW50LCBlID0+IGUuY2xhc3NOYW1lLmluY2x1ZGVzKCdzbWUtdGFibGUtY2VsbCcpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFyZW50VGFibGVDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghIXBhcmVudFRhYmxlQ2VsbC5xdWVyeVNlbGVjdG9yKCcuc21lLWZvY3VzLXpvbmUnKSkge1xyXG4gICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5FcnJvcixcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm90IGFsbG93ZWQgdG8gYWRkIHNtZS1mb2N1cy16b25lIHRvIHRhYmxlIGNlbGwsIGlmIHlvdSB3YW50IHRvIG5hdmlnYXRlIGluIGJldHdlZW4gdGFibGUgY2VsbHMsIHBsZWFzZSB1c2UgYXJyb3cga2V5LicsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnRGF0YVRhYmxlQ29tcG9uZW50Lm9uRWxlbWVudEZvY3VzaW5nJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHRvIGNoZWNrIGlmIHRoZSB0aGlzIGlzIHRoZSBsYXN0IGl0ZW0gd2hpY2ggaXMgdGhlIGRlbGV0ZSBidXR0b24gZnJvbSB0aGUgZWRpdGFibGVcclxuICAgICAqIGRhdGEgdGFibGUgcm93XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0SXNGb2N1c2luZ091dEZyb21MYXN0Q29sdW1uSW5FZGl0YWJsZURhdGFUYWJsZVJvdyh0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHNlbGVjdG9yXHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBjaGVja3MgaWYgdGhlIGN1cnJlbnQgSHRtbCBlbGVtZW50IGlzIGluc2lkZSBvZiBhIHNtZS1mb3JtLWZpZWxkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1NtZUZvcm1GaWVsZCh0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBEb20uZ2V0U3BlY2lmaWNBbmNlc3Rvcih0YXJnZXRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NNRS1GT1JNLUZJRUxEJyk7XHJcbiAgICB9XHJcbn1cclxuIl19