angular-xml-editor
Version:
XML editor component for Angular
150 lines (149 loc) • 21.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XMLCursorPositions } from './xmlCursorPos.class';
import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class';
import { XmlToolbox } from '../xmlToolbox.class';
export class XmlCursorPosSetter {
/**
* @param {?} pos
* @param {?} selectionAnchorNode
* @param {?} selectionAnchorOffset
* @param {?=} debugLog
* @return {?}
*/
static setFromSelection(pos, selectionAnchorNode, selectionAnchorOffset, debugLog = null) {
if (selectionAnchorNode !== undefined && selectionAnchorNode !== null) {
/** @type {?} */
let node = /** @type {?} */ (selectionAnchorNode);
if (DomDummyNodeManager.IsDummyNode(selectionAnchorNode.parentElement)) {
// clicked inside a dummy node
node = /** @type {?} */ (selectionAnchorNode.parentElement);
if (DomDummyNodeManager.IsBeforeFirstTagDummyNode(node)) {
switch (selectionAnchorOffset) {
case 0:
if (debugLog) {
debugLog.setInputSelection(`(1) cursor here: #<tag> pos 0`);
}
pos.SetCursor(node.parentElement, XMLCursorPositions.CursorOnCompleteNode, 0);
return;
case 1:
if (debugLog) {
debugLog.setInputSelection(`(2) cursor here: #<tag> pos 1`);
}
pos.SetCursor(node.parentElement, XMLCursorPositions.CursorInFrontOfNode, 0);
return;
default:
throw new Error(`selectionAnchorOffset=${selectionAnchorOffset}?!?`);
}
}
if (node.parentElement.childNodes.length === 2) {
if (debugLog) {
debugLog.setInputSelection(`(13, 14) cursor here: <tag>#</tag>`);
}
pos.SetCursor(node.parentElement, XMLCursorPositions.CursorInEmptyNode, 0);
return;
}
if (node === node.parentElement.lastChild && selectionAnchorOffset === 1) {
if (debugLog) {
debugLog.setInputSelection(`(8, 12) cursor here: #</tag>, selecting complete node`);
}
pos.SetCursor(node.parentElement, XMLCursorPositions.CursorOnCompleteNode, 0);
return;
}
/** @type {?} */
const nextSibling = node.nextSibling;
if (nextSibling) {
if (debugLog) {
debugLog.setInputSelection(`(3, 4, 9, 10) cursor here: #Text or here #<tag>`);
}
pos.SetCursor(nextSibling, XMLCursorPositions.CursorInFrontOfNode, 0);
return;
}
/** @type {?} */
const previousSibling = node.previousSibling;
if (previousSibling) {
if (debugLog) {
debugLog.setInputSelection(`(7, 11) cursor here: Text# or here <tag>#`);
}
pos.SetCursor(previousSibling, XMLCursorPositions.CursorBehindNode, 0);
return;
}
}
else {
// is no dummy node
if (selectionAnchorNode.nodeType === Node.TEXT_NODE) {
if (selectionAnchorOffset === 0) {
if (debugLog) {
debugLog.setInputSelection(`(6) cursor here: #Text`);
}
pos.SetCursor(selectionAnchorNode, XMLCursorPositions.CursorInsideTextNode, 0);
return;
}
if (selectionAnchorOffset === selectionAnchorNode.textContent.length) {
if (debugLog) {
debugLog.setInputSelection(`(7 Alternative) cursor here: Text#`);
}
pos.SetCursor(selectionAnchorNode, XMLCursorPositions.CursorInsideTextNode, selectionAnchorNode.textContent.length);
return;
}
if (debugLog) {
debugLog.setInputSelection(`(5) cursor here: Text#Text`);
}
if (selectionAnchorOffset > selectionAnchorNode.textContent.length) {
throw new Error(`selectionAnchorOffset ${selectionAnchorOffset} is > than text-lenght ${selectionAnchorNode.textContent.length} of text '${selectionAnchorNode.textContent}' `);
}
pos.SetCursor(selectionAnchorNode, XMLCursorPositions.CursorInsideTextNode, selectionAnchorOffset);
return;
}
}
// if (DomDummyNodeManager.IsDummyNode(parentElem)) {
// const dummyElement = parentElem;
// const nextSibling = parentElem.nextSibling;
// if (XmlToolbox.IstTextOderKommentarNode(nextSibling)) {
// // cursor here: #text (# = red dummyNode)
// pos.CursorSetzen(nextSibling, XMLCursorPositionen.CursorInnerhalbDesTextNodes, 0);
// return;
// }
// const previousSibling = dummyElement.previousSibling;
// if (!previousSibling) {
// // pos.CursorSetzen(dummyElement.parentElement, XMLCursorPositionen.c, 0);
// }
// }
// switch (node.nodeType) {
// case Node.TEXT_NODE:
// if (loopCount === 0) {
// const nextSibling = parentElem.nextSibling;
// if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE && selectionAnchorOffset === 1) {
// // set cursor at start of following textnode
// pos.CursorSetzen(nextSibling, XMLCursorPositionen.CursorInnerhalbDesTextNodes, 0);
// } else {
// const previousSibling = parentElem.previousSibling;
// if (previousSibling && previousSibling.nodeType === Node.TEXT_NODE && selectionAnchorOffset === 0) {
// // set cursor at end of previous textnode
// pos.CursorSetzen(previousSibling, XMLCursorPositionen.CursorInnerhalbDesTextNodes, previousSibling.nodeValue.length);
// }
// }
// } else {
// node = parentElem; // up to dummy node
// }
// } else {
// pos.CursorSetzen(node, XMLCursorPositionen.CursorInnerhalbDesTextNodes, selectionAnchorOffset);
// }
// break;
// case Node.ELEMENT_NODE:
// if (DomDummyNodeManager.IsDummyNode(node)) {
// // node = parentElem; // up to parent node
// } else {
// pos.CursorSetzen(node, XMLCursorPositionen.CursorAufNodeSelbstVorderesTag);
// }
// break;
// default:
// throw new Error(`unhandled nodeType '${node.nodeType}' of node ${XmlToolbox.GetNodeDebugContext(node)}`);
// }
}
console.error(`found no suiting cursor interpretation! For selectionAnchorNode=${XmlToolbox.GetNodeDebugContext(selectionAnchorNode)}, selectionAnchorOffset=${selectionAnchorOffset}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sQ3Vyc29yUG9zU2V0dGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUvY3Vyc29yL3htbEN1cnNvclBvc1NldHRlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRCxNQUFNOzs7Ozs7OztJQUNHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFpQixFQUFFLG1CQUF5QixFQUFFLHFCQUE2QixFQUFFLFdBQThCLElBQUk7UUFDNUksSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSSxFQUFFOztZQUNyRSxJQUFJLElBQUkscUJBQUcsbUJBQThCLEVBQUM7WUFDMUMsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7O2dCQUV0RSxJQUFJLHFCQUFHLG1CQUFtQixDQUFDLGFBQXdCLENBQUEsQ0FBQztnQkFFcEQsSUFBSSxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdkQsUUFBUSxxQkFBcUIsRUFBRTt3QkFDN0IsS0FBSyxDQUFDOzRCQUNKLElBQUksUUFBUSxFQUFFO2dDQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDOzZCQUM3RDs0QkFDRCxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzlFLE9BQU87d0JBRVQsS0FBSyxDQUFDOzRCQUNKLElBQUksUUFBUSxFQUFFO2dDQUNa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QUFNLEVBQUU7d0JBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLHFCQUFxQiwwQkFBMEIsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE1BQU0sYUFBYSxtQkFBbUIsQ0FBQyxXQUFXLElBQUksQ0FDL0osQ0FBQztxQkFDSDtvQkFDRCxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDLENBQUM7b0JBQ25HLE9BQU87aUJBQ1I7YUFDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBc0RGO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FDWCxtRUFBbUUsVUFBVSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLDJCQUEyQixxQkFBcUIsRUFBRSxDQUN6SyxDQUFDOztDQUVMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuL3htbEN1cnNvclBvcy5jbGFzcyc7XHJcbmltcG9ydCB7IERvbUR1bW15Tm9kZU1hbmFnZXIgfSBmcm9tICcuLi9kdW1teU5vZGVzL2RvbUR1bW15Tm9kZU1hbmFnZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxUb29sYm94IH0gZnJvbSAnLi4veG1sVG9vbGJveC5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbEVkaXRvckRlYnVnZ2VyIH0gZnJvbSAnLi4veG1sRWRpdG9yRGVidWdnZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFhtbEN1cnNvclBvc1NldHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRGcm9tU2VsZWN0aW9uKHBvczogWG1sQ3Vyc29yUG9zLCBzZWxlY3Rpb25BbmNob3JOb2RlOiBOb2RlLCBzZWxlY3Rpb25BbmNob3JPZmZzZXQ6IG51bWJlciwgZGVidWdMb2c6IFhtbEVkaXRvckRlYnVnZ2VyID0gbnVsbCkge1xyXG4gICAgaWYgKHNlbGVjdGlvbkFuY2hvck5vZGUgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3Rpb25BbmNob3JOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBub2RlID0gc2VsZWN0aW9uQW5jaG9yTm9kZSBhcyBFbGVtZW50O1xyXG4gICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShzZWxlY3Rpb25BbmNob3JOb2RlLnBhcmVudEVsZW1lbnQpKSB7XHJcbiAgICAgICAgLy8gY2xpY2tlZCBpbnNpZGUgYSBkdW1teSBub2RlXHJcbiAgICAgICAgbm9kZSA9IHNlbGVjdGlvbkFuY2hvck5vZGUucGFyZW50RWxlbWVudCBhcyBFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0JlZm9yZUZpcnN0VGFnRHVtbXlOb2RlKG5vZGUpKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGlvbkFuY2hvck9mZnNldCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgaWYgKGRlYnVnTG9nKSB7XHJcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZy5zZXRJbnB1dFNlbGVjdGlvbihgKDEpIGN1cnNvciBoZXJlOiAjPHRhZz4gcG9zIDBgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcG9zLlNldEN1cnNvcihub2RlLnBhcmVudEVsZW1lbnQsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZSwgMCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGlmIChkZWJ1Z0xvZykge1xyXG4gICAgICAgICAgICAgICAgZGVidWdMb2cuc2V0SW5wdXRTZWxlY3Rpb24oYCgyKSBjdXJzb3IgaGVyZTogIzx0YWc+IHBvcyAxYCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHBvcy5TZXRDdXJzb3Iobm9kZS5wYXJlbnRFbGVtZW50LCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSwgMCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlbGVjdGlvbkFuY2hvck9mZnNldD0ke3NlbGVjdGlvbkFuY2hvck9mZnNldH0/IT9gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgIGlmIChkZWJ1Z0xvZykge1xyXG4gICAgICAgICAgICBkZWJ1Z0xvZy5zZXRJbnB1dFNlbGVjdGlvbihgKDEzLCAxNCkgY3Vyc29yIGhlcmU6IDx0YWc+IzwvdGFnPmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9zLlNldEN1cnNvcihub2RlLnBhcmVudEVsZW1lbnQsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZSwgMCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobm9kZSA9PT0gbm9kZS5wYXJlbnRFbGVtZW50Lmxhc3RDaGlsZCAmJiBzZWxlY3Rpb25BbmNob3JPZmZzZXQgPT09IDEpIHtcclxuICAgICAgICAgIGlmIChkZWJ1Z0xvZykge1xyXG4gICAgICAgICAgICBkZWJ1Z0xvZy5zZXRJbnB1dFNlbGVjdGlvbihgKDgsIDEyKSBjdXJzb3IgaGVyZTogIzwvdGFnPiwgc2VsZWN0aW5nIGNvbXBsZXRlIG5vZGVgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBvcy5TZXRDdXJzb3Iobm9kZS5wYXJlbnRFbGVtZW50LCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yT25Db21wbGV0ZU5vZGUsIDApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgICAgaWYgKGRlYnVnTG9nKSB7XHJcbiAgICAgICAgICAgIGRlYnVnTG9nLnNldElucHV0U2VsZWN0aW9uKGAoMywgNCwgOSwgMTApIGN1cnNvciBoZXJlOiAjVGV4dCBvciBoZXJlICM8dGFnPmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9zLlNldEN1cnNvcihuZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUsIDApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNTaWJsaW5nID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgaWYgKGRlYnVnTG9nKSB7XHJcbiAgICAgICAgICAgIGRlYnVnTG9nLnNldElucHV0U2VsZWN0aW9uKGAoNywgMTEpIGN1cnNvciBoZXJlOiBUZXh0IyBvciBoZXJlIDx0YWc+I2ApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9zLlNldEN1cnNvcihwcmV2aW91c1NpYmxpbmcsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlLCAwKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaXMgbm8gZHVtbXkgbm9kZVxyXG4gICAgICAgIGlmIChzZWxlY3Rpb25BbmNob3JOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkFuY2hvck9mZnNldCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAoZGVidWdMb2cpIHtcclxuICAgICAgICAgICAgICBkZWJ1Z0xvZy5zZXRJbnB1dFNlbGVjdGlvbihgKDYpIGN1cnNvciBoZXJlOiAjVGV4dGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3Ioc2VsZWN0aW9uQW5jaG9yTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlLCAwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChzZWxlY3Rpb25BbmNob3JPZmZzZXQgPT09IHNlbGVjdGlvbkFuY2hvck5vZGUudGV4dENvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChkZWJ1Z0xvZykge1xyXG4gICAgICAgICAgICAgIGRlYnVnTG9nLnNldElucHV0U2VsZWN0aW9uKGAoNyBBbHRlcm5hdGl2ZSkgY3Vyc29yIGhlcmU6IFRleHQjYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihzZWxlY3Rpb25BbmNob3JOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGUsIHNlbGVjdGlvbkFuY2hvck5vZGUudGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkZWJ1Z0xvZykge1xyXG4gICAgICAgICAgICBkZWJ1Z0xvZy5zZXRJbnB1dFNlbGVjdGlvbihgKDUpIGN1cnNvciBoZXJlOiBUZXh0I1RleHRgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzZWxlY3Rpb25BbmNob3JPZmZzZXQgPiBzZWxlY3Rpb25BbmNob3JOb2RlLnRleHRDb250ZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgYHNlbGVjdGlvbkFuY2hvck9mZnNldCAke3NlbGVjdGlvbkFuY2hvck9mZnNldH0gaXMgPiB0aGFuIHRleHQtbGVuZ2h0ICR7c2VsZWN0aW9uQW5jaG9yTm9kZS50ZXh0Q29udGVudC5sZW5ndGh9IG9mIHRleHQgJyR7c2VsZWN0aW9uQW5jaG9yTm9kZS50ZXh0Q29udGVudH0nIGBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBvcy5TZXRDdXJzb3Ioc2VsZWN0aW9uQW5jaG9yTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlLCBzZWxlY3Rpb25BbmNob3JPZmZzZXQpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUocGFyZW50RWxlbSkpIHtcclxuICAgICAgLy8gICAgIGNvbnN0IGR1bW15RWxlbWVudCA9IHBhcmVudEVsZW07XHJcblxyXG4gICAgICAvLyAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBwYXJlbnRFbGVtLm5leHRTaWJsaW5nO1xyXG4gICAgICAvLyAgICAgaWYgKFhtbFRvb2xib3guSXN0VGV4dE9kZXJLb21tZW50YXJOb2RlKG5leHRTaWJsaW5nKSkge1xyXG4gICAgICAvLyAgICAgICAgIC8vIGN1cnNvciBoZXJlOiAjdGV4dCAoIyA9IHJlZCBkdW1teU5vZGUpXHJcbiAgICAgIC8vICAgICAgICAgcG9zLkN1cnNvclNldHplbihuZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsIDApO1xyXG4gICAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgIC8vICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmcgPSBkdW1teUVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAvLyAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmcpIHtcclxuICAgICAgLy8gICAgIC8vICAgIHBvcy5DdXJzb3JTZXR6ZW4oZHVtbXlFbGVtZW50LnBhcmVudEVsZW1lbnQsIFhNTEN1cnNvclBvc2l0aW9uZW4uYywgMCk7XHJcbiAgICAgIC8vICAgICB9XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xyXG5cclxuICAgICAgLy8gICAgIGNhc2UgTm9kZS5URVhUX05PREU6XHJcblxyXG4gICAgICAvLyBpZiAobG9vcENvdW50ID09PSAwKSB7XHJcbiAgICAgIC8vICAgICBjb25zdCBuZXh0U2libGluZyA9IHBhcmVudEVsZW0ubmV4dFNpYmxpbmc7XHJcbiAgICAgIC8vICAgICBpZiAobmV4dFNpYmxpbmcgJiYgbmV4dFNpYmxpbmcubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIHNlbGVjdGlvbkFuY2hvck9mZnNldCA9PT0gMSkge1xyXG4gICAgICAvLyAgICAgICAgIC8vIHNldCBjdXJzb3IgYXQgc3RhcnQgb2YgZm9sbG93aW5nIHRleHRub2RlXHJcbiAgICAgIC8vICAgICAgICAgcG9zLkN1cnNvclNldHplbihuZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsIDApO1xyXG4gICAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmcgPSBwYXJlbnRFbGVtLnByZXZpb3VzU2libGluZztcclxuICAgICAgLy8gICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICYmIHByZXZpb3VzU2libGluZy5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgc2VsZWN0aW9uQW5jaG9yT2Zmc2V0ID09PSAwKSB7XHJcbiAgICAgIC8vICAgICAgICAgICAgIC8vIHNldCBjdXJzb3IgYXQgZW5kIG9mIHByZXZpb3VzIHRleHRub2RlXHJcbiAgICAgIC8vICAgICAgICAgICAgIHBvcy5DdXJzb3JTZXR6ZW4ocHJldmlvdXNTaWJsaW5nLCBYTUxDdXJzb3JQb3NpdGlvbmVuLkN1cnNvcklubmVyaGFsYkRlc1RleHROb2RlcywgcHJldmlvdXNTaWJsaW5nLm5vZGVWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAvLyAgICAgICAgIH1cclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICAgIG5vZGUgPSBwYXJlbnRFbGVtOyAvLyB1cCB0byBkdW1teSBub2RlXHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgICAgICAgICAgcG9zLkN1cnNvclNldHplbihub2RlLCBYTUxDdXJzb3JQb3NpdGlvbmVuLkN1cnNvcklubmVyaGFsYkRlc1RleHROb2Rlcywgc2VsZWN0aW9uQW5jaG9yT2Zmc2V0KTtcclxuICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgIC8vICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgLy8gICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlKSkge1xyXG4gICAgICAvLyAgICAgICAgICAgICAvLyBub2RlID0gcGFyZW50RWxlbTsgLy8gdXAgdG8gcGFyZW50IG5vZGVcclxuICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgICAgICAgICBwb3MuQ3Vyc29yU2V0emVuKG5vZGUsIFhNTEN1cnNvclBvc2l0aW9uZW4uQ3Vyc29yQXVmTm9kZVNlbGJzdFZvcmRlcmVzVGFnKTtcclxuICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgIC8vICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyAgICAgZGVmYXVsdDpcclxuICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBub2RlVHlwZSAnJHtub2RlLm5vZGVUeXBlfScgb2Ygbm9kZSAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX1gKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5lcnJvcihcclxuICAgICAgYGZvdW5kIG5vIHN1aXRpbmcgY3Vyc29yIGludGVycHJldGF0aW9uISBGb3Igc2VsZWN0aW9uQW5jaG9yTm9kZT0ke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChzZWxlY3Rpb25BbmNob3JOb2RlKX0sIHNlbGVjdGlvbkFuY2hvck9mZnNldD0ke3NlbGVjdGlvbkFuY2hvck9mZnNldH1gXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=