UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

126 lines (121 loc) 15.2 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const network_Handlers = require('./Handlers.cjs.cjs'); const network_Packets = require('./Packets.cjs.cjs'); const utils_Timer = require('../utils/Timer.cjs.cjs'); const network_Identifiers = require('./Identifiers.cjs.cjs'); class PacketRegistry { server; packets = /* @__PURE__ */ new Map(); handlers = /* @__PURE__ */ new Map(); constructor(server) { this.server = server; } /** * On enable hook. * @group Lifecycle */ async enable() { await this.registerPackets(); await this.registerHandlers(); } /** * On disable hook. * @group Lifecycle */ async disable() { this.handlers.clear(); this.packets.clear(); } /** * Register a packet. * @param packet - the packet. */ registerPacket(packet) { if (this.packets.has(packet.NetID)) throw new Error( `Packet ${packet.name} is trying to use id ${packet.NetID.toString(16)} which already exists!` ); this.packets.set(packet.NetID, packet); this.server.getLogger().debug(`Packet with id §b${packet.name}§r registered`); } /** * Get a packet by it's network ID. * @param id - the NetID. */ getPacket(id) { if (!this.packets.has(id)) throw new Error(`Invalid packet with id ${id}!`); return this.packets.get(id); } /** * Remove a packet from the registry. * @param id - the NetID. */ removePacket(id) { this.packets.delete(id); } registerHandler(id, handler) { if (this.handlers.has(id)) throw new Error(`Handler with id ${id} already exists!`); this.handlers.set(id, handler); this.server.getLogger().debug(`Handler with id §b${handler.constructor.name}§r registered`, "PacketRegistry/registerHandler"); } getHandler(id) { if (!this.handlers.has(id)) throw new Error(`Invalid handler with id ${id.toString(16)}!`); return this.handlers.get(id); } /** * Merge two handlers. * This is useful if you want to extend a handler without actually replacing it. * * @param handler - the first handler, executed first. * @param handler2 - the second handler. */ appendHandler(handler, handler2) { const res = new class Handler { async handle(packet, server, session) { await handler.handle(packet, server, session); await handler2.handle(packet, server, session); } }(); return res; } /** * Remove a handler from the registry. * @param id - the handler id. */ removeHandler(id) { this.handlers.delete(id); } /** * Dynamically register all packets exported by './Protocol'. */ async registerPackets() { const timer = new utils_Timer.default(); Object.entries(network_Packets).filter(([, value]) => value.name !== "DataPacket" && value.name !== "BatchPacket").map(([, value]) => this.registerPacket(value)); this.server.getLogger().verbose( `Registered §b${this.packets.size}§r of §b${Array.from(Object.keys(network_Identifiers.default)).length - 2}§r packet(s) (took §e${timer.stop()} ms§r)!` ); } /** * Dynamically register all handlers exported by './Handlers'. */ async registerHandlers() { const timer = new utils_Timer.default(); Object.entries(network_Handlers).map(([, value]) => this.registerHandler(value.NetID, new value())); this.server.getLogger().verbose(`Registered §b${this.handlers.size}§r packet handler(s) (took §e${timer.stop()} ms§r)!`); } /** * Get all packets from the registry. */ getPackets() { return this.packets; } /** * Get all handlers from the registry. */ getHandlers() { return this.handlers; } } exports.default = PacketRegistry; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2V0UmVnaXN0cnkuY2pzLmNqcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldHdvcmsvUGFja2V0UmVnaXN0cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgSGFuZGxlcnMgZnJvbSAnLi9IYW5kbGVycyc7XG5pbXBvcnQgKiBhcyBQYWNrZXRzIGZyb20gJy4vUGFja2V0cyc7XG5cbmltcG9ydCB0eXBlIHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLyc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCBUaW1lciBmcm9tICcuLi91dGlscy9UaW1lcic7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSBQYWNrZXRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9QYWNrZXRIYW5kbGVyJztcbmltcG9ydCB0eXBlIFByZUxvZ2luUGFja2V0SGFuZGxlciBmcm9tICcuL2hhbmRsZXIvUHJlTG9naW5QYWNrZXRIYW5kbGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFja2V0UmVnaXN0cnkge1xuICAgIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRzOiBNYXA8bnVtYmVyLCB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBNYXA8bnVtYmVyLCBQYWNrZXRIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGVuYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGFja2V0cygpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVySGFuZGxlcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBkaXNhYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFja2V0cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgcGFja2V0LlxuICAgICAqIEBwYXJhbSBwYWNrZXQgLSB0aGUgcGFja2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlclBhY2tldChwYWNrZXQ6IHR5cGVvZiBQYWNrZXRzLkRhdGFQYWNrZXQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFja2V0cy5oYXMocGFja2V0Lk5ldElEKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGFja2V0ICR7cGFja2V0Lm5hbWV9IGlzIHRyeWluZyB0byB1c2UgaWQgJHtwYWNrZXQuTmV0SUQudG9TdHJpbmcoMTYpfSB3aGljaCBhbHJlYWR5IGV4aXN0cyFgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucGFja2V0cy5zZXQocGFja2V0Lk5ldElELCBwYWNrZXQpO1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgUGFja2V0IHdpdGggaWQgwqdiJHtwYWNrZXQubmFtZX3Cp3IgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBhY2tldCBieSBpdCdzIG5ldHdvcmsgSUQuXG4gICAgICogQHBhcmFtIGlkIC0gdGhlIE5ldElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXQoaWQ6IG51bWJlcik6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5wYWNrZXRzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrZXQgd2l0aCBpZCAke2lkfSFgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKiBAcGFyYW0gaWQgLSB0aGUgTmV0SUQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVBhY2tldChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFja2V0cy5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IG51bWJlciwgaGFuZGxlcjogUGFja2V0SGFuZGxlcjxhbnk+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIWApO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgLmRlYnVnKGBIYW5kbGVyIHdpdGggaWQgwqdiJHtoYW5kbGVyLmNvbnN0cnVjdG9yLm5hbWV9wqdyIHJlZ2lzdGVyZWRgLCAnUGFja2V0UmVnaXN0cnkvcmVnaXN0ZXJIYW5kbGVyJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhhbmRsZXIoaWQ6IG51bWJlcik6IFBhY2tldEhhbmRsZXI8YW55PiB8IFByZUxvZ2luUGFja2V0SGFuZGxlcjxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXJzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoYW5kbGVyIHdpdGggaWQgJHtpZC50b1N0cmluZygxNil9IWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIHR3byBoYW5kbGVycy5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleHRlbmQgYSBoYW5kbGVyIHdpdGhvdXQgYWN0dWFsbHkgcmVwbGFjaW5nIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZmlyc3QgaGFuZGxlciwgZXhlY3V0ZWQgZmlyc3QuXG4gICAgICogQHBhcmFtIGhhbmRsZXIyIC0gdGhlIHNlY29uZCBoYW5kbGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBlbmRIYW5kbGVyKGhhbmRsZXI6IFBhY2tldEhhbmRsZXI8YW55PiwgaGFuZGxlcjI6IFBhY2tldEhhbmRsZXI8YW55Pik6IFBhY2tldEhhbmRsZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyAoY2xhc3MgSGFuZGxlciB7XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHBhY2tldDogYW55LCBzZXJ2ZXI6IFNlcnZlciwgc2Vzc2lvbjogUGxheWVyU2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHBhY2tldCwgc2VydmVyLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyMi5oYW5kbGUocGFja2V0LCBzZXJ2ZXIsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiByZXMgYXMgUGFja2V0SGFuZGxlcjxhbnk+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGhhbmRsZXIgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICogQHBhcmFtIGlkIC0gdGhlIGhhbmRsZXIgaWQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUhhbmRsZXIoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYWxsIHBhY2tldHMgZXhwb3J0ZWQgYnkgJy4vUHJvdG9jb2wnLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQYWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIHBhY2tldHNcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBpZ25vcmUgRGF0YVBhY2tldCAmIEJhdGNoUGFja2V0XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKFBhY2tldHMpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlLm5hbWUgIT09ICdEYXRhUGFja2V0JyAmJiB2YWx1ZS5uYW1lICE9PSAnQmF0Y2hQYWNrZXQnKVxuICAgICAgICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB0aGlzLnJlZ2lzdGVyUGFja2V0KHZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgLnZlcmJvc2UoXG4gICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgwqdiJHt0aGlzLnBhY2tldHMuc2l6ZX3Cp3Igb2YgwqdiJHtcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbShPYmplY3Qua2V5cyhJZGVudGlmaWVycykpLmxlbmd0aCAtIDJcbiAgICAgICAgICAgICAgICB9wqdyIHBhY2tldChzKSAodG9vayDCp2Uke3RpbWVyLnN0b3AoKX0gbXPCp3IpIWBcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYWxsIGhhbmRsZXJzIGV4cG9ydGVkIGJ5ICcuL0hhbmRsZXJzJy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVySGFuZGxlcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAgICAgLy8gRHluYW1pY2FsbHkgcmVnaXN0ZXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoSGFuZGxlcnMpLm1hcCgoWywgdmFsdWVdKSA9PiB0aGlzLnJlZ2lzdGVySGFuZGxlcih2YWx1ZS5OZXRJRCEsIG5ldyAodmFsdWUgYXMgYW55KSgpKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgLnZlcmJvc2UoYFJlZ2lzdGVyZWQgwqdiJHt0aGlzLmhhbmRsZXJzLnNpemV9wqdyIHBhY2tldCBoYW5kbGVyKHMpICh0b29rIMKnZSR7dGltZXIuc3RvcCgpfSBtc8KncikhYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBwYWNrZXRzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgaGFuZGxlcnMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcHVibGljIGdldEhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycztcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiVGltZXIiLCJQYWNrZXRzIiwiSWRlbnRpZmllcnMiLCJIYW5kbGVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBVUEsTUFBcUIsY0FBZSxDQUFBO0FBQUEsRUFDeEIsTUFBQTtBQUFBLEVBQ1MsT0FBQSx1QkFBc0QsR0FBSSxFQUFBO0FBQUEsRUFDMUQsUUFBQSx1QkFBZ0QsR0FBSSxFQUFBO0FBQUEsRUFFOUQsWUFBWSxNQUFnQixFQUFBO0FBQy9CLElBQUEsSUFBQSxDQUFLLE1BQVMsR0FBQSxNQUFBO0FBQUE7QUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsTUFBd0IsR0FBQTtBQUNqQyxJQUFBLE1BQU0sS0FBSyxlQUFnQixFQUFBO0FBQzNCLElBQUEsTUFBTSxLQUFLLGdCQUFpQixFQUFBO0FBQUE7QUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsT0FBeUIsR0FBQTtBQUNsQyxJQUFBLElBQUEsQ0FBSyxTQUFTLEtBQU0sRUFBQTtBQUNwQixJQUFBLElBQUEsQ0FBSyxRQUFRLEtBQU0sRUFBQTtBQUFBO0FBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxlQUFlLE1BQXlDLEVBQUE7QUFDM0QsSUFBQSxJQUFJLElBQUssQ0FBQSxPQUFBLENBQVEsR0FBSSxDQUFBLE1BQUEsQ0FBTyxLQUFLLENBQUE7QUFDN0IsTUFBQSxNQUFNLElBQUksS0FBQTtBQUFBLFFBQ04sQ0FBQSxPQUFBLEVBQVUsT0FBTyxJQUFJLENBQUEscUJBQUEsRUFBd0IsT0FBTyxLQUFNLENBQUEsUUFBQSxDQUFTLEVBQUUsQ0FBQyxDQUFBLHNCQUFBO0FBQUEsT0FDMUU7QUFFSixJQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsR0FBQSxDQUFJLE1BQU8sQ0FBQSxLQUFBLEVBQU8sTUFBTSxDQUFBO0FBQ3JDLElBQUEsSUFBQSxDQUFLLE9BQU8sU0FBVSxFQUFBLENBQUUsTUFBTSxDQUFvQixpQkFBQSxFQUFBLE1BQUEsQ0FBTyxJQUFJLENBQWUsYUFBQSxDQUFBLENBQUE7QUFBQTtBQUNoRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBVSxFQUFpQixFQUFBO0FBQzlCLElBQUksSUFBQSxDQUFDLElBQUssQ0FBQSxPQUFBLENBQVEsR0FBSSxDQUFBLEVBQUUsQ0FBRyxFQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBMEIsdUJBQUEsRUFBQSxFQUFFLENBQUcsQ0FBQSxDQUFBLENBQUE7QUFFMUUsSUFBTyxPQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsR0FBQSxDQUFJLEVBQUUsQ0FBQTtBQUFBO0FBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxhQUFhLEVBQWtCLEVBQUE7QUFDbEMsSUFBSyxJQUFBLENBQUEsT0FBQSxDQUFRLE9BQU8sRUFBRSxDQUFBO0FBQUE7QUFDMUIsRUFFTyxlQUFBLENBQWdCLElBQVksT0FBbUMsRUFBQTtBQUNsRSxJQUFJLElBQUEsSUFBQSxDQUFLLFFBQVMsQ0FBQSxHQUFBLENBQUksRUFBRSxDQUFBLFFBQVMsSUFBSSxLQUFBLENBQU0sQ0FBbUIsZ0JBQUEsRUFBQSxFQUFFLENBQWtCLGdCQUFBLENBQUEsQ0FBQTtBQUVsRixJQUFLLElBQUEsQ0FBQSxRQUFBLENBQVMsR0FBSSxDQUFBLEVBQUEsRUFBSSxPQUFPLENBQUE7QUFDN0IsSUFBSyxJQUFBLENBQUEsTUFBQSxDQUNBLFdBQ0EsQ0FBQSxLQUFBLENBQU0scUJBQXFCLE9BQVEsQ0FBQSxXQUFBLENBQVksSUFBSSxDQUFBLGFBQUEsQ0FBQSxFQUFpQixnQ0FBZ0MsQ0FBQTtBQUFBO0FBQzdHLEVBRU8sV0FBVyxFQUE2RCxFQUFBO0FBQzNFLElBQUEsSUFBSSxDQUFDLElBQUEsQ0FBSyxRQUFTLENBQUEsR0FBQSxDQUFJLEVBQUUsQ0FBRyxFQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBMkIsd0JBQUEsRUFBQSxFQUFBLENBQUcsUUFBUyxDQUFBLEVBQUUsQ0FBQyxDQUFHLENBQUEsQ0FBQSxDQUFBO0FBRXpGLElBQU8sT0FBQSxJQUFBLENBQUssUUFBUyxDQUFBLEdBQUEsQ0FBSSxFQUFFLENBQUE7QUFBQTtBQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sYUFBQSxDQUFjLFNBQTZCLFFBQWtELEVBQUE7QUFDaEcsSUFBTSxNQUFBLEdBQUEsR0FBTSxJQUFLLE1BQU0sT0FBUSxDQUFBO0FBQUEsTUFDM0IsTUFBYSxNQUFBLENBQU8sTUFBYSxFQUFBLE1BQUEsRUFBZ0IsT0FBd0IsRUFBQTtBQUNyRSxRQUFBLE1BQU0sT0FBUSxDQUFBLE1BQUEsQ0FBTyxNQUFRLEVBQUEsTUFBQSxFQUFRLE9BQU8sQ0FBQTtBQUM1QyxRQUFBLE1BQU0sUUFBUyxDQUFBLE1BQUEsQ0FBTyxNQUFRLEVBQUEsTUFBQSxFQUFRLE9BQU8sQ0FBQTtBQUFBO0FBQ2pELEtBQ0QsRUFBQTtBQUVILElBQU8sT0FBQSxHQUFBO0FBQUE7QUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sY0FBYyxFQUFrQixFQUFBO0FBQ25DLElBQUssSUFBQSxDQUFBLFFBQUEsQ0FBUyxPQUFPLEVBQUUsQ0FBQTtBQUFBO0FBQzNCO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYyxlQUFpQyxHQUFBO0FBQzNDLElBQU0sTUFBQSxLQUFBLEdBQVEsSUFBSUEsbUJBQU0sRUFBQTtBQUl4QixJQUFPLE1BQUEsQ0FBQSxPQUFBLENBQVFDLGVBQU8sQ0FBQSxDQUNqQixNQUFPLENBQUEsQ0FBQyxHQUFHLEtBQUssQ0FBTSxLQUFBLEtBQUEsQ0FBTSxJQUFTLEtBQUEsWUFBQSxJQUFnQixNQUFNLElBQVMsS0FBQSxhQUFhLENBQ2pGLENBQUEsR0FBQSxDQUFJLENBQUMsR0FBRyxLQUFLLENBQU0sS0FBQSxJQUFBLENBQUssY0FBZSxDQUFBLEtBQUssQ0FBQyxDQUFBO0FBRWxELElBQUssSUFBQSxDQUFBLE1BQUEsQ0FDQSxXQUNBLENBQUEsT0FBQTtBQUFBLE1BQ0csZ0JBQWdCLElBQUssQ0FBQSxPQUFBLENBQVEsSUFBSSxDQUFBLFFBQUEsRUFDN0IsTUFBTSxJQUFLLENBQUEsTUFBQSxDQUFPLElBQUssQ0FBQUMsMkJBQVcsQ0FBQyxDQUFFLENBQUEsTUFBQSxHQUFTLENBQ2xELENBQXdCLHFCQUFBLEVBQUEsS0FBQSxDQUFNLE1BQU0sQ0FBQSxPQUFBO0FBQUEsS0FDeEM7QUFBQTtBQUNSO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYyxnQkFBa0MsR0FBQTtBQUM1QyxJQUFNLE1BQUEsS0FBQSxHQUFRLElBQUlGLG1CQUFNLEVBQUE7QUFHeEIsSUFBQSxNQUFBLENBQU8sUUFBUUcsZ0JBQVEsQ0FBQSxDQUFFLEdBQUksQ0FBQSxDQUFDLEdBQUcsS0FBSyxDQUFNLEtBQUEsSUFBQSxDQUFLLGdCQUFnQixLQUFNLENBQUEsS0FBQSxFQUFRLElBQUssS0FBQSxFQUFlLENBQUMsQ0FBQTtBQUVwRyxJQUFBLElBQUEsQ0FBSyxNQUNBLENBQUEsU0FBQSxFQUNBLENBQUEsT0FBQSxDQUFRLENBQWdCLGFBQUEsRUFBQSxJQUFBLENBQUssUUFBUyxDQUFBLElBQUksQ0FBZ0MsNkJBQUEsRUFBQSxLQUFBLENBQU0sSUFBSyxFQUFDLENBQVMsT0FBQSxDQUFBLENBQUE7QUFBQTtBQUN4RztBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQWEsR0FBQTtBQUNoQixJQUFBLE9BQU8sSUFBSyxDQUFBLE9BQUE7QUFBQTtBQUNoQjtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQWMsR0FBQTtBQUNqQixJQUFBLE9BQU8sSUFBSyxDQUFBLFFBQUE7QUFBQTtBQUVwQjs7OzsifQ==