@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
137 lines (136 loc) • 21.7 kB
JavaScript
"use strict";
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: "Module" }
});
const require_NBTDefinitions = require("./NBTDefinitions.cjs.cjs");
const require_Allocation = require("./Allocation.cjs.cjs");
const require_NBTStreamReader = require("./NBTStreamReader.cjs.cjs");
const require_NBTTagCompound = require("./NBTTagCompound.cjs.cjs");
//#region src/NBTReader.ts
var NBTReader = class extends require_NBTStreamReader.default {
constructor(input, byteOrder) {
super(input, byteOrder);
}
parseList() {
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
if (this.readByteValue().getValue() !== require_NBTDefinitions.NBTDefinitions.TAG_LIST) throw new Error("Invalid NBT Data: Not list tag found");
this.readStringValue();
return this.readTagListValue();
}
parse() {
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
if (this.readByteValue().getValue() !== require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND) throw new Error("Invalid NBT Data: No root tag found");
const name = this.readStringValue().getValue();
const root = this.readTagCompoundValue();
root.setName(name);
return root;
}
readTagCompoundValue() {
this.alterAllocationLimit(require_Allocation.Allocation.COMPOUND);
const compound = new require_NBTTagCompound.default();
this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false);
let tagID = this.readByteValue().getValue();
while (tagID !== require_NBTDefinitions.NBTDefinitions.TAG_END) {
switch (tagID) {
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE:
compound.addValue(this.readStringValue().getValue(), this.readByteValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_SHORT:
compound.addValue(this.readStringValue().getValue(), this.readShortValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT:
compound.addValue(this.readStringValue().getValue(), this.readIntValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LONG:
compound.addValue(this.readStringValue().getValue(), this.readLongValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT:
compound.addValue(this.readStringValue().getValue(), this.readFloatValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
compound.addValue(this.readStringValue().getValue(), this.readDoubleValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_STRING:
compound.addValue(this.readStringValue().getValue(), this.readStringValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LIST:
compound.addValue(this.readStringValue().getValue(), this.readTagListValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
const name = this.readStringValue().getValue();
const child = this.readTagCompoundValue();
child.setName(name);
compound.addChild(child);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue());
break;
default: throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`);
}
this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false);
tagID = this.readByteValue().getValue();
}
return compound;
}
readTagListValue() {
this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false);
const listType = this.readByteValue().getValue();
let listLength = this.readIntValue().getValue();
this.alterAllocationLimit(require_Allocation.Allocation.ARRAY_LIST);
this.alterAllocationLimit(require_Allocation.Allocation.REFERENCE);
const backingList = /* @__PURE__ */ new Set();
switch (listType) {
case require_NBTDefinitions.NBTDefinitions.TAG_END:
listLength = 0;
break;
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE:
this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_SHORT:
this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT:
this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readIntValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LONG:
this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readLongValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT:
this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readFloatValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readDoubleValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
for (let i = 0; i < listLength; i++) backingList.add(this.readByteArrayValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_STRING:
for (let i = 0; i < listLength; i++) backingList.add(this.readStringValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LIST:
for (let i = 0; i < listLength; i++) backingList.add(this.readTagListValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
for (let i = 0; i < listLength; i++) backingList.add(this.readTagCompoundValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
for (let i = 0; i < listLength; i++) backingList.add(this.readIntArrayValue());
break;
default: throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`);
}
return backingList;
}
};
//#endregion
exports.default = NBTReader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL05CVFJlYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBBbGxvY2F0aW9uIH0gZnJvbSAnLi9BbGxvY2F0aW9uJztcbmltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgeyBOQlREZWZpbml0aW9ucyB9IGZyb20gJy4vTkJURGVmaW5pdGlvbnMnO1xuaW1wb3J0IE5CVFN0cmVhbVJlYWRlciBmcm9tICcuL05CVFN0cmVhbVJlYWRlcic7XG5pbXBvcnQgTkJUVGFnQ29tcG91bmQgZnJvbSAnLi9OQlRUYWdDb21wb3VuZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFJlYWRlciBleHRlbmRzIE5CVFN0cmVhbVJlYWRlciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGlucHV0OiBCaW5hcnlTdHJlYW0sIGJ5dGVPcmRlcjogQnl0ZU9yZGVyKSB7XG4gICAgICAgIHN1cGVyKGlucHV0LCBieXRlT3JkZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZUxpc3Q8VGFnVHlwZT4oKTogU2V0PFRhZ1R5cGU+IHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19MSVNUKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBsaXN0IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFkU3RyaW5nVmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZSgpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogMywgJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBlbm91Z2ggZGF0YSB0byByZWFkIG5ldyB0YWcnLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpICE9PSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm8gcm9vdCB0YWcgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgcm9vdDogTkJUVGFnQ29tcG91bmQgPSB0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCk7XG4gICAgICAgIHJvb3Quc2V0TmFtZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVGFnQ29tcG91bmRWYWx1ZSgpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5DT01QT1VORCk7XG4gICAgICAgIGNvbnN0IGNvbXBvdW5kOiBOQlRUYWdDb21wb3VuZCA9IG5ldyBOQlRUYWdDb21wb3VuZCgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDEsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUYWcgSUQgaW4gY29tcG91bmQgdGFnJywgZmFsc2UpO1xuXG4gICAgICAgIGxldCB0YWdJRCA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHdoaWxlICh0YWdJRCAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0VORCkge1xuICAgICAgICAgICAgc3dpdGNoICh0YWdJRCkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkQnl0ZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkSW50VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkRG91YmxlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkOiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0TmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkSW50QXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBVbmtub3duIHRhZyA8JHt0YWdJRH0+YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHRhZyBJRCBpbiB0YWcgY29tcG91bmQnLCBmYWxzZSk7XG4gICAgICAgICAgICB0YWdJRCA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG91bmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVGFnTGlzdFZhbHVlKCk6IFNldDxhbnk+IHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiA1LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgVEFHTGlzdCBoZWFkZXInLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IGxpc3RUeXBlOiBudW1iZXIgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBsZXQgbGlzdExlbmd0aDogbnVtYmVyID0gdGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5BUlJBWV9MSVNUKTtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLlJFRkVSRU5DRSk7XG5cbiAgICAgICAgY29uc3QgYmFja2luZ0xpc3Q6IFNldDxhbnk+ID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHN3aXRjaCAobGlzdFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0VORDpcbiAgICAgICAgICAgICAgICBsaXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dChsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgYnl0ZXMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMiAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBzaG9ydHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgaW50cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGxvbmdzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZExvbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBmbG9hdHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkRmxvYXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgZG91YmxlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEJ5dGVBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke2xpc3RUeXBlfT5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiYWNraW5nTGlzdDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFRQSxJQUFxQixZQUFyQixjQUF1Qyx3QkFBQSxRQUFnQjtDQUNuRCxZQUFtQixPQUFxQixXQUFzQjtFQUMxRCxNQUFNLE9BQU8sU0FBUztDQUMxQjtDQUVBLFlBQTBDO0VBQ3RDLEtBQUssWUFBWSxLQUFLLGNBQWMsSUFBSSxJQUFJLEdBQUcs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