@wikipathways/cxml
Version:
Advanced schema-aware streaming XML parser
235 lines • 31.2 kB
JavaScript
"use strict";
// This file is part of cxml, copyright (c) 2016 BusFaster Ltd.
// Released under the MIT license, see LICENSE.
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var MemberRef_1 = require("./MemberRef");
var Rule_1 = require("../parser/Rule");
var Item_1 = require("./Item");
/** Parse name from schema in serialized JSON format.
* If name used in XML is not a valid JavaScript identifier, the schema
* definition will be in format <cleaned up name for JavaScript>:<XML name>. */
function parseName(name) {
var splitPos = name.indexOf(':');
var safeName;
if (splitPos >= 0) {
safeName = name.substr(0, splitPos);
name = name.substr(splitPos + 1);
}
else
safeName = name;
return ({
name: name,
safeName: safeName
});
}
exports.parseName = parseName;
/** Create a new data object inheriting default values from another. */
function inherit(parentObject) {
function Proxy() { }
Proxy.prototype = parentObject;
return (new Proxy());
}
function defineSubstitute(substitute, proxy) {
var ref = MemberRef_1.MemberRef.parseSpec([substitute, 0, substitute.safeName], substitute.namespace, proxy);
return (ref);
}
/** Type specification defining attributes and children. */
var TypeSpec = /** @class */ (function (_super) {
__extends(TypeSpec, _super);
function TypeSpec(name, namespace, spec) {
var _this = _super.call(this, TypeSpec, spec[1]) || this;
_this.optionalList = [];
_this.requiredList = [];
if (name) {
var parts = parseName(name);
_this.name = parts.name;
_this.safeName = parts.safeName;
}
_this.namespace = namespace;
if (spec) {
_this.flags = spec[0];
_this.childSpecList = spec[2];
_this.attributeSpecList = spec[3];
}
return _this;
}
TypeSpec.prototype.getProto = function () { return (this.proto); };
TypeSpec.prototype.getType = function () { return (this.rule); };
TypeSpec.prototype.init = function () {
// This function hasn't been called for this type yet by setParent,
// but something must by now have called it for the parent type.
var dependency = this.dependency;
var parent = Rule_1.Member;
if (dependency && dependency != this)
parent = dependency.proto;
this.proto = /** @class */ (function (_super) {
__extends(XmlType, _super);
function XmlType() {
return _super !== null && _super.apply(this, arguments) || this;
}
return XmlType;
}(parent));
var instanceProto = this.proto.prototype;
instanceProto._exists = true;
instanceProto._namespace = this.namespace.name;
this.placeHolder = new this.proto();
this.placeHolder._exists = false;
this.rule = new Rule_1.Rule(this.proto);
this.proto.rule = this.rule;
this.rule.namespace = this.namespace;
if (dependency) {
this.rule.childTbl = inherit(dependency.rule.childTbl);
this.rule.attributeTbl = inherit(dependency.rule.attributeTbl);
}
else {
this.rule.attributeTbl = {};
this.rule.childTbl = {};
}
this.rule.isPrimitive = !!(this.flags & 1 /* primitive */);
this.rule.isPlainPrimitive = !!(this.flags & 2 /* plainPrimitive */);
this.rule.isList = !!(this.flags & 4 /* list */);
if (this.rule.isPrimitive) {
var primitiveType = this;
var next;
while ((next = primitiveType.dependency) && next != primitiveType)
primitiveType = next;
this.rule.primitiveType = primitiveType.safeName;
}
return (this.rule);
};
TypeSpec.prototype.defineMember = function (ref) {
var typeSpec = ref.member.typeSpecList && ref.member.typeSpecList[0];
var proxySpec = ref.member.proxySpec;
if (proxySpec) {
if (ref.max > 1) {
typeSpec = proxySpec;
}
else {
proxySpec = this;
typeSpec = null;
}
TypeSpec.addSubstitutesToProxy(ref.member, proxySpec.proto.prototype);
}
if (typeSpec) {
var memberType = typeSpec.placeHolder;
var type = (this.proto.prototype);
type[ref.safeName] = (ref.max > 1) ? [memberType] : memberType;
if (ref.min < 1)
this.optionalList.push(ref.safeName);
else
this.requiredList.push(ref.safeName);
}
return (ref);
};
TypeSpec.prototype.getSubstitutes = function () {
return (this.substituteList);
};
TypeSpec.prototype.defineMembers = function () {
var spec;
for (var _i = 0, _a = this.childSpecList; _i < _a.length; _i++) {
spec = _a[_i];
var memberRef = MemberRef_1.MemberRef.parseSpec(spec, this.namespace);
this.addChild(memberRef);
this.defineMember(memberRef);
}
for (var _b = 0, _c = this.attributeSpecList; _b < _c.length; _b++) {
spec = _c[_b];
var attributeRef = MemberRef_1.MemberRef.parseSpec(spec, this.namespace);
if (attributeRef.member.typeSpecList)
this.rule.addAttribute(attributeRef);
this.defineMember(attributeRef);
}
};
TypeSpec.prototype.addSubstitutes = function (headRef, proxy) {
headRef.member.containingTypeList.push({
type: this,
head: headRef,
proxy: proxy
});
headRef.member.proxySpec.tryInit();
for (var _i = 0, _a = headRef.member.proxySpec.getSubstitutes(); _i < _a.length; _i++) {
var substitute = _a[_i];
if (substitute == headRef.member) {
this.rule.addChild(headRef);
}
else {
var substituteRef = defineSubstitute(substitute, proxy);
this.addChild(substituteRef, proxy);
}
}
};
TypeSpec.prototype.addChild = function (memberRef, proxy) {
if (memberRef.member.proxySpec)
this.addSubstitutes(memberRef, proxy || memberRef);
else if (!memberRef.member.isAbstract)
this.rule.addChild(memberRef);
};
TypeSpec.prototype.addSubstitute = function (head, substitute) {
if (this.ready && head.containingTypeList.length) {
// The element's proxy type has already been defined
// so we need to patch other types containing the element.
for (var _i = 0, _a = head.containingTypeList; _i < _a.length; _i++) {
var spec = _a[_i];
var ref = defineSubstitute(substitute, spec.proxy);
spec.type.addChild(ref, spec.proxy);
if (spec.head.max <= 1) {
TypeSpec.addSubstituteToProxy(substitute, spec.type.proto.prototype);
}
}
// Add the substitution to proxy type of the group head,
// and loop if the head further substitutes something else.
while (head) {
TypeSpec.addSubstituteToProxy(substitute, head.proxySpec.proto.prototype);
head = head.dependency;
}
}
this.substituteList.push(substitute);
};
TypeSpec.prototype.addMixin = function (spec) {
this.mixinList.push(spec);
};
/** Remove placeholders from instance prototype. They allow dereferencing
* contents of missing optional child elements without throwing errors.
* @param strict Also remove placeholders for mandatory child elements. */
TypeSpec.prototype.cleanPlaceholders = function (strict) {
var type = (this.proto.prototype);
var nameList = this.optionalList;
if (strict)
nameList = nameList.concat(this.requiredList);
for (var _i = 0, nameList_1 = nameList; _i < nameList_1.length; _i++) {
var name = nameList_1[_i];
delete (type[name]);
}
};
TypeSpec.addSubstituteToProxy = function (substitute, type, head) {
if (substitute == head || !substitute.proxySpec) {
if (!substitute.isAbstract)
type[substitute.safeName] = substitute.typeSpecList[0].placeHolder;
}
else {
TypeSpec.addSubstitutesToProxy(substitute, type);
}
};
TypeSpec.addSubstitutesToProxy = function (member, type) {
for (var _i = 0, _a = member.proxySpec.getSubstitutes(); _i < _a.length; _i++) {
var substitute = _a[_i];
TypeSpec.addSubstituteToProxy(substitute, type, member);
}
};
return TypeSpec;
}(Item_1.Item));
exports.TypeSpec = TypeSpec;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZVNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveG1sL1R5cGVTcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrREFBK0Q7QUFDL0QsK0NBQStDOzs7Ozs7Ozs7Ozs7Ozs7QUFJL0MseUNBQWtEO0FBQ2xELHVDQUF1RDtBQUN2RCwrQkFBNEI7QUFNNUI7O2dGQUVnRjtBQUVoRixTQUFnQixTQUFTLENBQUMsSUFBWTtJQUNyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLElBQUksUUFBZ0IsQ0FBQTtJQUVwQixJQUFHLFFBQVEsSUFBSSxDQUFDLEVBQUU7UUFDakIsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNqQzs7UUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRXZCLE9BQU0sQ0FBQztRQUNOLElBQUksRUFBRSxJQUFJO1FBQ1YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQWJELDhCQWFDO0FBRUQsdUVBQXVFO0FBRXZFLFNBQVMsT0FBTyxDQUFPLFlBQWtCO0lBQ3hDLFNBQVMsS0FBSyxLQUFJLENBQUM7SUFDbkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7SUFDL0IsT0FBTSxDQUFDLElBQUssS0FBZ0MsRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQVNELFNBQVMsZ0JBQWdCLENBQUMsVUFBc0IsRUFBRSxLQUFnQjtJQUNqRSxJQUFJLEdBQUcsR0FBRyxxQkFBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFnQixFQUFFLEtBQUss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QUE7WUFDakIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDeEQ7SUFDRixDQUFDO0lBK0JGLGVBQUM7QUFBRCxDQUFDLEFBbk9ELENBQThCLFdBQUksR0FtT2pDO0FBbk9ZLDRCQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgY3htbCwgY29weXJpZ2h0IChjKSAyMDE2IEJ1c0Zhc3RlciBMdGQuXG4vLyBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBMSUNFTlNFLlxuXG5pbXBvcnQge05hbWVzcGFjZX0gZnJvbSAnLi9OYW1lc3BhY2UnO1xuaW1wb3J0IHtNZW1iZXJTcGVjfSBmcm9tICcuL01lbWJlclNwZWMnO1xuaW1wb3J0IHtNZW1iZXJSZWYsIFJhd1JlZlNwZWN9IGZyb20gJy4vTWVtYmVyUmVmJztcbmltcG9ydCB7UnVsZSwgUnVsZUNsYXNzLCBNZW1iZXJ9IGZyb20gJy4uL3BhcnNlci9SdWxlJztcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi9JdGVtJztcblxuLyoqIFR1cGxlOiBmbGFncywgcGFyZW50IHR5cGUgSUQsIGNoaWxkIGVsZW1lbnQgbGlzdCwgYXR0cmlidXRlIGxpc3QuXG4gICogU2VyaWFsaXplZCBKU09OIGZvcm1hdC4gKi9cbmV4cG9ydCB0eXBlIFJhd1R5cGVTcGVjID0gWyBudW1iZXIsIG51bWJlciwgUmF3UmVmU3BlY1tdLCBSYXdSZWZTcGVjW10gXTtcblxuLyoqIFBhcnNlIG5hbWUgZnJvbSBzY2hlbWEgaW4gc2VyaWFsaXplZCBKU09OIGZvcm1hdC5cbiAgKiBJZiBuYW1lIHVzZWQgaW4gWE1MIGlzIG5vdCBhIHZhbGlkIEphdmFTY3JpcHQgaWRlbnRpZmllciwgdGhlIHNjaGVtYVxuICAqIGRlZmluaXRpb24gd2lsbCBiZSBpbiBmb3JtYXQgPGNsZWFuZWQgdXAgbmFtZSBmb3IgSmF2YVNjcmlwdD46PFhNTCBuYW1lPi4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTmFtZShuYW1lOiBzdHJpbmcpIHtcblx0dmFyIHNwbGl0UG9zID0gbmFtZS5pbmRleE9mKCc6Jyk7XG5cdHZhciBzYWZlTmFtZTogc3RyaW5nXG5cblx0aWYoc3BsaXRQb3MgPj0gMCkge1xuXHRcdHNhZmVOYW1lID0gbmFtZS5zdWJzdHIoMCwgc3BsaXRQb3MpO1xuXHRcdG5hbWUgPSBuYW1lLnN1YnN0cihzcGxpdFBvcyArIDEpO1xuXHR9IGVsc2Ugc2FmZU5hbWUgPSBuYW1lO1xuXG5cdHJldHVybih7XG5cdFx0bmFtZTogbmFtZSxcblx0XHRzYWZlTmFtZTogc2FmZU5hbWVcblx0fSk7XG59XG5cbi8qKiBDcmVhdGUgYSBuZXcgZGF0YSBvYmplY3QgaW5oZXJpdGluZyBkZWZhdWx0IHZhbHVlcyBmcm9tIGFub3RoZXIuICovXG5cbmZ1bmN0aW9uIGluaGVyaXQ8VHlwZT4ocGFyZW50T2JqZWN0OiBUeXBlKSB7XG5cdGZ1bmN0aW9uIFByb3h5KCkge31cblx0UHJveHkucHJvdG90eXBlID0gcGFyZW50T2JqZWN0O1xuXHRyZXR1cm4obmV3IChQcm94eSBhcyBhbnkgYXMgeyBuZXcoKTogVHlwZSB9KSgpKTtcbn1cblxuLyoqIFJlcHJlc2VudHMgdGhlIHByb3RvdHlwZSBvZiBSdWxlQ2xhc3MuXG4gICogQ29udGFpbnMgcGxhY2Vob2xkZXJzIGZvciBhbnkgbWlzc2luZyBtZW1iZXJzLiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVNZW1iZXJzIHtcblx0W25hbWU6IHN0cmluZ106IE1lbWJlciB8IE1lbWJlcltdO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVTdWJzdGl0dXRlKHN1YnN0aXR1dGU6IE1lbWJlclNwZWMsIHByb3h5OiBNZW1iZXJSZWYpIHtcblx0dmFyIHJlZiA9IE1lbWJlclJlZi5wYXJzZVNwZWMoW3N1YnN0aXR1dGUsIDAsIHN1YnN0aXR1dGUuc2FmZU5hbWVdLCBzdWJzdGl0dXRlLm5hbWVzcGFjZSBhcyBhbnksIHByb3h5KTtcblxuXHRyZXR1cm4ocmVmKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gVHlwZUZsYWcge1xuXHQvKiogVHlwZSBjb250YWlucyB0ZXh0IHRoYXQgZ2V0cyBwYXJzZWQgdG8gSmF2YVNjcmlwdCBwcmltaXRpdmVzLiAqL1xuXHRwcmltaXRpdmUgPSAxLFxuXHQvKiogVHlwZSBvbmx5IGNvbnRhaW5zIHRleHQsIG5vIHdyYXBwZXIgb2JqZWN0IGlzIG5lZWRlZCB0byBob2xkIGl0cyBhdHRyaWJ1dGVzLiAqL1xuXHRwbGFpblByaW1pdGl2ZSA9IDIsXG5cdC8qKiBUeXBlIGNvbnRhaW5zIHRleHQgd2l0aCBhIGxpc3Qgb2Ygd2hpdGVzcGFjZS1zZXBhcmF0ZWQgaXRlbXMuICovXG5cdGxpc3QgPSA0XG59XG5cbi8qKiBUeXBlIHNwZWNpZmljYXRpb24gZGVmaW5pbmcgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW4uICovXG5cbmV4cG9ydCBjbGFzcyBUeXBlU3BlYyBleHRlbmRzIEl0ZW0ge1xuXHRjb25zdHJ1Y3RvcihuYW1lPzogc3RyaW5nLCBuYW1lc3BhY2U/OiBOYW1lc3BhY2UsIHNwZWM/OiBSYXdUeXBlU3BlYykge1xuXHRcdHN1cGVyKFR5cGVTcGVjLCBzcGVjWzFdKTtcblxuXHRcdGlmKG5hbWUpIHtcblx0XHRcdHZhciBwYXJ0cyA9IHBhcnNlTmFtZShuYW1lKTtcblx0XHRcdHRoaXMubmFtZSA9IHBhcnRzLm5hbWU7XG5cdFx0XHR0aGlzLnNhZmVOYW1lID0gcGFydHMuc2FmZU5hbWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cblx0XHRpZihzcGVjKSB7XG5cdFx0XHR0aGlzLmZsYWdzID0gc3BlY1swXTtcblx0XHRcdHRoaXMuY2hpbGRTcGVjTGlzdCA9IHNwZWNbMl07XG5cdFx0XHR0aGlzLmF0dHJpYnV0ZVNwZWNMaXN0ID0gc3BlY1szXTtcblx0XHR9XG5cdH1cblxuXHRnZXRQcm90bygpIHsgcmV0dXJuKHRoaXMucHJvdG8pOyB9XG5cblx0Z2V0VHlwZSgpIHsgcmV0dXJuKHRoaXMucnVsZSk7IH1cblxuXHRpbml0KCkge1xuXHRcdC8vIFRoaXMgZnVuY3Rpb24gaGFzbid0IGJlZW4gY2FsbGVkIGZvciB0aGlzIHR5cGUgeWV0IGJ5IHNldFBhcmVudCxcblx0XHQvLyBidXQgc29tZXRoaW5nIG11c3QgYnkgbm93IGhhdmUgY2FsbGVkIGl0IGZvciB0aGUgcGFyZW50IHR5cGUuXG5cblx0XHR2YXIgZGVwZW5kZW5jeSA9IHRoaXMuZGVwZW5kZW5jeSBhcyBUeXBlU3BlYztcblx0XHRsZXQgcGFyZW50ID0gTWVtYmVyO1xuXG5cdFx0aWYoZGVwZW5kZW5jeSAmJiBkZXBlbmRlbmN5ICE9IHRoaXMpIHBhcmVudCA9IGRlcGVuZGVuY3kucHJvdG87XG5cblx0XHR0aGlzLnByb3RvID0gY2xhc3MgWG1sVHlwZSBleHRlbmRzIHBhcmVudCB7fTtcblxuXHRcdHZhciBpbnN0YW5jZVByb3RvID0gdGhpcy5wcm90by5wcm90b3R5cGUgYXMgTWVtYmVyO1xuXHRcdGluc3RhbmNlUHJvdG8uX2V4aXN0cyA9IHRydWU7XG5cdFx0aW5zdGFuY2VQcm90by5fbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2UubmFtZTtcblxuXHRcdHRoaXMucGxhY2VIb2xkZXIgPSBuZXcgdGhpcy5wcm90bygpO1xuXHRcdHRoaXMucGxhY2VIb2xkZXIuX2V4aXN0cyA9IGZhbHNlO1xuXHRcdHRoaXMucnVsZSA9IG5ldyBSdWxlKHRoaXMucHJvdG8pO1xuXHRcdHRoaXMucHJvdG8ucnVsZSA9IHRoaXMucnVsZTtcblx0XHR0aGlzLnJ1bGUubmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7XG5cblx0XHRpZihkZXBlbmRlbmN5KSB7XG5cdFx0XHR0aGlzLnJ1bGUuY2hpbGRUYmwgPSBpbmhlcml0KGRlcGVuZGVuY3kucnVsZS5jaGlsZFRibCk7XG5cdFx0XHR0aGlzLnJ1bGUuYXR0cmlidXRlVGJsID0gaW5oZXJpdChkZXBlbmRlbmN5LnJ1bGUuYXR0cmlidXRlVGJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5ydWxlLmF0dHJpYnV0ZVRibCA9IHt9O1xuXHRcdFx0dGhpcy5ydWxlLmNoaWxkVGJsID0ge307XG5cdFx0fVxuXG5cdFx0dGhpcy5ydWxlLmlzUHJpbWl0aXZlID0gISEodGhpcy5mbGFncyAmIFR5cGVGbGFnLnByaW1pdGl2ZSk7XG5cdFx0dGhpcy5ydWxlLmlzUGxhaW5QcmltaXRpdmUgPSAhISh0aGlzLmZsYWdzICYgVHlwZUZsYWcucGxhaW5QcmltaXRpdmUpO1xuXHRcdHRoaXMucnVsZS5pc0xpc3QgPSAhISh0aGlzLmZsYWdzICYgVHlwZUZsYWcubGlzdCk7XG5cblx0XHRpZih0aGlzLnJ1bGUuaXNQcmltaXRpdmUpIHtcblx0XHRcdHZhciBwcmltaXRpdmVUeXBlOiBJdGVtID0gdGhpcztcblx0XHRcdHZhciBuZXh0OiBJdGVtO1xuXG5cdFx0XHR3aGlsZSgobmV4dCA9IHByaW1pdGl2ZVR5cGUuZGVwZW5kZW5jeSkgJiYgbmV4dCAhPSBwcmltaXRpdmVUeXBlKSBwcmltaXRpdmVUeXBlID0gbmV4dDtcblxuXHRcdFx0dGhpcy5ydWxlLnByaW1pdGl2ZVR5cGUgPSAocHJpbWl0aXZlVHlwZSBhcyBUeXBlU3BlYykuc2FmZU5hbWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuKHRoaXMucnVsZSk7XG5cdH1cblxuXHRwcml2YXRlIGRlZmluZU1lbWJlcihyZWY6IE1lbWJlclJlZikge1xuXHRcdHZhciB0eXBlU3BlYyA9IHJlZi5tZW1iZXIudHlwZVNwZWNMaXN0ICYmIHJlZi5tZW1iZXIudHlwZVNwZWNMaXN0WzBdO1xuXHRcdHZhciBwcm94eVNwZWMgPSByZWYubWVtYmVyLnByb3h5U3BlYztcblxuXHRcdGlmKHByb3h5U3BlYykge1xuXHRcdFx0aWYocmVmLm1heCA+IDEpIHtcblx0XHRcdFx0dHlwZVNwZWMgPSBwcm94eVNwZWM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm94eVNwZWMgPSB0aGlzO1xuXHRcdFx0XHR0eXBlU3BlYyA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdFR5cGVTcGVjLmFkZFN1YnN0aXR1dGVzVG9Qcm94eShyZWYubWVtYmVyLCBwcm94eVNwZWMucHJvdG8ucHJvdG90eXBlKTtcblx0XHR9XG5cblx0XHRpZih0eXBlU3BlYykge1xuXHRcdFx0dmFyIG1lbWJlclR5cGUgPSB0eXBlU3BlYy5wbGFjZUhvbGRlcjtcblx0XHRcdHZhciB0eXBlID0gKHRoaXMucHJvdG8ucHJvdG90eXBlKSBhcyBSdWxlTWVtYmVycztcblxuXHRcdFx0dHlwZVtyZWYuc2FmZU5hbWVdID0gKHJlZi5tYXggPiAxKSA/IFttZW1iZXJUeXBlXSA6IG1lbWJlclR5cGU7XG5cblx0XHRcdGlmKHJlZi5taW4gPCAxKSB0aGlzLm9wdGlvbmFsTGlzdC5wdXNoKHJlZi5zYWZlTmFtZSk7XG5cdFx0XHRlbHNlIHRoaXMucmVxdWlyZWRMaXN0LnB1c2gocmVmLnNhZmVOYW1lKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ocmVmKTtcblx0fVxuXG5cdGdldFN1YnN0aXR1dGVzKCkge1xuXHRcdHJldHVybih0aGlzLnN1YnN0aXR1dGVMaXN0KTtcblx0fVxuXG5cdGRlZmluZU1lbWJlcnMoKSB7XG5cdFx0dmFyIHNwZWM6IFJhd1JlZlNwZWM7XG5cblx0XHRmb3Ioc3BlYyBvZiB0aGlzLmNoaWxkU3BlY0xpc3QpIHtcblx0XHRcdHZhciBtZW1iZXJSZWYgPSBNZW1iZXJSZWYucGFyc2VTcGVjKHNwZWMsIHRoaXMubmFtZXNwYWNlKTtcblx0XHRcdHRoaXMuYWRkQ2hpbGQobWVtYmVyUmVmKTtcblx0XHRcdHRoaXMuZGVmaW5lTWVtYmVyKG1lbWJlclJlZik7XG5cdFx0fVxuXG5cdFx0Zm9yKHNwZWMgb2YgdGhpcy5hdHRyaWJ1dGVTcGVjTGlzdCkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZVJlZiA9IE1lbWJlclJlZi5wYXJzZVNwZWMoc3BlYywgdGhpcy5uYW1lc3BhY2UpO1xuXHRcdFx0aWYoYXR0cmlidXRlUmVmLm1lbWJlci50eXBlU3BlY0xpc3QpIHRoaXMucnVsZS5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlUmVmKTtcblx0XHRcdHRoaXMuZGVmaW5lTWVtYmVyKGF0dHJpYnV0ZVJlZik7XG5cdFx0fVxuXHR9XG5cblx0YWRkU3Vic3RpdHV0ZXMoaGVhZFJlZjogTWVtYmVyUmVmLCBwcm94eTogTWVtYmVyUmVmKSB7XG5cdFx0aGVhZFJlZi5tZW1iZXIuY29udGFpbmluZ1R5cGVMaXN0LnB1c2goe1xuXHRcdFx0dHlwZTogdGhpcyxcblx0XHRcdGhlYWQ6IGhlYWRSZWYsXG5cdFx0XHRwcm94eTogcHJveHlcblx0XHR9KTtcblx0XHRoZWFkUmVmLm1lbWJlci5wcm94eVNwZWMudHJ5SW5pdCgpO1xuXG5cdFx0Zm9yKHZhciBzdWJzdGl0dXRlIG9mIGhlYWRSZWYubWVtYmVyLnByb3h5U3BlYy5nZXRTdWJzdGl0dXRlcygpKSB7XG5cdFx0XHRpZihzdWJzdGl0dXRlID09IGhlYWRSZWYubWVtYmVyKSB7XG5cdFx0XHRcdHRoaXMucnVsZS5hZGRDaGlsZChoZWFkUmVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBzdWJzdGl0dXRlUmVmID0gZGVmaW5lU3Vic3RpdHV0ZShzdWJzdGl0dXRlLCBwcm94eSk7XG5cdFx0XHRcdHRoaXMuYWRkQ2hpbGQoc3Vic3RpdHV0ZVJlZiwgcHJveHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFkZENoaWxkKG1lbWJlclJlZjogTWVtYmVyUmVmLCBwcm94eT86IE1lbWJlclJlZikge1xuXHRcdGlmKG1lbWJlclJlZi5tZW1iZXIucHJveHlTcGVjKSB0aGlzLmFkZFN1YnN0aXR1dGVzKG1lbWJlclJlZiwgcHJveHkgfHwgbWVtYmVyUmVmKTtcblx0XHRlbHNlIGlmKCFtZW1iZXJSZWYubWVtYmVyLmlzQWJzdHJhY3QpIHRoaXMucnVsZS5hZGRDaGlsZChtZW1iZXJSZWYpO1xuXHR9XG5cblx0YWRkU3Vic3RpdHV0ZShoZWFkOiBNZW1iZXJTcGVjLCBzdWJzdGl0dXRlOiBNZW1iZXJTcGVjKSB7XG5cdFx0aWYodGhpcy5yZWFkeSAmJiBoZWFkLmNvbnRhaW5pbmdUeXBlTGlzdC5sZW5ndGgpIHtcblx0XHRcdC8vIFRoZSBlbGVtZW50J3MgcHJveHkgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWRcblx0XHRcdC8vIHNvIHdlIG5lZWQgdG8gcGF0Y2ggb3RoZXIgdHlwZXMgY29udGFpbmluZyB0aGUgZWxlbWVudC5cblxuXHRcdFx0Zm9yKHZhciBzcGVjIG9mIGhlYWQuY29udGFpbmluZ1R5cGVMaXN0KSB7XG5cdFx0XHRcdHZhciByZWYgPSBkZWZpbmVTdWJzdGl0dXRlKHN1YnN0aXR1dGUsIHNwZWMucHJveHkpO1xuXHRcdFx0XHRzcGVjLnR5cGUuYWRkQ2hpbGQocmVmLCBzcGVjLnByb3h5KTtcblxuXHRcdFx0XHRpZihzcGVjLmhlYWQubWF4IDw9IDEpIHtcblx0XHRcdFx0XHRUeXBlU3BlYy5hZGRTdWJzdGl0dXRlVG9Qcm94eShzdWJzdGl0dXRlLCBzcGVjLnR5cGUucHJvdG8ucHJvdG90eXBlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdGhlIHN1YnN0aXR1dGlvbiB0byBwcm94eSB0eXBlIG9mIHRoZSBncm91cCBoZWFkLFxuXHRcdFx0Ly8gYW5kIGxvb3AgaWYgdGhlIGhlYWQgZnVydGhlciBzdWJzdGl0dXRlcyBzb21ldGhpbmcgZWxzZS5cblxuXHRcdFx0d2hpbGUoaGVhZCkge1xuXHRcdFx0XHRUeXBlU3BlYy5hZGRTdWJzdGl0dXRlVG9Qcm94eShzdWJzdGl0dXRlLCBoZWFkLnByb3h5U3BlYy5wcm90by5wcm90b3R5cGUpO1xuXHRcdFx0XHRoZWFkID0gaGVhZC5kZXBlbmRlbmN5IGFzIE1lbWJlclNwZWM7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zdWJzdGl0dXRlTGlzdC5wdXNoKHN1YnN0aXR1dGUpO1xuXHR9XG5cblx0YWRkTWl4aW4oc3BlYzogVHlwZVNwZWMpIHtcblx0XHR0aGlzLm1peGluTGlzdC5wdXNoKHNwZWMpO1xuXHR9XG5cblx0LyoqIFJlbW92ZSBwbGFjZWhvbGRlcnMgZnJvbSBpbnN0YW5jZSBwcm90b3R5cGUuIFRoZXkgYWxsb3cgZGVyZWZlcmVuY2luZ1xuXHQgICogY29udGVudHMgb2YgbWlzc2luZyBvcHRpb25hbCBjaGlsZCBlbGVtZW50cyB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cblx0ICAqIEBwYXJhbSBzdHJpY3QgQWxzbyByZW1vdmUgcGxhY2Vob2xkZXJzIGZvciBtYW5kYXRvcnkgY2hpbGQgZWxlbWVudHMuICovXG5cblx0Y2xlYW5QbGFjZWhvbGRlcnMoc3RyaWN0PzogYm9vbGVhbikge1xuXHRcdHZhciB0eXBlID0gKHRoaXMucHJvdG8ucHJvdG90eXBlKSBhcyBSdWxlTWVtYmVycztcblx0XHR2YXIgbmFtZUxpc3QgPSB0aGlzLm9wdGlvbmFsTGlzdDtcblxuXHRcdGlmKHN0cmljdCkgbmFtZUxpc3QgPSBuYW1lTGlzdC5jb25jYXQodGhpcy5yZXF1aXJlZExpc3QpO1xuXG5cdFx0Zm9yKHZhciBuYW1lIG9mIG5hbWVMaXN0KSB7XG5cdFx0XHRkZWxldGUodHlwZVtuYW1lXSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgYWRkU3Vic3RpdHV0ZVRvUHJveHkoc3Vic3RpdHV0ZTogTWVtYmVyU3BlYywgdHlwZTogUnVsZU1lbWJlcnMsIGhlYWQ/OiBNZW1iZXJTcGVjKSB7XG5cdFx0aWYoc3Vic3RpdHV0ZSA9PSBoZWFkIHx8ICFzdWJzdGl0dXRlLnByb3h5U3BlYykge1xuXHRcdFx0aWYoIXN1YnN0aXR1dGUuaXNBYnN0cmFjdCkgdHlwZVtzdWJzdGl0dXRlLnNhZmVOYW1lXSA9IHN1YnN0aXR1dGUudHlwZVNwZWNMaXN0WzBdLnBsYWNlSG9sZGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUeXBlU3BlYy5hZGRTdWJzdGl0dXRlc1RvUHJveHkoc3Vic3RpdHV0ZSwgdHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgYWRkU3Vic3RpdHV0ZXNUb1Byb3h5KG1lbWJlcjogTWVtYmVyU3BlYywgdHlwZTogUnVsZU1lbWJlcnMpIHtcblx0XHRmb3IodmFyIHN1YnN0aXR1dGUgb2YgbWVtYmVyLnByb3h5U3BlYy5nZXRTdWJzdGl0dXRlcygpKSB7XG5cdFx0XHRUeXBlU3BlYy5hZGRTdWJzdGl0dXRlVG9Qcm94eShzdWJzdGl0dXRlLCB0eXBlLCBtZW1iZXIpO1xuXHRcdH1cblx0fVxuXG5cdG5hbWVzcGFjZTogTmFtZXNwYWNlO1xuXHQvLyBUT0RPOiBJcyBhIHNlcGFyYXRlIG5hbWUgYW5kIHNhZmVOYW1lIG5lZWRlZCBmb3IgYW55dGhpbmcgaGVyZT9cblx0Ly8gTWF5YmUgZm9yIGZ1dHVyZSB1c2Ugd2hlbiBjeHNkIGNhbiBpbXBvcnQgcGFyc2VkIG5hbWVzcGFjZXM/XG5cdG5hbWU6IHN0cmluZztcblx0c2FmZU5hbWU6IHN0cmluZztcblx0ZmxhZ3M6IG51bWJlcjtcblxuXHRjaGlsZFNwZWNMaXN0OiBSYXdSZWZTcGVjW107XG5cdGF0dHJpYnV0ZVNwZWNMaXN0OiBSYXdSZWZTcGVjW107XG5cdHN1YnN0aXR1dGVMaXN0OiBNZW1iZXJTcGVjW107XG5cblx0LyoqIE90aGVyIHR5cGVzIGFkZGVkIGFzIG1peGlucy4gKi9cblx0bWl4aW5MaXN0OiBUeXBlU3BlY1tdO1xuXG5cdG9wdGlvbmFsTGlzdDogc3RyaW5nW10gPSBbXTtcblx0cmVxdWlyZWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuXG5cdGlzUHJveHk6IGJvb2xlYW47XG5cblx0LyoqIEZvciBhbiBhbm9ueW1vdXMgdHlwZSwgdGhlIG1lbWJlciAob2YgYW5vdGhlciB0eXBlKSB0aGF0IGl0IGRlZmluZXMuXG5cdCAgKiBVc2VkIGZvciBnaXZpbmcgdGhlIHR5cGUgYSBkZXNjcmlwdGl2ZSBuYW1lLiAqL1xuXHRjb250YWluaW5nVHlwZTogVHlwZVNwZWM7XG5cdGNvbnRhaW5pbmdSZWY6IE1lbWJlclJlZjtcblxuXHRjb21tZW50OiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBydWxlOiBSdWxlO1xuXHRwcml2YXRlIHByb3RvOiBSdWxlQ2xhc3M7XG5cdHByaXZhdGUgcGxhY2VIb2xkZXI6IE1lbWJlcjtcbn1cbiJdfQ==