UNPKG

@jsprismarine/nbt

Version:
160 lines (157 loc) • 24.5 kB
import { Allocation } from './Allocation.es.js'; import { NBTDefinitions } from './NBTDefinitions.es.js'; import NBTStreamReader from './NBTStreamReader.es.js'; import NBTTagCompound from './NBTTagCompound.es.js'; class NBTReader extends NBTStreamReader { 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() !== 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() !== 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(Allocation.COMPOUND); const compound = new NBTTagCompound(); this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false); let tagID = this.readByteValue().getValue(); while (tagID !== NBTDefinitions.TAG_END) { switch (tagID) { case NBTDefinitions.TAG_BYTE: compound.addValue(this.readStringValue().getValue(), this.readByteValue()); break; case NBTDefinitions.TAG_SHORT: compound.addValue(this.readStringValue().getValue(), this.readShortValue()); break; case NBTDefinitions.TAG_INT: compound.addValue(this.readStringValue().getValue(), this.readIntValue()); break; case NBTDefinitions.TAG_LONG: compound.addValue(this.readStringValue().getValue(), this.readLongValue()); break; case NBTDefinitions.TAG_FLOAT: compound.addValue(this.readStringValue().getValue(), this.readFloatValue()); break; case NBTDefinitions.TAG_DOUBLE: compound.addValue(this.readStringValue().getValue(), this.readDoubleValue()); break; case NBTDefinitions.TAG_BYTE_ARRAY: compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue()); break; case NBTDefinitions.TAG_STRING: compound.addValue(this.readStringValue().getValue(), this.readStringValue()); break; case NBTDefinitions.TAG_LIST: compound.addValue(this.readStringValue().getValue(), this.readTagListValue()); break; case NBTDefinitions.TAG_COMPOUND: const name = this.readStringValue().getValue(); const child = this.readTagCompoundValue(); child.setName(name); compound.addChild(child); break; case 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(Allocation.ARRAY_LIST); this.alterAllocationLimit(Allocation.REFERENCE); const backingList = /* @__PURE__ */ new Set(); switch (listType) { case NBTDefinitions.TAG_END: listLength = 0; break; case 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 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 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 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 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 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 NBTDefinitions.TAG_BYTE_ARRAY: for (let i = 0; i < listLength; i++) { backingList.add(this.readByteArrayValue()); } break; case NBTDefinitions.TAG_STRING: for (let i = 0; i < listLength; i++) { backingList.add(this.readStringValue()); } break; case NBTDefinitions.TAG_LIST: for (let i = 0; i < listLength; i++) { backingList.add(this.readTagListValue()); } break; case NBTDefinitions.TAG_COMPOUND: for (let i = 0; i < listLength; i++) { backingList.add(this.readTagCompoundValue()); } break; case 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; } } export { NBTReader as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUUmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IEFsbG9jYXRpb24gfSBmcm9tICcuL0FsbG9jYXRpb24nO1xuaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgdHlwZSB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCB7IE5CVERlZmluaXRpb25zIH0gZnJvbSAnLi9OQlREZWZpbml0aW9ucyc7XG5pbXBvcnQgTkJUU3RyZWFtUmVhZGVyIGZyb20gJy4vTkJUU3RyZWFtUmVhZGVyJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUUmVhZGVyIGV4dGVuZHMgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5wdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgc3VwZXIoaW5wdXQsIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlTGlzdDxUYWdUeXBlPigpOiBTZXQ8VGFnVHlwZT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm90IGxpc3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBObyByb290IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCByb290OiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgcm9vdC5zZXROYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdDb21wb3VuZFZhbHVlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkNPTVBPVU5EKTtcbiAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRhZyBJRCBpbiBjb21wb3VuZCB0YWcnLCBmYWxzZSk7XG5cbiAgICAgICAgbGV0IHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgd2hpbGUgKHRhZ0lEICE9PSBOQlREZWZpbml0aW9ucy5UQUdfRU5EKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZ0lEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQ6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXROYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke3RhZ0lEfT5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgdGFnIElEIGluIHRhZyBjb21wb3VuZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdMaXN0VmFsdWUoKTogU2V0PGFueT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUQUdMaXN0IGhlYWRlcicsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgbGlzdFR5cGU6IG51bWJlciA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGxldCBsaXN0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkFSUkFZX0xJU1QpO1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uUkVGRVJFTkNFKTtcblxuICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgc3dpdGNoIChsaXN0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRU5EOlxuICAgICAgICAgICAgICAgIGxpc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgyICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHNob3J0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZ3MgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGZsb2F0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBkb3VibGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7bGlzdFR5cGV9PmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhY2tpbmdMaXN0O1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLE1BQXFCLGtCQUFrQixlQUFnQixDQUFBO0FBQUEsRUFDNUMsV0FBQSxDQUFZLE9BQXFCLFNBQXNCLEVBQUE7QUFDMUQsSUFBQSxLQUFBLENBQU0sT0FBTyxTQUFTLENBQUE7QUFBQTtBQUMxQixFQUVPLFNBQW1DLEdBQUE7QUFDdEMsSUFBQSxJQUFB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