angular-xml-editor
Version:
XML editor component for Angular
261 lines (260 loc) • 25.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Xml2html } from '../xml-html-converter/xml2html.class';
export class DomDummyNodeManager {
constructor() { }
/**
* @param {?} node
* @return {?}
*/
static IsDummyNode(node) {
/** @type {?} */
const asElem = /** @type {?} */ (node);
if (asElem && node.nodeType === Node.ELEMENT_NODE) {
return asElem.classList.contains(DomDummyNodeManager.DummyNodeClassName);
}
return false;
}
/**
* @param {?} node
* @return {?}
*/
static IsBeforeFirstTagDummyNode(node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
/** @type {?} */
const asElem = /** @type {?} */ (node);
if (asElem && node.nodeType === Node.ELEMENT_NODE) {
return asElem.classList.contains(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName);
}
return false;
}
else {
return false;
}
}
/**
* @param {?} node
* @return {?}
*/
static getPreviousSibling(node) {
if (!node) {
return undefined;
}
while (node) {
node = node.previousSibling;
if (node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
}
else {
return node;
}
}
}
return undefined;
}
/**
* @param {?} node
* @return {?}
*/
static getNextSibling(node) {
if (!node) {
return undefined;
}
while (node) {
node = node.nextSibling;
if (node) {
if (DomDummyNodeManager.IsDummyNode(node)) {
}
else {
return node;
}
}
}
return undefined;
}
/**
* @param {?} node
* @return {?}
*/
static getChildNodeCount(node) {
if (!node) {
return 0;
}
/** @type {?} */
let count = 0;
for (let i = 0; i < node.childNodes.length; i++) {
if (!DomDummyNodeManager.IsDummyNode(node.childNodes[i])) {
count++;
}
}
return count;
}
/**
* @param {?} node
* @return {?}
*/
static getFirstChild(node) {
if (!node) {
return undefined;
}
/** @type {?} */
let first = /** @type {?} */ (node.firstChild);
while (DomDummyNodeManager.IsDummyNode(first)) {
first = first.nextSibling;
}
return first;
}
/**
* @param {?} node
* @return {?}
*/
static getLastChild(node) {
if (!node) {
return undefined;
}
/** @type {?} */
let last = /** @type {?} */ (node.lastChild);
while (DomDummyNodeManager.IsDummyNode(last)) {
last = last.previousSibling;
}
return last;
}
/**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
RemoveAllDummyNodes(node, nodeDepth = 0) {
/** @type {?} */
let children = [];
for (let i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
// delete all dummy node children
children.forEach(child => {
if (DomDummyNodeManager.IsDummyNode(child)) {
node.removeChild(child);
}
});
children = [];
for (let i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
// update child nodes
children.forEach(child => {
this.RemoveAllDummyNodes(child, nodeDepth + 1);
});
}
/**
* @param {?} node
* @param {?=} nodeDepth
* @return {?}
*/
UpdateDummyNodes(node, nodeDepth = 0) {
/** @type {?} */
const document = node.ownerDocument;
/** @type {?} */
const asElement = /** @type {?} */ (node);
/** @type {?} */
const children = [];
for (let i = 0; i < node.childNodes.length; ++i) {
children.push(node.childNodes[i]);
}
if (asElement && !DomDummyNodeManager.IsDummyNode(asElement) && !DomDummyNodeManager.IsDummyNode(asElement.parentElement)) {
if (asElement.nodeType === Node.TEXT_NODE) {
/** @type {?} */
const before = asElement.previousSibling;
if (before.nodeType === Node.TEXT_NODE) {
// textnode after text node: dont insert dummy node!
}
else {
if (!DomDummyNodeManager.IsDummyNode(before)) {
asElement.parentNode.insertBefore(this.createDummyNode(document), asElement);
}
}
}
if (asElement.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
let firstChild = node.firstChild;
if (!firstChild) {
// create dummy node in empty tag
node.appendChild(this.createDummyNode(document));
firstChild = node.firstChild;
}
if (Xml2html.isNoClosingElement(node)) {
}
else {
firstChild = node.firstChild;
if (!firstChild) {
// create dummy node in empty tag
node.appendChild(this.createDummyNode(document));
firstChild = node.firstChild;
}
// Insert a dummy node before the first child
if (!DomDummyNodeManager.IsDummyNode(firstChild)) {
if (firstChild) {
node.insertBefore(this.createDummyNode(document), firstChild);
firstChild = node.firstChild;
}
else {
node.appendChild(this.createDummyNode(document));
}
}
/** @type {?} */
let lastChild = node.lastChild;
if (!DomDummyNodeManager.IsDummyNode(lastChild)) {
node.appendChild(this.createDummyNode(document));
lastChild = node.lastChild;
}
// Insert a dummy node before the first (dummy child) but optical in front of the node (to show the cursor in front of the node)
if (nodeDepth > 0) {
if (DomDummyNodeManager.IsDummyNode(firstChild) && !DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) {
/** @type {?} */
const dummyNode = this.createDummyNode(document);
dummyNode.classList.add(DomDummyNodeManager.DummyNodeBeforeFirstTagClassName);
asElement.insertBefore(dummyNode, firstChild);
}
}
}
}
}
// update child nodes
children.forEach(child => {
this.UpdateDummyNodes(child, nodeDepth + 1);
});
}
/**
* @param {?} targetDocument
* @param {?=} content
* @return {?}
*/
createDummyNode(targetDocument, content) {
/** @type {?} */
const dummyNode = targetDocument.createElement('span');
/** @type {?} */
let dummy2TextNode;
if (content === undefined) {
dummy2TextNode = targetDocument.createTextNode(DomDummyNodeManager.DummyNodeContent);
}
else {
dummy2TextNode = targetDocument.createTextNode(content);
}
dummyNode.classList.add(DomDummyNodeManager.DummyNodeClassName);
dummyNode.appendChild(dummy2TextNode);
return dummyNode;
}
}
DomDummyNodeManager.DummyNodeClassName = 'dummyNode';
DomDummyNodeManager.DummyNodeBeforeFirstTagClassName = 'beforefirstTag';
DomDummyNodeManager.DummyNodeContent = String.fromCharCode(160);
if (false) {
/** @type {?} */
DomDummyNodeManager.DummyNodeClassName;
/** @type {?} */
DomDummyNodeManager.DummyNodeBeforeFirstTagClassName;
/** @type {?} */
DomDummyNodeManager.DummyNodeContent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLE1BQU07SUFLSixpQkFBZ0I7Ozs7O0lBRVQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFVOztRQUNsQyxNQUFNLE1BQU0scUJBQUcsSUFBZSxFQUFDO1FBQy9CLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDMUU7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7O0lBR1IsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQVU7UUFDaEQsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7O1lBQ3pDLE1BQU0sTUFBTSxxQkFBRyxJQUFlLEVBQUM7WUFDL0IsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNqRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7YUFDeEY7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkOzs7Ozs7SUFJSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBVTtRQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksRUFBRTtZQUNYLElBQUks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QWMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxDQUFDOzs7eUNBOU1nQixXQUFXO3VEQUNHLGdCQUFnQjt1Q0FDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRG9tRHVtbXlOb2RlTWFuYWdlciB7XHJcbiAgcHVibGljIHN0YXRpYyBEdW1teU5vZGVDbGFzc05hbWUgPSAnZHVtbXlOb2RlJztcclxuICBwdWJsaWMgc3RhdGljIER1bW15Tm9kZUJlZm9yZUZpcnN0VGFnQ2xhc3NOYW1lID0gJ2JlZm9yZWZpcnN0VGFnJztcclxuICBwdWJsaWMgc3RhdGljIER1bW15Tm9kZUNvbnRlbnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgcHVibGljIHN0YXRpYyBJc0R1bW15Tm9kZShub2RlOiBOb2RlKSB7XHJcbiAgICBjb25zdCBhc0VsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICBpZiAoYXNFbGVtICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgIHJldHVybiBhc0VsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKERvbUR1bW15Tm9kZU1hbmFnZXIuRHVtbXlOb2RlQ2xhc3NOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgSXNCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kZShub2RlOiBOb2RlKSB7XHJcbiAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlKSkge1xyXG4gICAgICBjb25zdCBhc0VsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgIGlmIChhc0VsZW0gJiYgbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICByZXR1cm4gYXNFbGVtLmNsYXNzTGlzdC5jb250YWlucyhEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUJlZm9yZUZpcnN0VGFnQ2xhc3NOYW1lKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcHJldmlvcyBzaWJsaW5nIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRQcmV2aW91c1NpYmxpbmcobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobm9kZSkpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IG5leHQgc2libGluZyAtIGV4Y2VwdCBkdW1teSBub2Rlc1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV4dFNpYmxpbmcobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcclxuICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlKSkge1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgY2hpbGRyZW4gY291bnQgLSBleGNlcHQgZHVtbXkgbm9kZXNcclxuICBwdWJsaWMgc3RhdGljIGdldENoaWxkTm9kZUNvdW50KG5vZGU6IE5vZGUpOiBudW1iZXIge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShub2RlLmNoaWxkTm9kZXNbaV0pKSB7XHJcbiAgICAgICAgY291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGZpcnN0IGNoaWxkIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGaXJzdENoaWxkKG5vZGU6IE5vZGUpOiBOb2RlIHtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgbGV0IGZpcnN0ID0gbm9kZS5maXJzdENoaWxkIGFzIE5vZGU7XHJcbiAgICB3aGlsZSAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdCkpIHtcclxuICAgICAgZmlyc3QgPSBmaXJzdC5uZXh0U2libGluZztcclxuICAgIH1cclxuICAgIHJldHVybiBmaXJzdDtcclxuICB9XHJcblxyXG4gIC8vIGdldCBsYXN0IGNoaWxkIC0gZXhjZXB0IGR1bW15IG5vZGVzXHJcbiAgcHVibGljIHN0YXRpYyBnZXRMYXN0Q2hpbGQobm9kZTogTm9kZSk6IE5vZGUge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBsZXQgbGFzdCA9IG5vZGUubGFzdENoaWxkIGFzIE5vZGU7XHJcbiAgICB3aGlsZSAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShsYXN0KSkge1xyXG4gICAgICBsYXN0ID0gbGFzdC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGFzdDtcclxuICB9XHJcblxyXG4gIFJlbW92ZUFsbER1bW15Tm9kZXMobm9kZTogTm9kZSwgbm9kZURlcHRoID0gMCk6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBOb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWxldGUgYWxsIGR1bW15IG5vZGUgY2hpbGRyZW5cclxuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShjaGlsZCkpIHtcclxuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hpbGRyZW4gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgY2hpbGQgbm9kZXNcclxuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICB0aGlzLlJlbW92ZUFsbER1bW15Tm9kZXMoY2hpbGQsIG5vZGVEZXB0aCArIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVEdW1teU5vZGVzKG5vZGU6IE5vZGUsIG5vZGVEZXB0aCA9IDApIHtcclxuICAgIGNvbnN0IGRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xyXG4gICAgY29uc3QgYXNFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IGNoaWxkcmVuOiBOb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXNFbGVtZW50ICYmICFEb21EdW1teU5vZGVNYW5hZ2VyLklzRHVtbXlOb2RlKGFzRWxlbWVudCkgJiYgIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoYXNFbGVtZW50LnBhcmVudEVsZW1lbnQpKSB7XHJcbiAgICAgIGlmIChhc0VsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgY29uc3QgYmVmb3JlID0gYXNFbGVtZW50LnByZXZpb3VzU2libGluZztcclxuICAgICAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgLy8gdGV4dG5vZGUgYWZ0ZXIgdGV4dCBub2RlOiBkb250IGluc2VydCBkdW1teSBub2RlIVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoYmVmb3JlKSkge1xyXG4gICAgICAgICAgICBhc0VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpLCBhc0VsZW1lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGFzRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBsZXQgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgIC8vIGNyZWF0ZSBkdW1teSBub2RlIGluIGVtcHR5IHRhZ1xyXG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUR1bW15Tm9kZShkb2N1bWVudCkpO1xyXG4gICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChYbWwyaHRtbC5pc05vQ2xvc2luZ0VsZW1lbnQobm9kZSkpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIGR1bW15IG5vZGUgaW4gZW1wdHkgdGFnXHJcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpKTtcclxuICAgICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJbnNlcnQgYSBkdW1teSBub2RlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGRcclxuICAgICAgICAgIGlmICghRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSwgZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJbnNlcnQgYSBkdW1teSBub2RlIGFmdGVyIHRoZSBsYXN0IGNoaWxkXHJcbiAgICAgICAgICBsZXQgbGFzdENoaWxkID0gbm9kZS5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICBpZiAoIURvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUobGFzdENoaWxkKSkge1xyXG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRHVtbXlOb2RlKGRvY3VtZW50KSk7XHJcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IG5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEluc2VydCBhIGR1bW15IG5vZGUgYmVmb3JlIHRoZSBmaXJzdCAoZHVtbXkgY2hpbGQpIGJ1dCBvcHRpY2FsIGluIGZyb250IG9mIHRoZSBub2RlICh0byBzaG93IHRoZSBjdXJzb3IgaW4gZnJvbnQgb2YgdGhlIG5vZGUpXHJcbiAgICAgICAgICBpZiAobm9kZURlcHRoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSAmJiAhRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0JlZm9yZUZpcnN0VGFnRHVtbXlOb2RlKGZpcnN0Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHVtbXlOb2RlID0gdGhpcy5jcmVhdGVEdW1teU5vZGUoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICAgIGR1bW15Tm9kZS5jbGFzc0xpc3QuYWRkKERvbUR1bW15Tm9kZU1hbmFnZXIuRHVtbXlOb2RlQmVmb3JlRmlyc3RUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgIGFzRWxlbWVudC5pbnNlcnRCZWZvcmUoZHVtbXlOb2RlLCBmaXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVwZGF0ZSBjaGlsZCBub2Rlc1xyXG4gICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgIHRoaXMuVXBkYXRlRHVtbXlOb2RlcyhjaGlsZCwgbm9kZURlcHRoICsgMSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVEdW1teU5vZGUodGFyZ2V0RG9jdW1lbnQ6IERvY3VtZW50LCBjb250ZW50Pzogc3RyaW5nKTogRWxlbWVudCB7XHJcbiAgICBjb25zdCBkdW1teU5vZGUgPSB0YXJnZXREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBsZXQgZHVtbXkyVGV4dE5vZGU7XHJcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGR1bW15MlRleHROb2RlID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoRG9tRHVtbXlOb2RlTWFuYWdlci5EdW1teU5vZGVDb250ZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR1bW15MlRleHROb2RlID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCk7XHJcbiAgICB9XHJcbiAgICBkdW1teU5vZGUuY2xhc3NMaXN0LmFkZChEb21EdW1teU5vZGVNYW5hZ2VyLkR1bW15Tm9kZUNsYXNzTmFtZSk7XHJcbiAgICBkdW1teU5vZGUuYXBwZW5kQ2hpbGQoZHVtbXkyVGV4dE5vZGUpO1xyXG4gICAgcmV0dXJuIGR1bW15Tm9kZTtcclxuICB9XHJcbn1cclxuIl19