angular-xml-editor
Version:
XML editor component for Angular
206 lines (205 loc) • 26.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XMLCursorPositions } from './xmlCursorPos.class';
import { XmlToolbox } from '../xmlToolbox.class';
import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class';
import { Xml2html } from '../xml-html-converter/xml2html.class';
var XmlCursorPosMover = /** @class */ (function () {
function XmlCursorPosMover() {
}
/**
* @param {?} pos
* @param {?} rootNode
* @param {?} xmlRules
* @return {?}
*/
XmlCursorPosMover.moveLeft = /**
* @param {?} pos
* @param {?} rootNode
* @param {?} xmlRules
* @return {?}
*/
function (pos, rootNode, xmlRules) {
if (pos === undefined) {
return false;
}
switch (pos.PosAtNode) {
case XMLCursorPositions.CursorOnCompleteNode:
// Put in front of the node
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode);
break;
case XMLCursorPositions.CursorInFrontOfNode:
if (pos.ActualNode === rootNode) {
return false;
}
else {
/** @type {?} */
var previousSibling = DomDummyNodeManager.getPreviousSibling(pos.ActualNode);
if (previousSibling) {
// Previous sibling node exists
pos.setCursorpBehindNodeForLeftMovement(previousSibling);
}
else {
// no previous sibling node available -> set before parent node
pos.SetCursor(pos.ActualNode.parentNode, XMLCursorPositions.CursorInFrontOfNode);
}
}
break;
case XMLCursorPositions.CursorBehindNode:
pos.setCursorpBehindNodeForLeftMovement(pos.ActualNode);
break;
case XMLCursorPositions.CursorInEmptyNode:
// Put in front of the node
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode);
break;
case XMLCursorPositions.CursorInsideTextNode:
if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) {
// Node is Textnode
if (pos.PosInTextnode > 1) {
// Cursor one character to the left
pos.SetCursor(pos.ActualNode, pos.PosAtNode, pos.PosInTextnode - 1);
}
else {
// Put in front of the node
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInFrontOfNode);
}
}
else {
/** @type {?} */
var elemt = /** @type {?} */ (pos.ActualNode);
throw new Error("XMLCursorPos.MoveLeft: CursorPos is XMLCursorPositionen.CursorInnerhalbDesTextNodes,\n but no text node has been chosen, but the node " + (elemt ? elemt.outerHTML : ''));
}
break;
default:
throw new Error("XMLCursorPos.MoveLeft: unknown CursorPos " + pos.PosAtNode);
}
return true;
};
/**
* @param {?} pos
* @param {?} rootNode
* @param {?} xmlRules
* @return {?}
*/
XmlCursorPosMover.moveRight = /**
* @param {?} pos
* @param {?} rootNode
* @param {?} xmlRules
* @return {?}
*/
function (pos, rootNode, xmlRules) {
if (pos === undefined) {
return false;
}
switch (pos.PosAtNode) {
case XMLCursorPositions.CursorOnCompleteNode:
/** @type {?} */
var tagName = Xml2html.getTagNameFromNode(pos.ActualNode);
/** @type {?} */
var rule = xmlRules.ruleElements.get(tagName);
if (rule && rule.empty === true) {
pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode);
}
else {
/** @type {?} */
var firstChild = DomDummyNodeManager.getFirstChild(pos.ActualNode);
if (firstChild) {
pos.SetCursor(firstChild, XMLCursorPositions.CursorInFrontOfNode);
}
else {
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInEmptyNode);
}
}
break;
case XMLCursorPositions.CursorBehindNode:
/** @type {?} */
var nextSibling = DomDummyNodeManager.getNextSibling(pos.ActualNode);
if (nextSibling) {
/** @type {?} */
var elemt = /** @type {?} */ (pos.ActualNode);
throw new Error("XMLCursorPos.MoveRight: cursor behind node should only be set, when no other siblings are following " + (elemt ? elemt.outerHTML : ''));
}
else {
/** @type {?} */
var parentNextSibling = DomDummyNodeManager.getNextSibling(pos.ActualNode.parentElement);
if (parentNextSibling) {
pos.SetCursor(parentNextSibling, XMLCursorPositions.CursorInFrontOfNode);
}
else {
pos.SetCursor(pos.ActualNode.parentElement, XMLCursorPositions.CursorBehindNode);
}
}
break;
case XMLCursorPositions.CursorInEmptyNode:
// Place behind the node
pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode);
break;
case XMLCursorPositions.CursorInFrontOfNode:
if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) {
// Node is Textnode
if ((/** @type {?} */ (pos.ActualNode)).textContent.length > 1) {
// Textnode is not empty
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInsideTextNode, 1); // one character forward, behind the first character
}
else {
// Textnode is empty
// put behind the node
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorBehindNode);
// Because "CursorBehindNode" is not attractive, one more step
this.moveRight(pos, rootNode, xmlRules);
}
}
else {
/** @type {?} */
var childNodeCount = DomDummyNodeManager.getChildNodeCount(pos.ActualNode);
if (childNodeCount === 0) {
// no Children existing
if (Xml2html.isNoClosingElement(pos.ActualNode)) {
// If no closed tag is displayed for this node, then directly behind the node
// Place behind the node
pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode);
}
else {
// Node has closing tag, so put in between
// Place in empty node
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInEmptyNode);
}
}
else {
/** @type {?} */
var firstChild = DomDummyNodeManager.getFirstChild(pos.ActualNode);
pos.SetCursor(firstChild, XMLCursorPositions.CursorInFrontOfNode);
}
}
break;
case XMLCursorPositions.CursorInsideTextNode:
if (XmlToolbox.IsTextOrCommentNode(pos.ActualNode)) {
// Node is Textnode
if ((/** @type {?} */ (pos.ActualNode)).textContent.length > pos.PosInTextnode + 1) {
// there is still text in the right of the textnode
// step one character forwards: behind the first char
pos.SetCursor(pos.ActualNode, pos.PosAtNode, pos.PosInTextnode + 1);
}
else {
// no text after the textnode
// place cursor behind the node
pos.setCursorBehindNodeForDefaultOrRightMovement(pos.ActualNode);
}
}
else {
/** @type {?} */
var elemt = /** @type {?} */ (pos.ActualNode);
throw new Error("XMLCursorPos.MoveRight: CursorPos is XMLCursorPositionen.CursorInnerhalbDesTextNodes, \n but no text node has been chosen, but the node " + (elemt ? elemt.outerHTML : ''));
}
break;
default:
throw new Error("String.Format(\"XMLCursorPos.MoveRight: unknown CursorPos " + pos.PosAtNode);
}
return true;
};
return XmlCursorPosMover;
}());
export { XmlCursorPosMover };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sQ3Vyc29yUG9zTW92ZXIuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS9jdXJzb3IveG1sQ3Vyc29yUG9zTW92ZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLElBQUE7Ozs7Ozs7OztJQUNnQiwwQkFBUTs7Ozs7O2NBQUMsR0FBaUIsRUFBRSxRQUFpQixFQUFFLFFBQWtCO1FBQzdFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNyQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQ3JCLEtBQUssa0JBQWtCLENBQUMsb0JBQW9COztnQkFFMUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU07WUFFUixLQUFLLGtCQUFrQixDQUFDLG1CQUFtQjtnQkFDekMsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRTtvQkFDL0IsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7cUJBQU07O29CQUNMLElBQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxlQUFlLEVBQUU7O3dCQUVuQixHQUFHLENBQUMsbUNBQW1DLENBQUMsZUFBZSxDQUFDLENBQUM7cUJBQzFEO3lCQUFNOzt3QkFFTCxHQUFHLENBQUMsU0FB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QUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLHFLQUMrQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDLENBQUM7aUJBQ2hHO2dCQUNELE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUE0RCxHQUFHLENBQUMsU0FBVyxDQUFDLENBQUM7U0FDaEc7UUFFRCxPQUFPLElBQUksQ0FBQzs7NEJBeEtoQjtJQTBLQyxDQUFBO0FBcEtELDZCQW9LQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFhtbEN1cnNvclBvcywgWE1MQ3Vyc29yUG9zaXRpb25zIH0gZnJvbSAnLi94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxSdWxlcyB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxSdWxlcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFRvb2xib3ggfSBmcm9tICcuLi94bWxUb29sYm94LmNsYXNzJztcclxuaW1wb3J0IHsgRG9tRHVtbXlOb2RlTWFuYWdlciB9IGZyb20gJy4uL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxDdXJzb3JQb3NNb3ZlciB7XHJcbiAgcHVibGljIHN0YXRpYyBtb3ZlTGVmdChwb3M6IFhtbEN1cnNvclBvcywgcm9vdE5vZGU6IEVsZW1lbnQsIHhtbFJ1bGVzOiBYbWxSdWxlcyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHBvcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHBvcy5Qb3NBdE5vZGUpIHtcclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yT25Db21wbGV0ZU5vZGU6XHJcbiAgICAgICAgLy8gUHV0IGluIGZyb250IG9mIHRoZSBub2RlXHJcbiAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICBpZiAocG9zLkFjdHVhbE5vZGUgPT09IHJvb3ROb2RlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2libGluZyA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0UHJldmlvdXNTaWJsaW5nKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHtcclxuICAgICAgICAgICAgLy8gUHJldmlvdXMgc2libGluZyBub2RlIGV4aXN0c1xyXG4gICAgICAgICAgICBwb3Muc2V0Q3Vyc29ycEJlaGluZE5vZGVGb3JMZWZ0TW92ZW1lbnQocHJldmlvdXNTaWJsaW5nKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG5vIHByZXZpb3VzIHNpYmxpbmcgbm9kZSBhdmFpbGFibGUgLT4gc2V0IGJlZm9yZSBwYXJlbnQgbm9kZVxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLnBhcmVudE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIHBvcy5zZXRDdXJzb3JwQmVoaW5kTm9kZUZvckxlZnRNb3ZlbWVudChwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZTpcclxuICAgICAgICAvLyBQdXQgaW4gZnJvbnQgb2YgdGhlIG5vZGVcclxuICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbnNpZGVUZXh0Tm9kZTpcclxuICAgICAgICBpZiAoWG1sVG9vbGJveC5Jc1RleHRPckNvbW1lbnROb2RlKHBvcy5BY3R1YWxOb2RlKSkge1xyXG4gICAgICAgICAgLy8gTm9kZSBpcyBUZXh0bm9kZVxyXG4gICAgICAgICAgaWYgKHBvcy5Qb3NJblRleHRub2RlID4gMSkge1xyXG4gICAgICAgICAgICAvLyBDdXJzb3Igb25lIGNoYXJhY3RlciB0byB0aGUgbGVmdFxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBwb3MuUG9zQXROb2RlLCBwb3MuUG9zSW5UZXh0bm9kZSAtIDEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUHV0IGluIGZyb250IG9mIHRoZSBub2RlXHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IocG9zLkFjdHVhbE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gbm8gVGV4dG5vZGVcclxuICAgICAgICAgIGNvbnN0IGVsZW10ID0gcG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWE1MQ3Vyc29yUG9zLk1vdmVMZWZ0OiBDdXJzb3JQb3MgaXMgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBubyB0ZXh0IG5vZGUgaGFzIGJlZW4gY2hvc2VuLCBidXQgdGhlIG5vZGUgJHtlbGVtdCA/IGVsZW10Lm91dGVySFRNTCA6ICcnfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYTUxDdXJzb3JQb3MuTW92ZUxlZnQ6IHVua25vd24gQ3Vyc29yUG9zICR7cG9zLlBvc0F0Tm9kZX1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBtb3ZlUmlnaHQocG9zOiBYbWxDdXJzb3JQb3MsIHJvb3ROb2RlOiBFbGVtZW50LCB4bWxSdWxlczogWG1sUnVsZXMpOiBib29sZWFuIHtcclxuICAgIGlmIChwb3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChwb3MuUG9zQXROb2RlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlOlxyXG4gICAgICAgIC8vIEhpbnRlciBkZW4gTm9kZSBzZXR6ZW5cclxuICAgICAgICBjb25zdCB0YWdOYW1lID0gWG1sMmh0bWwuZ2V0VGFnTmFtZUZyb21Ob2RlKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICBjb25zdCBydWxlID0geG1sUnVsZXMucnVsZUVsZW1lbnRzLmdldCh0YWdOYW1lKTtcclxuICAgICAgICBpZiAocnVsZSAmJiBydWxlLmVtcHR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICBwb3Muc2V0Q3Vyc29yQmVoaW5kTm9kZUZvckRlZmF1bHRPclJpZ2h0TW92ZW1lbnQocG9zLkFjdHVhbE5vZGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXRGaXJzdENoaWxkKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChmaXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IoZmlyc3RDaGlsZCwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXROZXh0U2libGluZyhwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgICAvLyBjdXJzb3IgYmVoaW5kIG5vZGUgc2hvdWxkIG9ubHkgYmUgc2V0LCB3aGVuIG5vIG90aGVyIHNpYmxpbmdzIGFyZSBmb2xsb3dpbmdcclxuICAgICAgICAgIGNvbnN0IGVsZW10ID0gcG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWE1MQ3Vyc29yUG9zLk1vdmVSaWdodDogY3Vyc29yIGJlaGluZCBub2RlIHNob3VsZCBvbmx5IGJlIHNldCwgd2hlbiBubyBvdGhlciBzaWJsaW5ncyBhcmUgZm9sbG93aW5nICR7ZWxlbXQgPyBlbGVtdC5vdXRlckhUTUwgOiAnJ31gKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gZm9sbG93aW5nIHNpYmxpbmdzIHByZXNlbnQsIHRoZW4gc2V0IGFmdGVyIHBhcmVudCBub2RlXHJcbiAgICAgICAgICBjb25zdCBwYXJlbnROZXh0U2libGluZyA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0TmV4dFNpYmxpbmcocG9zLkFjdHVhbE5vZGUucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICBpZiAocGFyZW50TmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwYXJlbnROZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50LCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgLy8gUGxhY2UgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgaWYgKFhtbFRvb2xib3guSXNUZXh0T3JDb21tZW50Tm9kZShwb3MuQWN0dWFsTm9kZSkpIHtcclxuICAgICAgICAgIC8vIE5vZGUgaXMgVGV4dG5vZGVcclxuICAgICAgICAgIGlmICgocG9zLkFjdHVhbE5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAvLyBUZXh0bm9kZSBpcyBub3QgZW1wdHlcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlLCAxKTsgLy8gb25lIGNoYXJhY3RlciBmb3J3YXJkLCBiZWhpbmQgdGhlIGZpcnN0IGNoYXJhY3RlclxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGV4dG5vZGUgaXMgZW1wdHlcclxuICAgICAgICAgICAgLy8gcHV0IGJlaGluZCB0aGUgbm9kZVxyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgXCJDdXJzb3JCZWhpbmROb2RlXCIgaXMgbm90IGF0dHJhY3RpdmUsIG9uZSBtb3JlIHN0ZXBcclxuICAgICAgICAgICAgdGhpcy5tb3ZlUmlnaHQocG9zLCByb290Tm9kZSwgeG1sUnVsZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOb2RlIGlzIG5vdCBUZXh0bm9kZVxyXG4gICAgICAgICAgY29uc3QgY2hpbGROb2RlQ291bnQgPSBEb21EdW1teU5vZGVNYW5hZ2VyLmdldENoaWxkTm9kZUNvdW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGlmIChjaGlsZE5vZGVDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBubyBDaGlsZHJlbiBleGlzdGluZ1xyXG4gICAgICAgICAgICBpZiAoWG1sMmh0bWwuaXNOb0Nsb3NpbmdFbGVtZW50KHBvcy5BY3R1YWxOb2RlKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIG5vIGNsb3NlZCB0YWcgaXMgZGlzcGxheWVkIGZvciB0aGlzIG5vZGUsIHRoZW4gZGlyZWN0bHkgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgICAgICAgLy8gUGxhY2UgYmVoaW5kIHRoZSBub2RlXHJcbiAgICAgICAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBOb2RlIGhhcyBjbG9zaW5nIHRhZywgc28gcHV0IGluIGJldHdlZW5cclxuICAgICAgICAgICAgICAvLyBQbGFjZSBpbiBlbXB0eSBub2RlXHJcbiAgICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ2hpbGRyZW4gZXhpc3RpbmdcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IERvbUR1bW15Tm9kZU1hbmFnZXIuZ2V0Rmlyc3RDaGlsZChwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgICAgIHBvcy5TZXRDdXJzb3IoZmlyc3RDaGlsZCwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgIGlmIChYbWxUb29sYm94LklzVGV4dE9yQ29tbWVudE5vZGUocG9zLkFjdHVhbE5vZGUpKSB7XHJcbiAgICAgICAgICAvLyBOb2RlIGlzIFRleHRub2RlXHJcbiAgICAgICAgICBpZiAoKHBvcy5BY3R1YWxOb2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50Lmxlbmd0aCA+IHBvcy5Qb3NJblRleHRub2RlICsgMSkge1xyXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBzdGlsbCB0ZXh0IGluIHRoZSByaWdodCBvZiB0aGUgdGV4dG5vZGVcclxuICAgICAgICAgICAgLy8gc3RlcCBvbmUgY2hhcmFjdGVyIGZvcndhcmRzOiBiZWhpbmQgdGhlIGZpcnN0IGNoYXJcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihwb3MuQWN0dWFsTm9kZSwgcG9zLlBvc0F0Tm9kZSwgcG9zLlBvc0luVGV4dG5vZGUgKyAxKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG5vIHRleHQgYWZ0ZXIgdGhlIHRleHRub2RlXHJcbiAgICAgICAgICAgIC8vIHBsYWNlIGN1cnNvciBiZWhpbmQgdGhlIG5vZGVcclxuICAgICAgICAgICAgcG9zLnNldEN1cnNvckJlaGluZE5vZGVGb3JEZWZhdWx0T3JSaWdodE1vdmVtZW50KHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm9kZSBpcyBubyBUZXh0bm9kZVxyXG4gICAgICAgICAgY29uc3QgZWxlbXQgPSBwb3MuQWN0dWFsTm9kZSBhcyBFbGVtZW50O1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYTUxDdXJzb3JQb3MuTW92ZVJpZ2h0OiBDdXJzb3JQb3MgaXMgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbm5lcmhhbGJEZXNUZXh0Tm9kZXMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXQgbm8gdGV4dCBub2RlIGhhcyBiZWVuIGNob3NlbiwgYnV0IHRoZSBub2RlICR7ZWxlbXQgPyBlbGVtdC5vdXRlckhUTUwgOiAnJ31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcuRm9ybWF0KFwiWE1MQ3Vyc29yUG9zLk1vdmVSaWdodDogdW5rbm93biBDdXJzb3JQb3MgJHtwb3MuUG9zQXROb2RlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxufVxyXG4iXX0=