@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
239 lines (234 loc) • 29.4 kB
JavaScript
'use strict';
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const ByteOrder = require('./ByteOrder.cjs.cjs');
const types_ByteVal = require('./types/ByteVal.cjs.cjs');
const types_DoubleVal = require('./types/DoubleVal.cjs.cjs');
const types_FloatVal = require('./types/FloatVal.cjs.cjs');
const types_LongVal = require('./types/LongVal.cjs.cjs');
const NBTDefinitions = require('./NBTDefinitions.cjs.cjs');
const NBTTagCompound = require('./NBTTagCompound.cjs.cjs');
const types_NumberVal = require('./types/NumberVal.cjs.cjs');
const types_ShortVal = require('./types/ShortVal.cjs.cjs');
const types_StringVal = require('./types/StringVal.cjs.cjs');
class NBTWriter {
order;
buf;
useVarint = false;
constructor(out, byteOrder) {
this.buf = out;
this.order = byteOrder;
}
setUseVarint(useVarint) {
this.useVarint = useVarint;
}
writeList(list) {
this.writeTagHeader(NBTDefinitions.NBTDefinitions.TAG_LIST, "");
this.writeListValue(list);
}
writeCompound(compound) {
this.writeTagHeader(NBTDefinitions.NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
this.writeCompoundValue(compound);
}
writeTagHeader(type, name) {
this.writeByteValue(type);
this.writeStringValue(name);
}
writeStringValue(value) {
if (value !== null) {
const bytes = Buffer.from(value, "utf8");
if (this.useVarint) {
this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
} else {
this.writeShortValue(Buffer.byteLength(value));
}
this.buf.write(bytes);
} else if (this.useVarint) {
this.writeByteValue(0);
} else {
this.writeShortValue(0);
}
}
writeByteValue(value) {
this.buf.writeByte(value);
}
writeShortValue(value) {
if (this.order === ByteOrder.ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedShortLE(value);
} else {
this.buf.writeUnsignedShort(value);
}
}
writeIntegerValue(value) {
if (this.useVarint) {
this.buf.writeVarInt(value);
} else if (this.order === ByteOrder.ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedIntLE(value);
} else {
this.buf.writeUnsignedInt(value);
}
}
writeLongValue(value) {
if (this.useVarint) {
this.buf.writeVarLong(value);
} else if (this.order === ByteOrder.ByteOrder.LITTLE_ENDIAN) {
this.buf.writeUnsignedLongLE(value);
} else {
this.buf.writeUnsignedLong(value);
}
}
writeFloatValue(value) {
if (this.order === ByteOrder.ByteOrder.LITTLE_ENDIAN) {
this.buf.writeFloatLE(value);
} else {
this.buf.writeFloat(value);
}
}
writeDoubleValue(value) {
if (this.order === ByteOrder.ByteOrder.LITTLE_ENDIAN) {
this.buf.writeDoubleLE(value);
} else {
this.buf.writeDouble(value);
}
}
writeByteArrayValue(value) {
this.writeIntegerValue(value.length);
this.buf.write(value);
}
writeIntegerArrayValue(value) {
this.writeIntegerValue(value.length);
value.forEach((v) => {
this.writeIntegerValue(v);
});
}
writeListValue(value) {
if (value.size > 0) {
const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
this.writeByteValue(listNbtType);
this.writeIntegerValue(value.size);
for (const rawValue of value) {
switch (listNbtType) {
case NBTDefinitions.NBTDefinitions.TAG_BYTE:
this.writeByteValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_SHORT:
this.writeShortValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_INT:
this.writeIntegerValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_LONG:
this.writeLongValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
this.writeDoubleValue(rawValue);
break;
case NBTDefinitions.NBTDefinitions.TAG_STRING:
this.writeStringValue(rawValue.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_LIST:
this.writeListValue(rawValue);
break;
case NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(rawValue);
break;
case NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerArrayValue(rawValue);
break;
default:
throw new Error("Invalid NBTTagType");
}
}
} else {
this.writeByteValue(NBTDefinitions.NBTDefinitions.TAG_BYTE);
this.writeIntegerValue(0);
}
}
writeCompoundValue(compound) {
for (const [key, value] of compound.entries()) {
const nbtType = this.getNBTTypeFromValue(value);
this.writeTagHeader(nbtType, key);
switch (nbtType) {
case NBTDefinitions.NBTDefinitions.TAG_BYTE:
this.writeByteValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_SHORT:
this.writeShortValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_INT:
this.writeIntegerValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_LONG:
this.writeLongValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
this.writeByteArrayValue(value);
break;
case NBTDefinitions.NBTDefinitions.TAG_STRING:
this.writeStringValue(value.getValue());
break;
case NBTDefinitions.NBTDefinitions.TAG_LIST:
this.writeListValue(value);
break;
case NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(value);
break;
case NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerValue(value);
break;
default:
throw new Error("Invalid NBTTagType");
}
}
this.writeByteValue(NBTDefinitions.NBTDefinitions.TAG_END);
}
getNBTTypeFromValue(value) {
if (value instanceof types_ByteVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_BYTE;
}
if (value instanceof types_ShortVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_SHORT;
}
if (value instanceof types_NumberVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_INT;
}
if (value instanceof types_LongVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_LONG;
}
if (value instanceof types_FloatVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_FLOAT;
}
if (value instanceof types_DoubleVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_DOUBLE;
}
if (value instanceof Buffer) {
return NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY;
}
if (value instanceof types_StringVal.default) {
return NBTDefinitions.NBTDefinitions.TAG_STRING;
}
if (value instanceof Set) {
return NBTDefinitions.NBTDefinitions.TAG_LIST;
}
if (value instanceof NBTTagCompound.default) {
return NBTDefinitions.NBTDefinitions.TAG_COMPOUND;
}
if (Array.isArray(value)) {
return NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY;
}
throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
}
}
exports.default = NBTWriter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRXcml0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFdyaXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcmRlcjogQnl0ZU9yZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmOiBCaW5hcnlTdHJlYW07XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICB0aGlzLmJ1ZiA9IG91dDtcbiAgICAgICAgdGhpcy5vcmRlciA9IGJ5dGVPcmRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVMaXN0KGxpc3Q6IFNldDxhbnk+KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIoTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShsaXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVDb21wb3VuZChjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQsIGNvbXBvdW5kLmdldE5hbWUoKSA/PyAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKGNvbXBvdW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVGFnSGVhZGVyKHR5cGU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodHlwZSk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlU3RyaW5nVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKHZhbHVlLCAndXRmOCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFZhckludChCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZShieXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJ5dGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlQnl0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU2hvcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVmFySW50KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZEludExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRJbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUxvbmdWYWx1ZSh2YWx1ZTogYmlnaW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVWYXJMb25nKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZExvbmdMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkTG9uZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRmxvYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZURvdWJsZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVCeXRlQXJyYXlWYWx1ZSh2YWx1ZTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyQXJyYXlWYWx1ZSh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlTGlzdFZhbHVlKHZhbHVlOiBTZXQ8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3ROYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlLmVudHJpZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShsaXN0TmJ0VHlwZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdE5idFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJBcnJheVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVFRhZ1R5cGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19CWVRFKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlQ29tcG91bmRWYWx1ZShjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29tcG91bmQuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBuYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIobmJ0VHlwZSwga2V5KTtcbiAgICAgICAgICAgIHN3aXRjaCAobmJ0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZUFycmF5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlRUYWdUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19FTkQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZTogYW55KTogTkJURGVmaW5pdGlvbnMge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0lOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19MSVNUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBDYW5ub3QgZGVkdWNlIE5CVCB0eXBlIG9mIGNsYXNzICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0gKCR7dmFsdWV9KWApO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJOQlREZWZpbml0aW9ucyIsIkJ5dGVPcmRlciIsIkJ5dGVWYWwiLCJTaG9ydFZhbCIsIk51bWJlclZhbCIsIkxvbmdWYWwiLCJGbG9hdFZhbCIsIkRvdWJsZVZhbCIsIlN0cmluZ1ZhbCIsIk5CVFRhZ0NvbXBvdW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFZQSxNQUFxQixTQUFVLENBQUE7QUFBQSxFQUNWLEtBQUE7QUFBQSxFQUNBLEdBQUE7QUFBQSxFQUVULFNBQVksR0FBQSxLQUFBO0FBQUEsRUFFYixXQUFBLENBQVksS0FBbUIsU0FBc0IsRUFBQTtBQUN4RCxJQUFBLElBQUEsQ0FBSyxHQUFNLEdBQUEsR0FBQTtBQUNYLElBQUEsSUFBQSxDQUFLLEtBQVEsR0FBQSxTQUFBO0FBQUE7QUFDakIsRUFFTyxhQUFhLFNBQTBCLEVBQUE7QUFDMUMsSUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLFNBQUE7QUFBQTtBQUNyQixFQUVPLFVBQVUsSUFBc0IsRUFBQTtBQUNuQyxJQUFLLElBQUEsQ0FBQSxjQUFBLENBQWVBLDZCQUFlLENBQUEsUUFBQSxFQUFVLEVBQUUsQ0FBQTtBQUMvQyxJQUFBLElBQUEsQ0FBSyxlQUFlLElBQUksQ0FBQTtBQUFBO0FBQzVCLEVBRU8sY0FBYyxRQUFnQyxFQUFBO0FBQ2pELElBQUEsSUFBQSxDQUFLLGVBQWVBLDZCQUFlLENB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