pw-js-api 0.3.15-dev.2f3e25b → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,18 +33,18 @@ NOTE: installing pw-js-api#dev is also available if you wish, there may be no di
33
33
  You could use a CDN like jsdelivr or unpkg. You can put this in your HTML page:
34
34
 
35
35
  ```html
36
- <script src="https://cdn.jsdelivr.net/npm/pw-js-api@0.1.1/browser/pw.prod.js"></script>
36
+ <script src="https://cdn.jsdelivr.net/npm/pw-js-api@0.3.15/browser/pw.prod.js"></script>
37
37
  ```
38
38
 
39
39
  ```html
40
- <script src="https://cdn.jsdelivr.net/npm/pw-js-api@0.1.1/browser/pw.dev.js"></script>
40
+ <script src="https://cdn.jsdelivr.net/npm/pw-js-api@0.3.15/browser/pw.dev.js"></script>
41
41
  ```
42
42
 
43
43
  When you have these scripts in your HTML file, you will be able to use the global variable PW which contains PWGameClient, PWApiClient and Constants.
44
44
 
45
45
  ## Example
46
46
 
47
- Feel free to take a look at the [source code for an example bot](https://github.com/doomestee/PW-JS-Api/blob/main/examples/) that only does snake and listen to certain chat commands (.ping, .say and .disconnect)
47
+ Feel free to take a look at the [source code for an example bot](/examples/index.mjs) that only does snake and listen to certain chat commands (.ping, .say and .disconnect)
48
48
 
49
49
  ## Why?
50
50
 
package/browser/pw.dev.js CHANGED
@@ -26,7 +26,7 @@ return /******/ (() => { // webpackBootstrap
26
26
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
27
27
 
28
28
  "use strict";
29
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ \"./node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _game_PWGameClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../game/PWGameClient.js */ \"./esm/game/PWGameClient.js\");\n/* harmony import */ var _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/Constants.js */ \"./esm/util/Constants.js\");\n/* harmony import */ var _util_Misc_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/Misc.js */ \"./esm/util/Misc.js\");\n\n\n\n\n/**\n * Note if you want to join a world, use new PWGameClient() then run .init()\n */\nclass PWApiClient {\n constructor(email, password, options) {\n /**\n * Account details with email and password, if applicable.\n */\n this.account = {\n email: \"\",\n password: \"\"\n };\n this.loggedIn = false;\n this.options = {\n endpoints: {\n Api: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api,\n GameHTTP: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP,\n GameWS: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameWS,\n }\n };\n if (typeof password === \"object\") {\n this.options = (0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.mergeObjects)(this.options, password);\n password = undefined;\n }\n else if (options)\n this.options = (0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.mergeObjects)(this.options, options);\n if (password === undefined) {\n this.token = email;\n this.loggedIn = true;\n return;\n }\n this.account.email = email;\n this.account.password = password;\n // this.token = token;\n }\n authenticate(email, password) {\n if (email === undefined) {\n if (this.account.email.length === 0 || this.account.password.length === 0)\n throw Error(\"No email/password given.\");\n email = this.account.email;\n password = this.account.password;\n }\n return this.request(`${this.options.endpoints.Api}/api/collections/users/auth-with-password`, { identity: email, password }, undefined, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api).then(res => {\n if (\"token\" in res) {\n this.token = res.token;\n this.loggedIn = true;\n }\n return res;\n }); //.then(console.log);\n }\n /**\n * Internal.\n */\n getJoinKey(roomType, roomId) {\n return this.request(`${this.options.endpoints.Api}/api/joinkey/${roomType}/${roomId}`, undefined, true, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n /**\n * This route is available to take if you chose to create an API client to then join a world, in which case this returns the Game Client instance.\n *\n * Make sure the API client is already authenticated before calling this.\n *\n * The 3rd parameter is for if you wish to customise the reconnectability of the game client.\n */\n joinWorld(roomId, obj) {\n const game = new _game_PWGameClient_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this, obj === null || obj === void 0 ? void 0 : obj.gameSettings);\n return game.joinWorld(roomId, obj === null || obj === void 0 ? void 0 : obj.joinData);\n }\n // I feel like this is cursed.\n /**\n * This will be an empty array if getRoomTypes has never been used successfully at least once.\n */\n get roomTypes() {\n return PWApiClient.roomTypes;\n }\n /**\n * Non-authenticated. This will refresh the room types each time, so make sure to check if roomTypes is available.\n */\n getRoomTypes() {\n return PWApiClient.getRoomTypes(this.options.endpoints.GameHTTP);\n }\n /**\n * Non-authenticated. This will refresh the room types each time, so make sure to check if roomTypes is available.\n */\n static getRoomTypes(EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n return this.request(`${EndpointURL}/listroomtypes`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP)\n .then(res => {\n PWApiClient.roomTypes = res;\n return this.getListBlocks(true);\n })\n .then(() => {\n return PWApiClient.roomTypes;\n });\n }\n /**\n * Non-authenticated. Returns the mappings from the game API.\n *\n * Note: This library also exports \"BlockNames\" which is an enum containing the block names along with their respective id.\n *\n * @deprecated Use getListBlocks()\n */\n getMappings() {\n return PWApiClient.getMappings();\n }\n /**\n * Non-authenticated. Returns the mappings from the game API.\n *\n * Note: This library also exports \"BlockNames\" which is an enum containing the block names along with their respective id.\n *\n * @deprecated Use getListBlocks()\n */\n static getMappings() {\n return this.request(`${_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP}/mappings`);\n }\n getListBlocks(skipCache = false, toObject) {\n // Yes, this actually gets typescript compiler to stop moaning\n if (toObject)\n return PWApiClient.getListBlocks(skipCache, toObject, this.options.endpoints.GameHTTP);\n return PWApiClient.getListBlocks(skipCache, toObject, this.options.endpoints.GameHTTP);\n }\n static getListBlocks() {\n return (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__awaiter)(this, arguments, void 0, function* (skipCache = false, toObject, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n if (!skipCache) {\n if (this.listBlocks !== undefined && !toObject)\n return this.listBlocks;\n if (this.listBlocksObj !== undefined && toObject)\n return this.listBlocksObj;\n }\n return this.request(`${EndpointURL}/listblocks`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP)\n .then(res => {\n const obj = {};\n const arr = []; // PW doesn't sort the returned endpoint data despite data structure means it's perfectly capable\n for (let i = 0, len = res.length; i < len; i++) {\n obj[res[i].PaletteId.toUpperCase()] = res[i];\n arr[res[i].Id] = res[i];\n }\n this.listBlocksObj = obj;\n this.listBlocks = arr;\n if (toObject)\n return obj;\n else\n return arr;\n });\n });\n }\n getOwnedWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return this.request(`${this.options.endpoints.Api}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.queryToString)(query)}`, undefined, true, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getPlayers(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getPlayers(page, perPage, query, this.options.endpoints.Api);\n }\n static getPlayers(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/users/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getPublicWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getPublicWorlds(page, perPage, query, this.options.endpoints.Api);\n }\n static getPublicWorlds(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getWootedWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getWootedWorlds(page, perPage, query, this.options.endpoints.Api);\n }\n static getWootedWorlds(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_2__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n /**\n * Returns the lobby result.\n */\n getVisibleWorlds() {\n return PWApiClient.getVisibleWorlds(this.options.endpoints.GameHTTP);\n }\n /**\n * Returns the lobby result.\n */\n static getVisibleWorlds(EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n if (this.roomTypes.length === 0)\n throw Error(\"roomTypes is empty - use getRoomTypes first!\");\n return this.request(`${EndpointURL}/room/list/${this.roomTypes[0]}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP);\n }\n /**\n * Returns the world, if it exists and is public.\n */\n getPublicWorld(id) {\n return this.getPublicWorlds(1, 1, { filter: { id } })\n .then(res => res.items[0]);\n }\n /**\n * Returns the world, if it exists and is public.\n */\n static getPublicWorld(id) {\n return this.getPublicWorlds(1, 1, { filter: { id } })\n .then(res => res.items[0]);\n }\n getMinimap(world, toURL = false) {\n if (toURL)\n return `${this.options.endpoints.Api}/api/files/rhrbt6wqhc4s0cp/${world.id}/${world.minimap}`;\n return PWApiClient.getMinimap(world, toURL, this.options.endpoints.Api);\n }\n static getMinimap(world, toURL = false, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (toURL)\n return `${EndpointURL}/api/files/rhrbt6wqhc4s0cp/${world.id}/${world.minimap}`;\n return this.request(this.getMinimap(world, true, EndpointURL), undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api)\n .then(res => {\n if (\"message\" in res)\n throw Error(\"Minimap doesn't exist, the world may be unlisted.\");\n return res;\n });\n }\n /**\n * Note that username is cap sensitive, and may require you to use toUppercase\n */\n getPlayerByName(username) {\n return this.getPlayers(1, 1, { filter: { username } })\n .then(res => res.items[0]);\n }\n /**\n * Note that username is cap sensitive, and may require you to use toUppercase\n */\n static getPlayerByName(username) {\n return this.getPlayers(1, 1, { filter: { username } })\n .then(res => res.items[0]);\n }\n // This doesn't seem to work so I commented it out, not removing it as there might be an oversight idk\n // getMessageTypes() {\n // return this.request<string[]>(`${Endpoint.GameHTTP}/message_types`)\n // .then(res => res instanceof Uint8Array ? [] : res ?? []);\n // }\n /**\n * IMPORTANT: This will return JSON for any responses that have the content-type of json, anything else will be sent back as ArrayBuffer.\n * If you're expecting raw bytes, make sure the endpoint is guaranteed to give you that otherwise there isn't a reason.\n *\n * This requires the manager to be authenticated, it will error if otherwise.\n * @param url Requires to be a full URL with endpoint unfortunately. It will throw error if it doesn't match any of the 2 HTTP endpoint URLs.\n * @param body If this is passed, the request will become a POST. (If you need to send a POST but has no data, just send an empty object).\n * @param token The API token (not join key), this is if you wish to use authenticated API calls without having to instantise an api client yourself.\n * @param overrideURL If true, this will skip checking if the URL truly belongs to PW (production wise).\n */\n static request(url, body, token, overrideURL = false) {\n if (!overrideURL && !(url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) || url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) || url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Client + \"/atlases/\")))\n throw Error(\"URL given does not have the correct endpoint URL, this is for safety.\");\n const headers = {\n // \"user-agent\": \"PW-TS-API/0.0.1\"\n };\n if (typeof token === \"string\")\n headers[\"authorization\"] = token;\n if (typeof body === \"object\")\n body = JSON.stringify(body);\n let method = \"GET\";\n if (typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json\";\n method = \"POST\";\n }\n let status = 0;\n return fetch(url, {\n headers, method,\n body: body\n }).then(res => {\n var _a;\n if (res.status === 403)\n throw Error(\"Forbidden access - token invalid or unauthorised.\");\n // else if (res.status !== 200) throw Error(\"\")\n status = res.status;\n if ((_a = res.headers.get(\"content-type\")) === null || _a === void 0 ? void 0 : _a.startsWith(\"application/json\"))\n return res.json();\n else\n return res.arrayBuffer();\n })\n .then(data => {\n if (status > 400)\n throw data;\n else\n return data;\n });\n }\n /**\n * IMPORTANT: This will return JSON for any responses that have the content-type of json, anything else will be sent back as Uint8array.\n * If you're expecting raw bytes, make sure the endpoint is guaranteed to give you that otherwise there isn't a reason.\n *\n * This requires the manager to be authenticated, it will error if otherwise.\n * @param url Requires to be a full URL with endpoint unfortunately. It will throw error if it doesn't match any of the 2 HTTP endpoint URLs.\n * @param body If this is passed, the request will become a POST. (If you need to send a POST but has no data, just send an empty object).\n * @param isAuthenticated If true, this will send the token as the header.\n * @param overrideURL If true, this will skip checking if the URL truly belongs to PW (production wise).\n */\n request(url, body, isAuthenticated = false, overrideURL = false) {\n return PWApiClient.request(url, body, isAuthenticated ? this.token : undefined, overrideURL);\n }\n}\n/**\n * This will be an empty array if getRoomTypes has never been used successfully at least once.\n */\nPWApiClient.roomTypes = [];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PWApiClient);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFdBcGlDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXBpL1BXQXBpQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLFlBQVksTUFBTSx5QkFBeUIsQ0FBQztBQUduRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RDs7R0FFRztBQUNILE1BQXFCLFdBQVc7SUF5QzVCLFlBQVksS0FBYSxFQUFFLFFBQW9DLEVBQUUsT0FBMEI7UUFuQzNGOztXQUVHO1FBQ0ssWUFBTyxHQUFHO1lBQ2QsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsRUFBRTtTQUNmLENBQUE7UUFJRCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBMEJiLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDWCxTQUFTLEVBQUU7Z0JBQ1AsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO2dCQUNqQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7Z0JBQzNCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTthQUMxQjtTQUNKLENBQUE7UUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEQsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV2RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFakMsc0JBQXNCO0lBQzFCLENBQUM7SUFZRCxZQUFZLENBQUMsS0FBYyxFQUFFLFFBQWlCO1FBQzFDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBRW5ILEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUMzQixRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBaUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLDJDQUEyQyxFQUN4SCxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUN4RixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNULElBQUksT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUM7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDLENBQUEscUJBQXFCO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDdkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLFFBQVEsSUFBSSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEssQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxNQUFjLEVBQUUsR0FBOEU7UUFDcEcsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxZQUFZLENBQUMsQ0FBQztRQUV2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxRQUFRLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBT0QsOEJBQThCO0lBQzlCOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1QsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDUixPQUFPLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFzQixRQUFRLENBQUMsUUFBUTtRQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQVcsR0FBRyxXQUFXLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUM7YUFDakgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1IsV0FBVyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFFNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUCxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsV0FBVztRQUNQLE9BQU8sV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBeUIsR0FBRyxRQUFRLENBQUMsUUFBUSxXQUFXLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBZUQsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLEVBQUUsUUFBa0I7UUFDL0MsOERBQThEO1FBQzlELElBQUksUUFBUTtZQUFFLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXJHLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFjRCxNQUFNLENBQU8sYUFBYTs2REFBQyxTQUFTLEdBQUcsS0FBSyxFQUFFLFFBQWtCLEVBQUUsV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRO1lBQzdGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDYixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsUUFBUTtvQkFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZFLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksUUFBUTtvQkFBRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDaEYsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBb0IsR0FBRyxXQUFXLGFBQWEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDO2lCQUN2SCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1IsTUFBTSxHQUFHLEdBQUcsRUFBcUMsQ0FBQztnQkFDbEQsTUFBTSxHQUFHLEdBQUcsRUFBNEIsQ0FBQyxDQUFDLGlHQUFpRztnQkFFM0ksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO2dCQUV0QixJQUFJLFFBQVE7b0JBQUUsT0FBTyxHQUFHLENBQUM7O29CQUNwQixPQUFPLEdBQUcsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQTtRQUNWLENBQUM7S0FBQTtJQVFELGNBQWMsQ0FBQyxPQUFvQyxDQUFDLEVBQUUsVUFBa0IsRUFBRSxFQUFFLEtBQTBCO1FBQ2xHLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNiLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUE2QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsd0NBQXdDLElBQUksWUFBWSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pPLENBQUM7SUFRRCxVQUFVLENBQUMsT0FBbUMsQ0FBQyxFQUFFLFVBQWtCLEVBQUUsRUFBRSxLQUF5QjtRQUM1RixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNCLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDYixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBUUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFtQyxDQUFDLEVBQUUsVUFBMkIsRUFBRSxFQUFFLEtBQXlCLEVBQUUsY0FBc0IsUUFBUSxDQUFDLEdBQUc7UUFDaEosSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixXQUFXLEdBQUcsT0FBTyxDQUFDO2dCQUN0QixPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLENBQUM7WUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2IsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQTRCLEdBQUcsV0FBVyx1Q0FBdUMsSUFBSSxZQUFZLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOU0sQ0FBQztJQVFELGVBQWUsQ0FBQyxPQUFvQyxDQUFDLEVBQUUsVUFBa0IsRUFBRSxFQUFFLEtBQTBCO1FBQ25HLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNiLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFRRCxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQW9DLENBQUMsRUFBRSxVQUEyQixFQUFFLEVBQUUsS0FBMEIsRUFBRSxjQUFzQixRQUFRLENBQUMsR0FBRztRQUN2SixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlCLFdBQVcsR0FBRyxPQUFPLENBQUM7Z0JBQ3RCLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztZQUVELEtBQUssR0FBRyxJQUFJLENBQUM7WUFDYixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBNkIsR0FBRyxXQUFXLHdDQUF3QyxJQUFJLFlBQVksT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoTixDQUFDO0lBUUQsZUFBZSxDQUFDLE9BQW9DLENBQUMsRUFBRSxVQUFrQixFQUFFLEVBQUUsS0FBMEI7UUFDbkcsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQixLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2IsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQVVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBb0MsQ0FBQyxFQUFFLFVBQTJCLEVBQUUsRUFBRSxLQUEwQixFQUFFLGNBQXNCLFFBQVEsQ0FBQyxHQUFHO1FBQ3ZKLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsV0FBVyxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNqQixDQUFDO1lBRUQsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNiLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUE2QixHQUFHLFdBQVcsd0NBQXdDLElBQUksWUFBWSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hOLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNaLE9BQU8sV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFzQixRQUFRLENBQUMsUUFBUTtRQUMzRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBRTdGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBYyxHQUFHLFdBQVcsY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzlJLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxFQUFVO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFVO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQVVELFVBQVUsQ0FBQyxLQUFpRCxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ3ZFLElBQUksS0FBSztZQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLDhCQUE4QixLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV6RyxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBVUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFpRCxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHO1FBQzFHLElBQUksS0FBSztZQUFFLE9BQU8sR0FBRyxXQUFXLDhCQUE4QixLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUxRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQXlCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDO2FBQ3JJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNSLElBQUksU0FBUyxJQUFJLEdBQUc7Z0JBQUUsTUFBTSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUV2RixPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLFFBQWdCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQzthQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFnQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7YUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsc0JBQXNCO0lBQ3RCLDBFQUEwRTtJQUMxRSxvRUFBb0U7SUFDcEUsSUFBSTtJQUVKOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUksR0FBVyxFQUFFLElBQWlDLEVBQUUsS0FBYyxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQ2pHLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFFaE8sTUFBTSxPQUFPLEdBQTBCO1FBQ25DLGtDQUFrQztTQUNyQyxDQUFDO1FBRUYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVoRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7WUFDN0MsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBTyxFQUFFLE1BQU07WUFDZixJQUFJLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7O1lBQ1YsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUc7Z0JBQUUsTUFBTSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUN6RiwrQ0FBK0M7WUFFL0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFFcEIsSUFBSSxNQUFBLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxVQUFVLENBQUMsa0JBQWtCLENBQUM7Z0JBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFPLENBQUM7O2dCQUN2RixPQUFPLEdBQUcsQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUN2QyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxJQUFJLE1BQU0sR0FBRyxHQUFHO2dCQUFFLE1BQU0sSUFBSSxDQUFDOztnQkFDeEIsT0FBTyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0Q7Ozs7Ozs7OztPQVNHO0lBQ08sT0FBTyxDQUFJLEdBQVcsRUFBRSxJQUFpQyxFQUFFLGVBQWUsR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDN0csT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDbkcsQ0FBQzs7QUEvWEQ7O0dBRUc7QUFDSSxxQkFBUyxHQUFZLEVBQUUsQUFBZCxDQUFlO2VBeEhkLFdBQVcifQ==\n\n//# sourceURL=webpack://PW/./esm/api/PWApiClient.js?");
29
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"./node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _game_PWGameClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../game/PWGameClient.js */ \"./esm/game/PWGameClient.js\");\n/* harmony import */ var _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/Constants.js */ \"./esm/util/Constants.js\");\n/* harmony import */ var _util_Errors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/Errors.js */ \"./esm/util/Errors.js\");\n/* harmony import */ var _util_Misc_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/Misc.js */ \"./esm/util/Misc.js\");\n\n\n\n\n\n/**\n * Note if you want to join a world, use new PWGameClient() then run .init()\n */\nclass PWApiClient {\n constructor(email, password, options) {\n /**\n * Account details with email and password, if applicable.\n */\n this.account = {\n email: \"\",\n password: \"\"\n };\n this.loggedIn = false;\n this.options = {\n endpoints: {\n Api: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api,\n GameHTTP: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP,\n GameWS: _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameWS,\n }\n };\n if (typeof password === \"object\") {\n this.options = (0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.mergeObjects)(this.options, password);\n password = undefined;\n }\n else if (options)\n this.options = (0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.mergeObjects)(this.options, options);\n if (password === undefined) {\n this.token = email;\n this.loggedIn = true;\n return;\n }\n this.account.email = email;\n this.account.password = password;\n // this.token = token;\n }\n authenticate(email, password) {\n if (email === undefined) {\n if (this.account.email.length === 0 || this.account.password.length === 0)\n throw Error(\"No email/password given.\");\n email = this.account.email;\n password = this.account.password;\n }\n return this.request(`${this.options.endpoints.Api}/api/collections/users/auth-with-password`, { identity: email, password }, undefined, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api).then(res => {\n if (\"token\" in res) {\n this.token = res.token;\n this.loggedIn = true;\n }\n return res;\n }); //.then(console.log);\n }\n /**\n * Internal.\n */\n getJoinKey(roomType, roomId) {\n return this.request(`${this.options.endpoints.Api}/api/joinkey/${roomType}/${roomId}`, undefined, true, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n /**\n * This route is available to take if you chose to create an API client to then join a world, in which case this returns the Game Client instance.\n *\n * Make sure the API client is already authenticated before calling this.\n *\n * The 3rd parameter is for if you wish to customise the reconnectability of the game client.\n */\n joinWorld(roomId, obj) {\n const game = new _game_PWGameClient_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this, obj === null || obj === void 0 ? void 0 : obj.gameSettings);\n return game.joinWorld(roomId, obj === null || obj === void 0 ? void 0 : obj.joinData);\n }\n /**\n * @deprecated\n *\n * This will be an empty array if getRoomTypes has never been used successfully at least once.\n */\n get roomTypes() {\n return PWApiClient.roomTypes;\n }\n /**\n * @deprecated This will be removed when the endpoint no longer exists. Use getVersion()\n *\n * Non-authenticated. This will refresh the room types each time, so make sure to check if roomTypes is available.\n */\n getRoomTypes() {\n return PWApiClient.getRoomTypes(this.options.endpoints.GameHTTP);\n }\n /**\n * @deprecated This will be removed when the endpoint no longer exists. Use getVersion()\n *\n * Non-authenticated. This will refresh the room types each time, so make sure to check if roomTypes is available.\n */\n static getRoomTypes(EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n return this.request(`${EndpointURL}/listroomtypes`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP)\n .then(res => {\n PWApiClient.roomTypes = res;\n return this.getListBlocks(true);\n })\n .then(() => {\n return PWApiClient.roomTypes;\n });\n }\n /**\n * This will be undefined if getVersion has never been used successfully at least once.\n */\n get gameVersion() {\n return PWApiClient.gameVersion;\n }\n /**\n * Non-authenticated. This will refresh the room types each time, so make sure to check if roomTypes is available.\n *\n * This will also atuomatically get all blocks.\n */\n getVersion() {\n return PWApiClient.getVersion(this.options.endpoints.GameHTTP);\n }\n /**\n * Non-authenticated. This will refresh the version each time, so make sure to check if roomTypes is available.\n *\n * This will also atuomatically get all blocks.\n */\n static getVersion(EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n return this.request(`${EndpointURL}/version`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP)\n .then(res => {\n if (\"version\" in res) {\n PWApiClient.gameVersion = res.version;\n return this.getListBlocks(true);\n }\n throw new _util_Errors_js__WEBPACK_IMPORTED_MODULE_2__.APIError(\"Version is missing when trying to fetch current version.\", \"MISSING_VERSION\");\n })\n .then(() => {\n return PWApiClient.gameVersion;\n });\n }\n /**\n * Non-authenticated. Returns the mappings from the game API.\n *\n * Note: This library also exports \"BlockNames\" which is an enum containing the block names along with their respective id.\n *\n * @deprecated Use getListBlocks()\n */\n getMappings() {\n return PWApiClient.getMappings();\n }\n /**\n * Non-authenticated. Returns the mappings from the game API.\n *\n * Note: This library also exports \"BlockNames\" which is an enum containing the block names along with their respective id.\n *\n * @deprecated Use getListBlocks()\n */\n static getMappings() {\n return this.request(`${_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP}/mappings`);\n }\n getListBlocks(skipCache = false, toObject) {\n // Yes, this actually gets typescript compiler to stop moaning\n if (toObject)\n return PWApiClient.getListBlocks(skipCache, toObject, this.options.endpoints.GameHTTP);\n return PWApiClient.getListBlocks(skipCache, toObject, this.options.endpoints.GameHTTP);\n }\n static getListBlocks() {\n return (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__awaiter)(this, arguments, void 0, function* (skipCache = false, toObject, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n if (!skipCache) {\n if (this.listBlocks !== undefined && !toObject)\n return this.listBlocks;\n if (this.listBlocksObj !== undefined && toObject)\n return this.listBlocksObj;\n }\n return this.request(`${EndpointURL}/listblocks`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP)\n .then(res => {\n const obj = {};\n const arr = []; // PW doesn't sort the returned endpoint data despite data structure means it's perfectly capable\n if (res.length === 0)\n throw new _util_Errors_js__WEBPACK_IMPORTED_MODULE_2__.APIError(\"Received no blocks when trying to fetch latest blocks\", \"MISSING_BLOCKS\");\n for (let i = 0, len = res.length; i < len; i++) {\n obj[res[i].PaletteId.toUpperCase()] = res[i];\n arr[res[i].Id] = res[i];\n }\n this.listBlocksObj = obj;\n this.listBlocks = arr;\n if (toObject)\n return obj;\n else\n return arr;\n });\n });\n }\n getOwnedWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return this.request(`${this.options.endpoints.Api}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.queryToString)(query)}`, undefined, true, this.options.endpoints.Api !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getPlayers(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getPlayers(page, perPage, query, this.options.endpoints.Api);\n }\n static getPlayers(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/users/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getPublicWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getPublicWorlds(page, perPage, query, this.options.endpoints.Api);\n }\n static getPublicWorlds(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n getWootedWorlds(page = 1, perPage = 10, query) {\n if (typeof page === \"object\") {\n query = page;\n page = 1;\n }\n return PWApiClient.getWootedWorlds(page, perPage, query, this.options.endpoints.Api);\n }\n static getWootedWorlds(page = 1, perPage = 10, query, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (typeof page === \"object\") {\n if (typeof perPage === \"string\") {\n EndpointURL = perPage;\n perPage = 10;\n }\n query = page;\n page = 1;\n }\n return this.request(`${EndpointURL}/api/collections/worlds/records?page=${page}&perPage=${perPage}${(0,_util_Misc_js__WEBPACK_IMPORTED_MODULE_3__.queryToString)(query)}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api);\n }\n /**\n * Returns the lobby result.\n */\n getVisibleWorlds() {\n return PWApiClient.getVisibleWorlds(this.options.endpoints.GameHTTP);\n }\n /**\n * Returns the lobby result.\n */\n static getVisibleWorlds(EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) {\n if (this.roomTypes.length === 0)\n throw Error(\"roomTypes is empty - use getRoomTypes first!\");\n return this.request(`${EndpointURL}/room/list/${this.roomTypes[0]}`, undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP);\n }\n /**\n * Returns the world, if it exists and is public.\n */\n getPublicWorld(id) {\n return this.getPublicWorlds(1, 1, { filter: { id } })\n .then(res => res.items[0]);\n }\n /**\n * Returns the world, if it exists and is public.\n */\n static getPublicWorld(id) {\n return this.getPublicWorlds(1, 1, { filter: { id } })\n .then(res => res.items[0]);\n }\n getMinimap(world, toURL = false) {\n if (toURL)\n return `${this.options.endpoints.Api}/api/files/rhrbt6wqhc4s0cp/${world.id}/${world.minimap}`;\n return PWApiClient.getMinimap(world, toURL, this.options.endpoints.Api);\n }\n static getMinimap(world, toURL = false, EndpointURL = _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) {\n if (toURL)\n return `${EndpointURL}/api/files/rhrbt6wqhc4s0cp/${world.id}/${world.minimap}`;\n return this.request(this.getMinimap(world, true, EndpointURL), undefined, undefined, EndpointURL !== _util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api)\n .then(res => {\n if (\"message\" in res)\n throw Error(\"Minimap doesn't exist, the world may be unlisted.\");\n return res;\n });\n }\n /**\n * Note that username is cap sensitive, and may require you to use toUppercase\n */\n getPlayerByName(username) {\n return this.getPlayers(1, 1, { filter: { username } })\n .then(res => res.items[0]);\n }\n /**\n * Note that username is cap sensitive, and may require you to use toUppercase\n */\n static getPlayerByName(username) {\n return this.getPlayers(1, 1, { filter: { username } })\n .then(res => res.items[0]);\n }\n // This doesn't seem to work so I commented it out, not removing it as there might be an oversight idk\n // getMessageTypes() {\n // return this.request<string[]>(`${Endpoint.GameHTTP}/message_types`)\n // .then(res => res instanceof Uint8Array ? [] : res ?? []);\n // }\n /**\n * IMPORTANT: This will return JSON for any responses that have the content-type of json, anything else will be sent back as ArrayBuffer.\n * If you're expecting raw bytes, make sure the endpoint is guaranteed to give you that otherwise there isn't a reason.\n *\n * This requires the manager to be authenticated, it will error if otherwise.\n * @param url Requires to be a full URL with endpoint unfortunately. It will throw error if it doesn't match any of the 2 HTTP endpoint URLs.\n * @param body If this is passed, the request will become a POST. (If you need to send a POST but has no data, just send an empty object).\n * @param token The API token (not join key), this is if you wish to use authenticated API calls without having to instantise an api client yourself.\n * @param overrideURL If true, this will skip checking if the URL truly belongs to PW (production wise).\n */\n static request(url, body, token, overrideURL = false) {\n if (!overrideURL && !(url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Api) || url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.GameHTTP) || url.startsWith(_util_Constants_js__WEBPACK_IMPORTED_MODULE_1__.Endpoint.Client + \"/atlases/\")))\n throw Error(\"URL given does not have the correct endpoint URL, this is for safety.\");\n const headers = {\n // \"user-agent\": \"PW-TS-API/0.0.1\"\n };\n if (typeof token === \"string\")\n headers[\"authorization\"] = token;\n if (typeof body === \"object\")\n body = JSON.stringify(body);\n let method = \"GET\";\n if (typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json\";\n method = \"POST\";\n }\n let status = 0;\n return fetch(url, {\n headers, method,\n body: body\n }).then(res => {\n var _a;\n if (res.status === 403)\n throw Error(\"Forbidden access - token invalid or unauthorised.\");\n // else if (res.status !== 200) throw Error(\"\")\n status = res.status;\n if ((_a = res.headers.get(\"content-type\")) === null || _a === void 0 ? void 0 : _a.startsWith(\"application/json\"))\n return res.json();\n else\n return res.arrayBuffer();\n })\n .then(data => {\n if (status > 400)\n throw data;\n else\n return data;\n });\n }\n /**\n * IMPORTANT: This will return JSON for any responses that have the content-type of json, anything else will be sent back as Uint8array.\n * If you're expecting raw bytes, make sure the endpoint is guaranteed to give you that otherwise there isn't a reason.\n *\n * This requires the manager to be authenticated, it will error if otherwise.\n * @param url Requires to be a full URL with endpoint unfortunately. It will throw error if it doesn't match any of the 2 HTTP endpoint URLs.\n * @param body If this is passed, the request will become a POST. (If you need to send a POST but has no data, just send an empty object).\n * @param isAuthenticated If true, this will send the token as the header.\n * @param overrideURL If true, this will skip checking if the URL truly belongs to PW (production wise).\n */\n request(url, body, isAuthenticated = false, overrideURL = false) {\n return PWApiClient.request(url, body, isAuthenticated ? this.token : undefined, overrideURL);\n }\n}\n/**\n * This will be an empty array if getRoomTypes has never been used successfully at least once.\n */\nPWApiClient.roomTypes = [];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PWApiClient);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFdBcGlDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXBpL1BXQXBpQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLFlBQVksTUFBTSx5QkFBeUIsQ0FBQztBQUduRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxNQUFxQixXQUFXO0lBeUM1QixZQUFZLEtBQWEsRUFBRSxRQUFvQyxFQUFFLE9BQTBCO1FBbkMzRjs7V0FFRztRQUNLLFlBQU8sR0FBRztZQUNkLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLEVBQUU7U0FDZixDQUFBO1FBSUQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQTBCYixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ1gsU0FBUyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07YUFDMUI7U0FDSixDQUFBO1FBRUQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQzthQUFNLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkUsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEtB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\n\n//# sourceURL=webpack://PW/./esm/api/PWApiClient.js?");
30
30
 
31
31
  /***/ }),
32
32
 
@@ -92,7 +92,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
92
92
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
93
93
 
94
94
  "use strict";
95
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthError: () => (/* binding */ AuthError)\n/* harmony export */ });\nclass AuthError extends Error {\n constructor(message, code) {\n super(message);\n this.code = code;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWwvRXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxTQUFVLFNBQVEsS0FBSztJQUNoQyxZQUFZLE9BQWUsRUFBUyxJQUFZO1FBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURpQixTQUFJLEdBQUosSUFBSSxDQUFRO0lBRWhELENBQUM7Q0FDSiJ9\n\n//# sourceURL=webpack://PW/./esm/util/Errors.js?");
95
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APIError: () => (/* binding */ APIError),\n/* harmony export */ AuthError: () => (/* binding */ AuthError)\n/* harmony export */ });\nclass AuthError extends Error {\n constructor(message, \n /**\n * The websocket close event code.\n */\n code) {\n super(message);\n this.code = code;\n }\n}\nclass APIError extends Error {\n constructor(message, \n /**\n * Code identifying the source behind this error.\n */\n code) {\n super(message);\n this.code = code;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWwvRXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxTQUFVLFNBQVEsS0FBSztJQUNoQyxZQUFZLE9BQWU7SUFDdkI7O09BRUc7SUFDSSxJQUFZO1FBRW5CLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUZSLFNBQUksR0FBSixJQUFJLENBQVE7SUFHdkIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLFFBQVMsU0FBUSxLQUFLO0lBQy9CLFlBQVksT0FBZTtJQUN2Qjs7T0FFRztJQUNJLElBQXdDO1FBRS9DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUZSLFNBQUksR0FBSixJQUFJLENBQW9DO0lBR25ELENBQUM7Q0FDSiJ9\n\n//# sourceURL=webpack://PW/./esm/util/Errors.js?");
96
96
 
97
97
  /***/ }),
98
98