ng-focus-selector
Version:
For device like `candy`, `qwerty`, `tv apps`, `stb` etc where element selection happens with keypad (or) remote, selection of element across the application will become complex.
116 lines • 15.6 kB
JavaScript
import { Component, HostListener, ElementRef } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
export class FocusSelectorComponent {
constructor(el, router, route) {
this.el = el;
this.router = router;
this.route = route;
}
onArrowLeftRight(event) {
const keyCode = event.keyCode || event.which;
const currentRow = parseInt(event.target.getAttribute('row'));
let column = parseInt(event.target.getAttribute('column'));
const currentElement = document.querySelector(`[row="${currentRow}"][column="${column}"]`);
if (currentElement && currentElement.getAttribute('istabitem')) {
const isNextElementTab = document.querySelector(`[tabfocus="true"]`);
if (isNextElementTab) {
let state = this.route.snapshot;
while (!state.firstChild.paramMap.get('column')) {
state = state.firstChild;
}
const { paramMap, params, data } = state.firstChild;
let column = parseInt(paramMap.get('column'));
if (keyCode === 37) {
column = column - 1;
}
else if (keyCode === 39) {
column = column + 1;
}
const isElementTab = document.querySelectorAll(`[istabheader="true"]`);
if (isElementTab.length && isElementTab[column]) {
if (isNextElementTab.getAttribute('tabfocus')) {
isNextElementTab.setAttribute('tabfocus', false);
}
isElementTab[column].setAttribute('tabfocus', true);
this.focusElement(isElementTab[column]);
const tabUrl = isElementTab[column].getAttribute('taburl');
if (tabUrl) {
this.router.navigateByUrl(tabUrl);
}
}
return;
}
}
if (keyCode === 37) {
column = column - 1;
}
else if (keyCode === 39) {
column = column + 1;
}
let matchElement = document.querySelector(`[row="${currentRow}"][column="${column}"]`);
if (matchElement) {
if (currentElement.getAttribute('tabfocus')) {
currentElement.setAttribute('tabfocus', false);
}
matchElement.setAttribute('tabfocus', true);
this.focusElement(matchElement);
const tabUrl = matchElement.getAttribute('taburl');
if (tabUrl) {
this.router.navigateByUrl(tabUrl);
}
}
}
onArrowDownUp(event) {
const keyCode = event.keyCode || event.which;
const isGrid = event.target.getAttribute('isgrid');
let currentRow = parseInt(event.target.getAttribute('row'));
let column = parseInt(event.target.getAttribute('column'));
column = isGrid ? column : 0;
if (keyCode === 40) {
currentRow = currentRow + 1;
}
else if (keyCode === 38) {
currentRow = currentRow - 1;
}
const isNextElementTab = document.querySelector(`[row="${currentRow}"][tabfocus="true"]`);
if (isNextElementTab && !isGrid) {
this.focusElement(isNextElementTab);
return;
}
let matchElement = document.querySelector(`[row="${currentRow}"][column="${column}"]`);
if (!matchElement) {
return;
}
this.focusElement(matchElement);
}
ngOnInit() { }
focusElement(el) {
el.focus();
el.scrollIntoView({
block: 'end',
inline: 'end'
});
}
setActiveIndex(index) {
const selector = this.el.nativeElement.getElementsByClassName('focus-selector');
if (selector[index]) {
this.focusElement(selector[index]);
}
}
}
FocusSelectorComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-focus-selector',
template: '<ng-content></ng-content>'
},] }
];
FocusSelectorComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: Router },
{ type: ActivatedRoute }
];
FocusSelectorComponent.propDecorators = {
onArrowLeftRight: [{ type: HostListener, args: ['document:keydown.ArrowLeft', ['$event'],] }, { type: HostListener, args: ['document:keydown.ArrowRight', ['$event'],] }],
onArrowDownUp: [{ type: HostListener, args: ['document:keydown.ArrowDown', ['$event'],] }, { type: HostListener, args: ['document:keydown.ArrowUp', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9jdXMtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL2tyaXNobmEvRG9jdW1lbnRzL2RvY2svbmctZm9jdXMtc2VsZWN0b3IvZm9jdXMtc2VsZWN0b3IvcHJvamVjdHMvbmctZm9jdXMtc2VsZWN0b3Ivc3JjLyIsInNvdXJjZXMiOlsibGliL25nLWZvY3VzLXNlbGVjdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFNakYsTUFBTSxPQUFPLHNCQUFzQjtJQXFHakMsWUFBb0IsRUFBYyxFQUFVLE1BQWMsRUFBVSxLQUFxQjtRQUFyRSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFVBQUssR0FBTCxLQUFLLENBQWdCO0lBQUcsQ0FBQztJQWxHN0YsZ0JBQWdCLENBQUMsS0FBSztRQUNwQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFM0QsTUFBTSxjQUFjLEdBQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLFVBQVUsY0FBYyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRWhHLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDOUQsTUFBTSxnQkFBZ0IsR0FBUSxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFFMUUsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDcEIsSUFBSSxLQUFLLEdBQTJCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUN4RCxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMvQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDMUI7Z0JBQ0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDcEQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFFOUMsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO29CQUNsQixNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDckI7cUJBQU0sSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO29CQUN6QixNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDckI7Z0JBRUQsTUFBTSxZQUFZLEdBQVEsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBRTVFLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQy9DLElBQUksZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUM3QyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNsRDtvQkFDRCxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFFeEMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFFM0QsSUFBSSxNQUFNLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ25DO2lCQUNGO2dCQUNELE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO2FBQU0sSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ3pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxZQUFZLEdBQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLFVBQVUsY0FBYyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRTVGLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDM0MsY0FBYyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDaEQ7WUFFRCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRWhDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFJRCxhQUFhLENBQUMsS0FBSztRQUNqQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ2xCLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQzdCO2FBQU0sSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ3pCLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsTUFBTSxnQkFBZ0IsR0FBUSxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsVUFBVSxxQkFBcUIsQ0FBQyxDQUFDO1FBRS9GLElBQUksZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDUjtRQUVELElBQUksWUFBWSxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxVQUFVLGNBQWMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUU1RixJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUlELFFBQVEsS0FBVSxDQUFDO0lBRW5CLFlBQVksQ0FBQyxFQUFFO1FBQ2IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUNoQixLQUFLLEVBQUUsS0FBSztZQUNaLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFLO1FBQ2xCLE1BQU0sUUFBUSxHQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFckYsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7OztZQTNIRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsUUFBUSxFQUFFLDJCQUEyQjthQUN0Qzs7O1lBTnlDLFVBQVU7WUFDM0MsTUFBTTtZQUFFLGNBQWM7OzsrQkFPNUIsWUFBWSxTQUFDLDRCQUE0QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ3JELFlBQVksU0FBQyw2QkFBNkIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs0QkFvRXRELFlBQVksU0FBQyw0QkFBNEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNyRCxZQUFZLFNBQUMsMEJBQTBCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctZm9jdXMtc2VsZWN0b3InLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nXG59KVxuZXhwb3J0IGNsYXNzIEZvY3VzU2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLkFycm93TGVmdCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uQXJyb3dSaWdodCcsIFsnJGV2ZW50J10pXG4gIG9uQXJyb3dMZWZ0UmlnaHQoZXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICBjb25zdCBjdXJyZW50Um93ID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgncm93JykpO1xuICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdjb2x1bW4nKSk7XG5cbiAgICBjb25zdCBjdXJyZW50RWxlbWVudDogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW3Jvdz1cIiR7Y3VycmVudFJvd31cIl1bY29sdW1uPVwiJHtjb2x1bW59XCJdYCk7XG5cbiAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpc3RhYml0ZW0nKSkge1xuICAgICAgY29uc3QgaXNOZXh0RWxlbWVudFRhYjogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW3RhYmZvY3VzPVwidHJ1ZVwiXWApO1xuXG4gICAgICBpZiAoaXNOZXh0RWxlbWVudFRhYikge1xuICAgICAgICBsZXQgc3RhdGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgPSB0aGlzLnJvdXRlLnNuYXBzaG90O1xuICAgICAgICB3aGlsZSAoIXN0YXRlLmZpcnN0Q2hpbGQucGFyYW1NYXAuZ2V0KCdjb2x1bW4nKSkge1xuICAgICAgICAgIHN0YXRlID0gc3RhdGUuZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHBhcmFtTWFwLCBwYXJhbXMsIGRhdGEgfSA9IHN0YXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChwYXJhbU1hcC5nZXQoJ2NvbHVtbicpKTtcblxuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gMzcpIHtcbiAgICAgICAgICBjb2x1bW4gPSBjb2x1bW4gLSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IDM5KSB7XG4gICAgICAgICAgY29sdW1uID0gY29sdW1uICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRWxlbWVudFRhYjogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2lzdGFiaGVhZGVyPVwidHJ1ZVwiXWApO1xuXG4gICAgICAgIGlmIChpc0VsZW1lbnRUYWIubGVuZ3RoICYmIGlzRWxlbWVudFRhYltjb2x1bW5dKSB7XG4gICAgICAgICAgaWYgKGlzTmV4dEVsZW1lbnRUYWIuZ2V0QXR0cmlidXRlKCd0YWJmb2N1cycpKSB7XG4gICAgICAgICAgICBpc05leHRFbGVtZW50VGFiLnNldEF0dHJpYnV0ZSgndGFiZm9jdXMnLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzRWxlbWVudFRhYltjb2x1bW5dLnNldEF0dHJpYnV0ZSgndGFiZm9jdXMnLCB0cnVlKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudChpc0VsZW1lbnRUYWJbY29sdW1uXSk7XG5cbiAgICAgICAgICBjb25zdCB0YWJVcmwgPSBpc0VsZW1lbnRUYWJbY29sdW1uXS5nZXRBdHRyaWJ1dGUoJ3RhYnVybCcpO1xuXG4gICAgICAgICAgaWYgKHRhYlVybCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0YWJVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IDM3KSB7XG4gICAgICBjb2x1bW4gPSBjb2x1bW4gLSAxO1xuICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gMzkpIHtcbiAgICAgIGNvbHVtbiA9IGNvbHVtbiArIDE7XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoRWxlbWVudDogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW3Jvdz1cIiR7Y3VycmVudFJvd31cIl1bY29sdW1uPVwiJHtjb2x1bW59XCJdYCk7XG5cbiAgICBpZiAobWF0Y2hFbGVtZW50KSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJmb2N1cycpKSB7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiZm9jdXMnLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIG1hdGNoRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmZvY3VzJywgdHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzRWxlbWVudChtYXRjaEVsZW1lbnQpO1xuXG4gICAgICBjb25zdCB0YWJVcmwgPSBtYXRjaEVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJ1cmwnKTtcblxuICAgICAgaWYgKHRhYlVybCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRhYlVybCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5BcnJvd0Rvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLkFycm93VXAnLCBbJyRldmVudCddKVxuICBvbkFycm93RG93blVwKGV2ZW50KSB7XG4gICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XG4gICAgY29uc3QgaXNHcmlkID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaXNncmlkJyk7XG4gICAgbGV0IGN1cnJlbnRSb3cgPSBwYXJzZUludChldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdyb3cnKSk7XG4gICAgbGV0IGNvbHVtbiA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NvbHVtbicpKTtcbiAgICBjb2x1bW4gPSBpc0dyaWQgPyBjb2x1bW4gOiAwO1xuXG4gICAgaWYgKGtleUNvZGUgPT09IDQwKSB7XG4gICAgICBjdXJyZW50Um93ID0gY3VycmVudFJvdyArIDE7XG4gICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSAzOCkge1xuICAgICAgY3VycmVudFJvdyA9IGN1cnJlbnRSb3cgLSAxO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTmV4dEVsZW1lbnRUYWI6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtyb3c9XCIke2N1cnJlbnRSb3d9XCJdW3RhYmZvY3VzPVwidHJ1ZVwiXWApO1xuXG4gICAgaWYgKGlzTmV4dEVsZW1lbnRUYWIgJiYgIWlzR3JpZCkge1xuICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoaXNOZXh0RWxlbWVudFRhYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoRWxlbWVudDogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW3Jvdz1cIiR7Y3VycmVudFJvd31cIl1bY29sdW1uPVwiJHtjb2x1bW59XCJdYCk7XG5cbiAgICBpZiAoIW1hdGNoRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNFbGVtZW50KG1hdGNoRWxlbWVudCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgZm9jdXNFbGVtZW50KGVsKSB7XG4gICAgZWwuZm9jdXMoKTtcbiAgICBlbC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICBibG9jazogJ2VuZCcsXG4gICAgICBpbmxpbmU6ICdlbmQnXG4gICAgfSk7XG4gIH1cblxuICBzZXRBY3RpdmVJbmRleChpbmRleCkge1xuICAgIGNvbnN0IHNlbGVjdG9yOiBhbnkgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9jdXMtc2VsZWN0b3InKTtcblxuICAgIGlmIChzZWxlY3RvcltpbmRleF0pIHtcbiAgICAgIHRoaXMuZm9jdXNFbGVtZW50KHNlbGVjdG9yW2luZGV4XSk7XG4gICAgfVxuICB9XG59XG4iXX0=