angular-xml-editor
Version:
XML editor component for Angular
171 lines (170 loc) • 18.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class';
import { Xml2html } from '../xml-html-converter/xml2html.class';
var XmlEditRuleCheckElements = /** @class */ (function () {
function XmlEditRuleCheckElements(xsdNodes) {
this.xsdNodes = xsdNodes;
}
/**
* @param {?} cursorPosToCheck
* @return {?}
*/
XmlEditRuleCheckElements.prototype.ElementsAllowedAtThisCursorPos = /**
* @param {?} cursorPosToCheck
* @return {?}
*/
function (cursorPosToCheck) {
if (!cursorPosToCheck) {
return [];
}
/** @type {?} */
var parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck);
/** @type {?} */
var parentName = Xml2html.getTagNameFromNode(parentNode);
/** @type {?} */
var xsdNode = this.xsdNodes.get(parentName);
if (xsdNode) {
/** @type {?} */
var result = this.getSubElementNames(xsdNode, []);
return result;
}
else {
// console.warn('element "' + parentName + '" not found');
return [];
}
};
/**
* @param {?} cursorPosToCheck
* @return {?}
*/
XmlEditRuleCheckElements.prototype.getRelevantParentNodeForCursorPos = /**
* @param {?} cursorPosToCheck
* @return {?}
*/
function (cursorPosToCheck) {
if (cursorPosToCheck) {
/** @type {?} */
var parentNode = cursorPosToCheck.ActualNode;
switch (parentNode.nodeType) {
case Node.COMMENT_NODE:
case Node.TEXT_NODE:
parentNode = parentNode.parentElement;
break;
case Node.ELEMENT_NODE:
switch (cursorPosToCheck.PosAtNode) {
case XMLCursorPositions.CursorInEmptyNode:
case XMLCursorPositions.CursorInsideTextNode:
break;
case XMLCursorPositions.CursorBehindNode:
case XMLCursorPositions.CursorInFrontOfNode:
case XMLCursorPositions.CursorOnCompleteNode:
parentNode = parentNode.parentElement;
break;
default:
throw new Error("unhandled cursorPosToCheck.PosAmNode \"" + cursorPosToCheck.PosAtNode + "\"/" + XmlCursorPos.getXmlCursorPositionDebugName(cursorPosToCheck.PosAtNode) + "\" ");
}
break;
default:
throw new Error("unhandled parentNode.nodeType \"" + parentNode.nodeType + "\"");
}
return parentNode;
}
};
/**
* @param {?} xsdNode
* @param {?} alreadyAddedElementNames
* @param {?=} depth
* @return {?}
*/
XmlEditRuleCheckElements.prototype.getSubElementNames = /**
* @param {?} xsdNode
* @param {?} alreadyAddedElementNames
* @param {?=} depth
* @return {?}
*/
function (xsdNode, alreadyAddedElementNames, depth) {
var _this = this;
if (depth === void 0) { depth = 0; }
/** @type {?} */
var elementNames = [];
/** @type {?} */
var elementName;
if (xsdNode.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
var asElem = /** @type {?} */ (xsdNode);
if (asElem) {
if (asElem.localName === 'element') {
elementName = asElem.getAttribute('name');
}
}
}
if (elementName) {
// console.warn('found: ' + JSON.stringify(elementName) + ' depth: ' + depth);
if (alreadyAddedElementNames.length !== 0) {
if (alreadyAddedElementNames.indexOf(elementName) !== -1) {
return elementNames; // element recursion detected
}
if (depth === 0) {
// is the parent element itself - skip!
}
else {
elementNames = elementNames.concat(elementName);
return elementNames;
}
}
alreadyAddedElementNames.push(elementName);
}
/** @type {?} */
var childNodes = /** @type {?} */ (Array.prototype.slice.call(xsdNode.childNodes));
depth++;
childNodes.forEach(function (child) {
if (child.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
var childElem = /** @type {?} */ (child);
if (childElem) {
switch (childElem.localName) {
case 'complexType':
case 'sequence':
case 'choice':
case 'simpleContent':
case 'extension':
elementNames = elementNames.concat(_this.getSubElementNames(child, alreadyAddedElementNames, depth));
break;
case 'element':
/** @type {?} */
var refname = childElem.attributes.getNamedItem('ref');
if (refname) {
/** @type {?} */
var referedNode = _this.xsdNodes.get(refname.value);
if (referedNode) {
elementNames = elementNames.concat(_this.getSubElementNames(referedNode, alreadyAddedElementNames, depth));
}
else {
throw new Error(" refered element \"" + refname + "\" for element \"" + childElem.outerHTML + "\" not found");
}
}
else {
elementNames = elementNames.concat(_this.getSubElementNames(child, alreadyAddedElementNames, depth));
}
break;
case 'attribute':
break;
default:
throw new Error("unknown childElem.localname \"" + childElem.localName + "\"/" + childElem.outerHTML);
}
}
}
});
return elementNames;
};
return XmlEditRuleCheckElements;
}());
export { XmlEditRuleCheckElements };
if (false) {
/** @type {?} */
XmlEditRuleCheckElements.prototype.xsdNodes;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUveG1sLXJ1bGVzLWNoZWNrL3htbEVkaXRSdWxlQ2hlY2tFbGVtZW50cy5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVoRSxJQUFBO0lBQ0Usa0NBQW9CLFFBQThCO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQXNCO0tBQUk7Ozs7O0lBRXRELGlFQUE4Qjs7OztJQUE5QixVQUErQixnQkFBOEI7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7O1FBQ0QsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1FBQzVFLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7UUFDM0QsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxPQUFPLEVBQUU7O1lBQ1gsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU07O1lBRUwsT0FBTyxFQUFFLENBQUM7U0FDWDtLQUNGOzs7OztJQUVELG9FQUFpQzs7OztJQUFqQyxVQUFrQyxnQkFBOEI7UUFDOUQsSUFBSSxnQkFBZ0IsRUFBRTs7WUFDcEIsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBRTdDLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDM0IsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUN2QixLQUFLLElBQUksQ0FBQyxTQUFTO29CQUNqQixVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztvQkFDdEMsTUFBTTtnQkFFUixLQUFLLElBQUksQ0FBQyxZQUFZO29CQUNwQixRQUFRLGdCQUFnQixDQUFDLFNBQVMsRUFBRTt3QkFDbEMsS0FBSyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDMUMsS0FBSyxrQkFBa0IsQ0FBQyxvQkFBb0I7NEJBQzFDLE1BQU07d0JBRVIsS0FBSyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDekMsS0FBSyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDNUMsS0FBSyxrQkFBa0IsQ0FBQyxvQkFBb0I7NEJBQzFDLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDOzRCQUN0QyxNQUFNO3dCQUVSOzRCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTBDLGdCQUFnQixDQUFDLFNBQVMsV0FBSyxZQUFZLENBQUMsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQUksQ0FBQyxDQUFDO3FCQUN4SztvQkFDRCxNQUFNO2dCQUVSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQW1DLFVBQVUsQ0FBQyxRQUFRLE9BQUcsQ0FBQyxDQUFDO2FBQzlFO1lBQ0QsT0FBTyxVQUFVLENBQUM7U0FDbkI7S0FDRjs7Ozs7OztJQUVNLHFEQUFrQjs7Ozs7O2NBQUMsT0FBYSxFQUFFLHdCQUFrQyxFQUFFLEtBQWlCOztRQUFqQixzQkFBQSxFQUFBLFNBQWlCOztRQUM1RixJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7O1FBQ2hDLElBQUksV0FBVyxDQUFTO1FBRXhCLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFOztZQUMxQyxJQUFNLE1BQU0scUJBQUcsT0FBa0IsRUFBQztZQUNsQyxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUNsQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0M7YUFDRjtTQUNGO1FBRUQsSUFBSSxXQUFXLEVBQUU7O1lBRWYsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDeEQsT0FBTyxZQUFZLENBQUM7aUJBQ3JCO2dCQUNELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTs7aUJBRWhCO3FCQUFNO29CQUNMLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNoRCxPQUFPLFlBQVksQ0FBQztpQkFDckI7YUFDRjtZQUNELHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM1Qzs7UUFFRCxJQUFNLFVBQVUscUJBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQVcsRUFBQztRQUU1RSxLQUFLLEVBQUUsQ0FBQztRQUVSLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO1lBQ3RCLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFOztnQkFDeEMsSUFBTSxTQUFTLHFCQUFHLEtBQWdCLEVBQUM7Z0JBQ25DLElBQUksU0FBUyxFQUFFO29CQUNiLFFBQVEsU0FBUyxDQUFDLFNBQVMsRUFBRTt3QkFDM0IsS0FBSyxhQUFhLENBQUM7d0JBQ25CLEtBQUssVUFBVSxDQUFDO3dCQUNoQixLQUFLLFFBQVEsQ0FBQzt3QkFDZCxLQUFLLGVBQWUsQ0FBQzt3QkFDckIsS0FBSyxXQUFXOzRCQUNkLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFDcEcsTUFBTTt3QkFFUixLQUFLLFNBQVM7OzRCQUNaLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN6RCxJQUFJLE9BQU8sRUFBRTs7Z0NBQ1gsSUFBTSxXQUFXLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNyRCxJQUFJLFdBQVcsRUFBRTtvQ0FDZixZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7aUNBQzNHO3FDQUFNO29DQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXFCLE9BQU8seUJBQWtCLFNBQVMsQ0FBQyxTQUFTLGlCQUFhLENBQUMsQ0FBQztpQ0FDakc7NkJBQ0Y7aUNBQU07Z0NBQ0wsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDOzZCQUNyRzs0QkFDRCxNQUFNO3dCQUVSLEtBQUssV0FBVzs0QkFDZCxNQUFNO3dCQUVSOzRCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQWdDLFNBQVMsQ0FBQyxTQUFTLFdBQUssU0FBUyxDQUFDLFNBQVcsQ0FBQyxDQUFDO3FCQUNsRztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7O21DQTlIeEI7SUFnSUMsQ0FBQTtBQTdIRCxvQ0E2SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxDdXJzb3JQb3MsIFhNTEN1cnNvclBvc2l0aW9ucyB9IGZyb20gJy4uL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHhzZE5vZGVzOiBNYXA8c3RyaW5nLCBFbGVtZW50Pikge31cclxuXHJcbiAgRWxlbWVudHNBbGxvd2VkQXRUaGlzQ3Vyc29yUG9zKGN1cnNvclBvc1RvQ2hlY2s6IFhtbEN1cnNvclBvcyk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5nZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjayk7XHJcbiAgICBjb25zdCBwYXJlbnROYW1lID0gWG1sMmh0bWwuZ2V0VGFnTmFtZUZyb21Ob2RlKHBhcmVudE5vZGUpO1xyXG4gICAgY29uc3QgeHNkTm9kZSA9IHRoaXMueHNkTm9kZXMuZ2V0KHBhcmVudE5hbWUpO1xyXG4gICAgaWYgKHhzZE5vZGUpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRTdWJFbGVtZW50TmFtZXMoeHNkTm9kZSwgW10pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKCdlbGVtZW50IFwiJyArIHBhcmVudE5hbWUgKyAnXCIgbm90IGZvdW5kJyk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlbGV2YW50UGFyZW50Tm9kZUZvckN1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrOiBYbWxDdXJzb3JQb3MpOiBOb2RlIHtcclxuICAgIGlmIChjdXJzb3JQb3NUb0NoZWNrKSB7XHJcbiAgICAgIGxldCBwYXJlbnROb2RlID0gY3Vyc29yUG9zVG9DaGVjay5BY3R1YWxOb2RlO1xyXG5cclxuICAgICAgc3dpdGNoIChwYXJlbnROb2RlLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpcclxuICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOlxyXG4gICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOlxyXG4gICAgICAgICAgc3dpdGNoIChjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGU6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCAgY3Vyc29yUG9zVG9DaGVjay5Qb3NBbU5vZGUgXCIke2N1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlfVwiLyR7WG1sQ3Vyc29yUG9zLmdldFhtbEN1cnNvclBvc2l0aW9uRGVidWdOYW1lKGN1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlKX1cIiBgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgIHBhcmVudE5vZGUubm9kZVR5cGUgXCIke3BhcmVudE5vZGUubm9kZVR5cGV9XCJgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyZW50Tm9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdWJFbGVtZW50TmFtZXMoeHNkTm9kZTogTm9kZSwgYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzOiBzdHJpbmdbXSwgZGVwdGg6IG51bWJlciA9IDApOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgZWxlbWVudE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGVsZW1lbnROYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKHhzZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgIGNvbnN0IGFzRWxlbSA9IHhzZE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgaWYgKGFzRWxlbSkge1xyXG4gICAgICAgIGlmIChhc0VsZW0ubG9jYWxOYW1lID09PSAnZWxlbWVudCcpIHtcclxuICAgICAgICAgIGVsZW1lbnROYW1lID0gYXNFbGVtLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbGVtZW50TmFtZSkge1xyXG4gICAgICAvLyBjb25zb2xlLndhcm4oJ2ZvdW5kOiAnICsgSlNPTi5zdHJpbmdpZnkoZWxlbWVudE5hbWUpICsgJyBkZXB0aDogJyArIGRlcHRoKTtcclxuICAgICAgaWYgKGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICBpZiAoYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLmluZGV4T2YoZWxlbWVudE5hbWUpICE9PSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lczsgLy8gZWxlbWVudCByZWN1cnNpb24gZGV0ZWN0ZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgcGFyZW50IGVsZW1lbnQgaXRzZWxmIC0gc2tpcCFcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWxlbWVudE5hbWVzID0gZWxlbWVudE5hbWVzLmNvbmNhdChlbGVtZW50TmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMucHVzaChlbGVtZW50TmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2RlcykgYXMgTm9kZVtdO1xyXG5cclxuICAgIGRlcHRoKys7XHJcblxyXG4gICAgY2hpbGROb2Rlcy5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbSA9IGNoaWxkIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGNoaWxkRWxlbSkge1xyXG4gICAgICAgICAgc3dpdGNoIChjaGlsZEVsZW0ubG9jYWxOYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXhUeXBlJzpcclxuICAgICAgICAgICAgY2FzZSAnc2VxdWVuY2UnOlxyXG4gICAgICAgICAgICBjYXNlICdjaG9pY2UnOlxyXG4gICAgICAgICAgICBjYXNlICdzaW1wbGVDb250ZW50JzpcclxuICAgICAgICAgICAgY2FzZSAnZXh0ZW5zaW9uJzpcclxuICAgICAgICAgICAgICBlbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuY29uY2F0KHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMsIGRlcHRoKSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdlbGVtZW50JzpcclxuICAgICAgICAgICAgICBjb25zdCByZWZuYW1lID0gY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdyZWYnKTtcclxuICAgICAgICAgICAgICBpZiAocmVmbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmZXJlZE5vZGUgPSB0aGlzLnhzZE5vZGVzLmdldChyZWZuYW1lLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuY29uY2F0KHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKHJlZmVyZWROb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMsIGRlcHRoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCByZWZlcmVkIGVsZW1lbnQgXCIke3JlZm5hbWV9XCIgZm9yIGVsZW1lbnQgXCIke2NoaWxkRWxlbS5vdXRlckhUTUx9XCIgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lcyA9IGVsZW1lbnROYW1lcy5jb25jYXQodGhpcy5nZXRTdWJFbGVtZW50TmFtZXMoY2hpbGQsIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcywgZGVwdGgpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdhdHRyaWJ1dGUnOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gY2hpbGRFbGVtLmxvY2FsbmFtZSBcIiR7Y2hpbGRFbGVtLmxvY2FsTmFtZX1cIi8ke2NoaWxkRWxlbS5vdXRlckhUTUx9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZWxlbWVudE5hbWVzO1xyXG4gIH1cclxufVxyXG4iXX0=