@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
183 lines (182 loc) • 13.4 kB
JavaScript
import { BlockToolType } from "./BlockToolType.es.js";
import { ItemEnchantmentType } from "../item/ItemEnchantmentType.es.js";
import { ItemTieredToolType } from "../item/ItemTieredToolType.es.js";
import { item_id_map } from "@jsprismarine/bedrock-data";
//#region src/block/Block.ts
var Block = class Block {
/**
* The block's numeric block ID.
*/
id;
/**
* The block's namespaced block ID.
*/
name;
/**
* The block's java-edition namespaced block ID.
*/
javaName;
hardness;
meta = 0;
networkId;
nbt = null;
count = 1;
constructor({ id, name, javaName, parentName, hardness }) {
Object.setPrototypeOf(this, Block.prototype);
this.id = id;
this.name = name;
this.javaName = javaName ?? name;
this.hardness = hardness ?? 0;
this.networkId = item_id_map[parentName ?? name];
}
get [Symbol.toStringTag]() {
return `Block(${this.toString()})`;
}
toString() {
return this.name;
}
/**
* Get the Block's namespaced id.
*/
getName() {
return this.name;
}
/**
* Get the Block's meta value.
*/
getMeta() {
return this.meta;
}
/**
* Get the Block's numeric id.
*
* @returns The block's numeric ID.
*/
getId() {
return this.id;
}
/**
* Get the Block's network numeric id.
*/
getNetworkId() {
return this.networkId || this.getId();
}
/**
* Get the Block's hardness value.
*/
getHardness() {
return this.hardness;
}
/**
* Get the Block's break time.
*/
getBreakTime(_item, _server) {
return this.getHardness();
}
/**
* Get the Block's blast resistance.
*/
getBlastResistance() {
return this.getHardness() * 5;
}
/**
* Get the Block's light level emission.
*/
getLightLevel() {
return 0;
}
/**
* Get the Block's flammability.
*/
getFlammability() {
return 0;
}
/**
* Get the Block's required tool type.
*/
getToolType() {
return [BlockToolType.None];
}
/**
* Get the Block's required item tool tier.
*/
getToolHarvestLevel() {
return ItemTieredToolType.None;
}
/**
* Get the Block's drop(s) if the tool is compatible.
*/
getDropsForCompatibleTool(_item, _server) {
return [this];
}
/**
* Get the Block's drop(s) from the current item.
*/
getDrops(item, server) {
if (this.isCompatibleWithTool(item)) {
if (this.isAffectedBySilkTouch() && item?.hasEnchantment(ItemEnchantmentType.SilkTouch)) return this.getSilkTouchDrops(item, server);
return this.getDropsForCompatibleTool(item, server);
}
return [];
}
/**
* Get the Block's drop(s) if silk touch is used.
*/
getSilkTouchDrops(_item, _server) {
return [this];
}
getLightFilter() {
return 15;
}
canPassThrough() {
return false;
}
/**
* Sets if the block can be replaced when place action occurs on it.
*/
canBeReplaced() {
return false;
}
canBePlaced() {
return true;
}
canBeFlowedInto() {
return false;
}
isTransparent() {
return false;
}
/**
* Check if the block is breakable.
*
* @returns `true` if the block is breakable otherwise `false`.
*/
isBreakable() {
return true;
}
/**
* Check if the block is solid.
*
* @returns `true` if the block is solid otherwise `false`.
*/
isSolid() {
return false;
}
isCompatibleWithTool(item) {
const toolType = this.getToolType();
const harvestLevel = this.getToolHarvestLevel();
if (toolType.includes(BlockToolType.None) || harvestLevel <= 0) return true;
if (!item) return false;
if (toolType.includes(item.getToolType()) && item.getToolHarvestLevel() >= harvestLevel) return true;
return false;
}
isAffectedBySilkTouch() {
return true;
}
isPartOfCreativeInventory() {
return true;
}
};
//#endregion
export { Block };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrL0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGl0ZW1faWRfbWFwIGFzIEJsb2NrSWRNYXAgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCB0eXBlIHsgSXRlbSB9IGZyb20gJy4uL2l0ZW0vSXRlbSc7XG5pbXBvcnQgeyBJdGVtRW5jaGFudG1lbnRUeXBlIH0gZnJvbSAnLi4vaXRlbS9JdGVtRW5jaGFudG1lbnRUeXBlJztcbmltcG9ydCB7IEl0ZW1UaWVyZWRUb29sVHlwZSB9IGZyb20gJy4uL2l0ZW0vSXRlbVRpZXJlZFRvb2xUeXBlJztcbmltcG9ydCB7IEJsb2NrVG9vbFR5cGUgfSBmcm9tICcuL0Jsb2NrVG9vbFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIC8qKlxuICAgICAqIFRoZSBibG9jaydzIG51bWVyaWMgYmxvY2sgSUQuXG4gICAgICovXG4gICAgcHVibGljIGlkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBuYW1lc3BhY2VkIGJsb2NrIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBqYXZhLWVkaXRpb24gbmFtZXNwYWNlZCBibG9jayBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgamF2YU5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgaGFyZG5lc3M6IG51bWJlcjtcbiAgICBwdWJsaWMgbWV0YSA9IDA7XG4gICAgcHJpdmF0ZSBuZXR3b3JrSWQ6IG51bWJlcjtcblxuICAgIC8vIFRPRE9cbiAgICBwdWJsaWMgbmJ0ID0gbnVsbDtcbiAgICBwdWJsaWMgY291bnQgPSAxO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGphdmFOYW1lLFxuICAgICAgICBwYXJlbnROYW1lLFxuICAgICAgICBoYXJkbmVzc1xuICAgIH06IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBqYXZhTmFtZT86IHN0cmluZztcbiAgICAgICAgcGFyZW50TmFtZT86IHN0cmluZztcbiAgICAgICAgaGFyZG5lc3M/OiBudW1iZXI7XG4gICAgfSkge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQmxvY2sucHJvdG90eXBlKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmphdmFOYW1lID0gamF2YU5hbWUgPz8gbmFtZTtcbiAgICAgICAgdGhpcy5oYXJkbmVzcyA9IGhhcmRuZXNzID8/IDA7XG5cbiAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSAoQmxvY2tJZE1hcCBhcyBhbnkpW3BhcmVudE5hbWUgPz8gbmFtZV0gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgICAgIHJldHVybiBgQmxvY2soJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmFtZXNwYWNlZCBpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbWV0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWV0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbnVtZXJpYyBpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBibG9jaydzIG51bWVyaWMgSUQuXG4gICAgICovXG4gICAgcHVibGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmV0d29yayBudW1lcmljIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXR3b3JrSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtJZCB8fCB0aGlzLmdldElkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGhhcmRuZXNzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXJkbmVzcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXJkbmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgYnJlYWsgdGltZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QnJlYWtUaW1lKF9pdGVtOiBJdGVtIHwgbnVsbCwgX3NlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhcmRuZXNzKCk7IC8vIFRPRE86IEZpeCBicmVhayB0aW1lIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgIC8qIGxldCBiYXNlID0gdGhpcy5nZXRIYXJkbmVzcygpO1xuICAgICAgICBiYXNlICo9IHRoaXMuaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbSkgPyAxLjUgOiA1O1xuICAgICAgICBjb25zdCBlZmZpY2llbmN5ID0gMTsgLy8gSXRlbS5nZXRNaW5pbmdFZmZpY2llbmN5KHRoaXMpO1xuICAgICAgICByZXR1cm4gKGJhc2UgLz0gZWZmaWNpZW5jeSk7ICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGJsYXN0IHJlc2lzdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsYXN0UmVzaXN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGFyZG5lc3MoKSAqIDU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGxpZ2h0IGxldmVsIGVtaXNzaW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWdodExldmVsKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZmxhbW1hYmlsaXR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGbGFtbWFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyByZXF1aXJlZCB0b29sIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xUeXBlKCk6IEJsb2NrVG9vbFR5cGVbXSB7XG4gICAgICAgIHJldHVybiBbQmxvY2tUb29sVHlwZS5Ob25lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgcmVxdWlyZWQgaXRlbSB0b29sIHRpZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xIYXJ2ZXN0TGV2ZWwoKTogSXRlbVRpZXJlZFRvb2xUeXBlIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1UaWVyZWRUb29sVHlwZS5Ob25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHRoZSB0b29sIGlzIGNvbXBhdGlibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldERyb3BzRm9yQ29tcGF0aWJsZVRvb2woX2l0ZW06IEl0ZW0gfCBudWxsLCBfc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGRyb3AocykgZnJvbSB0aGUgY3VycmVudCBpdGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcm9wcyhpdGVtOiBJdGVtIHwgbnVsbCwgc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGF0aWJsZVdpdGhUb29sKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0FmZmVjdGVkQnlTaWxrVG91Y2goKSAmJiBpdGVtPy5oYXNFbmNoYW50bWVudChJdGVtRW5jaGFudG1lbnRUeXBlLlNpbGtUb3VjaCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2lsa1RvdWNoRHJvcHMoaXRlbSwgc2VydmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJvcHNGb3JDb21wYXRpYmxlVG9vbChpdGVtLCBzZXJ2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHNpbGsgdG91Y2ggaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2lsa1RvdWNoRHJvcHMoX2l0ZW06IEl0ZW0sIF9zZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMaWdodEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIDE1O1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5QYXNzVGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgdGhlIGJsb2NrIGNhbiBiZSByZXBsYWNlZCB3aGVuIHBsYWNlIGFjdGlvbiBvY2N1cnMgb24gaXQuXG4gICAgICovXG4gICAgcHVibGljIGNhbkJlUmVwbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQmVQbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5CZUZsb3dlZEludG8oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUcmFuc3BhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBicmVha2FibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJsb2NrIGlzIGJyZWFrYWJsZSBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCcmVha2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYmxvY2sgaXMgc29saWQgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzU29saWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbTogSXRlbSB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG9vbFR5cGUgPSB0aGlzLmdldFRvb2xUeXBlKCk7XG4gICAgICAgIGNvbnN0IGhhcnZlc3RMZXZlbCA9IHRoaXMuZ2V0VG9vbEhhcnZlc3RMZXZlbCgpO1xuXG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhCbG9ja1Rvb2xUeXBlLk5vbmUpIHx8IGhhcnZlc3RMZXZlbCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhpdGVtLmdldFRvb2xUeXBlKCkpICYmIGl0ZW0uZ2V0VG9vbEhhcnZlc3RMZXZlbCgpID49IGhhcnZlc3RMZXZlbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBZmZlY3RlZEJ5U2lsa1RvdWNoKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXJ0T2ZDcmVhdGl2ZUludmVudG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQU9BLElBQWEsUUFBYixNQUFhLE1BQU07Ozs7Q0FJZjs7OztDQUtBOzs7O0NBS0E7Q0FDQTtDQUNBLE9BQWM7Q0FDZDtDQUdBLE1BQWE7Q0FDYixRQUFlO0NBRWYsWUFBbUIsRUFDZixJQUNBLE1BQ0EsVUFDQSxZQUNBLFlBT0Q7RUFDQyxPQUFPLGVBQWUsTUFBTSxNQUFNLFNBQVM7RUFDM0MsS0FBSyxLQUFLO0VBQ1YsS0FBSyxPQUFPO0VBQ1osS0FBSyxXQUFXLFlBQVk7RUFDNUIsS0FBSyxXQUFXLFlBQVk7RUFFNUIsS0FBSyxZQUFhLFlBQW1CLGNBQWM7Q0FDdkQ7Q0FFQSxLQUFZLE9BQU8sZUFBZTtFQUM5QixPQUFPLFNBQVMsS0FBSyxTQUFTLEVBQUU7Q0FDcEM7Q0FDQSxXQUFrQjtFQUNkLE9BQU8sS0FBSztDQUNoQjs7OztDQUtBLFVBQWlCO0VBQ2IsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsVUFBaUI7RUFDYixPQUFPLEtBQUs7Q0FDaEI7Ozs7OztDQU9BLFFBQWU7RUFDWCxPQUFPLEtBQUs7Q0FDaEI7Ozs7Q0FLQSxlQUFzQjtFQUNsQixPQUFPLEtBQUssYUFBYSxLQUFLLE1BQU07Q0FDeEM7Ozs7Q0FLQSxjQUE2QjtFQUN6QixPQUFPLEtBQUs7Q0FDaEI7Ozs7Q0FLQSxhQUFvQixPQUFvQixTQUFpQjtFQUNyRCxPQUFPLEtBQUssWUFBWTtDQU01Qjs7OztDQUtBLHFCQUE0QjtFQUN4QixPQUFPLEtBQUssWUFBWSxJQUFJO0NBQ2hDOzs7O0NBS0EsZ0JBQXVCO0VBQ25CLE9BQU87Q0FDWDs7OztDQUtBLGtCQUF5QjtFQUNyQixPQUFPO0NBQ1g7Ozs7Q0FLQSxjQUFzQztFQUNsQyxPQUFPLENBQUMsY0FBYyxJQUFJO0NBQzlCOzs7O0NBS0Esc0JBQWlEO0VBQzdDLE9BQU8sbUJBQW1CO0NBQzlCOzs7O0NBS0EsMEJBQWlDLE9BQW9CLFNBQTZDO0VBQzlGLE9BQU8sQ0FBQyxJQUFJO0NBQ2hCOzs7O0NBS0EsU0FBZ0IsTUFBbUIsUUFBNEM7RUFDM0UsSUFBSSxLQUFLLHFCQUFxQixJQUFJLEdBQUc7R0FDakMsSUFBSSxLQUFLLHNCQUFzQixLQUFLLE1BQU0sZUFBZSxvQkFBb0IsU0FBUyxHQUNsRixPQUFPLEtBQUssa0JBQWtCLE1BQU0sTUFBTTtHQUU5QyxPQUFPLEtBQUssMEJBQTBCLE1BQU0sTUFBTTtFQUN0RDtFQUVBLE9BQU8sQ0FBQztDQUNaOzs7O0NBS0Esa0JBQXlCLE9BQWEsU0FBaUI7RUFDbkQsT0FBTyxDQUFDLElBQUk7Q0FDaEI7Q0FFQSxpQkFBd0I7RUFDcEIsT0FBTztDQUNYO0NBRUEsaUJBQXdCO0VBQ3BCLE9BQU87Q0FDWDs7OztDQUtBLGdCQUF1QjtFQUNuQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPO0NBQ1g7Q0FFQSxrQkFBeUI7RUFDckIsT0FBTztDQUNYO0NBRUEsZ0JBQXVCO0VBQ25CLE9BQU87Q0FDWDs7Ozs7O0NBT0EsY0FBOEI7RUFDMUIsT0FBTztDQUNYOzs7Ozs7Q0FPQSxVQUFpQjtFQUNiLE9BQU87Q0FDWDtDQUVBLHFCQUE0QixNQUFtQjtFQUMzQyxNQUFNLFdBQVcsS0FBSyxZQUFZO0VBQ2xDLE1BQU0sZUFBZSxLQUFLLG9CQUFvQjtFQUU5QyxJQUFJLFNBQVMsU0FBUyxjQUFjLElBQUksS0FBSyxnQkFBZ0IsR0FBRyxPQUFPO0VBQ3ZFLElBQUksQ0FBQyxNQUFNLE9BQU87RUFDbEIsSUFBSSxTQUFTLFNBQVMsS0FBSyxZQUFZLENBQUMsS0FBSyxLQUFLLG9CQUFvQixLQUFLLGNBQWMsT0FBTztFQUNoRyxPQUFPO0NBQ1g7Q0FFQSx3QkFBK0I7RUFDM0IsT0FBTztDQUNYO0NBRUEsNEJBQW1DO0VBQy9CLE9BQU87Q0FDWDtBQUNKIn0=