UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

234 lines 32.5 kB
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