From 20d1cc0bbe43d940455533851da9f936664ccde9 Mon Sep 17 00:00:00 2001 From: LLaverty Date: Tue, 20 May 2025 19:57:39 +0100 Subject: [PATCH 1/2] removes the --- dist/bundle.js | 5152 ++++++++--------- dist/bundle.js.map | 1 + dist/css/style.css | 69 +- dist/css/style.css.map | 1 + dist/webpack.config.js | 66 - dist/webpack.config.js.map | 1 - package.json | 57 +- pnpm-lock.yaml | 4621 +++++++++++++++ src/application/Core/timer.service.ts | 3 +- .../Graphics/Textures/texture.service.ts | 2 +- src/application/World/world.jsonfiles.ts | 46 +- src/application/game.ts | 10 +- src/index.html | 2 +- tsconfig.json | 25 +- vite.config.ts | 28 + webpack.config.js | 166 +- 16 files changed, 7407 insertions(+), 2843 deletions(-) create mode 100644 dist/bundle.js.map create mode 100644 dist/css/style.css.map delete mode 100644 dist/webpack.config.js delete mode 100644 dist/webpack.config.js.map create mode 100644 pnpm-lock.yaml create mode 100644 vite.config.ts diff --git a/dist/bundle.js b/dist/bundle.js index 48fb265..ae85728 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -1,593 +1,369 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ({ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ -/***/ "./src/application/Core/timer.service.ts": -/*!***********************************************!*\ - !*** ./src/application/Core/timer.service.ts ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 81: +/*!**************************************************************!*\ + !*** ./src/application/Graphics/Viewport/Viewport.Helper.ts ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class TimerService { - constructor(targetFps = 60) { - this.fps = targetFps; - this.timePerTick = 1000 / this.fps; - this.delta = 0; - this.now = 0; - this.lastTime = performance.now(); - this.timer = 0; - this.ticks = 0; - this.lastTimeTook = 0; - } - CheckShouldRunLoop() { - this.now = performance.now(); - this.delta += (this.now - this.lastTime) / this.timePerTick; - this.timer += this.now - this.lastTime; - this.lastTimeTook = this.now - this.lastTime; - this.lastTime = this.now; - if (this.delta >= 1) { - return true; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ViewportHelper = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class ViewportHelper { + static GetSquareInBrowser() { + const h = this.GetBrowserHeight() - 5; + const w = this.GetBrowserWidth() - 5; + if (h < w) { + return new Vector2_model_1.Vector2(h, h); + } + else { + return new Vector2_model_1.Vector2(w, w); } - console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`); - return false; - } - UpdateTicksAndRenderAfterLoop() { - this.delta--; - this.ticks++; } - /** - * returns true if it's a good time to print to - * the console - * - * @returns {boolean} - * @memberof FpsService - */ - ShouldPrintDebugData() { - return this.timer > 1000; + static GetWindowInAspectRatio(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1) { + const aspectRatio = aspectRatioWidth / aspectRatioHeight; + const adjustedWindowHeight = this.GetBrowserHeight() * heightPercent; + const adjustedWindowWidth = this.GetBrowserWidth() * widthPercent; + const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); + const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); + return new Vector2_model_1.Vector2(displayWidth, displayHeight); } /** - * prints debug data from this class - * to the console + * Gets a window in a given aspect ratio. * - * @memberof FpsService + * @static + * @param {number} [aspectRatioWidth=16] + * @param {number} [aspectRatioHeight=9] + * @param {number} [widthPercent=1] between 0 & 1. Should usually be the same as heightPercent + * @param {number} [heightPercent=1] between 0 & 1. Shoudl usually be the same as widthPercent + * @param {string} elementId An element to put this canvas into. Can be null (will use the full window) + * @returns {Vector2} + * @memberof ViewportHelper + * @returns {Vector2} + * @memberof ViewportHelper */ - PrintCurrentFpsToConsole() { - return ` - ticks and frames: ${this.ticks.toFixed(2)} - lastDelta: ${this.delta.toFixed(2)} - timer: ${this.timer.toFixed(2)} - lastTime Took: ${this.lastTimeTook.toFixed(2)}`; + static GetWindowInAspectRatioForCanvas(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1, canvasableElement = null) { + if (!canvasableElement) { + console.warn(`setup with no canvasable element. Will use the entire window`); + } + else { + console.warn(`setup with id of ${canvasableElement.id}`); + } + const aspectRatio = aspectRatioWidth / aspectRatioHeight; + if (heightPercent !== widthPercent) { + console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); + } + if (aspectRatioHeight > aspectRatioWidth) { + console.log(`starting in portrait mode (${aspectRatioWidth}:${aspectRatioHeight})`); + } + else { + console.info(`starting in landscape mode (${aspectRatioWidth}:${aspectRatioHeight})`); + } + const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * heightPercent; + const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * widthPercent; + const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); + const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); + return new Vector2_model_1.Vector2(displayWidth, displayHeight); } - ResetTimers() { - if (this.timer > 1000) { - this.ticks = 0; - this.timer = 0; + static GetBrowserWidth(element = null) { + if (!element) { + return window.innerWidth; + } + else { + return element.clientWidth; } } - GetLastUpdateTimeTook() { - return this.lastTimeTook / 1000; + static GetBrowserHeight(element = null) { + if (!element) { + return window.innerHeight; + } + else { + return element.clientHeight; + } } } -exports.TimerService = TimerService; +exports.ViewportHelper = ViewportHelper; /***/ }), -/***/ "./src/application/Entities/Creatures/baddy.ts": -/*!*****************************************************!*\ - !*** ./src/application/Entities/Creatures/baddy.ts ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 289: +/*!****************************************!*\ + !*** ./src/application/World/world.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const creature_1 = __webpack_require__(/*! ./creature */ "./src/application/Entities/Creatures/creature.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ "./src/numerics/helpers/degrees.helper.ts"); -const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ "./src/numerics/helpers/number.helper.ts"); -class Baddy extends creature_1.Creature { - constructor(position, size, name, texturePath, graphicsService, colour, playerService) { - super(position, size, name, texturePath, graphicsService); - this.playerService = playerService; - this.colour = colour; - this.maxSpeed = new Vector2_model_1.Vector2(10, 10); - this.acceleration = new Vector2_model_1.Vector2(.55, .6); - // const friction = 0.85; // RandomNumberGenerator.GetRandomNumber(100, 200) / 1000; - // this.friction = new Vector2(friction, - // friction); - this.direction = new Vector2_model_1.Vector2(0, 0); - // this.velocity = RandomNumberGenerator.GetRandomVector2(-10, 10, -10, 10); - this.rotationDegrees = 0; // RandomNumberGenerator.GetRandomNumber(0, 359); - this.turnSpeed = .0515; - this.thrust = 1; - } - Tick(lastDelta) { - this.UpdateAABB(); - const playerAABB = this.playerService.GetPlayer().getAABB(); - this.MoveToPlayer(playerAABB); - this.Move(lastDelta); - } - Render() { - // super.Draw(this.colour); - } - collideWithObject(entity) { - console.log('colliding with object'); - } - turnToPlayer(playerAABB) { - let dx = playerAABB.GetCenter().getValueX() - this.getAABB().GetCenter().getValueX(); - let dy = playerAABB.GetCenter().getValueY() - this.getAABB().GetCenter().getValueY(); - const len = Math.sqrt(dx * dy + dy * dy); - dx /= len ? len : 0.1; - dy /= len ? len : 0.1; - let dirX = Math.cos(degrees_helper_1.Radians(this.rotationDegrees)); - let dirY = Math.sin(degrees_helper_1.Radians(this.rotationDegrees)); - dirX += (dx - dirX) * 1; - dirY += (dy - dirY) * 1; - const rotateTo = Math.atan2(dirY, dirX); - // this.rotationDegrees = Degrees(rotateTo) + (90); - this.rotationDegrees = number_helper_1.Lerp(this.rotationDegrees, degrees_helper_1.Degrees(rotateTo) + (-this.angleAdjust), .5); - } - MoveToPlayer(playerAABB) { - this.turnToPlayer(playerAABB); - const rotationAsRadians = degrees_helper_1.Radians(this.rotationDegrees - this.angleAdjust); - const rotSin = Math.sin(rotationAsRadians); - const rotCos = Math.cos(rotationAsRadians); - this.velocity.x -= (rotCos * this.thrust); - this.velocity.y -= (rotSin * this.thrust); - // const rotationAsRadians = this.rotationDegrees / Math.PI * 180; - // const rotCos = Math.sin(rotationAsRadians); - // const rotSin = Math.cos(rotationAsRadians); - // this.velocity.x = (rotSin * thrust); - // this.velocity.y = (rotCos * thrust); - // console.log(`baddy: - // rotation: ${this.rotationDegrees} - // CosRotation: ${rotCos} - // SinRotation: ${rotSin} - // velocity: ${this.velocity.concat()}`); - // if (IntersectionHelper.AabbVsAabb( - // this.getAABB(), playerAABB) === false) { - // if (this.getAABB().IsAbove(playerAABB)) { - // this.setDirectionDown(); - // this.velocity.y += this.acceleration.y; - // // console.log('entity is above player') - // } else if (this.getAABB().IsBelow(playerAABB)) { - // this.setDirectionUp(); - // // console.log('entity is above player') - // this.velocity.y -= this.acceleration.y; // console.log('entity is below player') - // } - // if (this.getAABB().IsRight(playerAABB)) { - // this.setDirectionLeft(); - // // console.log('entity is right of the player'); - // this.velocity.x += this.acceleration.x; - // } else if (this.getAABB().IsLeft(playerAABB)) { - // this.setDirectionRigth(); - // // console.log('entity is left of the player') - // this.velocity.x -= this.acceleration.x; - // } - // } - // this.velocity.x -= (this.getDirectionHorizontal() * this.acceleration.x) / 4; - // this.velocity.y += (this.getDirectionVertical() * this.acceleration.y) / 4; - } - setDirectionRigth() { - this.direction.setValueX(1); - } - setDirectionLeft() { - this.direction.setValueX(-1); - } - setDirectionUp() { - this.direction.setValueY(-1); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.World = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); +class World { + constructor(area, spawn, tiles, id) { + this.area = new Vector2_model_1.Vector2(20, 20); + this.area = area; + this.spawn = spawn; + this.tiles = tiles; + this.id = id; } - setDirectionDown() { - this.direction.setValueY(1); + GetTiles() { + return this.tiles; } - getDirectionHorizontal() { - return this.direction.getValueX(); + GetStartingPosition() { + return this.spawn; } - getDirectionVertical() { - return this.direction.getValueY(); + GetId() { + return this.id; } } -exports.Baddy = Baddy; +exports.World = World; /***/ }), -/***/ "./src/application/Entities/Creatures/creature.default.settings.ts": -/*!*************************************************************************!*\ - !*** ./src/application/Entities/Creatures/creature.default.settings.ts ***! - \*************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 378: +/*!***************************************************************!*\ + !*** ./src/application/Graphics/Viewport/viewport.service.ts ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class CreatureDefaultSettings { -} -CreatureDefaultSettings.DEFAULT_HEALTH = 100; -CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED = new Vector2_model_1.Vector2(3.0, 3.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX = new Vector2_model_1.Vector2(11.0, 11.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION = new Vector2_model_1.Vector2(3.0, 3.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_VELOCITY = new Vector2_model_1.Vector2(3, 3); -CreatureDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(20, 20); -CreatureDefaultSettings.DEFAULT_FRICTION = new Vector2_model_1.Vector2(0.95, 0.95); -exports.CreatureDefaultSettings = CreatureDefaultSettings; - - -/***/ }), - -/***/ "./src/application/Entities/Creatures/creature.ts": -/*!********************************************************!*\ - !*** ./src/application/Entities/Creatures/creature.ts ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_entity_1 = __webpack_require__(/*! ../_base-entity */ "./src/application/Entities/_base-entity.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const creature_default_settings_1 = __webpack_require__(/*! ./creature.default.settings */ "./src/application/Entities/Creatures/creature.default.settings.ts"); -const vector2_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/vector2.helper */ "./src/numerics/helpers/vector2.helper.ts"); -const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ "./src/numerics/helpers/number.helper.ts"); -class Creature extends _base_entity_1.Entity { - // protected canvasId: string; - // protected texture: Texture2D; - constructor(position, size, name, texturePath, graphicsService) { - super(position, size, name, '1', 'no_text_yet'); - this.turnSpeed = 1; - this.angleAdjust = -90; - console.error('passing incorrect texture ID and canvasId, and canvas to super'); - this.graphicsService = graphicsService; - this.health = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_HEALTH; - this.speed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED; - this.velocity = new Vector2_model_1.Vector2(0, 0); - this.maxSpeed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX; - this.acceleration = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION; - this.deceleration = vector2_helper_1.Vector2Helpers.DivideByScale(creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION, 1); - this.friction = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_FRICTION; - this.setCanvasId(this.graphicsService.RegisterDrawableEntity()); - if (texturePath !== undefined && texturePath !== null && texturePath.length) { - const textureId = this.graphicsService.GetTextureService().RegisterNewTexture(texturePath); - this.SetTextureId(textureId); - } - else { - console.error(new Error(`creature [${name}] did not have a texture`)); - } - } - Move(lastDelta) { - this.CapMovementSpeed(); - this.CapRotation(); - this.UpdatePosition(lastDelta); - this.ReduceSpeed(); - this.UpdateAABB(); - } - ReduceSpeed() { - this.velocity.y *= this.friction.y; - this.velocity.x *= this.friction.x; - // if (this.velocity.y > 0) { - // this.velocity.y -= this.friction.y; - // if (this.velocity.y < 0) { - // this.velocity.y = 0; - // } - // } else if (this.velocity.y < 0) { - // this.velocity.y += this.friction.y; - // if (this.velocity.y > 0) { - // this.velocity.y = 0; - // } - // } - // if (this.velocity.x > 0) { - // this.velocity.x -= this.friction.x; - // if (this.velocity.x < 0) { - // this.velocity.x = 0; - // } - // } else if (this.velocity.x < 0) { - // this.velocity.x += this.friction.x; - // if (this.velocity.x > 0) { - // this.velocity.x = 0; - // } - // } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ViewportService = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class ViewportService { + constructor(aspectRatio = new Vector2_model_1.Vector2(16, 9), sizePercent = new Vector2_model_1.Vector2(1, 1)) { + this.listeningForBrowserChanges = false; + this.aspectRatio = aspectRatio; + this.aspectRatioCalculated = (this.aspectRatio.getValueX() / this.aspectRatio.getValueY()); + this.sizePercent = sizePercent; + this.setupListner(); } - /** - * updates the creature's position - * - * @private - * @memberof Creature - */ - UpdatePosition(lastDelta) { - // this.position.x += (this.velocity.x * (lastDelta) * 50); - // this.position.y += (this.velocity.y * (lastDelta) * 50); - this.position.x = number_helper_1.Lerp(this.position.x, this.position.x + (this.velocity.x * (lastDelta) * 50), .8); - this.position.y = number_helper_1.Lerp(this.position.y, this.position.y + (this.velocity.y * (lastDelta) * 50), .8); + setupListner() { + console.log('setting up browser listner'); + this.listner = window.addEventListener('resize', () => { + this.listeningForBrowserChanges = true; + setTimeout(() => { + this.listeningForBrowserChanges = false; + }, 5000); + }); } /** - * caps the creature's movement speed at - * this.maxSpeed + *Gets a window in a the game's aspect ratio * - * @private - * @memberof Creature + * @param {HTMLElement} [canvasableElement=null] + * @returns {Vector2} + * @memberof ViewportService */ - CapMovementSpeed() { - if (this.velocity.x > this.maxSpeed.x) { - this.velocity.x = this.maxSpeed.x; + GetWindowInAspectRatioForCanvas(canvasableElement = null) { + if (!canvasableElement) { + console.warn(`setup with no canvasable element. Will use the entire window`); } - else if (this.velocity.x < -this.maxSpeed.x) { - this.velocity.x = -this.maxSpeed.x; + else { + console.warn(`setup with id of ${canvasableElement.id}`); } - if (this.velocity.y > this.maxSpeed.y) { - this.velocity.y = this.maxSpeed.y; + if (this.sizePercent.getValueX() !== this.sizePercent.getValueY()) { + console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); } - else if (this.velocity.y < -this.maxSpeed.y) { - this.velocity.y = -this.maxSpeed.y; + if (this.aspectRatio.getValueX() > this.aspectRatio.getValueY()) { + console.log(`starting in portrait mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); } - if (this.velocity.x < 0.1 && this.velocity.x > -0.1) { - this.velocity.x = 0; + else { + console.info(`starting in landscape mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); } - if (this.velocity.y < 0.1 && this.velocity.y > -0.1) { - this.velocity.y = 0; + const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * this.sizePercent.getValueX(); + const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * this.sizePercent.getValueY(); + const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); + const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); + return new Vector2_model_1.Vector2(displayWidth, displayHeight); + } + GetSquareInBrowser() { + const h = this.GetBrowserHeight() - 5; + const w = this.GetBrowserWidth() - 5; + if (h < w) { + return new Vector2_model_1.Vector2(h, h); + } + else { + return new Vector2_model_1.Vector2(w, w); } } - CapRotation() { - // if (this.rotationDegrees < 0) { - // this.rotationDegrees = 360 - (-this.rotationDegrees); - // } - // if (this.rotationDegrees < 0) { - // this.rotationDegrees = 359; - // } if (this.rotationDegrees > 360) { - // this.rotationDegrees = 0; - // } + GetWindowInAspectRatio() { + const adjustedWindowHeight = this.GetBrowserHeight() * this.sizePercent.getValueX(); + const adjustedWindowWidth = this.GetBrowserWidth() * this.sizePercent.getValueY(); + const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); + const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); + return new Vector2_model_1.Vector2(displayWidth, displayHeight); } - getHealth() { - return this.health; + GetBrowserWidth(element = null) { + if (!element) { + return window.innerWidth; + } + else { + return element.clientWidth; + } } - setHealth(health) { - this.health = health; + GetBrowserHeight(element = null) { + if (!element) { + return window.innerHeight; + } + else { + return element.clientHeight; + } } - getSpeed() { - return this.speed; + getBrowserSize() { + return this.browserSize; } - setSpeed(speed) { - this.speed = speed; + setBrowserSize(browserSize) { + this.browserSize = browserSize; } - getMove() { - return this.velocity; + getViewportSize() { + return this.viewportSize; } - setMove(move) { - this.velocity = move; + setViewportSize(viewportSize) { + this.viewportSize = viewportSize; } } -exports.Creature = Creature; +exports.ViewportService = ViewportService; /***/ }), -/***/ "./src/application/Entities/Creatures/player.ts": -/*!******************************************************!*\ - !*** ./src/application/Entities/Creatures/player.ts ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 652: +/*!**********************************************!*\ + !*** ./src/application/states/_BaseState.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const creature_1 = __webpack_require__(/*! ./creature */ "./src/application/Entities/Creatures/creature.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ "./src/numerics/helpers/degrees.helper.ts"); -class Player extends creature_1.Creature { - constructor(position, size, name, texturePath, inputManager, graphicsService) { - super(position, size, name, texturePath, graphicsService); - this.rotationSpeed = 5; - this.strafeThrust = 1.5; - this.startingFriction = this.friction; - this.inputManager = inputManager; - this.health = 100; - this.detailsDiv = document.getElementById('details_div'); - this.colour = '#fff'; - this.thrust = 1; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BaseState = void 0; +class BaseState { +} +exports.BaseState = BaseState; + + +/***/ }), + +/***/ 659: +/*!********************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TileType = void 0; +class TileType { + constructor(id, fallbackOutlineColour, textureId) { + this.textureId = textureId; + this.id = id; + this.fallbackOutlineColour = fallbackOutlineColour; } - Tick(lastDelta) { - this.GetInput(); - this.Move(lastDelta); - this.graphicsService.getGameCameraService().LookAt(this.position, this.size); + Tick() { } - GetInput() { - // this.setMove(new Vector2(0, 0)); - this.UpdatePlayerSpeedFromInput(); - this.UpdatePlayerRotationFromInput(); - this.UpdatePlayerStrafeFromInput(); - // if (this.inputManager.IsKeyPressed('direction_left')) { - // this.AddToRotation(-(this.rotationSpeed * this.inputManager.GetForceValue('direction_left'))); - // // this.AddToRotation(-this.rotationSpeed); - // // this.velocity.x -= this.acceleration.x; - // } - // if (this.inputManager.IsKeyPressed('direction_right')) { - // this.AddToRotation(this.rotationSpeed * this.inputManager.GetForceValue('direction_right')); - // // this.velocity.x += this.acceleration.x; - // } - if (this.inputManager.IsKeyPressed('')) - if (this.inputManager.IsKeyPressed('action_a')) { - console.log('space pressed'); - } - // console.log(`this.movement.x = ${this.movement.x}`) + GetTextureId() { + return this.textureId; } - UpdatePlayerRotationFromInput() { - if (this.inputManager.IsKeyPressed('axes_pad_left_horizontal')) { - this.AddToRotation(this.rotationSpeed * - this.inputManager.GetForceValue('axes_pad_left_horizontal')); - } - else { - if (this.inputManager.IsKeyPressed('direction_right')) { - this.AddToRotation(this.rotationSpeed * - this.inputManager.GetForceValue('direction_right')); - } - if (this.inputManager.IsKeyPressed('direction_left')) { - this.AddToRotation(-(this.rotationSpeed * - this.inputManager.GetForceValue('direction_left'))); - } - } + GetId() { + return this.id; } - UpdatePlayerSpeedFromInput() { - const rotationAsRadians = degrees_helper_1.Radians(this.rotationDegrees - this.angleAdjust); - const rotSin = Math.sin(rotationAsRadians); - const rotCos = Math.cos(rotationAsRadians); - if (this.inputManager.IsKeyPressed('trigger_two_right') || - this.inputManager.IsKeyPressed('direction_up')) { - const triggerTwoRightForce = Math.max(this.inputManager.GetForceValue('direction_up'), (this.inputManager.GetForceValue('trigger_two_right'))); - this.velocity.x -= (rotCos * (this.thrust * triggerTwoRightForce)); - this.velocity.y -= (rotSin * (this.thrust * triggerTwoRightForce)); - } - if (this.inputManager.IsKeyPressed('trigger_two_left') || - this.inputManager.IsKeyPressed('direction_down')) { - const triggerTwoLeftForce = Math.max(this.inputManager.GetForceValue('trigger_two_left'), (this.inputManager.GetForceValue('direction_down'))); - // this.velocity.x += (rotCos * (this.thrust * triggerTwoLeftForce)); - // this.velocity.y += (rotSin * (this.thrust * triggerTwoLeftForce)); - this.friction.x = 0.85; - this.friction.y = 0.85; - } - else { - this.friction = new Vector2_model_1.Vector2(this.startingFriction.getValueX(), this.startingFriction.getValueY()); - } - if (this.inputManager.IsKeyPressed('trigger_one_right')) { - const triggerOneRightForce = this.inputManager.GetForceValue('trigger_one_right'); - this.velocity.x += (rotSin * triggerOneRightForce) * this.strafeThrust; - this.velocity.y -= (rotCos * triggerOneRightForce) * this.strafeThrust; + GetFallbackColour() { + return this.fallbackOutlineColour; + } +} +exports.TileType = TileType; + + +/***/ }), + +/***/ 752: +/*!***********************************************!*\ + !*** ./src/application/Core/timer.service.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TimerService = void 0; +class TimerService { + constructor(targetFps = 60) { + this.fps = targetFps; + this.timePerTick = 1000 / this.fps; + this.delta = 0; + this.now = 0; + this.lastTime = performance.now(); + this.timer = 0; + this.ticks = 0; + this.lastTimeTook = 0; + } + CheckShouldRunLoop() { + this.now = performance.now(); + this.delta += (this.now - this.lastTime) / this.timePerTick; + this.timer += this.now - this.lastTime; + this.lastTimeTook = this.now - this.lastTime; + this.lastTime = this.now; + if (this.delta >= 1) { + return true; } - if (this.inputManager.IsKeyPressed('trigger_one_left')) { - const triggerOneLeftForce = this.inputManager.GetForceValue('trigger_one_right'); - this.velocity.x -= rotSin * triggerOneLeftForce; - this.velocity.y += rotCos * triggerOneLeftForce; + console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`); + return false; + } + UpdateTicksAndRenderAfterLoop() { + this.delta--; + this.ticks++; + } + /** + * returns true if it's a good time to print to + * the console + * + * @returns {boolean} + * @memberof FpsService + */ + ShouldPrintDebugData() { + return this.timer > 1000; + } + /** + * prints debug data from this class + * to the console + * + * @memberof FpsService + */ + PrintCurrentFpsToConsole() { + return ` + ticks and frames: ${this.ticks.toFixed(2)} + lastDelta: ${this.delta.toFixed(2)} + timer: ${this.timer.toFixed(2)} + lastTime Took: ${this.lastTimeTook.toFixed(2)}`; + } + ResetTimers() { + if (this.timer > 1000) { + this.ticks = 0; + this.timer = 0; } - this.detailsDiv.innerHTML = ` - player:
- ve: ${this.velocity.concat(3)}
- ro: ${this.rotationDegrees.toFixed(3)}DEG
- ro: ${rotationAsRadians.toFixed(3)}RAD
- th: ${this.thrust.toFixed(3)}
- rS: ${rotSin.toFixed(3)}
- rC: ${rotCos.toFixed(3)}
- - `; } - UpdatePlayerStrafeFromInput() { - // if (this.inputManager.IsKeyPressed('trigger_one_right')) { - // this.velocity.x -= (this.inputManager.GetForceValue('trigger_one_right') * this.acceleration.y) ; - // } - // if (this.inputManager.IsKeyPressed('trigger_one_left')) { - // this.velocity.x += (this.inputManager.GetForceValue('trigger_one_left') * this.acceleration.y) ; - // } + GetLastUpdateTimeTook() { + return this.lastTimeTook / 1000; } } -exports.Player = Player; +exports.TimerService = TimerService; /***/ }), -/***/ "./src/application/Entities/_base-entity.ts": +/***/ 954: /*!**************************************************!*\ !*** ./src/application/Entities/_base-entity.ts ***! \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const random_guid_generator_1 = __webpack_require__(/*! ../Tools/random_generators/random_guid.generator */ "./src/application/Tools/random_generators/random_guid.generator.ts"); -const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ "./src/numerics/models/AABB.model.ts"); -const drawable_1 = __webpack_require__(/*! ../Graphics/Draw/drawable */ "./src/application/Graphics/Draw/drawable.ts"); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Entity = void 0; +const random_guid_generator_1 = __webpack_require__(/*! ../Tools/random_generators/random_guid.generator */ 6953); +const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ 5537); +const drawable_1 = __webpack_require__(/*! ../Graphics/Draw/drawable */ 7267); // export interface IEntity { // position: Vector2; // size: Vector2; @@ -647,1347 +423,1445 @@ exports.Entity = Entity; /***/ }), -/***/ "./src/application/Entities/entity.service.ts": -/*!****************************************************!*\ - !*** ./src/application/Entities/entity.service.ts ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 961: +/*!*********************************************************!*\ + !*** ./src/application/Graphics/Tiles/drawable-tile.ts ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class EntityService { - constructor( - // drawingService: DrawingService - ) { - this.gameEntities = new Array(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DrawableTile = void 0; +const drawable_1 = __webpack_require__(/*! ../Draw/drawable */ 7267); +class DrawableTile extends drawable_1.Drawable { + constructor(tileTypeId, position, size, fallbackOutlineColour, canvasId, textureId) { + super(position, size, canvasId, textureId); + this.tileTypeId = tileTypeId; + this.colour = fallbackOutlineColour; } - TickAllEntities(lastDelta) { - for (let i = 0; i < this.gameEntities.length; i++) { - this.gameEntities[i].Tick(lastDelta); - } + getTileTypeId() { + return this.tileTypeId; } - RenderAllEntities(graphicsService) { - for (let i = 0; i < this.gameEntities.length; i++) { - graphicsService.getDrawingService().Draw(this.gameEntities[i]); - } + getPosition() { + return this.position; } - RegisterEntity(entity) { - console.log('registering an entity'); - this.gameEntities.push(entity); + getSize() { + return this.size; } } -exports.EntityService = EntityService; +exports.DrawableTile = DrawableTile; /***/ }), -/***/ "./src/application/Entities/player.service.ts": -/*!****************************************************!*\ - !*** ./src/application/Entities/player.service.ts ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 1226: +/*!**********************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class PlayerService { - constructor() { - } - SetPlayer(player) { - if (this.player !== undefined) { - console.error(`playerService.SetPlayer would overwrite the existing player`); - } - else { - console.warn('setting player'); - this.player = player; - } - } - GetPlayer() { - return this.player; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StarTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class StarTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#060948', textId); } } -exports.PlayerService = PlayerService; +exports.StarTileType = StarTileType; +StarTileType.texturePath = '/Tiles/space_tile2.png'; /***/ }), -/***/ "./src/application/Graphics/Camera/game-camera.service.ts": -/*!****************************************************************!*\ - !*** ./src/application/Graphics/Camera/game-camera.service.ts ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 1759: +/*!***********************************************!*\ + !*** ./src/numerics/helpers/number.helper.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ "./src/application/Graphics/Viewport/Viewport.Helper.ts"); -const intersection_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/intersection.helper */ "./src/numerics/helpers/intersection.helper.ts"); -const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ "./src/numerics/models/AABB.model.ts"); -class GameCameraService { - /** - *Creates an instance of GameCameraService. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Between = Between; +exports.Lerp = Lerp; +function Between(x, min, max) { + return x >= min && x <= max; +} +function Lerp(start, end, amt) { + return (1 - amt) * start + amt * end; +} - applyWorldBounding tells the camera if it should continue - moving right or left if it reaches the edge of the level - * @param {number} xOffset - * @param {number} yOffset - * @param {boolean} applyWorldBounding - * @memberof GameCameraService - */ - constructor(xOffset, yOffset, applyWorldBounding) { - this.offset = new Vector2_model_1.Vector2(xOffset, yOffset); - this.applyWorldBounding = applyWorldBounding; - this.displayableSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio(); - this.UpdatePositionAndSize(); + +/***/ }), + +/***/ 1854: +/*!**********************************************!*\ + !*** ./src/application/Input/input.model.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Input = void 0; +class Input { + constructor(name, keyboardId, gamepadId, gamePadAxesId) { + this.pressed = false; + this.force = 0; + this.wasPressedPreviousCheck = false; + this.name = name; + this.keyboardId = keyboardId; + this.gamepadId = gamepadId; + this.gamePadAxesId = gamePadAxesId; } - SetLevelAABB(levelAABB) { - this.levelAABB = levelAABB; +} +exports.Input = Input; + + +/***/ }), + +/***/ 1874: +/*!***********************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SpaceTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class SpaceTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#1C1C1B', textId); } - GetDebugInfo() { - return [` - offset: ${this.offset.concat(2)} - size: ${this.displayableSize.concat(2)}`]; +} +exports.SpaceTileType = SpaceTileType; +SpaceTileType.texturePath = '/Tiles/space_tile.png'; + + +/***/ }), + +/***/ 2126: +/*!*********************************!*\ + !*** ./src/application/game.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Game = void 0; +const InputManager_1 = __webpack_require__(/*! ./Input/InputManager */ 5622); +const debug_service_1 = __webpack_require__(/*! ./_debug/debug.service */ 6417); +const debug_component_1 = __webpack_require__(/*! ./_debug/debug.component */ 5277); +const Vector2_model_1 = __webpack_require__(/*! ../numerics/models/Vector2.model */ 2239); +const GameState_1 = __webpack_require__(/*! ./states/GameState */ 7918); +const state_service_1 = __webpack_require__(/*! ./states/state.service */ 9809); +const MenuState_1 = __webpack_require__(/*! ./states/MenuState */ 2345); +const SettingsState_1 = __webpack_require__(/*! ./states/SettingsState */ 9623); +const player_1 = __webpack_require__(/*! ./Entities/Creatures/player */ 9188); +const graphics_service_1 = __webpack_require__(/*! ./Graphics/graphics.service */ 4288); +const baddy_1 = __webpack_require__(/*! ./Entities/Creatures/baddy */ 7709); +const random_string_generator_1 = __webpack_require__(/*! ./Tools/random_generators/random_string.generator */ 9473); +const random_number_generators_1 = __webpack_require__(/*! ./Tools/random_generators/random_number.generators */ 6012); +const world_service_1 = __webpack_require__(/*! ./World/world.service */ 9992); +const viewport_service_1 = __webpack_require__(/*! ./Graphics/Viewport/viewport.service */ 378); +const player_service_1 = __webpack_require__(/*! ./Entities/player.service */ 7594); +const entity_service_1 = __webpack_require__(/*! ./Entities/entity.service */ 9984); +const timer_service_1 = __webpack_require__(/*! ./Core/timer.service */ 752); +class Game { + constructor() { + this.running = false; + this.launchMessage = 'Start'; + this.performanceInfoDiv = document.getElementById('performance_div'); + this.performanceInfoDiv.innerHTML = `waiting for perf data`; + this.viewportService = new viewport_service_1.ViewportService(); + const loadedInDebugMode = this.checkDebugModeFromQueryString(); + this.graphicsService = new graphics_service_1.GraphicsService(); + this.stateService = new state_service_1.StateService(); + this.debugService = new debug_service_1.DebugService(loadedInDebugMode); + this.debugComponent = new debug_component_1.DebugComponent(this.debugService); + this.inputManager = new InputManager_1.InputManager(); + this.timerService = new timer_service_1.TimerService(60); + this.worldService = new world_service_1.WorldService(this.graphicsService.GetTileService()); + this.entityService = new entity_service_1.EntityService(); + this.playerService = new player_service_1.PlayerService(); } - /** - * checks if two objects intersect - * - * @param {Vector2} position - * @param {Vector2} size - * @returns {boolean} - * @memberof GameCameraService - */ - IsObectOnScreen(position, size) { - const objectAABB = new AABB_model_1.AABB(position, size); - return this.IsObjectOnScreenAABB(objectAABB); + Run() { + console.log('Run called in game.ts'); + this.Init(); + this.running = true; + this.Loop(); } - IsObjectOnScreenAABB(AABB) { - if (intersection_helper_1.IntersectionHelper.AabbVsAabb(this.cameraAABB, AABB)) { - return true; - } - else { - return false; + Init() { + console.log(this.launchMessage + ' will now be posted to the document '); + this.SetupStates(); + this.inputManager.InitInputManager(); + this.graphicsService.InitGraphicsService(); + this.worldService.Init(); + this.graphicsService.getGameCameraService().SetLevelAABB(this.worldService.GetWorldSize()); + this.registerEntities(); + // this.canvasManager.InitCanvasManager('main_div', this.gameEntities); + if (this.debugService.IsInDebugMode()) { + console.log('setting up with debug info'); + this.debugComponent.InitDebugComponent('main_div'); } + return this.launchMessage; } - MoveCamera(xAmount, yAmount) { - console.error('don\'t use MoveCamera'); - this.offset.x += xAmount; - this.offset.y += yAmount; + SetupStates() { + this.gameState = new GameState_1.GameState(this.graphicsService); + this.menuState = new MenuState_1.MenuState(); + this.settingsState = new SettingsState_1.SettingsState(); + this.stateService.setState(this.gameState); } /** - * sets the camera to points at (looks at) a specific entity + * loops continuously whenever the browser is ready + * for a new frame * - * @param {Vector2} entityPosition - * @param {Vector2} entitySize - * @memberof GameCameraService + * @memberof Game */ - LookAt(entityPosition, entitySize) { - const vieportWidth = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueX(); - const vieportHeight = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueY(); - const centerX = entityPosition.getValueX() - (vieportWidth / 2) + (entitySize.getValueX() / 2); - const centerY = entityPosition.getValueY() - (vieportHeight / 2) + (entitySize.getValueY() / 2); - this.SetOffset(new Vector2_model_1.Vector2(centerX, centerY)); - } - SetOffset(positionVector) { - this.offset = positionVector; - if (this.applyWorldBounding) { - if (this.offset.getValueX() < this.levelAABB.GetLeft()) { - this.offset.setValueX(this.levelAABB.GetLeft()); - } - if (this.offset.getValueX() > this.levelAABB.GetRight()) { - this.offset.setValueX(this.levelAABB.GetRight()); + Loop() { + requestAnimationFrame(() => { + if (this.running) { + if (this.timerService.CheckShouldRunLoop()) { + const lastDelta = this.timerService.GetLastUpdateTimeTook(); + this.Update(lastDelta); + this.Render(lastDelta); + this.timerService.UpdateTicksAndRenderAfterLoop(); + } + this.PrintDebugInfoToConsole(false, true); + this.timerService.ResetTimers(); } - if (this.offset.getValueY() < this.levelAABB.GetTop()) { - this.offset.setValueY(this.levelAABB.GetTop()); + this.Loop(); + }); + } + /** + * prints debug info from various places in the + * application + * + * @private + * @memberof Game + */ + PrintDebugInfoToConsole(printToConsole = false, printToHtml = false) { + if (this.timerService.ShouldPrintDebugData()) { + // console.clear(); + let debugInformation = new Array(); + debugInformation.push('FPS Serv: ' + this.timerService.PrintCurrentFpsToConsole()); + debugInformation.push('Cam Serv: ' + this.graphicsService.getGameCameraService().GetDebugInfo()); + if (printToConsole) { + for (let line of debugInformation) { + if (line.length > 0) { + console.log('%c ' + line + ' ', 'background: #000; color:white; '); + } + } } - if (this.offset.getValueY() > this.levelAABB.GetBottom()) { - this.offset.setValueY(this.levelAABB.GetBottom()); + if (printToHtml) { + this.performanceInfoDiv.innerHTML = `
${debugInformation.join('\n')}
`; } + // debugInformation = Array(0); } - this.UpdatePositionAndSize(); } - UpdatePositionAndSize() { - this.cameraAABB = new AABB_model_1.AABB(this.offset, this.displayableSize); + Update(lastDelta) { + if (this.stateService.GetState() !== null) { + this.inputManager.NewInputLoopCheck(); + this.stateService.GetState().Tick(); + this.entityService.TickAllEntities(lastDelta); + // for (let i = 0; i < this.gameEntities.length; i++) { + // this.gameEntities[i].Tick(); + // } + } } - GetOffsetX() { - return this.offset.getValueX(); + Render(lastDelta) { + if (this.stateService.GetState() !== null) { + this.graphicsService.GetTileService().Redner(); + this.entityService.RenderAllEntities(this.graphicsService); + this.stateService.GetState().Render(); + this.graphicsService.Render(); + } } - GetOffsetY() { - return this.offset.getValueY(); + checkDebugModeFromQueryString() { + const urlParams = new URLSearchParams(window.location.search); + const debugModeParam = urlParams.get('inDebugMode'); + return JSON.parse(debugModeParam); } - GetOffsetVector() { - return this.offset; + registerEntities(baddyCount = 75) { + const ships = [ + 'metalic_01.png', + 'metalic_02.png', + 'metalic_03.png', + 'metalic_04.png', + 'metalic_05.png', + 'metalic_06.png', + 'orange_01.png', + 'orange_02.png', + 'orange_03.png', + 'orange_04.png', + 'orange_05.png', + 'orange_06.png' + ]; + const entitySize = new Vector2_model_1.Vector2(30, 30); + for (let i = 0; i < baddyCount; i++) { + const imageLoc = random_number_generators_1.RandomNumberGenerator.GetRandomNumber(0, 6); + console.log('image loc will be ' + imageLoc); + const entity = new baddy_1.Baddy( + // new Vector2(500, 300), + random_number_generators_1.RandomNumberGenerator.GetRandomVector2(0, this.viewportService.GetBrowserWidth(), 0, this.viewportService.GetBrowserHeight()), entitySize, 'baddy' + i.toString(), '/Ships/' + ships[imageLoc], this.graphicsService, random_string_generator_1.RandomStringGenerator.GetRandomHexColour(), this.playerService); + this.entityService.RegisterEntity(entity); + } + this.playerService.SetPlayer(new player_1.Player(new Vector2_model_1.Vector2(this.viewportService.GetBrowserWidth() / 2, this.viewportService.GetBrowserHeight() / 2), + // new Vector2(0, 0), + new Vector2_model_1.Vector2(50, 50), 'player', 'Ships/large_purple_01.png', this.inputManager, this.graphicsService)); + this.entityService.RegisterEntity(this.playerService.GetPlayer()); + // return entities; } } -exports.GameCameraService = GameCameraService; +exports.Game = Game; /***/ }), -/***/ "./src/application/Graphics/Canvas/graphics.canvas.service.ts": -/*!********************************************************************!*\ - !*** ./src/application/Graphics/Canvas/graphics.canvas.service.ts ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2185: +/*!**********************************************!*\ + !*** ./src/application/Input/input-state.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const graphics_drawable_canvas_1 = __webpack_require__(/*! ../Models/graphics.drawable-canvas */ "./src/application/Graphics/Models/graphics.drawable-canvas.ts"); -const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ "./src/application/Graphics/Viewport/Viewport.Helper.ts"); -const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ "./src/application/Tools/random_generators/random_guid.generator.ts"); -class CanvasService { - constructor(htmlService) { - console.log('creating a canvas service'); - this.htmlService = htmlService; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InputState = void 0; +const input_model_1 = __webpack_require__(/*! ./input.model */ 1854); +class InputState { + constructor() { + this.controllingWithPad = false; + console.log('inputState: constructing input state'); + this.detailsDiv = document.getElementById('details_div'); + this.registeredGamePads = new Array(); + this.gamePads = new Array(); } Init() { - const viewportSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatioForCanvas(); - this.viewportHeight = viewportSize.y; - this.viewportWidth = viewportSize.x; - this.mainCanvas = this.htmlService.createCanvas('main_canvas', this.htmlService.GetMainDiv().id, this.viewportWidth, this.viewportHeight, ['parent']); - this.mainCanvasCtx = this.mainCanvas.getContext('2d'); - this.drawableAreas = new Array(); + console.log('inputState: init inputstate'); + this.setupInputs(); + this.SetupGamePadRegistrationWatch(); + this.SetupKeyboardInputWatch(); + this.SetGamePadMode(false); } - RegisterNewCanvas(id = null) { - console.log(`registering a new canvas with id ${id}`); - if (id === null) { - id = random_guid_generator_1.GuidGenerator.NewGuid(); + SetGamePadMode(controllingWithPad) { + this.controllingWithPad = controllingWithPad; + if (controllingWithPad) { + this.detailsDiv.innerHTML = 'controlling with gamepad. Press >> k << to use keyboard mode'; } - const canvas = this.htmlService.createCanvas(id, this.mainCanvas.id, this.viewportWidth, this.viewportHeight); - this.drawableAreas.push(new graphics_drawable_canvas_1.DrawableCanvas(canvas, id, this.viewportWidth, this.viewportHeight)); - return id; - } - GetMainCanvas() { - return this.mainCanvas; - } - GetCanvas(id) { - for (let i = 0; i < this.drawableAreas.length; i++) { - if (this.drawableAreas[i].id === id) { - return this.drawableAreas[i]; - } + else { + this.detailsDiv.innerHTML = 'controlling with keyboard. Press >> select << to use gamepad mode'; } - console.error(`failed to get a canvas of id ${id}`); } -} -exports.CanvasService = CanvasService; - - -/***/ }), - -/***/ "./src/application/Graphics/Draw/drawable.ts": -/*!***************************************************!*\ - !*** ./src/application/Graphics/Draw/drawable.ts ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ "./src/numerics/models/AABB.model.ts"); -class Drawable { - constructor(position, size, canvasId, textureId) { - console.log(`drawable constructor`); - this.position = position; - this.size = size; - this.AABB = new AABB_model_1.AABB(this.position, this.size); - this.canvasId = canvasId; - this.rotationDegrees = 0; - this.textureId = textureId; + GetGamePadMode() { + return this.controllingWithPad; } - getCanvasId() { - return this.canvasId; + /** + * // https://w3c.github.io/gamepad/#remapping + * + * @memberof InputState + */ + setupInputs() { + this.currentInputs = new Array(); + this.currentInputs.push(new input_model_1.Input('direction_left', 'a', 14, null), new input_model_1.Input('direction_right', 'd', 15, null), new input_model_1.Input('direction_up', 'w', 12, null), new input_model_1.Input('direction_down', 's', 13, null), new input_model_1.Input('axes_pad_left_horizontal', null, null, 0), new input_model_1.Input('axes_pad_left_vertical', null, null, 1), new input_model_1.Input('axes_pad_right_horizontal', null, null, 2), new input_model_1.Input('axes_pad_right_vertical', null, null, 3), new input_model_1.Input('trigger_one_left', 'q', 4, null), new input_model_1.Input('trigger_two_left', 'w', 6, null), new input_model_1.Input('trigger_one_right', 'e', 5, null), new input_model_1.Input('trigger_two_right', 's', 7, null), + // 'action_{val}' where {val} is the + // name of the button on an XBox360 controller + new input_model_1.Input('action_a', ' ', 0, null), new input_model_1.Input('action_y', 'z', 3, null), new input_model_1.Input('action_x', 'x', 2, null), new input_model_1.Input('action_b', 'c', 1, null)); } - setCanvasId(canvasId) { - this.canvasId = canvasId; + UpdateInputs() { + // console.log('inputstate: updating inputs. There are ' + this.registeredGamePads.length + ' pads connected') + this.UpdateGamePadInputs(); } - GetTextureId() { - return this.textureId; + ResetInputsBeforeGamePadInput() { + for (let input of this.currentInputs) { + input.wasPressedPreviousCheck = input.pressed; + input.pressed = false; + } } - SetTextureId(textureId) { - this.textureId = textureId; + UpdateGamePadInputs() { + for (let i = 0; i < this.registeredGamePads.length; i++) { + const padToCheck = this.GetGamePad(i); + if (this.GetGamePadMode()) { + this.ResetInputsBeforeGamePadInput(); + for (let btnIndex = 0; btnIndex < padToCheck.buttons.length; btnIndex++) { + if (this.gamePadButtonPressed(padToCheck.buttons[btnIndex])) { + this.pushToCurrentInputsFromGamePad(btnIndex, padToCheck.buttons[btnIndex].value); + // console.log(`inputstate: btn ${btnIndex} is pressed`) + } + } + for (let axesIndex = 0; axesIndex < padToCheck.axes.length; axesIndex++) { + if (this.gamePadAxesPressed(padToCheck.axes[axesIndex])) { + this.pushToCurrentInputsFromGamePadAxes(axesIndex, padToCheck.axes[axesIndex]); + } + } + } + else { + if (this.gamePadButtonPressed(padToCheck.buttons[8])) { + console.warn('inputstate: in gamepad mode'); + this.SetGamePadMode(true); + } + } + } } - getAABB() { - if (this.AABB === undefined) { - this.UpdateAABB(); + IsInputPressed(inputDescription) { + for (let input of this.currentInputs) { + if (input.name === inputDescription) { + return input.pressed; + } } - return this.AABB; + return false; } - setAABB(AABB) { - this.AABB = AABB; + GetForceValue(inputDescription) { + for (let input of this.currentInputs) { + if (input.name === inputDescription) { + return input.force; + } + } + return 0; } - UpdateAABB() { - this.setAABB(new AABB_model_1.AABB(this.position, this.size)); + /** + * checks if this key is in the SYSTEM_KEYS array + * (includes keys like F1 - F12) + * + * @private + * @param {string} key + * @returns + * @memberof InputState + */ + isSystemKey(key) { + if (InputState.SYSTEM_KEYS.includes(key)) { + return true; + } + return false; } - GetPositionX() { - return this.position.x; + SetupKeyboardInputWatch() { + window.addEventListener('keydown', event => { + if (!this.isSystemKey(event.key)) { + event.preventDefault(); + this.pushToCurrentInputsFromKeyboard(event.key); + } + }); + window.addEventListener('keyup', event => { + if (!this.isSystemKey(event.key)) { + event.preventDefault(); + this.popFromCurrentInputsFromKeyboard(event.key); + if (event.key === 'k') { + console.warn(`inputstate: controlling by keyboard`); + this.SetGamePadMode(false); + } + } + }); } - GetPositionY() { - return this.position.y; + pushToCurrentInputsFromKeyboard(key) { + if (this.GetGamePadMode() === false) { + for (let thisInput of this.currentInputs) { + if (thisInput.keyboardId === key) { + thisInput.pressed = true; + thisInput.force = 1; + // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) + return; + } + } + } } - GetSizeX() { - return this.size.x; + popFromCurrentInputsFromKeyboard(key) { + if (this.GetGamePadMode() === false) { + for (let input of this.currentInputs) { + if (input.keyboardId === key) { + input.pressed = false; + // console.log(`inputstate marked ${input.name} as pressed`) + return; + } + } + } } - GetSizeY() { - return this.size.y; + pushToCurrentInputsFromGamePad(btnId, pushForce) { + for (let thisInput of this.currentInputs) { + if (thisInput.gamepadId === btnId) { + thisInput.pressed = true; + thisInput.force = pushForce; + // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) + return; + } + } } - GetColour() { - if (this.colour) { - return this.colour; + pushToCurrentInputsFromGamePadAxes(axesIndex, pushForce) { + for (let thisInput of this.currentInputs) { + if (thisInput.gamePadAxesId === axesIndex) { + thisInput.pressed = true; + thisInput.force = pushForce; + // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) + return; + } } - else { - return '#f00'; + } + popFromCurrentInputsFromGamePad(btnId) { + for (let input of this.currentInputs) { + if (input.gamepadId === btnId) { + input.pressed = false; + // console.log(`inputstate marked ${input.name} as not`) + return; + } } } - GetRotation() { - return this.rotationDegrees; + /* GamePad code */ + /** + * watches for the game pad registration events + * + * @memberof InputState + */ + SetupGamePadRegistrationWatch() { + console.log('inputstate setting up registrations'); + window.addEventListener('gamepadconnected', (e) => { + console.log('inputstate got gamepad'); + this.RegisterGamePad(e.gamepad); + }); + window.addEventListener('gamepaddisconnected', (e) => { + console.error('inputstate gamepad was disconnected'); + this.DeRegisterGamePad(e.gamepad); + }); } - AddToRotation(val) { - this.rotationDegrees += val; - if (this.rotationDegrees > 359) { - this.rotationDegrees = 0; + RegisterGamePad(gamePad) { + console.warn("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); + this.registeredGamePads[gamePad.index] = gamePad; + this.detailsDiv.innerHTML = 'Gamepad has been connected'; + } + DeRegisterGamePad(gamePad) { + console.error("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); + this.GetGamePads(); + this.detailsDiv.innerHTML = 'inputstate: Gamepad has been disconnected'; + } + GetGamePads() { + this.gamePads = navigator.getGamepads(); + } + GetGamePad(index) { + return navigator.getGamepads()[index]; + } + gamePadAxesPressed(axes) { + return (axes > InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY || axes < -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY); + } + gamePadButtonPressed(btn) { + // console.log(typeof(btn)); + if (typeof (btn) === 'object') { + // firefox + // console.log('gamepad: ff') + if (btn.pressed) { + // console.log('inputstate: button is pressed') + } + return btn.value; } - else if (this.rotationDegrees < 0) { - this.rotationDegrees = 359; + else { + // console.log('inputstate: gamepad: chrome') + return btn === 1.0; } } } -exports.Drawable = Drawable; +exports.InputState = InputState; +InputState.SYSTEM_KEYS = [ + 'F1', + 'F2', + 'F3', + 'F4', + 'F5', + 'F6', + 'F7', + 'F8', + 'F9', + 'F10', + 'F11', + 'F12', +]; +InputState.DEFAULT_MAX_INPUTS = 4; +InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY = 0.1; /***/ }), -/***/ "./src/application/Graphics/Draw/drawing.service.ts": -/*!**********************************************************!*\ - !*** ./src/application/Graphics/Draw/drawing.service.ts ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2228: +/*!********************************************************!*\ + !*** ./src/application/Entities/Creatures/creature.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class DrawingService { - constructor(cameraService, canvasService, textureService) { - this.allowTextureDrawing = true; - this.drawAsStroke = true; - this.textureService = textureService; - this.canvasService = canvasService; - this.cameraService = cameraService; - console.log('constructing drawing service'); - } - Draw(drawable, skipCanvasClear = false) { - const deg = drawable.GetRotation(); - if (this.cameraService.IsObjectOnScreenAABB(drawable.getAABB())) { - const canv = this.canvasService.GetCanvas(drawable.getCanvasId()); - var rad = deg * (Math.PI / 180); - if (!skipCanvasClear) { - canv.ClearCanvas(); - } - canv.ctx.save(); - // canv.ctx.scale(0.5, 0.5); - const translateX = drawable.GetSizeX() + (drawable.GetPositionX() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetX()); // + (drawable.GetSizeX() / 2));// + this.cameraService.GetOffsetY(); - const translateY = drawable.GetSizeX() + (drawable.GetPositionY() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetY()); // + (drawable.GetSizeY() / 2));// + this.cameraService.GetOffsetY(); - canv.ctx.translate(translateX, translateY); - canv.ctx.rotate(rad); - const drawLocationX = -drawable.GetSizeX() / 2; // / 2;// ; - const drawLocationY = -drawable.GetSizeY() / 2; // / 2;// - this.cameraService.GetOffsetY(); - const drawSizeX = drawable.GetSizeX(); - const drawSizeY = drawable.GetSizeY(); - const texture = this.textureService.GetTexture(drawable.GetTextureId()); - if (this.allowTextureDrawing && texture && texture.GetCanRender()) { - this.DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - else if (false) {} - else { - // if (drawable.GetTextureId()) { - // console.log(` - // text: ${texture.GetId()} - // rend: ${texture.GetCanRender()}`); - // } - this.DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - // detranslates the canvas - canv.ctx.translate(-(translateX), -(translateY)); - canv.ctx.restore(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Creature = void 0; +const _base_entity_1 = __webpack_require__(/*! ../_base-entity */ 954); +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +const creature_default_settings_1 = __webpack_require__(/*! ./creature.default.settings */ 2360); +const vector2_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/vector2.helper */ 2655); +const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ 1759); +class Creature extends _base_entity_1.Entity { + // protected canvasId: string; + // protected texture: Texture2D; + constructor(position, size, name, texturePath, graphicsService) { + super(position, size, name, '1', 'no_text_yet'); + this.turnSpeed = 1; + this.angleAdjust = -90; + console.error('passing incorrect texture ID and canvasId, and canvas to super'); + this.graphicsService = graphicsService; + this.health = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_HEALTH; + this.speed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED; + this.velocity = new Vector2_model_1.Vector2(0, 0); + this.maxSpeed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX; + this.acceleration = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION; + this.deceleration = vector2_helper_1.Vector2Helpers.DivideByScale(creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION, 1); + this.friction = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_FRICTION; + this.setCanvasId(this.graphicsService.RegisterDrawableEntity()); + if (texturePath !== undefined && texturePath !== null && texturePath.length) { + const textureId = this.graphicsService.GetTextureService().RegisterNewTexture(texturePath); + this.SetTextureId(textureId); + } + else { + console.error(new Error(`creature [${name}] did not have a texture`)); } } - // private rotate(ctx) { - // //Convert degrees to radian - // var rad = deg * Math.PI / 180; - // //Set the origin to the center of the image - // ctx.translate(x + width / 2, y + height / 2); - // //Rotate the canvas around the origin - // ctx.rotate(rad); - // //draw the image - // ctx.drawImage(img, width / 2 * (-1), height / 2 * (-1), width, height); - // //reset the canvas - // ctx.rotate(rad * (-1)); - // ctx.translate((x + width / 2) * (-1), (y + height / 2) * (-1)); - // } - DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { - canv.ctx.strokeStyle = '#fff'; - canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); - canv.ctx.drawImage(texture.GetImage(), drawLocationX, drawLocationY, drawSizeX, drawSizeY); + Move(lastDelta) { + this.CapMovementSpeed(); + this.CapRotation(); + this.UpdatePosition(lastDelta); + this.ReduceSpeed(); + this.UpdateAABB(); } - DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { - if (this.drawAsStroke) { - canv.ctx.strokeStyle = drawable.GetColour(); - canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); + ReduceSpeed() { + this.velocity.y *= this.friction.y; + this.velocity.x *= this.friction.x; + // if (this.velocity.y > 0) { + // this.velocity.y -= this.friction.y; + // if (this.velocity.y < 0) { + // this.velocity.y = 0; + // } + // } else if (this.velocity.y < 0) { + // this.velocity.y += this.friction.y; + // if (this.velocity.y > 0) { + // this.velocity.y = 0; + // } + // } + // if (this.velocity.x > 0) { + // this.velocity.x -= this.friction.x; + // if (this.velocity.x < 0) { + // this.velocity.x = 0; + // } + // } else if (this.velocity.x < 0) { + // this.velocity.x += this.friction.x; + // if (this.velocity.x > 0) { + // this.velocity.x = 0; + // } + // } + } + /** + * updates the creature's position + * + * @private + * @memberof Creature + */ + UpdatePosition(lastDelta) { + // this.position.x += (this.velocity.x * (lastDelta) * 50); + // this.position.y += (this.velocity.y * (lastDelta) * 50); + this.position.x = (0, number_helper_1.Lerp)(this.position.x, this.position.x + (this.velocity.x * (lastDelta) * 50), .8); + this.position.y = (0, number_helper_1.Lerp)(this.position.y, this.position.y + (this.velocity.y * (lastDelta) * 50), .8); + } + /** + * caps the creature's movement speed at + * this.maxSpeed + * + * @private + * @memberof Creature + */ + CapMovementSpeed() { + if (this.velocity.x > this.maxSpeed.x) { + this.velocity.x = this.maxSpeed.x; } - else { - canv.ctx.fillStyle = drawable.GetColour(); - canv.ctx.fillRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); + else if (this.velocity.x < -this.maxSpeed.x) { + this.velocity.x = -this.maxSpeed.x; + } + if (this.velocity.y > this.maxSpeed.y) { + this.velocity.y = this.maxSpeed.y; + } + else if (this.velocity.y < -this.maxSpeed.y) { + this.velocity.y = -this.maxSpeed.y; + } + if (this.velocity.x < 0.1 && this.velocity.x > -0.1) { + this.velocity.x = 0; + } + if (this.velocity.y < 0.1 && this.velocity.y > -0.1) { + this.velocity.y = 0; } } + CapRotation() { + // if (this.rotationDegrees < 0) { + // this.rotationDegrees = 360 - (-this.rotationDegrees); + // } + // if (this.rotationDegrees < 0) { + // this.rotationDegrees = 359; + // } if (this.rotationDegrees > 360) { + // this.rotationDegrees = 0; + // } + } + getHealth() { + return this.health; + } + setHealth(health) { + this.health = health; + } + getSpeed() { + return this.speed; + } + setSpeed(speed) { + this.speed = speed; + } + getMove() { + return this.velocity; + } + setMove(move) { + this.velocity = move; + } } -exports.DrawingService = DrawingService; +exports.Creature = Creature; /***/ }), -/***/ "./src/application/Graphics/Html/graphics.html.service.ts": -/*!****************************************************************!*\ - !*** ./src/application/Graphics/Html/graphics.html.service.ts ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2239: +/*!**********************************************!*\ + !*** ./src/numerics/models/Vector2.model.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class HtmlService { - constructor() { - console.log('creating Html Helper Service in Graphics'); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Vector2 = void 0; +class Vector2 { + constructor(x, y) { + this.x = x; + this.y = y; } - Init() { - this.createMainDiv('main_div'); + concat(decimalPlaces = -1) { + if (decimalPlaces > -1) { + return `x:[${this.x.toFixed(decimalPlaces)}], y:[${this.y.toFixed(decimalPlaces)}]`; + } + return `x:[${this.x}], y:[${this.y}]`; } - GetMainDiv() { - return this.mainDiv; + getValueX() { + return this.x; } - createMainDiv(id = 'main_div') { - this.mainDiv = document.createElement('div'); - this.mainDiv.id = id; - document.body.appendChild(this.mainDiv); - return this.mainDiv.id; + getValueY() { + return this.y; } - createCanvas(id, attatchTo, width, height, classList = null) { - const canvas = document.createElement('canvas'); - canvas.id = id; - canvas.width = width; - canvas.height = height; - if (classList != null) { - for (let i = 0; i < classList.length; i++) { - canvas.classList.add(classList[i]); - } - } - document.getElementById(attatchTo).appendChild(canvas); - return canvas; + setValueX(x) { + this.x = x; + } + setValueY(y) { + this.y = y; + } + setValues(x, y) { + this.x = x; + this.y = y; } } -exports.HtmlService = HtmlService; +exports.Vector2 = Vector2; /***/ }), -/***/ "./src/application/Graphics/Images/ImageHelper.ts": -/*!********************************************************!*\ - !*** ./src/application/Graphics/Images/ImageHelper.ts ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2345: +/*!*********************************************!*\ + !*** ./src/application/states/MenuState.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class ImageHelper { - static NewImage(path) { - const image = new Image(128, 128); - image.src = this.assetBasePath + path; - image.onerror = ((event) => this.onError(event)); - return image; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MenuState = void 0; +const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); +class MenuState extends _BaseState_1.BaseState { + constructor() { + super(); + console.log(`constructing MenuState`); } - static onError(error) { - console.log('error loading image', error); - return; + Tick() { + console.error("Method not implemented."); + } + Render() { + console.error("Method not implemented."); } } -ImageHelper.assetBasePath = './assets/_dist/'; -exports.ImageHelper = ImageHelper; +exports.MenuState = MenuState; /***/ }), -/***/ "./src/application/Graphics/Models/graphics.drawable-canvas.ts": -/*!*********************************************************************!*\ - !*** ./src/application/Graphics/Models/graphics.drawable-canvas.ts ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2360: +/*!*************************************************************************!*\ + !*** ./src/application/Entities/Creatures/creature.default.settings.ts ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class DrawableCanvas extends Vector2_model_1.Vector2 { - constructor(canvas, id, width, height) { - super(width, height); - this.id = id; - this.canvas = canvas; - this.ctx = this.canvas.getContext('2d'); - } - GetWidth() { - return this.getValueX(); - } - GetHeight() { - return this.getValueY(); - } - ClearCanvas() { - this.ctx.clearRect(0, 0, this.getValueX(), this.getValueY()); - } - PaintImmediately() { - this.ctx.drawImage(this.canvas, 0, 0); - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CreatureDefaultSettings = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class CreatureDefaultSettings { } -exports.DrawableCanvas = DrawableCanvas; +exports.CreatureDefaultSettings = CreatureDefaultSettings; +CreatureDefaultSettings.DEFAULT_HEALTH = 100; +CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED = new Vector2_model_1.Vector2(3.0, 3.0); +CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX = new Vector2_model_1.Vector2(11.0, 11.0); +CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION = new Vector2_model_1.Vector2(3.0, 3.0); +CreatureDefaultSettings.DEFAULT_MOVEMENT_VELOCITY = new Vector2_model_1.Vector2(3, 3); +CreatureDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(20, 20); +CreatureDefaultSettings.DEFAULT_FRICTION = new Vector2_model_1.Vector2(0.95, 0.95); /***/ }), -/***/ "./src/application/Graphics/Textures/Texture2d.ts": -/*!********************************************************!*\ - !*** ./src/application/Graphics/Textures/Texture2d.ts ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2451: +/*!****************************************************************!*\ + !*** ./src/application/Graphics/Camera/game-camera.service.ts ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ "./src/application/Tools/random_generators/random_guid.generator.ts"); -const ImageHelper_1 = __webpack_require__(/*! ../Images/ImageHelper */ "./src/application/Graphics/Images/ImageHelper.ts"); -class Texture2D { - constructor(path) { - this.path = path; - this.url = path; - this.id = random_guid_generator_1.GuidGenerator.NewGuid(); - this.image = ImageHelper_1.ImageHelper.NewImage(this.url); - this.image.onload = (() => { - this.imageCanRender = true; - }); - this.image.onerror = (() => { - this.imageCanRender = false; - console.error('text2d: image could not render'); - }); - } - GetPath() { - return this.path; - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GameCameraService = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ 81); +const intersection_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/intersection.helper */ 6695); +const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ 5537); +class GameCameraService { /** - * GetId + *Creates an instance of GameCameraService. + + applyWorldBounding tells the camera if it should continue + moving right or left if it reaches the edge of the level + * @param {number} xOffset + * @param {number} yOffset + * @param {boolean} applyWorldBounding + * @memberof GameCameraService */ - GetId() { - return this.id; + constructor(xOffset, yOffset, applyWorldBounding) { + this.offset = new Vector2_model_1.Vector2(xOffset, yOffset); + this.applyWorldBounding = applyWorldBounding; + this.displayableSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio(); + this.UpdatePositionAndSize(); } - /** - * GetUrl - */ - GetImage() { - return this.image; + SetLevelAABB(levelAABB) { + this.levelAABB = levelAABB; + } + GetDebugInfo() { + return [` + offset: ${this.offset.concat(2)} + size: ${this.displayableSize.concat(2)}`]; } /** - * returns imageCanRender. If the image is successfully loaded, - * this returns true. Otherwise returns false + * checks if two objects intersect * - * @returns - * @memberof Texture2D + * @param {Vector2} position + * @param {Vector2} size + * @returns {boolean} + * @memberof GameCameraService */ - GetCanRender() { - return this.imageCanRender; - } -} -exports.Texture2D = Texture2D; - - -/***/ }), - -/***/ "./src/application/Graphics/Textures/texture.service.ts": -/*!**************************************************************!*\ - !*** ./src/application/Graphics/Textures/texture.service.ts ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const Texture2d_1 = __webpack_require__(/*! ./Texture2d */ "./src/application/Graphics/Textures/Texture2d.ts"); -class TextureService { - constructor() { - console.log('constructing texture service'); - this.textures = new Array(); + IsObectOnScreen(position, size) { + const objectAABB = new AABB_model_1.AABB(position, size); + return this.IsObjectOnScreenAABB(objectAABB); } - GetTexture(textureId) { - for (let i = 0; i < this.textures.length; i++) { - if (textureId === this.textures[i].GetId()) { - return this.textures[i]; - } + IsObjectOnScreenAABB(AABB) { + if (intersection_helper_1.IntersectionHelper.AabbVsAabb(this.cameraAABB, AABB)) { + return true; + } + else { + return false; } } + MoveCamera(xAmount, yAmount) { + console.error('don\'t use MoveCamera'); + this.offset.x += xAmount; + this.offset.y += yAmount; + } /** - * registers a new texture in the service. If the texture already - * exists, throws an error and returns the existing one + * sets the camera to points at (looks at) a specific entity * - * @param {string} texturePath - * @returns {string} - * @memberof TextureService + * @param {Vector2} entityPosition + * @param {Vector2} entitySize + * @memberof GameCameraService */ - RegisterNewTexture(texturePath) { - for (let i = 0; i < this.textures.length; i++) { - const thisTextPath = this.textures[i].GetPath(); - if (thisTextPath === texturePath) { - console.error('attempted to create a texture a second time'); - return this.textures[i].GetId(); + LookAt(entityPosition, entitySize) { + const vieportWidth = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueX(); + const vieportHeight = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueY(); + const centerX = entityPosition.getValueX() - (vieportWidth / 2) + (entitySize.getValueX() / 2); + const centerY = entityPosition.getValueY() - (vieportHeight / 2) + (entitySize.getValueY() / 2); + this.SetOffset(new Vector2_model_1.Vector2(centerX, centerY)); + } + SetOffset(positionVector) { + this.offset = positionVector; + if (this.applyWorldBounding) { + if (this.offset.getValueX() < this.levelAABB.GetLeft()) { + this.offset.setValueX(this.levelAABB.GetLeft()); + } + if (this.offset.getValueX() > this.levelAABB.GetRight()) { + this.offset.setValueX(this.levelAABB.GetRight()); + } + if (this.offset.getValueY() < this.levelAABB.GetTop()) { + this.offset.setValueY(this.levelAABB.GetTop()); + } + if (this.offset.getValueY() > this.levelAABB.GetBottom()) { + this.offset.setValueY(this.levelAABB.GetBottom()); } } - const newTexture = new Texture2d_1.Texture2D(texturePath); - this.textures.push(newTexture); - console.warn(`texture stack is now [${this.textures.length}] long`); - return newTexture.GetId(); + this.UpdatePositionAndSize(); } -} -exports.TextureService = TextureService; - - -/***/ }), - -/***/ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts": -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts ***! - \***********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class DirtTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#916D49', textId); + UpdatePositionAndSize() { + this.cameraAABB = new AABB_model_1.AABB(this.offset, this.displayableSize); + } + GetOffsetX() { + return this.offset.getValueX(); + } + GetOffsetY() { + return this.offset.getValueY(); + } + GetOffsetVector() { + return this.offset; } } -DirtTileType.texturePath = '/Tiles/ground/dirt.png'; -exports.DirtTileType = DirtTileType; +exports.GameCameraService = GameCameraService; /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts": -/*!************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts ***! - \************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 2655: +/*!************************************************!*\ + !*** ./src/numerics/helpers/vector2.helper.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class GrassTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -GrassTileType.texturePath = '/Tiles/ground/grass.png'; -exports.GrassTileType = GrassTileType; -class GrassTileTypeDirt extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#87CC6F', textId); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Vector2Helpers = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../models/Vector2.model */ 2239); +class Vector2Helpers { + /* + * adds two Vector2 together and returns a new Vector2 + * containing the results + */ + static Add(left, right) { + const vecX = left.getValueX() + right.getValueX(); + const vecY = left.getValueY() + right.getValueY(); + return new Vector2_model_1.Vector2(vecX, vecY); } -} -GrassTileTypeDirt.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; -exports.GrassTileTypeDirt = GrassTileTypeDirt; -class GrassTileTypeDirtTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); + /** + * compares two Vector 2s for equality + * If the vectors are identica, this returns true otherwise returns false + * + * @static + * @param {Vector2} left + * @param {Vector2} right + * @returns {boolean} + * @memberof Vector2Helpers + */ + static CompareEquality(left, right) { + return !(left.getValueX() !== right.getValueX() || left.getValueY() !== right.getValueY()); } -} -GrassTileTypeDirtTop.texturePath = '/Tiles/ground/grass_with_dirt_top.png'; -exports.GrassTileTypeDirtTop = GrassTileTypeDirtTop; -class GrassTileTypeDirtRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -GrassTileTypeDirtRight.texturePath = '/Tiles/ground/grass_with_dirt_right.png'; -exports.GrassTileTypeDirtRight = GrassTileTypeDirtRight; -class GrassTileTypeDirtBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -GrassTileTypeDirtBottom.texturePath = '/Tiles/ground/grass_with_dirt_bottom.png'; -exports.GrassTileTypeDirtBottom = GrassTileTypeDirtBottom; -class GrassTileTypeDirtLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); + /* + * divides the first vector by the second + * this is not scalar division + */ + static Divide(left, right) { + const vecX = left.getValueX() / right.getValueX(); + const vecY = left.getValueY() / right.getValueY(); + return new Vector2_model_1.Vector2(vecX, vecY); } -} -GrassTileTypeDirtLeft.texturePath = '/Tiles/ground/grass_with_dirt_left.png'; -exports.GrassTileTypeDirtLeft = GrassTileTypeDirtLeft; -class GrassTileTypeDirtMiddle extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); + /* + * divides a given source vector2 by a scale factor + */ + static DivideByScale(source, scaleFactor) { + const factor = 1 / scaleFactor; + const vecX = source.getValueX() * factor; + const vecY = source.getValueY() * factor; + return new Vector2_model_1.Vector2(vecX, vecY); } -} -GrassTileTypeDirtMiddle.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; -exports.GrassTileTypeDirtMiddle = GrassTileTypeDirtMiddle; - - -/***/ }), - -/***/ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts": -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts ***! - \***********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class SandTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); + /* + * gets the dot product of two vectors, + * returns as a number (float?) + */ + static Dot(left, right) { + const vecX = left.getValueX() * right.getValueX(); + const vecY = left.getValueY() * right.getValueY(); + return vecX + vecY; } -} -SandTileType.texturePath = '/Tiles/ground/sand.png'; -exports.SandTileType = SandTileType; -class SandTileTypeGrassTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); + static Subtract(left, right) { + const vecX = left.getValueX() - right.getValueX(); + const vecY = left.getValueY() - right.getValueY(); + return new Vector2_model_1.Vector2(vecX, vecY); } -} -SandTileTypeGrassTop.texturePath = '/Tiles/ground/sand_grass_top.png'; -exports.SandTileTypeGrassTop = SandTileTypeGrassTop; -class SandTileTypeGrassRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); + static NegativeOf(source) { + const vecX = -source.getValueX(); + const vecY = -source.getValueY(); + return new Vector2_model_1.Vector2(vecX, vecY); } -} -SandTileTypeGrassRight.texturePath = '/Tiles/ground/sand_grass_right.png'; -exports.SandTileTypeGrassRight = SandTileTypeGrassRight; -class SandTileTypeGrassBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); + static Multiply(left, right) { + const vecX = left.getValueX() * right.getValueX(); + const vecY = left.getValueY() * right.getValueY(); + return new Vector2_model_1.Vector2(vecX, vecY); } -} -SandTileTypeGrassBottom.texturePath = '/Tiles/ground/sand_grass_bottom.png'; -exports.SandTileTypeGrassBottom = SandTileTypeGrassBottom; -class SandTileTypeGrassLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); + static MultiplyByScale(source, scaleFactor) { + const vecX = source.getValueX() * scaleFactor; + const vecY = source.getValueY() * scaleFactor; + return new Vector2_model_1.Vector2(vecX, vecY); } } -SandTileTypeGrassLeft.texturePath = '/Tiles/ground/sand_grass_left.png'; -exports.SandTileTypeGrassLeft = SandTileTypeGrassLeft; +exports.Vector2Helpers = Vector2Helpers; /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts": -/*!********************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts ***! - \********************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 3137: +/*!**********************************************************!*\ + !*** ./src/application/_debug/debuggable-items.model.ts ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class ShallowWaterTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -ShallowWaterTileType.texturePath = '/Tiles/ground/shallow_water.png'; -exports.ShallowWaterTileType = ShallowWaterTileType; -class ShallowWaterTileTypeSandTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -ShallowWaterTileTypeSandTop.texturePath = '/Tiles/ground/shallow_water_sand_top.png'; -exports.ShallowWaterTileTypeSandTop = ShallowWaterTileTypeSandTop; -class ShallowWaterTileTypeSandRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -ShallowWaterTileTypeSandRight.texturePath = '/Tiles/ground/shallow_water_sand_right.png'; -exports.ShallowWaterTileTypeSandRight = ShallowWaterTileTypeSandRight; -class ShallowWaterTileTypeSandBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DebugKvp = exports.DebuggableItems = void 0; +class DebuggableItems { + constructor() { + this.debugItems = new Array(); } } -ShallowWaterTileTypeSandBottom.texturePath = '/Tiles/ground/shallow_water_sand_bottom.png'; -exports.ShallowWaterTileTypeSandBottom = ShallowWaterTileTypeSandBottom; -class ShallowWaterTileTypeSandLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); +exports.DebuggableItems = DebuggableItems; +class DebugKvp { + constructor(key, value) { + this.Key = key; + this.Value = value; } } -ShallowWaterTileTypeSandLeft.texturePath = '/Tiles/ground/shallow_water_sand_left.png'; -exports.ShallowWaterTileTypeSandLeft = ShallowWaterTileTypeSandLeft; +exports.DebugKvp = DebugKvp; /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts": -/*!************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts ***! - \************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 3309: +/*!**************************************************************!*\ + !*** ./src/application/Graphics/Textures/texture.service.ts ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class StoneTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#52504F', textId); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TextureService = void 0; +const Texture2d_1 = __webpack_require__(/*! ./Texture2d */ 6622); +class TextureService { + constructor() { + console.log('constructing texture service'); + this.textures = new Array(); + } + GetTexture(textureId) { + for (let i = 0; i < this.textures.length; i++) { + if (textureId === this.textures[i].GetId()) { + return this.textures[i]; + } + } + } + /** + * registers a new texture in the service. If the texture already + * exists, throws an error and returns the existing one + * + * @param {string} texturePath + * @returns {string} + * @memberof TextureService + */ + RegisterNewTexture(texturePath) { + for (let i = 0; i < this.textures.length; i++) { + const thisTextPath = this.textures[i].GetPath(); + if (thisTextPath === texturePath) { + console.error('attempted to create a texture a second time'); + return this.textures[i].GetId(); + } + } + const newTexture = new Texture2d_1.Texture2D(texturePath); + this.textures.push(newTexture); + console.warn(`texture stack is now [${this.textures.length}] long`); + return newTexture.GetId(); } } -StoneTileType.texturePath = '/Tiles/ground/stone.png'; -exports.StoneTileType = StoneTileType; +exports.TextureService = TextureService; /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts": -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts ***! - \***********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 3536: +/*!********************************************************!*\ + !*** ./src/application/Graphics/Images/ImageHelper.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class SpaceTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#1C1C1B', textId); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ImageHelper = void 0; +class ImageHelper { + static NewImage(path) { + const image = new Image(128, 128); + image.src = this.assetBasePath + path; + image.onerror = ((event) => this.onError(event)); + return image; + } + static onError(error) { + console.log('error loading image', error); + return; } } -SpaceTileType.texturePath = '/Tiles/space_tile.png'; -exports.SpaceTileType = SpaceTileType; +exports.ImageHelper = ImageHelper; +ImageHelper.assetBasePath = './assets/_dist/'; /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts": -/*!**********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts ***! - \**********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts"); -class StarTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#060948', textId); - } -} -StarTileType.texturePath = '/Tiles/space_tile2.png'; -exports.StarTileType = StarTileType; +/***/ 3754: +/*!*********************************************!*\ + !*** ./src/assets/_dist/Worlds/worlds.json ***! + \*********************************************/ +/***/ ((module) => { +module.exports = /*#__PURE__*/JSON.parse('[{"worldId":2,"start":{"x":0,"y":0},"tiles":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]},{"worldId":1,"start":{"x":0,"y":0},"tiles":[[9,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9],[2,3,2,6,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,5,9,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,12,12,12,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,17,17,17,17,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,2,2,2,2,9],[16,16,16,16,16,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[9,14,14,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9]]},{"worldId":0,"start":{"x":0,"y":0},"tiles":[[0,0,0,0],[0,0,0,0],[0,0,0,0]]}]'); /***/ }), -/***/ "./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts": -/*!********************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 4288: +/*!******************************************************!*\ + !*** ./src/application/Graphics/graphics.service.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class TileType { - constructor(id, fallbackOutlineColour, textureId) { - this.textureId = textureId; - this.id = id; - this.fallbackOutlineColour = fallbackOutlineColour; - } - Tick() { +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GraphicsService = void 0; +const graphics_html_service_1 = __webpack_require__(/*! ./Html/graphics.html.service */ 7415); +const graphics_canvas_service_1 = __webpack_require__(/*! ./Canvas/graphics.canvas.service */ 9855); +const tile_service_1 = __webpack_require__(/*! ./Tiles/tile.service */ 6247); +const game_camera_service_1 = __webpack_require__(/*! ./Camera/game-camera.service */ 2451); +const drawing_service_1 = __webpack_require__(/*! ./Draw/drawing.service */ 6726); +const texture_service_1 = __webpack_require__(/*! ./Textures/texture.service */ 3309); +class GraphicsService { + constructor() { + console.log('starting graphics service'); + this.htmlService = new graphics_html_service_1.HtmlService(); + this.canvasService = new graphics_canvas_service_1.CanvasService(this.htmlService); + this.tileService = new tile_service_1.TileService(this.canvasService, this); + this.textureService = new texture_service_1.TextureService(); + const applyCameraWorldBounding = false; + this.gameCameraService = new game_camera_service_1.GameCameraService(0, 0, applyCameraWorldBounding); + this.drawingService = new drawing_service_1.DrawingService(this.gameCameraService, this.canvasService, this.textureService); } - GetTextureId() { - return this.textureId; + InitGraphicsService() { + this.htmlService.Init(); + this.canvasService.Init(); + this.tileService.Init(); } - GetId() { - return this.id; + GetTextureService() { + return this.textureService; } - GetFallbackColour() { - return this.fallbackOutlineColour; + GetTileService() { + return this.tileService; + } + getGameCameraService() { + return this.gameCameraService; + } + getDrawingService() { + return this.drawingService; + } + RegisterDrawableEntity(id = null) { + return this.canvasService.RegisterNewCanvas(id); + } + GetCanvas(id) { + return this.canvasService.GetCanvas(id); + } + Render() { + // console.log('rendering in graphics service'); + this.canvasService.mainCanvasCtx.clearRect(0, 0, this.canvasService.mainCanvas.width, this.canvasService.mainCanvas.height); + for (let i = 0; i < this.canvasService.drawableAreas.length; i++) { + this.canvasService.mainCanvasCtx.drawImage(this.canvasService.drawableAreas[i].canvas, 0, 0); + } } } -exports.TileType = TileType; +exports.GraphicsService = GraphicsService; /***/ }), -/***/ "./src/application/Graphics/Tiles/drawable-tile.ts": -/*!*********************************************************!*\ - !*** ./src/application/Graphics/Tiles/drawable-tile.ts ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 4312: +/*!***********************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const drawable_1 = __webpack_require__(/*! ../Draw/drawable */ "./src/application/Graphics/Draw/drawable.ts"); -class DrawableTile extends drawable_1.Drawable { - constructor(tileTypeId, position, size, fallbackOutlineColour, canvasId, textureId) { - super(position, size, canvasId, textureId); - this.tileTypeId = tileTypeId; - this.colour = fallbackOutlineColour; - } - getTileTypeId() { - return this.tileTypeId; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DirtTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class DirtTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#916D49', textId); } - getPosition() { - return this.position; +} +exports.DirtTileType = DirtTileType; +DirtTileType.texturePath = '/Tiles/ground/dirt.png'; + + +/***/ }), + +/***/ 4554: +/*!**************************************************!*\ + !*** ./src/application/World/world.jsonfiles.ts ***! + \**************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorldJsonFileLoader = void 0; +const json = __importStar(__webpack_require__(/*! ../../assets/_dist/Worlds/worlds.json */ 3754)); +const world_1 = __webpack_require__(/*! ./world */ 289); +const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); +/** + * this is in a different file because adding .json files + * causes VSCode to only want to load .js imports, and not + * .ts imports + * + * @export + * @class WorldJsonFileLoader + */ +class WorldJsonFileLoader { + constructor() { } - getSize() { - return this.size; + static GetWorlds() { + const worldArr = new Array(); + for (let i = 0; i < this.worldCount; i++) { + const world = json[i]; + worldArr.push(new world_1.World(new Vector2_model_1.Vector2(world.tiles.length, world.tiles[0].length), new Vector2_model_1.Vector2(world.start.x, world.start.y), world.tiles, world.worldId)); + } + return worldArr; } } -exports.DrawableTile = DrawableTile; +exports.WorldJsonFileLoader = WorldJsonFileLoader; +WorldJsonFileLoader.worldCount = 2; /***/ }), -/***/ "./src/application/Graphics/Tiles/tile.default.settings.ts": -/*!*****************************************************************!*\ - !*** ./src/application/Graphics/Tiles/tile.default.settings.ts ***! - \*****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 4881: +/*!********************************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts ***! + \********************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class TileDefaultSettings { +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ShallowWaterTileTypeSandLeft = exports.ShallowWaterTileTypeSandBottom = exports.ShallowWaterTileTypeSandRight = exports.ShallowWaterTileTypeSandTop = exports.ShallowWaterTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class ShallowWaterTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#4380E4', textId); + } } -TileDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(64, 64); -exports.TileDefaultSettings = TileDefaultSettings; +exports.ShallowWaterTileType = ShallowWaterTileType; +ShallowWaterTileType.texturePath = '/Tiles/ground/shallow_water.png'; +class ShallowWaterTileTypeSandTop extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#4380E4', textId); + } +} +exports.ShallowWaterTileTypeSandTop = ShallowWaterTileTypeSandTop; +ShallowWaterTileTypeSandTop.texturePath = '/Tiles/ground/shallow_water_sand_top.png'; +class ShallowWaterTileTypeSandRight extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#4380E4', textId); + } +} +exports.ShallowWaterTileTypeSandRight = ShallowWaterTileTypeSandRight; +ShallowWaterTileTypeSandRight.texturePath = '/Tiles/ground/shallow_water_sand_right.png'; +class ShallowWaterTileTypeSandBottom extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#4380E4', textId); + } +} +exports.ShallowWaterTileTypeSandBottom = ShallowWaterTileTypeSandBottom; +ShallowWaterTileTypeSandBottom.texturePath = '/Tiles/ground/shallow_water_sand_bottom.png'; +class ShallowWaterTileTypeSandLeft extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#4380E4', textId); + } +} +exports.ShallowWaterTileTypeSandLeft = ShallowWaterTileTypeSandLeft; +ShallowWaterTileTypeSandLeft.texturePath = '/Tiles/ground/shallow_water_sand_left.png'; /***/ }), -/***/ "./src/application/Graphics/Tiles/tile.service.ts": -/*!********************************************************!*\ - !*** ./src/application/Graphics/Tiles/tile.service.ts ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const space_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/space.tiletype */ "./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const tile_default_settings_1 = __webpack_require__(/*! ./tile.default.settings */ "./src/application/Graphics/Tiles/tile.default.settings.ts"); -const drawable_tile_1 = __webpack_require__(/*! ./drawable-tile */ "./src/application/Graphics/Tiles/drawable-tile.ts"); -const grass_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/grass.tiletype */ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts"); -const star_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/star.tiletype */ "./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts"); -const dirt_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/dirt.tiletype */ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts"); -const sand_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/sand.tiletype */ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts"); -const shallow_water_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/shallow-water.tiletype */ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts"); -const stone_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/stone.tiletype */ "./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts"); -class TileService { - constructor(canvasService, graphicsService) { - this.tileSize = tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE; - this.tileTypes = new Array(256); - this.tiles = new Array(); - this.graphicsService = graphicsService; - this.canvasService = canvasService; - } - Init() { - this.tileCanvasId = this.canvasService.RegisterNewCanvas(); - this.spaceTileType = new space_tiletype_1.SpaceTileType(0, this.graphicsService.GetTextureService().RegisterNewTexture(space_tiletype_1.SpaceTileType.texturePath)); - this.starTileType = new star_tiletype_1.StarTileType(1, this.graphicsService.GetTextureService().RegisterNewTexture(star_tiletype_1.StarTileType.texturePath)); - this.grassTileType = new grass_tiletype_1.GrassTileType(2, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileType.texturePath)); - this.grassTileTypeDirt = new grass_tiletype_1.GrassTileTypeDirt(3, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirt.texturePath)); - this.grassTileTypeDirtTop = new grass_tiletype_1.GrassTileTypeDirtTop(4, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtTop.texturePath)); - this.grassTileTypeDirtRight = new grass_tiletype_1.GrassTileTypeDirtRight(5, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtRight.texturePath)); - this.grassTileTypeBottom = new grass_tiletype_1.GrassTileTypeDirtBottom(6, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtBottom.texturePath)); - this.grassTileTypeLeft = new grass_tiletype_1.GrassTileTypeDirtLeft(7, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtLeft.texturePath)); - this.grassTileTypeMiddle = new grass_tiletype_1.GrassTileTypeDirtMiddle(8, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtMiddle.texturePath)); - this.dirtTileType = new dirt_tiletype_1.DirtTileType(9, this.graphicsService.GetTextureService().RegisterNewTexture(dirt_tiletype_1.DirtTileType.texturePath)); - this.stoneTileType = new stone_tiletype_1.StoneTileType(10, this.graphicsService.GetTextureService().RegisterNewTexture(stone_tiletype_1.StoneTileType.texturePath)); - this.sandTileType = new sand_tiletype_1.SandTileType(11, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileType.texturePath)); - this.sandTileTypeDirtTop = new sand_tiletype_1.SandTileTypeGrassTop(12, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassTop.texturePath)); - this.sandTileTypeDirtRight = new sand_tiletype_1.SandTileTypeGrassRight(13, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassRight.texturePath)); - this.sandTileTypeBottom = new sand_tiletype_1.SandTileTypeGrassBottom(14, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassBottom.texturePath)); - this.sandTileTypeLeft = new sand_tiletype_1.SandTileTypeGrassLeft(15, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassLeft.texturePath)); - this.shallowWaterTileType = new shallow_water_tiletype_1.ShallowWaterTileType(16, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileType.texturePath)); - this.shallowWaterTileTypeDirtTop = new shallow_water_tiletype_1.ShallowWaterTileTypeSandTop(17, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandTop.texturePath)); - this.shallowWaterTileTypeDirtRight = new shallow_water_tiletype_1.ShallowWaterTileTypeSandRight(18, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandRight.texturePath)); - this.shallowWaterTileTypeBottom = new shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom(19, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom.texturePath)); - this.shallowWaterTileTypeLeft = new shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft(20, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft.texturePath)); - this.setupTileTypes(); - // this.setupTiles(); +/***/ 5277: +/*!***************************************************!*\ + !*** ./src/application/_debug/debug.component.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DebugComponent = void 0; +class DebugComponent { + constructor(debugService) { + this.debugService = debugService; + this._debugService = debugService; } - setupTileTypes() { - this.tileTypes[this.spaceTileType.GetId()] = this.spaceTileType; - this.tileTypes[this.starTileType.GetId()] = this.starTileType; - this.tileTypes[this.grassTileType.GetId()] = this.grassTileType; - this.tileTypes[this.grassTileTypeDirt.GetId()] = this.grassTileTypeDirt; - this.tileTypes[this.grassTileTypeDirtTop.GetId()] = this.grassTileTypeDirtTop; - this.tileTypes[this.grassTileTypeDirtRight.GetId()] = this.grassTileTypeDirtRight; - this.tileTypes[this.grassTileTypeBottom.GetId()] = this.grassTileTypeBottom; - this.tileTypes[this.grassTileTypeLeft.GetId()] = this.grassTileTypeLeft; - this.tileTypes[this.grassTileTypeMiddle.GetId()] = this.grassTileTypeMiddle; - this.tileTypes[this.dirtTileType.GetId()] = this.dirtTileType; - this.tileTypes[this.stoneTileType.GetId()] = this.stoneTileType; - this.tileTypes[this.sandTileType.GetId()] = this.sandTileType; - this.tileTypes[this.sandTileTypeDirtTop.GetId()] = this.sandTileTypeDirtTop; - this.tileTypes[this.sandTileTypeDirtRight.GetId()] = this.sandTileTypeDirtRight; - this.tileTypes[this.sandTileTypeBottom.GetId()] = this.sandTileTypeBottom; - this.tileTypes[this.sandTileTypeLeft.GetId()] = this.sandTileTypeLeft; - this.tileTypes[this.shallowWaterTileType.GetId()] = this.shallowWaterTileType; - this.tileTypes[this.shallowWaterTileTypeDirtTop.GetId()] = this.shallowWaterTileTypeDirtTop; - this.tileTypes[this.shallowWaterTileTypeDirtRight.GetId()] = this.shallowWaterTileTypeDirtRight; - this.tileTypes[this.shallowWaterTileTypeBottom.GetId()] = this.shallowWaterTileTypeBottom; - this.tileTypes[this.shallowWaterTileTypeLeft.GetId()] = this.shallowWaterTileTypeLeft; + InitDebugComponent(mainDivId) { + this.createDebugDiv(mainDivId); + this.tick(); } - /** - * returns a Vector 2 containing a size - * - * @param {number[][]} tiles - * @returns {Vector2} - * @memberof TileService - */ - setupTilesFromArray(tiles) { - const size = new Vector2_model_1.Vector2(0, 0); - // const canvId = `${this.graphicsService.RegisterDrawableEntity('texts')}`; - for (let x = 0; x < tiles.length; x++) { - for (let y = 0; y < tiles[x].length; y++) { - this.tiles.push(new drawable_tile_1.DrawableTile(tiles[x][y], new Vector2_model_1.Vector2(y * this.GetTileSize().getValueX(), x * this.GetTileSize().getValueY()), tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE, this.tileTypes[tiles[x][y]].GetFallbackColour(), this.tileCanvasId, this.tileTypes[tiles[x][y]].GetTextureId())); + createDebugDiv(parentElementId, id = 'el_debug_info') { + if (this.debugService.IsInDebugMode()) { + const mainDiv = document.getElementById(parentElementId); + this.debugInfoElement = document.createElement('div'); + this.debugInfoElement.id = id; + mainDiv.appendChild(this.debugInfoElement); + for (let i = 0; i < 10; i++) { + this.debugService.PushOrUpdateInDebugArray('Debug Info' + i, 'debug value'); } + // this.debugService.PopFromDebugArray('Debug Info') + return this.debugInfoElement; } - return size; } - PreClearCanvas() { - const canv = this.graphicsService.GetCanvas(this.tileCanvasId); - canv.ClearCanvas(); + tick() { + // setTimeout(() => { + // this.ticks++; + // }); + requestAnimationFrame(() => { + // console.log('updating debugger') + this.Update(); + this.tick(); + }); } - Redner() { - this.PreClearCanvas(); - for (let i = 0; i < this.tiles.length; i++) { - this.graphicsService.getDrawingService().Draw(this.tiles[i], true); + Update() { + // console.log(this.debugService.GetDebugInfo(), null, 2) + let DebugsAsString = ''; + const debugInfoArray = this.debugService.GetDebugInfo(); + for (let i = 0; i < debugInfoArray.length; i++) { + // DebugsAsString += this.GetTemplateForKvp(debugInfoArray[i]); } + this.debugInfoElement.innerHTML = DebugsAsString; } - GetTileSize() { - return this.tileSize; + GetTemplateForKvp(item) { + throw new Error('not implemented'); + // removed by dead control flow +{} } } -exports.TileService = TileService; +exports.DebugComponent = DebugComponent; /***/ }), -/***/ "./src/application/Graphics/Viewport/Viewport.Helper.ts": -/*!**************************************************************!*\ - !*** ./src/application/Graphics/Viewport/Viewport.Helper.ts ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 5537: +/*!*******************************************!*\ + !*** ./src/numerics/models/AABB.model.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class ViewportHelper { - static GetSquareInBrowser() { - const h = this.GetBrowserHeight() - 5; - const w = this.GetBrowserWidth() - 5; - if (h < w) { - return new Vector2_model_1.Vector2(h, h); - } - else { - return new Vector2_model_1.Vector2(w, w); - } - } - static GetWindowInAspectRatio(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1) { - const aspectRatio = aspectRatioWidth / aspectRatioHeight; - const adjustedWindowHeight = this.GetBrowserHeight() * heightPercent; - const adjustedWindowWidth = this.GetBrowserWidth() * widthPercent; - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - /** - * Gets a window in a given aspect ratio. - * - * @static - * @param {number} [aspectRatioWidth=16] - * @param {number} [aspectRatioHeight=9] - * @param {number} [widthPercent=1] between 0 & 1. Should usually be the same as heightPercent - * @param {number} [heightPercent=1] between 0 & 1. Shoudl usually be the same as widthPercent - * @param {string} elementId An element to put this canvas into. Can be null (will use the full window) - * @returns {Vector2} - * @memberof ViewportHelper - * @returns {Vector2} - * @memberof ViewportHelper - */ - static GetWindowInAspectRatioForCanvas(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1, canvasableElement = null) { - if (!canvasableElement) { - console.warn(`setup with no canvasable element. Will use the entire window`); - } - else { - console.warn(`setup with id of ${canvasableElement.id}`); - } - const aspectRatio = aspectRatioWidth / aspectRatioHeight; - if (heightPercent !== widthPercent) { - console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); - } - if (aspectRatioHeight > aspectRatioWidth) { - console.log(`starting in portrait mode (${aspectRatioWidth}:${aspectRatioHeight})`); - } - else { - console.info(`starting in landscape mode (${aspectRatioWidth}:${aspectRatioHeight})`); - } - const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * heightPercent; - const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * widthPercent; - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AABB = void 0; +const Vector2_model_1 = __webpack_require__(/*! ./Vector2.model */ 2239); +class AABB { + constructor(position, size) { + this.min = new Vector2_model_1.Vector2(position.getValueX(), position.getValueY()); + this.max = new Vector2_model_1.Vector2(position.getValueX() + size.getValueX(), position.getValueY() + size.getValueY()); } - static GetBrowserWidth(element = null) { - if (!element) { - return window.innerWidth; - } - else { - return element.clientWidth; - } + GetCenter() { + const x = ((this.max.x - this.min.x) / 2) + this.min.x; + const y = ((this.max.y - this.min.y) / 2) + this.min.y; + return new Vector2_model_1.Vector2(x, y); } - static GetBrowserHeight(element = null) { - if (!element) { - return window.innerHeight; - } - else { - return element.clientHeight; - } + GetTop() { + return this.min.getValueY(); } -} -exports.ViewportHelper = ViewportHelper; - - -/***/ }), - -/***/ "./src/application/Graphics/Viewport/viewport.service.ts": -/*!***************************************************************!*\ - !*** ./src/application/Graphics/Viewport/viewport.service.ts ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class ViewportService { - constructor(aspectRatio = new Vector2_model_1.Vector2(16, 9), sizePercent = new Vector2_model_1.Vector2(1, 1)) { - this.listeningForBrowserChanges = false; - this.aspectRatio = aspectRatio; - this.aspectRatioCalculated = (this.aspectRatio.getValueX() / this.aspectRatio.getValueY()); - this.sizePercent = sizePercent; - this.setupListner(); + GetBottom() { + return this.max.getValueY(); } - setupListner() { - console.log('setting up browser listner'); - this.listner = window.addEventListener('resize', () => { - this.listeningForBrowserChanges = true; - setTimeout(() => { - this.listeningForBrowserChanges = false; - }, 5000); - }); + GetLeft() { + return this.min.getValueX(); } - /** - *Gets a window in a the game's aspect ratio - * - * @param {HTMLElement} [canvasableElement=null] - * @returns {Vector2} - * @memberof ViewportService - */ - GetWindowInAspectRatioForCanvas(canvasableElement = null) { - if (!canvasableElement) { - console.warn(`setup with no canvasable element. Will use the entire window`); - } - else { - console.warn(`setup with id of ${canvasableElement.id}`); - } - if (this.sizePercent.getValueX() !== this.sizePercent.getValueY()) { - console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); - } - if (this.aspectRatio.getValueX() > this.aspectRatio.getValueY()) { - console.log(`starting in portrait mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); - } - else { - console.info(`starting in landscape mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); - } - const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * this.sizePercent.getValueX(); - const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * this.sizePercent.getValueY(); - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); + GetRight() { + return this.max.getValueX(); } - GetSquareInBrowser() { - const h = this.GetBrowserHeight() - 5; - const w = this.GetBrowserWidth() - 5; - if (h < w) { - return new Vector2_model_1.Vector2(h, h); - } - else { - return new Vector2_model_1.Vector2(w, w); + IsAbove(target) { + if (this.GetBottom() < target.GetTop()) { + return true; } + return false; } - GetWindowInAspectRatio() { - const adjustedWindowHeight = this.GetBrowserHeight() * this.sizePercent.getValueX(); - const adjustedWindowWidth = this.GetBrowserWidth() * this.sizePercent.getValueY(); - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - GetBrowserWidth(element = null) { - if (!element) { - return window.innerWidth; - } - else { - return element.clientWidth; + IsBelow(target) { + if (this.GetTop() > target.GetBottom()) { + return true; } + return false; } - GetBrowserHeight(element = null) { - if (!element) { - return window.innerHeight; - } - else { - return element.clientHeight; + IsRight(target) { + if (this.GetRight() < target.GetLeft()) { + return true; } + return false; } - getBrowserSize() { - return this.browserSize; - } - setBrowserSize(browserSize) { - this.browserSize = browserSize; - } - getViewportSize() { - return this.viewportSize; - } - setViewportSize(viewportSize) { - this.viewportSize = viewportSize; - } -} -exports.ViewportService = ViewportService; - - -/***/ }), - -/***/ "./src/application/Graphics/graphics.service.ts": -/*!******************************************************!*\ - !*** ./src/application/Graphics/graphics.service.ts ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const graphics_html_service_1 = __webpack_require__(/*! ./Html/graphics.html.service */ "./src/application/Graphics/Html/graphics.html.service.ts"); -const graphics_canvas_service_1 = __webpack_require__(/*! ./Canvas/graphics.canvas.service */ "./src/application/Graphics/Canvas/graphics.canvas.service.ts"); -const tile_service_1 = __webpack_require__(/*! ./Tiles/tile.service */ "./src/application/Graphics/Tiles/tile.service.ts"); -const game_camera_service_1 = __webpack_require__(/*! ./Camera/game-camera.service */ "./src/application/Graphics/Camera/game-camera.service.ts"); -const drawing_service_1 = __webpack_require__(/*! ./Draw/drawing.service */ "./src/application/Graphics/Draw/drawing.service.ts"); -const texture_service_1 = __webpack_require__(/*! ./Textures/texture.service */ "./src/application/Graphics/Textures/texture.service.ts"); -class GraphicsService { - constructor() { - console.log('starting graphics service'); - this.htmlService = new graphics_html_service_1.HtmlService(); - this.canvasService = new graphics_canvas_service_1.CanvasService(this.htmlService); - this.tileService = new tile_service_1.TileService(this.canvasService, this); - this.textureService = new texture_service_1.TextureService(); - const applyCameraWorldBounding = false; - this.gameCameraService = new game_camera_service_1.GameCameraService(0, 0, applyCameraWorldBounding); - this.drawingService = new drawing_service_1.DrawingService(this.gameCameraService, this.canvasService, this.textureService); - } - InitGraphicsService() { - this.htmlService.Init(); - this.canvasService.Init(); - this.tileService.Init(); - } - GetTextureService() { - return this.textureService; - } - GetTileService() { - return this.tileService; - } - getGameCameraService() { - return this.gameCameraService; - } - getDrawingService() { - return this.drawingService; - } - RegisterDrawableEntity(id = null) { - return this.canvasService.RegisterNewCanvas(id); - } - GetCanvas(id) { - return this.canvasService.GetCanvas(id); - } - Render() { - // console.log('rendering in graphics service'); - this.canvasService.mainCanvasCtx.clearRect(0, 0, this.canvasService.mainCanvas.width, this.canvasService.mainCanvas.height); - for (let i = 0; i < this.canvasService.drawableAreas.length; i++) { - this.canvasService.mainCanvasCtx.drawImage(this.canvasService.drawableAreas[i].canvas, 0, 0); + IsLeft(target) { + if (this.GetLeft() > target.GetRight()) { + return true; } + return false; } } -exports.GraphicsService = GraphicsService; +exports.AABB = AABB; /***/ }), -/***/ "./src/application/Input/InputManager.ts": +/***/ 5622: /*!***********************************************!*\ !*** ./src/application/Input/InputManager.ts ***! \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const input_state_1 = __webpack_require__(/*! ./input-state */ "./src/application/Input/input-state.ts"); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InputManager = void 0; +const input_state_1 = __webpack_require__(/*! ./input-state */ 2185); class InputManager { constructor() { this.gamePads = Array(); @@ -2057,436 +1931,443 @@ class InputManager { return this.inputState.GetForceValue(inputDescription); } } -InputManager.validInputs = ['w', 'a', 's', 'd', ' ']; exports.InputManager = InputManager; +InputManager.validInputs = ['w', 'a', 's', 'd', ' ']; /***/ }), -/***/ "./src/application/Input/input-state.ts": -/*!**********************************************!*\ - !*** ./src/application/Input/input-state.ts ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6012: +/*!*****************************************************************************!*\ + !*** ./src/application/Tools/random_generators/random_number.generators.ts ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const input_model_1 = __webpack_require__(/*! ./input.model */ "./src/application/Input/input.model.ts"); -class InputState { - constructor() { - this.controllingWithPad = false; - console.log('inputState: constructing input state'); - this.detailsDiv = document.getElementById('details_div'); - this.registeredGamePads = new Array(); - this.gamePads = new Array(); - } - Init() { - console.log('inputState: init inputstate'); - this.setupInputs(); - this.SetupGamePadRegistrationWatch(); - this.SetupKeyboardInputWatch(); - this.SetGamePadMode(false); - } - SetGamePadMode(controllingWithPad) { - this.controllingWithPad = controllingWithPad; - if (controllingWithPad) { - this.detailsDiv.innerHTML = 'controlling with gamepad. Press >> k << to use keyboard mode'; - } - else { - this.detailsDiv.innerHTML = 'controlling with keyboard. Press >> select << to use gamepad mode'; - } - } - GetGamePadMode() { - return this.controllingWithPad; - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RandomNumberGenerator = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class RandomNumberGenerator { /** - * // https://w3c.github.io/gamepad/#remapping + * Generates a random number * - * @memberof InputState + * @static + * @param {number} min + * @param {number} max + * @returns {number} + * @memberof RandomNumberGenerator */ - setupInputs() { - this.currentInputs = new Array(); - this.currentInputs.push(new input_model_1.Input('direction_left', 'a', 14, null), new input_model_1.Input('direction_right', 'd', 15, null), new input_model_1.Input('direction_up', 'w', 12, null), new input_model_1.Input('direction_down', 's', 13, null), new input_model_1.Input('axes_pad_left_horizontal', null, null, 0), new input_model_1.Input('axes_pad_left_vertical', null, null, 1), new input_model_1.Input('axes_pad_right_horizontal', null, null, 2), new input_model_1.Input('axes_pad_right_vertical', null, null, 3), new input_model_1.Input('trigger_one_left', 'q', 4, null), new input_model_1.Input('trigger_two_left', 'w', 6, null), new input_model_1.Input('trigger_one_right', 'e', 5, null), new input_model_1.Input('trigger_two_right', 's', 7, null), - // 'action_{val}' where {val} is the - // name of the button on an XBox360 controller - new input_model_1.Input('action_a', ' ', 0, null), new input_model_1.Input('action_y', 'z', 3, null), new input_model_1.Input('action_x', 'x', 2, null), new input_model_1.Input('action_b', 'c', 1, null)); - } - UpdateInputs() { - // console.log('inputstate: updating inputs. There are ' + this.registeredGamePads.length + ' pads connected') - this.UpdateGamePadInputs(); + static GetRandomNumber(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); } - ResetInputsBeforeGamePadInput() { - for (let input of this.currentInputs) { - input.wasPressedPreviousCheck = input.pressed; - input.pressed = false; - } + /** + * generates a random Vector 2 + * + * @static + * @param {number} minX + * @param {number} maxX + * @param {number} minY + * @param {number} maxY + * @returns {Vector2} + * @memberof RandomNumberGenerator + */ + static GetRandomVector2(minX, maxX, minY, maxY) { + return new Vector2_model_1.Vector2(this.GetRandomNumber(minX, maxX), this.GetRandomNumber(minY, maxY)); } - UpdateGamePadInputs() { - for (let i = 0; i < this.registeredGamePads.length; i++) { - const padToCheck = this.GetGamePad(i); - if (this.GetGamePadMode()) { - this.ResetInputsBeforeGamePadInput(); - for (let btnIndex = 0; btnIndex < padToCheck.buttons.length; btnIndex++) { - if (this.gamePadButtonPressed(padToCheck.buttons[btnIndex])) { - this.pushToCurrentInputsFromGamePad(btnIndex, padToCheck.buttons[btnIndex].value); - // console.log(`inputstate: btn ${btnIndex} is pressed`) - } - } - for (let axesIndex = 0; axesIndex < padToCheck.axes.length; axesIndex++) { - if (this.gamePadAxesPressed(padToCheck.axes[axesIndex])) { - this.pushToCurrentInputsFromGamePadAxes(axesIndex, padToCheck.axes[axesIndex]); - } - } - } - else { - if (this.gamePadButtonPressed(padToCheck.buttons[8])) { - console.warn('inputstate: in gamepad mode'); - this.SetGamePadMode(true); - } - } - } +} +exports.RandomNumberGenerator = RandomNumberGenerator; + + +/***/ }), + +/***/ 6247: +/*!********************************************************!*\ + !*** ./src/application/Graphics/Tiles/tile.service.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TileService = void 0; +const space_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/space.tiletype */ 1874); +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +const tile_default_settings_1 = __webpack_require__(/*! ./tile.default.settings */ 6538); +const drawable_tile_1 = __webpack_require__(/*! ./drawable-tile */ 961); +const grass_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/grass.tiletype */ 8241); +const star_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/star.tiletype */ 1226); +const dirt_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/dirt.tiletype */ 4312); +const sand_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/sand.tiletype */ 7769); +const shallow_water_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/shallow-water.tiletype */ 4881); +const stone_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/stone.tiletype */ 6716); +class TileService { + constructor(canvasService, graphicsService) { + this.tileSize = tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE; + this.tileTypes = new Array(256); + this.tiles = new Array(); + this.graphicsService = graphicsService; + this.canvasService = canvasService; } - IsInputPressed(inputDescription) { - for (let input of this.currentInputs) { - if (input.name === inputDescription) { - return input.pressed; - } - } - return false; + Init() { + this.tileCanvasId = this.canvasService.RegisterNewCanvas(); + this.spaceTileType = new space_tiletype_1.SpaceTileType(0, this.graphicsService.GetTextureService().RegisterNewTexture(space_tiletype_1.SpaceTileType.texturePath)); + this.starTileType = new star_tiletype_1.StarTileType(1, this.graphicsService.GetTextureService().RegisterNewTexture(star_tiletype_1.StarTileType.texturePath)); + this.grassTileType = new grass_tiletype_1.GrassTileType(2, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileType.texturePath)); + this.grassTileTypeDirt = new grass_tiletype_1.GrassTileTypeDirt(3, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirt.texturePath)); + this.grassTileTypeDirtTop = new grass_tiletype_1.GrassTileTypeDirtTop(4, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtTop.texturePath)); + this.grassTileTypeDirtRight = new grass_tiletype_1.GrassTileTypeDirtRight(5, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtRight.texturePath)); + this.grassTileTypeBottom = new grass_tiletype_1.GrassTileTypeDirtBottom(6, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtBottom.texturePath)); + this.grassTileTypeLeft = new grass_tiletype_1.GrassTileTypeDirtLeft(7, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtLeft.texturePath)); + this.grassTileTypeMiddle = new grass_tiletype_1.GrassTileTypeDirtMiddle(8, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtMiddle.texturePath)); + this.dirtTileType = new dirt_tiletype_1.DirtTileType(9, this.graphicsService.GetTextureService().RegisterNewTexture(dirt_tiletype_1.DirtTileType.texturePath)); + this.stoneTileType = new stone_tiletype_1.StoneTileType(10, this.graphicsService.GetTextureService().RegisterNewTexture(stone_tiletype_1.StoneTileType.texturePath)); + this.sandTileType = new sand_tiletype_1.SandTileType(11, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileType.texturePath)); + this.sandTileTypeDirtTop = new sand_tiletype_1.SandTileTypeGrassTop(12, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassTop.texturePath)); + this.sandTileTypeDirtRight = new sand_tiletype_1.SandTileTypeGrassRight(13, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassRight.texturePath)); + this.sandTileTypeBottom = new sand_tiletype_1.SandTileTypeGrassBottom(14, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassBottom.texturePath)); + this.sandTileTypeLeft = new sand_tiletype_1.SandTileTypeGrassLeft(15, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassLeft.texturePath)); + this.shallowWaterTileType = new shallow_water_tiletype_1.ShallowWaterTileType(16, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileType.texturePath)); + this.shallowWaterTileTypeDirtTop = new shallow_water_tiletype_1.ShallowWaterTileTypeSandTop(17, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandTop.texturePath)); + this.shallowWaterTileTypeDirtRight = new shallow_water_tiletype_1.ShallowWaterTileTypeSandRight(18, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandRight.texturePath)); + this.shallowWaterTileTypeBottom = new shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom(19, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom.texturePath)); + this.shallowWaterTileTypeLeft = new shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft(20, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft.texturePath)); + this.setupTileTypes(); + // this.setupTiles(); } - GetForceValue(inputDescription) { - for (let input of this.currentInputs) { - if (input.name === inputDescription) { - return input.force; - } - } - return 0; + setupTileTypes() { + this.tileTypes[this.spaceTileType.GetId()] = this.spaceTileType; + this.tileTypes[this.starTileType.GetId()] = this.starTileType; + this.tileTypes[this.grassTileType.GetId()] = this.grassTileType; + this.tileTypes[this.grassTileTypeDirt.GetId()] = this.grassTileTypeDirt; + this.tileTypes[this.grassTileTypeDirtTop.GetId()] = this.grassTileTypeDirtTop; + this.tileTypes[this.grassTileTypeDirtRight.GetId()] = this.grassTileTypeDirtRight; + this.tileTypes[this.grassTileTypeBottom.GetId()] = this.grassTileTypeBottom; + this.tileTypes[this.grassTileTypeLeft.GetId()] = this.grassTileTypeLeft; + this.tileTypes[this.grassTileTypeMiddle.GetId()] = this.grassTileTypeMiddle; + this.tileTypes[this.dirtTileType.GetId()] = this.dirtTileType; + this.tileTypes[this.stoneTileType.GetId()] = this.stoneTileType; + this.tileTypes[this.sandTileType.GetId()] = this.sandTileType; + this.tileTypes[this.sandTileTypeDirtTop.GetId()] = this.sandTileTypeDirtTop; + this.tileTypes[this.sandTileTypeDirtRight.GetId()] = this.sandTileTypeDirtRight; + this.tileTypes[this.sandTileTypeBottom.GetId()] = this.sandTileTypeBottom; + this.tileTypes[this.sandTileTypeLeft.GetId()] = this.sandTileTypeLeft; + this.tileTypes[this.shallowWaterTileType.GetId()] = this.shallowWaterTileType; + this.tileTypes[this.shallowWaterTileTypeDirtTop.GetId()] = this.shallowWaterTileTypeDirtTop; + this.tileTypes[this.shallowWaterTileTypeDirtRight.GetId()] = this.shallowWaterTileTypeDirtRight; + this.tileTypes[this.shallowWaterTileTypeBottom.GetId()] = this.shallowWaterTileTypeBottom; + this.tileTypes[this.shallowWaterTileTypeLeft.GetId()] = this.shallowWaterTileTypeLeft; } /** - * checks if this key is in the SYSTEM_KEYS array - * (includes keys like F1 - F12) + * returns a Vector 2 containing a size * - * @private - * @param {string} key - * @returns - * @memberof InputState + * @param {number[][]} tiles + * @returns {Vector2} + * @memberof TileService */ - isSystemKey(key) { - if (InputState.SYSTEM_KEYS.includes(key)) { - return true; + setupTilesFromArray(tiles) { + const size = new Vector2_model_1.Vector2(0, 0); + // const canvId = `${this.graphicsService.RegisterDrawableEntity('texts')}`; + for (let x = 0; x < tiles.length; x++) { + for (let y = 0; y < tiles[x].length; y++) { + this.tiles.push(new drawable_tile_1.DrawableTile(tiles[x][y], new Vector2_model_1.Vector2(y * this.GetTileSize().getValueX(), x * this.GetTileSize().getValueY()), tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE, this.tileTypes[tiles[x][y]].GetFallbackColour(), this.tileCanvasId, this.tileTypes[tiles[x][y]].GetTextureId())); + } } - return false; + return size; } - SetupKeyboardInputWatch() { - window.addEventListener('keydown', event => { - if (!this.isSystemKey(event.key)) { - event.preventDefault(); - this.pushToCurrentInputsFromKeyboard(event.key); - } - }); - window.addEventListener('keyup', event => { - if (!this.isSystemKey(event.key)) { - event.preventDefault(); - this.popFromCurrentInputsFromKeyboard(event.key); - if (event.key === 'k') { - console.warn(`inputstate: controlling by keyboard`); - this.SetGamePadMode(false); - } - } - }); + PreClearCanvas() { + const canv = this.graphicsService.GetCanvas(this.tileCanvasId); + canv.ClearCanvas(); } - pushToCurrentInputsFromKeyboard(key) { - if (this.GetGamePadMode() === false) { - for (let thisInput of this.currentInputs) { - if (thisInput.keyboardId === key) { - thisInput.pressed = true; - thisInput.force = 1; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) - return; - } - } + Redner() { + this.PreClearCanvas(); + for (let i = 0; i < this.tiles.length; i++) { + this.graphicsService.getDrawingService().Draw(this.tiles[i], true); } } - popFromCurrentInputsFromKeyboard(key) { - if (this.GetGamePadMode() === false) { - for (let input of this.currentInputs) { - if (input.keyboardId === key) { - input.pressed = false; - // console.log(`inputstate marked ${input.name} as pressed`) - return; - } - } - } + GetTileSize() { + return this.tileSize; } - pushToCurrentInputsFromGamePad(btnId, pushForce) { - for (let thisInput of this.currentInputs) { - if (thisInput.gamepadId === btnId) { - thisInput.pressed = true; - thisInput.force = pushForce; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) - return; - } - } +} +exports.TileService = TileService; + + +/***/ }), + +/***/ 6417: +/*!*************************************************!*\ + !*** ./src/application/_debug/debug.service.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DebugService = void 0; +const debuggable_items_model_1 = __webpack_require__(/*! ./debuggable-items.model */ 3137); +class DebugService { + constructor(inDebugMode = false) { + console.warn(`starting debug service. inDebugMode [${inDebugMode}]`); + this.inDebugMode = inDebugMode; + this.DebugInfo = new debuggable_items_model_1.DebuggableItems(); } - pushToCurrentInputsFromGamePadAxes(axesIndex, pushForce) { - for (let thisInput of this.currentInputs) { - if (thisInput.gamePadAxesId === axesIndex) { - thisInput.pressed = true; - thisInput.force = pushForce; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) + IsInDebugMode() { + return this.inDebugMode; + } + GetDebugInfo() { + return this.DebugInfo.debugItems; + } + PushOrUpdateInDebugArray(key, value) { + console.log(`adding item ${key} to debug array`); + if (!this.checkForExisting(key)) { + this.DebugInfo.debugItems.push(new debuggable_items_model_1.DebugKvp(key, value)); + return; + } + else { + if (this.PopFromDebugArray(key)) { + this.PushOrUpdateInDebugArray(key, value); + console.info(`successfully updated [${key}] in debug KVP`); return; } } + console.error(`attempted to push or update [${key}], but the item didn't exist in the KVP`); } - popFromCurrentInputsFromGamePad(btnId) { - for (let input of this.currentInputs) { - if (input.gamepadId === btnId) { - input.pressed = false; - // console.log(`inputstate marked ${input.name} as not`) + PopFromDebugArray(key) { + console.log(`removing item ${key} to debug array`); + for (let i = 0; i < this.DebugInfo.debugItems.length; i++) { + if (this.DebugInfo.debugItems[i].Key === key) { + this.DebugInfo.debugItems.splice(i, 1); return; } } + console.error(`attempted to remove [${key} from debug KVP, but it couldn't be found]`); + return false; } - /* GamePad code */ - /** - * watches for the game pad registration events - * - * @memberof InputState - */ - SetupGamePadRegistrationWatch() { - console.log('inputstate setting up registrations'); - window.addEventListener('gamepadconnected', (e) => { - console.log('inputstate got gamepad'); - this.RegisterGamePad(e.gamepad); - }); - window.addEventListener('gamepaddisconnected', (e) => { - console.error('inputstate gamepad was disconnected'); - this.DeRegisterGamePad(e.gamepad); - }); - } - RegisterGamePad(gamePad) { - console.warn("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); - this.registeredGamePads[gamePad.index] = gamePad; - this.detailsDiv.innerHTML = 'Gamepad has been connected'; - } - DeRegisterGamePad(gamePad) { - console.error("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); - this.GetGamePads(); - this.detailsDiv.innerHTML = 'inputstate: Gamepad has been disconnected'; - } - GetGamePads() { - this.gamePads = navigator.getGamepads(); - } - GetGamePad(index) { - return navigator.getGamepads()[index]; - } - gamePadAxesPressed(axes) { - return (axes > InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY || axes < -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY); - } - gamePadButtonPressed(btn) { - // console.log(typeof(btn)); - if (typeof (btn) === 'object') { - // firefox - // console.log('gamepad: ff') - if (btn.pressed) { - // console.log('inputstate: button is pressed') - } - return btn.value; - } - else { - // console.log('inputstate: gamepad: chrome') - return btn === 1.0; - } + checkForExisting(key) { + return false; } } -InputState.SYSTEM_KEYS = [ - 'F1', - 'F2', - 'F3', - 'F4', - 'F5', - 'F6', - 'F7', - 'F8', - 'F9', - 'F10', - 'F11', - 'F12', -]; -InputState.DEFAULT_MAX_INPUTS = 4; -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY = 0.1; -exports.InputState = InputState; +exports.DebugService = DebugService; /***/ }), -/***/ "./src/application/Input/input.model.ts": -/*!**********************************************!*\ - !*** ./src/application/Input/input.model.ts ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6538: +/*!*****************************************************************!*\ + !*** ./src/application/Graphics/Tiles/tile.default.settings.ts ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class Input { - constructor(name, keyboardId, gamepadId, gamePadAxesId) { - this.pressed = false; - this.force = 0; - this.wasPressedPreviousCheck = false; - this.name = name; - this.keyboardId = keyboardId; - this.gamepadId = gamepadId; - this.gamePadAxesId = gamePadAxesId; - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TileDefaultSettings = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class TileDefaultSettings { } -exports.Input = Input; +exports.TileDefaultSettings = TileDefaultSettings; +TileDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(64, 64); /***/ }), -/***/ "./src/application/States/GameState.ts": -/*!*********************************************!*\ - !*** ./src/application/States/GameState.ts ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6622: +/*!********************************************************!*\ + !*** ./src/application/Graphics/Textures/Texture2d.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ "./src/application/States/_BaseState.ts"); -class GameState extends _BaseState_1.BaseState { - constructor(graphicsService) { - super(); - this.graphicsService = graphicsService; - console.log('constructing GameState'); - } - Tick() { - // console.error("Method not implemented."); - // this.graphicsService.getGameCameraService().MoveCamera(1, 0); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Texture2D = void 0; +const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ 6953); +const ImageHelper_1 = __webpack_require__(/*! ../Images/ImageHelper */ 3536); +class Texture2D { + constructor(path) { + this.path = path; + this.url = path; + this.id = random_guid_generator_1.GuidGenerator.NewGuid(); + this.image = ImageHelper_1.ImageHelper.NewImage(this.url); + this.image.onload = (() => { + this.imageCanRender = true; + }); + this.image.onerror = (() => { + this.imageCanRender = false; + console.error('text2d: image could not render'); + }); } - Render() { - // console.error("Method not implemented."); + GetPath() { + return this.path; } -} -exports.GameState = GameState; - - -/***/ }), - -/***/ "./src/application/States/MenuState.ts": -/*!*********************************************!*\ - !*** ./src/application/States/MenuState.ts ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ "./src/application/States/_BaseState.ts"); -class MenuState extends _BaseState_1.BaseState { - constructor() { - super(); - console.log(`constructing MenuState`); + /** + * GetId + */ + GetId() { + return this.id; } - Tick() { - console.error("Method not implemented."); + /** + * GetUrl + */ + GetImage() { + return this.image; } - Render() { - console.error("Method not implemented."); + /** + * returns imageCanRender. If the image is successfully loaded, + * this returns true. Otherwise returns false + * + * @returns + * @memberof Texture2D + */ + GetCanRender() { + return this.imageCanRender; } } -exports.MenuState = MenuState; +exports.Texture2D = Texture2D; /***/ }), -/***/ "./src/application/States/SettingsState.ts": -/*!*************************************************!*\ - !*** ./src/application/States/SettingsState.ts ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6695: +/*!*****************************************************!*\ + !*** ./src/numerics/helpers/intersection.helper.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ "./src/application/States/_BaseState.ts"); -class SettingsState extends _BaseState_1.BaseState { - constructor() { - super(); - console.log(`constructing SettingsState`); - } - Tick() { - console.error("Method not implemented."); - } - Render() { - console.error("Method not implemented."); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.IntersectionHelper = void 0; +class IntersectionHelper { + // checks if two AABBs intersect (rectangle only) + static AabbVsAabb(left, right) { + if ((left.max.getValueX() < right.min.getValueX()) || (left.min.getValueX() > right.max.getValueX())) { + return false; + } + if ((left.max.getValueY() < right.min.getValueY()) || (left.min.getValueY() > right.max.getValueY())) { + return false; + } + return true; } } -exports.SettingsState = SettingsState; +exports.IntersectionHelper = IntersectionHelper; /***/ }), -/***/ "./src/application/States/_BaseState.ts": -/*!**********************************************!*\ - !*** ./src/application/States/_BaseState.ts ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6716: +/*!************************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class BaseState { +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StoneTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class StoneTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#52504F', textId); + } } -exports.BaseState = BaseState; +exports.StoneTileType = StoneTileType; +StoneTileType.texturePath = '/Tiles/ground/stone.png'; /***/ }), -/***/ "./src/application/States/state.service.ts": -/*!*************************************************!*\ - !*** ./src/application/States/state.service.ts ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 6726: +/*!**********************************************************!*\ + !*** ./src/application/Graphics/Draw/drawing.service.ts ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class StateService { - constructor() { - this.currentState = null; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DrawingService = void 0; +class DrawingService { + constructor(cameraService, canvasService, textureService) { + this.allowTextureDrawing = true; + this.drawAsStroke = true; + this.textureService = textureService; + this.canvasService = canvasService; + this.cameraService = cameraService; + console.log('constructing drawing service'); } - setState(state) { - this.currentState = state; + Draw(drawable, skipCanvasClear = false) { + const deg = drawable.GetRotation(); + if (this.cameraService.IsObjectOnScreenAABB(drawable.getAABB())) { + const canv = this.canvasService.GetCanvas(drawable.getCanvasId()); + var rad = deg * (Math.PI / 180); + if (!skipCanvasClear) { + canv.ClearCanvas(); + } + canv.ctx.save(); + // canv.ctx.scale(0.5, 0.5); + const translateX = drawable.GetSizeX() + (drawable.GetPositionX() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetX()); // + (drawable.GetSizeX() / 2));// + this.cameraService.GetOffsetY(); + const translateY = drawable.GetSizeX() + (drawable.GetPositionY() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetY()); // + (drawable.GetSizeY() / 2));// + this.cameraService.GetOffsetY(); + canv.ctx.translate(translateX, translateY); + canv.ctx.rotate(rad); + const drawLocationX = -drawable.GetSizeX() / 2; // / 2;// ; + const drawLocationY = -drawable.GetSizeY() / 2; // / 2;// - this.cameraService.GetOffsetY(); + const drawSizeX = drawable.GetSizeX(); + const drawSizeY = drawable.GetSizeY(); + const texture = this.textureService.GetTexture(drawable.GetTextureId()); + if (this.allowTextureDrawing && texture && texture.GetCanRender()) { + this.DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); + } + else if (false) // removed by dead control flow +{} + else { + // if (drawable.GetTextureId()) { + // console.log(` + // text: ${texture.GetId()} + // rend: ${texture.GetCanRender()}`); + // } + this.DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); + } + // detranslates the canvas + canv.ctx.translate(-(translateX), -(translateY)); + canv.ctx.restore(); + } } - GetState() { - return this.currentState; + // private rotate(ctx) { + // //Convert degrees to radian + // var rad = deg * Math.PI / 180; + // //Set the origin to the center of the image + // ctx.translate(x + width / 2, y + height / 2); + // //Rotate the canvas around the origin + // ctx.rotate(rad); + // //draw the image + // ctx.drawImage(img, width / 2 * (-1), height / 2 * (-1), width, height); + // //reset the canvas + // ctx.rotate(rad * (-1)); + // ctx.translate((x + width / 2) * (-1), (y + height / 2) * (-1)); + // } + DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { + canv.ctx.strokeStyle = '#fff'; + canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); + canv.ctx.drawImage(texture.GetImage(), drawLocationX, drawLocationY, drawSizeX, drawSizeY); + } + DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { + if (this.drawAsStroke) { + canv.ctx.strokeStyle = drawable.GetColour(); + canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); + } + else { + canv.ctx.fillStyle = drawable.GetColour(); + canv.ctx.fillRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); + } } } -exports.StateService = StateService; +exports.DrawingService = DrawingService; /***/ }), -/***/ "./src/application/Tools/random_generators/random_guid.generator.ts": +/***/ 6953: /*!**************************************************************************!*\ !*** ./src/application/Tools/random_generators/random_guid.generator.ts ***! \**************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GuidGenerator = void 0; class GuidGenerator { /** * returns a new guid @@ -2508,583 +2389,470 @@ exports.GuidGenerator = GuidGenerator; /***/ }), -/***/ "./src/application/Tools/random_generators/random_number.generators.ts": -/*!*****************************************************************************!*\ - !*** ./src/application/Tools/random_generators/random_number.generators.ts ***! - \*****************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7267: +/*!***************************************************!*\ + !*** ./src/application/Graphics/Draw/drawable.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class RandomNumberGenerator { - /** - * Generates a random number - * - * @static - * @param {number} min - * @param {number} max - * @returns {number} - * @memberof RandomNumberGenerator - */ - static GetRandomNumber(min, max) { - return Math.floor(Math.random() * (max - min + 1) + min); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Drawable = void 0; +const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ 5537); +class Drawable { + constructor(position, size, canvasId, textureId) { + console.log(`drawable constructor`); + this.position = position; + this.size = size; + this.AABB = new AABB_model_1.AABB(this.position, this.size); + this.canvasId = canvasId; + this.rotationDegrees = 0; + this.textureId = textureId; } - /** - * generates a random Vector 2 - * - * @static - * @param {number} minX - * @param {number} maxX - * @param {number} minY - * @param {number} maxY - * @returns {Vector2} - * @memberof RandomNumberGenerator - */ - static GetRandomVector2(minX, maxX, minY, maxY) { - return new Vector2_model_1.Vector2(this.GetRandomNumber(minX, maxX), this.GetRandomNumber(minY, maxY)); + getCanvasId() { + return this.canvasId; } -} -exports.RandomNumberGenerator = RandomNumberGenerator; - - -/***/ }), - -/***/ "./src/application/Tools/random_generators/random_string.generator.ts": -/*!****************************************************************************!*\ - !*** ./src/application/Tools/random_generators/random_string.generator.ts ***! - \****************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class RandomStringGenerator { - static GetRandomHexColour() { - return '#' + (Math.random() * 0xFFFFFF << 0).toString(16); + setCanvasId(canvasId) { + this.canvasId = canvasId; } -} -exports.RandomStringGenerator = RandomStringGenerator; - - -/***/ }), - -/***/ "./src/application/World/world.jsonfiles.ts": -/*!**************************************************!*\ - !*** ./src/application/World/world.jsonfiles.ts ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const json = __importStar(__webpack_require__(/*! ../../assets/_dist/Worlds/worlds.json */ "./src/assets/_dist/Worlds/worlds.json")); -const world_1 = __webpack_require__(/*! ./world */ "./src/application/World/world.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -/** - * this is in a different file because adding .json files - * causes VSCode to only want to load .js imports, and not - * .ts imports - * - * @export - * @class WorldJsonFileLoader - */ -class WorldJsonFileLoader { - constructor() { + GetTextureId() { + return this.textureId; + } + SetTextureId(textureId) { + this.textureId = textureId; + } + getAABB() { + if (this.AABB === undefined) { + this.UpdateAABB(); + } + return this.AABB; + } + setAABB(AABB) { + this.AABB = AABB; + } + UpdateAABB() { + this.setAABB(new AABB_model_1.AABB(this.position, this.size)); + } + GetPositionX() { + return this.position.x; + } + GetPositionY() { + return this.position.y; + } + GetSizeX() { + return this.size.x; + } + GetSizeY() { + return this.size.y; + } + GetColour() { + if (this.colour) { + return this.colour; + } + else { + return '#f00'; + } } - static GetWorlds() { - const worldArr = new Array(); - for (let i = 0; i < this.worldCount; i++) { - const world = json[i]; - worldArr.push(new world_1.World(new Vector2_model_1.Vector2(world.tiles.length, world.tiles[0].length), new Vector2_model_1.Vector2(world.start.x, world.start.y), world.tiles, world.worldId)); + GetRotation() { + return this.rotationDegrees; + } + AddToRotation(val) { + this.rotationDegrees += val; + if (this.rotationDegrees > 359) { + this.rotationDegrees = 0; + } + else if (this.rotationDegrees < 0) { + this.rotationDegrees = 359; } - return worldArr; } } -WorldJsonFileLoader.worldCount = 2; -exports.WorldJsonFileLoader = WorldJsonFileLoader; +exports.Drawable = Drawable; /***/ }), -/***/ "./src/application/World/world.service.ts": -/*!************************************************!*\ - !*** ./src/application/World/world.service.ts ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7415: +/*!****************************************************************!*\ + !*** ./src/application/Graphics/Html/graphics.html.service.ts ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const world_jsonfiles_1 = __webpack_require__(/*! ./world.jsonfiles */ "./src/application/World/world.jsonfiles.ts"); -const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ "./src/numerics/models/AABB.model.ts"); -const vector2_helper_1 = __webpack_require__(/*! ../../numerics/helpers/vector2.helper */ "./src/numerics/helpers/vector2.helper.ts"); -class WorldService { - constructor(tileService) { - this.currentWorldId = 0; - this.worlds = new Array(); - this.tileService = tileService; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HtmlService = void 0; +class HtmlService { + constructor() { + console.log('creating Html Helper Service in Graphics'); } Init() { - this.worlds = world_jsonfiles_1.WorldJsonFileLoader.GetWorlds(); - console.log(`this.worlds = ${JSON.stringify(this.worlds)} length is ${this.worlds.length}`); - console.info('setting current world to index 0'); - this.SetWorld(2); - } - SetWorld(index) { - this.DeRegisterWorld(); - this.tileService.setupTilesFromArray(this.GetWorld(index).GetTiles()); - } - GetWorldSize() { - const tileSize = this.tileService.GetTileSize(); - this.size = vector2_helper_1.Vector2Helpers.MultiplyByScale(tileSize, 2); - console.log(`this.size: ${this.size}`); - const worldPosition = new Vector2_model_1.Vector2(0, 0); - return new AABB_model_1.AABB(worldPosition, this.size); + this.createMainDiv('main_div'); } - DeRegisterWorld() { - console.error(" DeRegisterWorld: Method not implemented."); + GetMainDiv() { + return this.mainDiv; } - GetStartingPosition(worldIndex) { - return this.worlds[worldIndex].GetStartingPosition(); + createMainDiv(id = 'main_div') { + this.mainDiv = document.createElement('div'); + this.mainDiv.id = id; + document.body.appendChild(this.mainDiv); + return this.mainDiv.id; } - GetWorld(index) { - if (index > this.worlds.length) { - throw new Error(`index [${index}] out of range of world array (length: ${this.worlds.length})`); + createCanvas(id, attatchTo, width, height, classList = null) { + const canvas = document.createElement('canvas'); + canvas.id = id; + canvas.width = width; + canvas.height = height; + if (classList != null) { + for (let i = 0; i < classList.length; i++) { + canvas.classList.add(classList[i]); + } } - return this.worlds[0]; + document.getElementById(attatchTo).appendChild(canvas); + return canvas; } } -exports.WorldService = WorldService; +exports.HtmlService = HtmlService; /***/ }), -/***/ "./src/application/World/world.ts": -/*!****************************************!*\ - !*** ./src/application/World/world.ts ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7467: +/*!*********************************************************************!*\ + !*** ./src/application/Graphics/Models/graphics.drawable-canvas.ts ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class World { - constructor(area, spawn, tiles, id) { - this.area = new Vector2_model_1.Vector2(20, 20); - this.area = area; - this.spawn = spawn; - this.tiles = tiles; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DrawableCanvas = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +class DrawableCanvas extends Vector2_model_1.Vector2 { + constructor(canvas, id, width, height) { + super(width, height); this.id = id; + this.canvas = canvas; + this.ctx = this.canvas.getContext('2d'); } - GetTiles() { - return this.tiles; + GetWidth() { + return this.getValueX(); } - GetStartingPosition() { - return this.spawn; + GetHeight() { + return this.getValueY(); } - GetId() { - return this.id; + ClearCanvas() { + this.ctx.clearRect(0, 0, this.getValueX(), this.getValueY()); + } + PaintImmediately() { + this.ctx.drawImage(this.canvas, 0, 0); } } -exports.World = World; +exports.DrawableCanvas = DrawableCanvas; /***/ }), -/***/ "./src/application/_debug/debug.component.ts": -/*!***************************************************!*\ - !*** ./src/application/_debug/debug.component.ts ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7594: +/*!****************************************************!*\ + !*** ./src/application/Entities/player.service.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class DebugComponent { - constructor(debugService) { - this.debugService = debugService; - this._debugService = debugService; - } - InitDebugComponent(mainDivId) { - this.createDebugDiv(mainDivId); - this.tick(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PlayerService = void 0; +class PlayerService { + constructor() { } - createDebugDiv(parentElementId, id = 'el_debug_info') { - if (this.debugService.IsInDebugMode()) { - const mainDiv = document.getElementById(parentElementId); - this.debugInfoElement = document.createElement('div'); - this.debugInfoElement.id = id; - mainDiv.appendChild(this.debugInfoElement); - for (let i = 0; i < 10; i++) { - this.debugService.PushOrUpdateInDebugArray('Debug Info' + i, 'debug value'); - } - // this.debugService.PopFromDebugArray('Debug Info') - return this.debugInfoElement; + SetPlayer(player) { + if (this.player !== undefined) { + console.error(`playerService.SetPlayer would overwrite the existing player`); } - } - tick() { - // setTimeout(() => { - // this.ticks++; - // }); - requestAnimationFrame(() => { - // console.log('updating debugger') - this.Update(); - this.tick(); - }); - } - Update() { - // console.log(this.debugService.GetDebugInfo(), null, 2) - let DebugsAsString = ''; - const debugInfoArray = this.debugService.GetDebugInfo(); - for (let i = 0; i < debugInfoArray.length; i++) { - // DebugsAsString += this.GetTemplateForKvp(debugInfoArray[i]); + else { + console.warn('setting player'); + this.player = player; } - this.debugInfoElement.innerHTML = DebugsAsString; } - GetTemplateForKvp(item) { - throw new Error('not implemented'); - return ` -
-
-                ${item.Key}
-            
-
-                ${JSON.stringify(item.Value)}
-            
-
`; + GetPlayer() { + return this.player; } } -exports.DebugComponent = DebugComponent; +exports.PlayerService = PlayerService; /***/ }), -/***/ "./src/application/_debug/debug.service.ts": -/*!*************************************************!*\ - !*** ./src/application/_debug/debug.service.ts ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7709: +/*!*****************************************************!*\ + !*** ./src/application/Entities/Creatures/baddy.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const debuggable_items_model_1 = __webpack_require__(/*! ./debuggable-items.model */ "./src/application/_debug/debuggable-items.model.ts"); -class DebugService { - constructor(inDebugMode = false) { - console.warn(`starting debug service. inDebugMode [${inDebugMode}]`); - this.inDebugMode = inDebugMode; - this.DebugInfo = new debuggable_items_model_1.DebuggableItems(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Baddy = void 0; +const creature_1 = __webpack_require__(/*! ./creature */ 2228); +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ 8249); +const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ 1759); +class Baddy extends creature_1.Creature { + constructor(position, size, name, texturePath, graphicsService, colour, playerService) { + super(position, size, name, texturePath, graphicsService); + this.playerService = playerService; + this.colour = colour; + this.maxSpeed = new Vector2_model_1.Vector2(10, 10); + this.acceleration = new Vector2_model_1.Vector2(.55, .6); + // const friction = 0.85; // RandomNumberGenerator.GetRandomNumber(100, 200) / 1000; + // this.friction = new Vector2(friction, + // friction); + this.direction = new Vector2_model_1.Vector2(0, 0); + // this.velocity = RandomNumberGenerator.GetRandomVector2(-10, 10, -10, 10); + this.rotationDegrees = 0; // RandomNumberGenerator.GetRandomNumber(0, 359); + this.turnSpeed = .0515; + this.thrust = 1; + } + Tick(lastDelta) { + this.UpdateAABB(); + const playerAABB = this.playerService.GetPlayer().getAABB(); + this.MoveToPlayer(playerAABB); + this.Move(lastDelta); + } + Render() { + // super.Draw(this.colour); + } + collideWithObject(entity) { + console.log('colliding with object'); + } + turnToPlayer(playerAABB) { + let dx = playerAABB.GetCenter().getValueX() - this.getAABB().GetCenter().getValueX(); + let dy = playerAABB.GetCenter().getValueY() - this.getAABB().GetCenter().getValueY(); + const len = Math.sqrt(dx * dy + dy * dy); + dx /= len ? len : 0.1; + dy /= len ? len : 0.1; + let dirX = Math.cos((0, degrees_helper_1.Radians)(this.rotationDegrees)); + let dirY = Math.sin((0, degrees_helper_1.Radians)(this.rotationDegrees)); + dirX += (dx - dirX) * 1; + dirY += (dy - dirY) * 1; + const rotateTo = Math.atan2(dirY, dirX); + // this.rotationDegrees = Degrees(rotateTo) + (90); + this.rotationDegrees = (0, number_helper_1.Lerp)(this.rotationDegrees, (0, degrees_helper_1.Degrees)(rotateTo) + (-this.angleAdjust), .5); + } + MoveToPlayer(playerAABB) { + this.turnToPlayer(playerAABB); + const rotationAsRadians = (0, degrees_helper_1.Radians)(this.rotationDegrees - this.angleAdjust); + const rotSin = Math.sin(rotationAsRadians); + const rotCos = Math.cos(rotationAsRadians); + this.velocity.x -= (rotCos * this.thrust); + this.velocity.y -= (rotSin * this.thrust); + // const rotationAsRadians = this.rotationDegrees / Math.PI * 180; + // const rotCos = Math.sin(rotationAsRadians); + // const rotSin = Math.cos(rotationAsRadians); + // this.velocity.x = (rotSin * thrust); + // this.velocity.y = (rotCos * thrust); + // console.log(`baddy: + // rotation: ${this.rotationDegrees} + // CosRotation: ${rotCos} + // SinRotation: ${rotSin} + // velocity: ${this.velocity.concat()}`); + // if (IntersectionHelper.AabbVsAabb( + // this.getAABB(), playerAABB) === false) { + // if (this.getAABB().IsAbove(playerAABB)) { + // this.setDirectionDown(); + // this.velocity.y += this.acceleration.y; + // // console.log('entity is above player') + // } else if (this.getAABB().IsBelow(playerAABB)) { + // this.setDirectionUp(); + // // console.log('entity is above player') + // this.velocity.y -= this.acceleration.y; // console.log('entity is below player') + // } + // if (this.getAABB().IsRight(playerAABB)) { + // this.setDirectionLeft(); + // // console.log('entity is right of the player'); + // this.velocity.x += this.acceleration.x; + // } else if (this.getAABB().IsLeft(playerAABB)) { + // this.setDirectionRigth(); + // // console.log('entity is left of the player') + // this.velocity.x -= this.acceleration.x; + // } + // } + // this.velocity.x -= (this.getDirectionHorizontal() * this.acceleration.x) / 4; + // this.velocity.y += (this.getDirectionVertical() * this.acceleration.y) / 4; } - IsInDebugMode() { - return this.inDebugMode; + setDirectionRigth() { + this.direction.setValueX(1); } - GetDebugInfo() { - return this.DebugInfo.debugItems; + setDirectionLeft() { + this.direction.setValueX(-1); } - PushOrUpdateInDebugArray(key, value) { - console.log(`adding item ${key} to debug array`); - if (!this.checkForExisting(key)) { - this.DebugInfo.debugItems.push(new debuggable_items_model_1.DebugKvp(key, value)); - return; - } - else { - if (this.PopFromDebugArray(key)) { - this.PushOrUpdateInDebugArray(key, value); - console.info(`successfully updated [${key}] in debug KVP`); - return; - } - } - console.error(`attempted to push or update [${key}], but the item didn't exist in the KVP`); + setDirectionUp() { + this.direction.setValueY(-1); } - PopFromDebugArray(key) { - console.log(`removing item ${key} to debug array`); - for (let i = 0; i < this.DebugInfo.debugItems.length; i++) { - if (this.DebugInfo.debugItems[i].Key === key) { - this.DebugInfo.debugItems.splice(i, 1); - return; - } - } - console.error(`attempted to remove [${key} from debug KVP, but it couldn't be found]`); - return false; + setDirectionDown() { + this.direction.setValueY(1); } - checkForExisting(key) { - return false; + getDirectionHorizontal() { + return this.direction.getValueX(); + } + getDirectionVertical() { + return this.direction.getValueY(); } } -exports.DebugService = DebugService; +exports.Baddy = Baddy; /***/ }), -/***/ "./src/application/_debug/debuggable-items.model.ts": -/*!**********************************************************!*\ - !*** ./src/application/_debug/debuggable-items.model.ts ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 7769: +/*!***********************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts ***! + \***********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class DebuggableItems { - constructor() { - this.debugItems = new Array(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SandTileTypeGrassLeft = exports.SandTileTypeGrassBottom = exports.SandTileTypeGrassRight = exports.SandTileTypeGrassTop = exports.SandTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class SandTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#C1C128', textId); } } -exports.DebuggableItems = DebuggableItems; -class DebugKvp { - constructor(key, value) { - this.Key = key; - this.Value = value; +exports.SandTileType = SandTileType; +SandTileType.texturePath = '/Tiles/ground/sand.png'; +class SandTileTypeGrassTop extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#C1C128', textId); } } -exports.DebugKvp = DebugKvp; +exports.SandTileTypeGrassTop = SandTileTypeGrassTop; +SandTileTypeGrassTop.texturePath = '/Tiles/ground/sand_grass_top.png'; +class SandTileTypeGrassRight extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#C1C128', textId); + } +} +exports.SandTileTypeGrassRight = SandTileTypeGrassRight; +SandTileTypeGrassRight.texturePath = '/Tiles/ground/sand_grass_right.png'; +class SandTileTypeGrassBottom extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#C1C128', textId); + } +} +exports.SandTileTypeGrassBottom = SandTileTypeGrassBottom; +SandTileTypeGrassBottom.texturePath = '/Tiles/ground/sand_grass_bottom.png'; +class SandTileTypeGrassLeft extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#C1C128', textId); + } +} +exports.SandTileTypeGrassLeft = SandTileTypeGrassLeft; +SandTileTypeGrassLeft.texturePath = '/Tiles/ground/sand_grass_left.png'; /***/ }), -/***/ "./src/application/game.ts": -/*!*********************************!*\ - !*** ./src/application/game.ts ***! - \*********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const InputManager_1 = __webpack_require__(/*! ./Input/InputManager */ "./src/application/Input/InputManager.ts"); -const debug_service_1 = __webpack_require__(/*! ./_debug/debug.service */ "./src/application/_debug/debug.service.ts"); -const debug_component_1 = __webpack_require__(/*! ./_debug/debug.component */ "./src/application/_debug/debug.component.ts"); -const Vector2_model_1 = __webpack_require__(/*! ../numerics/models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -const GameState_1 = __webpack_require__(/*! ./States/GameState */ "./src/application/States/GameState.ts"); -const state_service_1 = __webpack_require__(/*! ./States/state.service */ "./src/application/States/state.service.ts"); -const MenuState_1 = __webpack_require__(/*! ./States/MenuState */ "./src/application/States/MenuState.ts"); -const SettingsState_1 = __webpack_require__(/*! ./States/SettingsState */ "./src/application/States/SettingsState.ts"); -const player_1 = __webpack_require__(/*! ./Entities/Creatures/player */ "./src/application/Entities/Creatures/player.ts"); -const graphics_service_1 = __webpack_require__(/*! ./Graphics/graphics.service */ "./src/application/Graphics/graphics.service.ts"); -const baddy_1 = __webpack_require__(/*! ./Entities/Creatures/baddy */ "./src/application/Entities/Creatures/baddy.ts"); -const random_string_generator_1 = __webpack_require__(/*! ./Tools/random_generators/random_string.generator */ "./src/application/Tools/random_generators/random_string.generator.ts"); -const random_number_generators_1 = __webpack_require__(/*! ./Tools/random_generators/random_number.generators */ "./src/application/Tools/random_generators/random_number.generators.ts"); -const world_service_1 = __webpack_require__(/*! ./World/world.service */ "./src/application/World/world.service.ts"); -const viewport_service_1 = __webpack_require__(/*! ./Graphics/Viewport/viewport.service */ "./src/application/Graphics/Viewport/viewport.service.ts"); -const player_service_1 = __webpack_require__(/*! ./Entities/player.service */ "./src/application/Entities/player.service.ts"); -const entity_service_1 = __webpack_require__(/*! ./Entities/entity.service */ "./src/application/Entities/entity.service.ts"); -const timer_service_1 = __webpack_require__(/*! ./Core/timer.service */ "./src/application/Core/timer.service.ts"); -class Game { - constructor() { - this.running = false; - this.launchMessage = 'Start'; - this.performanceInfoDiv = document.getElementById('performance_div'); - this.performanceInfoDiv.innerHTML = `waiting for perf data`; - this.viewportService = new viewport_service_1.ViewportService(); - const loadedInDebugMode = this.checkDebugModeFromQueryString(); - this.graphicsService = new graphics_service_1.GraphicsService(); - this.stateService = new state_service_1.StateService(); - this.debugService = new debug_service_1.DebugService(loadedInDebugMode); - this.debugComponent = new debug_component_1.DebugComponent(this.debugService); - this.inputManager = new InputManager_1.InputManager(); - this.timerService = new timer_service_1.TimerService(60); - this.worldService = new world_service_1.WorldService(this.graphicsService.GetTileService()); - this.entityService = new entity_service_1.EntityService(); - this.playerService = new player_service_1.PlayerService(); - } - Run() { - console.log('Run called in game.ts'); - this.Init(); - this.running = true; - this.Loop(); - } - Init() { - console.log(this.launchMessage + ' will now be posted to the document '); - this.SetupStates(); - this.inputManager.InitInputManager(); - this.graphicsService.InitGraphicsService(); - this.worldService.Init(); - this.graphicsService.getGameCameraService().SetLevelAABB(this.worldService.GetWorldSize()); - this.registerEntities(); - // this.canvasManager.InitCanvasManager('main_div', this.gameEntities); - if (this.debugService.IsInDebugMode()) { - console.log('setting up with debug info'); - this.debugComponent.InitDebugComponent('main_div'); - } - return this.launchMessage; - } - SetupStates() { - this.gameState = new GameState_1.GameState(this.graphicsService); - this.menuState = new MenuState_1.MenuState(); - this.settingsState = new SettingsState_1.SettingsState(); - this.stateService.setState(this.gameState); - } - /** - * loops continuously whenever the browser is ready - * for a new frame - * - * @memberof Game - */ - Loop() { - requestAnimationFrame(() => { - if (this.running) { - if (this.timerService.CheckShouldRunLoop()) { - const lastDelta = this.timerService.GetLastUpdateTimeTook(); - this.Update(lastDelta); - this.Render(lastDelta); - this.timerService.UpdateTicksAndRenderAfterLoop(); - } - this.PrintDebugInfoToConsole(false, true); - this.timerService.ResetTimers(); - } - this.Loop(); - }); - } - /** - * prints debug info from various places in the - * application - * - * @private - * @memberof Game - */ - PrintDebugInfoToConsole(printToConsole = false, printToHtml = false) { - if (this.timerService.ShouldPrintDebugData()) { - // console.clear(); - let debugInformation = new Array(); - debugInformation.push('FPS Serv: ' + this.timerService.PrintCurrentFpsToConsole()); - debugInformation.push('Cam Serv: ' + this.graphicsService.getGameCameraService().GetDebugInfo()); - if (printToConsole) { - for (let line of debugInformation) { - if (line.length > 0) { - console.log('%c ' + line + ' ', 'background: #000; color:white; '); - } - } - } - if (printToHtml) { - this.performanceInfoDiv.innerHTML = `
${debugInformation.join('\n')}
`; - } - // debugInformation = Array(0); - } - } - Update(lastDelta) { - if (this.stateService.GetState() !== null) { - this.inputManager.NewInputLoopCheck(); - this.stateService.GetState().Tick(); - this.entityService.TickAllEntities(lastDelta); - // for (let i = 0; i < this.gameEntities.length; i++) { - // this.gameEntities[i].Tick(); - // } - } - } - Render(lastDelta) { - if (this.stateService.GetState() !== null) { - this.graphicsService.GetTileService().Redner(); - this.entityService.RenderAllEntities(this.graphicsService); - this.stateService.GetState().Render(); - this.graphicsService.Render(); - } +/***/ 7918: +/*!*********************************************!*\ + !*** ./src/application/states/GameState.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GameState = void 0; +const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); +class GameState extends _BaseState_1.BaseState { + constructor(graphicsService) { + super(); + this.graphicsService = graphicsService; + console.log('constructing GameState'); } - checkDebugModeFromQueryString() { - const urlParams = new URLSearchParams(window.location.search); - const debugModeParam = urlParams.get('inDebugMode'); - return JSON.parse(debugModeParam); + Tick() { + // console.error("Method not implemented."); + // this.graphicsService.getGameCameraService().MoveCamera(1, 0); } - registerEntities(baddyCount = 75) { - const ships = [ - 'metalic_01.png', - 'metalic_02.png', - 'metalic_03.png', - 'metalic_04.png', - 'metalic_05.png', - 'metalic_06.png', - 'orange_01.png', - 'orange_02.png', - 'orange_03.png', - 'orange_04.png', - 'orange_05.png', - 'orange_06.png' - ]; - const entitySize = new Vector2_model_1.Vector2(30, 30); - for (let i = 0; i < baddyCount; i++) { - const imageLoc = random_number_generators_1.RandomNumberGenerator.GetRandomNumber(0, 6); - console.log('image loc will be ' + imageLoc); - const entity = new baddy_1.Baddy( - // new Vector2(500, 300), - random_number_generators_1.RandomNumberGenerator.GetRandomVector2(0, this.viewportService.GetBrowserWidth(), 0, this.viewportService.GetBrowserHeight()), entitySize, 'baddy' + i.toString(), '/Ships/' + ships[imageLoc], this.graphicsService, random_string_generator_1.RandomStringGenerator.GetRandomHexColour(), this.playerService); - this.entityService.RegisterEntity(entity); - } - this.playerService.SetPlayer(new player_1.Player(new Vector2_model_1.Vector2(this.viewportService.GetBrowserWidth() / 2, this.viewportService.GetBrowserHeight() / 2), - // new Vector2(0, 0), - new Vector2_model_1.Vector2(50, 50), 'player', 'Ships/large_purple_01.png', this.inputManager, this.graphicsService)); - this.entityService.RegisterEntity(this.playerService.GetPlayer()); - // return entities; + Render() { + // console.error("Method not implemented."); } } -exports.Game = Game; - - -/***/ }), - -/***/ "./src/assets/_dist/Worlds/worlds.json": -/*!*********************************************!*\ - !*** ./src/assets/_dist/Worlds/worlds.json ***! - \*********************************************/ -/*! exports provided: 0, 1, 2, default */ -/***/ (function(module) { +exports.GameState = GameState; -module.exports = [{"worldId":2,"start":{"x":0,"y":0},"tiles":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]},{"worldId":1,"start":{"x":0,"y":0},"tiles":[[9,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9],[2,3,2,6,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,5,9,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,12,12,12,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,17,17,17,17,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,2,2,2,2,9],[16,16,16,16,16,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[9,14,14,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9]]},{"worldId":0,"start":{"x":0,"y":0},"tiles":[[0,0,0,0],[0,0,0,0],[0,0,0,0]]}]; /***/ }), -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 8241: +/*!************************************************************************************!*\ + !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const game_1 = __webpack_require__(/*! ./application/game */ "./src/application/game.ts"); -class App { - start() { - const game = new game_1.Game(); - game.Run(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GrassTileTypeDirtMiddle = exports.GrassTileTypeDirtLeft = exports.GrassTileTypeDirtBottom = exports.GrassTileTypeDirtRight = exports.GrassTileTypeDirtTop = exports.GrassTileTypeDirt = exports.GrassTileType = void 0; +const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); +class GrassTileType extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); } } -exports.App = App; -const application = new App(); -application.start(); +exports.GrassTileType = GrassTileType; +GrassTileType.texturePath = '/Tiles/ground/grass.png'; +class GrassTileTypeDirt extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#87CC6F', textId); + } +} +exports.GrassTileTypeDirt = GrassTileTypeDirt; +GrassTileTypeDirt.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; +class GrassTileTypeDirtTop extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); + } +} +exports.GrassTileTypeDirtTop = GrassTileTypeDirtTop; +GrassTileTypeDirtTop.texturePath = '/Tiles/ground/grass_with_dirt_top.png'; +class GrassTileTypeDirtRight extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); + } +} +exports.GrassTileTypeDirtRight = GrassTileTypeDirtRight; +GrassTileTypeDirtRight.texturePath = '/Tiles/ground/grass_with_dirt_right.png'; +class GrassTileTypeDirtBottom extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); + } +} +exports.GrassTileTypeDirtBottom = GrassTileTypeDirtBottom; +GrassTileTypeDirtBottom.texturePath = '/Tiles/ground/grass_with_dirt_bottom.png'; +class GrassTileTypeDirtLeft extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); + } +} +exports.GrassTileTypeDirtLeft = GrassTileTypeDirtLeft; +GrassTileTypeDirtLeft.texturePath = '/Tiles/ground/grass_with_dirt_left.png'; +class GrassTileTypeDirtMiddle extends _base_tiletype_1.TileType { + constructor(id, textId) { + super(id, '#438337', textId); + } +} +exports.GrassTileTypeDirtMiddle = GrassTileTypeDirtMiddle; +GrassTileTypeDirtMiddle.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; /***/ }), -/***/ "./src/numerics/helpers/degrees.helper.ts": +/***/ 8249: /*!************************************************!*\ !*** ./src/numerics/helpers/degrees.helper.ts ***! \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DegreesHelper = void 0; +exports.Radians = Radians; +exports.Degrees = Degrees; +exports.FartherRight = FartherRight; class DegreesHelper { } exports.DegreesHelper = DegreesHelper; @@ -3098,7 +2866,6 @@ exports.DegreesHelper = DegreesHelper; function Radians(degrees) { return degrees * Math.PI / 180; } -exports.Radians = Radians; /** * converts radians into degrees * @@ -3109,268 +2876,395 @@ exports.Radians = Radians; function Degrees(radians) { return radians * 180 / Math.PI; } -exports.Degrees = Degrees; function FartherRight(fromDegrees, toDegrees) { return true; } -exports.FartherRight = FartherRight; - - -/***/ }), - -/***/ "./src/numerics/helpers/intersection.helper.ts": -/*!*****************************************************!*\ - !*** ./src/numerics/helpers/intersection.helper.ts ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class IntersectionHelper { - // checks if two AABBs intersect (rectangle only) - static AabbVsAabb(left, right) { - if ((left.max.getValueX() < right.min.getValueX()) || (left.min.getValueX() > right.max.getValueX())) { - return false; - } - if ((left.max.getValueY() < right.min.getValueY()) || (left.min.getValueY() > right.max.getValueY())) { - return false; - } - return true; - } -} -exports.IntersectionHelper = IntersectionHelper; - - -/***/ }), - -/***/ "./src/numerics/helpers/number.helper.ts": -/*!***********************************************!*\ - !*** ./src/numerics/helpers/number.helper.ts ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function Between(x, min, max) { - return x >= min && x <= max; -} -exports.Between = Between; -function Lerp(start, end, amt) { - return (1 - amt) * start + amt * end; -} -exports.Lerp = Lerp; /***/ }), -/***/ "./src/numerics/helpers/vector2.helper.ts": -/*!************************************************!*\ - !*** ./src/numerics/helpers/vector2.helper.ts ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 9188: +/*!******************************************************!*\ + !*** ./src/application/Entities/Creatures/player.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ../models/Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class Vector2Helpers { - /* - * adds two Vector2 together and returns a new Vector2 - * containing the results - */ - static Add(left, right) { - const vecX = left.getValueX() + right.getValueX(); - const vecY = left.getValueY() + right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Player = void 0; +const creature_1 = __webpack_require__(/*! ./creature */ 2228); +const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); +const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ 8249); +class Player extends creature_1.Creature { + constructor(position, size, name, texturePath, inputManager, graphicsService) { + super(position, size, name, texturePath, graphicsService); + this.rotationSpeed = 5; + this.strafeThrust = 1.5; + this.startingFriction = this.friction; + this.inputManager = inputManager; + this.health = 100; + this.detailsDiv = document.getElementById('details_div'); + this.colour = '#fff'; + this.thrust = 1; } - /** - * compares two Vector 2s for equality - * If the vectors are identica, this returns true otherwise returns false - * - * @static - * @param {Vector2} left - * @param {Vector2} right - * @returns {boolean} - * @memberof Vector2Helpers - */ - static CompareEquality(left, right) { - return !(left.getValueX() !== right.getValueX() || left.getValueY() !== right.getValueY()); + Tick(lastDelta) { + this.GetInput(); + this.Move(lastDelta); + this.graphicsService.getGameCameraService().LookAt(this.position, this.size); } - /* - * divides the first vector by the second - * this is not scalar division - */ - static Divide(left, right) { - const vecX = left.getValueX() / right.getValueX(); - const vecY = left.getValueY() / right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); + GetInput() { + // this.setMove(new Vector2(0, 0)); + this.UpdatePlayerSpeedFromInput(); + this.UpdatePlayerRotationFromInput(); + this.UpdatePlayerStrafeFromInput(); + // if (this.inputManager.IsKeyPressed('direction_left')) { + // this.AddToRotation(-(this.rotationSpeed * this.inputManager.GetForceValue('direction_left'))); + // // this.AddToRotation(-this.rotationSpeed); + // // this.velocity.x -= this.acceleration.x; + // } + // if (this.inputManager.IsKeyPressed('direction_right')) { + // this.AddToRotation(this.rotationSpeed * this.inputManager.GetForceValue('direction_right')); + // // this.velocity.x += this.acceleration.x; + // } + if (this.inputManager.IsKeyPressed('')) + if (this.inputManager.IsKeyPressed('action_a')) { + console.log('space pressed'); + } + // console.log(`this.movement.x = ${this.movement.x}`) } - /* - * divides a given source vector2 by a scale factor - */ - static DivideByScale(source, scaleFactor) { - const factor = 1 / scaleFactor; - const vecX = source.getValueX() * factor; - const vecY = source.getValueY() * factor; - return new Vector2_model_1.Vector2(vecX, vecY); + UpdatePlayerRotationFromInput() { + if (this.inputManager.IsKeyPressed('axes_pad_left_horizontal')) { + this.AddToRotation(this.rotationSpeed * + this.inputManager.GetForceValue('axes_pad_left_horizontal')); + } + else { + if (this.inputManager.IsKeyPressed('direction_right')) { + this.AddToRotation(this.rotationSpeed * + this.inputManager.GetForceValue('direction_right')); + } + if (this.inputManager.IsKeyPressed('direction_left')) { + this.AddToRotation(-(this.rotationSpeed * + this.inputManager.GetForceValue('direction_left'))); + } + } } - /* - * gets the dot product of two vectors, - * returns as a number (float?) - */ - static Dot(left, right) { - const vecX = left.getValueX() * right.getValueX(); - const vecY = left.getValueY() * right.getValueY(); - return vecX + vecY; + UpdatePlayerSpeedFromInput() { + const rotationAsRadians = (0, degrees_helper_1.Radians)(this.rotationDegrees - this.angleAdjust); + const rotSin = Math.sin(rotationAsRadians); + const rotCos = Math.cos(rotationAsRadians); + if (this.inputManager.IsKeyPressed('trigger_two_right') || + this.inputManager.IsKeyPressed('direction_up')) { + const triggerTwoRightForce = Math.max(this.inputManager.GetForceValue('direction_up'), (this.inputManager.GetForceValue('trigger_two_right'))); + this.velocity.x -= (rotCos * (this.thrust * triggerTwoRightForce)); + this.velocity.y -= (rotSin * (this.thrust * triggerTwoRightForce)); + } + if (this.inputManager.IsKeyPressed('trigger_two_left') || + this.inputManager.IsKeyPressed('direction_down')) { + const triggerTwoLeftForce = Math.max(this.inputManager.GetForceValue('trigger_two_left'), (this.inputManager.GetForceValue('direction_down'))); + // this.velocity.x += (rotCos * (this.thrust * triggerTwoLeftForce)); + // this.velocity.y += (rotSin * (this.thrust * triggerTwoLeftForce)); + this.friction.x = 0.85; + this.friction.y = 0.85; + } + else { + this.friction = new Vector2_model_1.Vector2(this.startingFriction.getValueX(), this.startingFriction.getValueY()); + } + if (this.inputManager.IsKeyPressed('trigger_one_right')) { + const triggerOneRightForce = this.inputManager.GetForceValue('trigger_one_right'); + this.velocity.x += (rotSin * triggerOneRightForce) * this.strafeThrust; + this.velocity.y -= (rotCos * triggerOneRightForce) * this.strafeThrust; + } + if (this.inputManager.IsKeyPressed('trigger_one_left')) { + const triggerOneLeftForce = this.inputManager.GetForceValue('trigger_one_right'); + this.velocity.x -= rotSin * triggerOneLeftForce; + this.velocity.y += rotCos * triggerOneLeftForce; + } + this.detailsDiv.innerHTML = ` + player:
+ ve: ${this.velocity.concat(3)}
+ ro: ${this.rotationDegrees.toFixed(3)}DEG
+ ro: ${rotationAsRadians.toFixed(3)}RAD
+ th: ${this.thrust.toFixed(3)}
+ rS: ${rotSin.toFixed(3)}
+ rC: ${rotCos.toFixed(3)}
+ + `; } - static Subtract(left, right) { - const vecX = left.getValueX() - right.getValueX(); - const vecY = left.getValueY() - right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); + UpdatePlayerStrafeFromInput() { + // if (this.inputManager.IsKeyPressed('trigger_one_right')) { + // this.velocity.x -= (this.inputManager.GetForceValue('trigger_one_right') * this.acceleration.y) ; + // } + // if (this.inputManager.IsKeyPressed('trigger_one_left')) { + // this.velocity.x += (this.inputManager.GetForceValue('trigger_one_left') * this.acceleration.y) ; + // } } - static NegativeOf(source) { - const vecX = -source.getValueX(); - const vecY = -source.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); +} +exports.Player = Player; + + +/***/ }), + +/***/ 9473: +/*!****************************************************************************!*\ + !*** ./src/application/Tools/random_generators/random_string.generator.ts ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RandomStringGenerator = void 0; +class RandomStringGenerator { + static GetRandomHexColour() { + return '#' + (Math.random() * 0xFFFFFF << 0).toString(16); } - static Multiply(left, right) { - const vecX = left.getValueX() * right.getValueX(); - const vecY = left.getValueY() * right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); +} +exports.RandomStringGenerator = RandomStringGenerator; + + +/***/ }), + +/***/ 9623: +/*!*************************************************!*\ + !*** ./src/application/states/SettingsState.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SettingsState = void 0; +const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); +class SettingsState extends _BaseState_1.BaseState { + constructor() { + super(); + console.log(`constructing SettingsState`); } - static MultiplyByScale(source, scaleFactor) { - const vecX = source.getValueX() * scaleFactor; - const vecY = source.getValueY() * scaleFactor; - return new Vector2_model_1.Vector2(vecX, vecY); + Tick() { + console.error("Method not implemented."); + } + Render() { + console.error("Method not implemented."); } } -exports.Vector2Helpers = Vector2Helpers; +exports.SettingsState = SettingsState; /***/ }), -/***/ "./src/numerics/models/AABB.model.ts": -/*!*******************************************!*\ - !*** ./src/numerics/models/AABB.model.ts ***! - \*******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 9809: +/*!*************************************************!*\ + !*** ./src/application/states/state.service.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Vector2_model_1 = __webpack_require__(/*! ./Vector2.model */ "./src/numerics/models/Vector2.model.ts"); -class AABB { - constructor(position, size) { - this.min = new Vector2_model_1.Vector2(position.getValueX(), position.getValueY()); - this.max = new Vector2_model_1.Vector2(position.getValueX() + size.getValueX(), position.getValueY() + size.getValueY()); - } - GetCenter() { - const x = ((this.max.x - this.min.x) / 2) + this.min.x; - const y = ((this.max.y - this.min.y) / 2) + this.min.y; - return new Vector2_model_1.Vector2(x, y); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StateService = void 0; +class StateService { + constructor() { + this.currentState = null; } - GetTop() { - return this.min.getValueY(); + setState(state) { + this.currentState = state; } - GetBottom() { - return this.max.getValueY(); + GetState() { + return this.currentState; } - GetLeft() { - return this.min.getValueX(); +} +exports.StateService = StateService; + + +/***/ }), + +/***/ 9855: +/*!********************************************************************!*\ + !*** ./src/application/Graphics/Canvas/graphics.canvas.service.ts ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CanvasService = void 0; +const graphics_drawable_canvas_1 = __webpack_require__(/*! ../Models/graphics.drawable-canvas */ 7467); +const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ 81); +const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ 6953); +class CanvasService { + constructor(htmlService) { + console.log('creating a canvas service'); + this.htmlService = htmlService; } - GetRight() { - return this.max.getValueX(); + Init() { + const viewportSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatioForCanvas(); + this.viewportHeight = viewportSize.y; + this.viewportWidth = viewportSize.x; + this.mainCanvas = this.htmlService.createCanvas('main_canvas', this.htmlService.GetMainDiv().id, this.viewportWidth, this.viewportHeight, ['parent']); + this.mainCanvasCtx = this.mainCanvas.getContext('2d'); + this.drawableAreas = new Array(); } - IsAbove(target) { - if (this.GetBottom() < target.GetTop()) { - return true; + RegisterNewCanvas(id = null) { + console.log(`registering a new canvas with id ${id}`); + if (id === null) { + id = random_guid_generator_1.GuidGenerator.NewGuid(); } - return false; + const canvas = this.htmlService.createCanvas(id, this.mainCanvas.id, this.viewportWidth, this.viewportHeight); + this.drawableAreas.push(new graphics_drawable_canvas_1.DrawableCanvas(canvas, id, this.viewportWidth, this.viewportHeight)); + return id; } - IsBelow(target) { - if (this.GetTop() > target.GetBottom()) { - return true; + GetMainCanvas() { + return this.mainCanvas; + } + GetCanvas(id) { + for (let i = 0; i < this.drawableAreas.length; i++) { + if (this.drawableAreas[i].id === id) { + return this.drawableAreas[i]; + } } - return false; + console.error(`failed to get a canvas of id ${id}`); } - IsRight(target) { - if (this.GetRight() < target.GetLeft()) { - return true; +} +exports.CanvasService = CanvasService; + + +/***/ }), + +/***/ 9984: +/*!****************************************************!*\ + !*** ./src/application/Entities/entity.service.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.EntityService = void 0; +class EntityService { + constructor( + // drawingService: DrawingService + ) { + this.gameEntities = new Array(); + } + TickAllEntities(lastDelta) { + for (let i = 0; i < this.gameEntities.length; i++) { + this.gameEntities[i].Tick(lastDelta); } - return false; } - IsLeft(target) { - if (this.GetLeft() > target.GetRight()) { - return true; + RenderAllEntities(graphicsService) { + for (let i = 0; i < this.gameEntities.length; i++) { + graphicsService.getDrawingService().Draw(this.gameEntities[i]); } - return false; + } + RegisterEntity(entity) { + console.log('registering an entity'); + this.gameEntities.push(entity); } } -exports.AABB = AABB; +exports.EntityService = EntityService; /***/ }), -/***/ "./src/numerics/models/Vector2.model.ts": -/*!**********************************************!*\ - !*** ./src/numerics/models/Vector2.model.ts ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ 9992: +/*!************************************************!*\ + !*** ./src/application/World/world.service.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class Vector2 { - constructor(x, y) { - this.x = x; - this.y = y; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorldService = void 0; +const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); +const world_jsonfiles_1 = __webpack_require__(/*! ./world.jsonfiles */ 4554); +const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ 5537); +const vector2_helper_1 = __webpack_require__(/*! ../../numerics/helpers/vector2.helper */ 2655); +class WorldService { + constructor(tileService) { + this.currentWorldId = 0; + this.worlds = new Array(); + this.tileService = tileService; } - concat(decimalPlaces = -1) { - if (decimalPlaces > -1) { - return `x:[${this.x.toFixed(decimalPlaces)}], y:[${this.y.toFixed(decimalPlaces)}]`; - } - return `x:[${this.x}], y:[${this.y}]`; + Init() { + this.worlds = world_jsonfiles_1.WorldJsonFileLoader.GetWorlds(); + console.log(`this.worlds = ${JSON.stringify(this.worlds)} length is ${this.worlds.length}`); + console.info('setting current world to index 0'); + this.SetWorld(2); } - getValueX() { - return this.x; + SetWorld(index) { + this.DeRegisterWorld(); + this.tileService.setupTilesFromArray(this.GetWorld(index).GetTiles()); } - getValueY() { - return this.y; + GetWorldSize() { + const tileSize = this.tileService.GetTileSize(); + this.size = vector2_helper_1.Vector2Helpers.MultiplyByScale(tileSize, 2); + console.log(`this.size: ${this.size}`); + const worldPosition = new Vector2_model_1.Vector2(0, 0); + return new AABB_model_1.AABB(worldPosition, this.size); } - setValueX(x) { - this.x = x; + DeRegisterWorld() { + console.error(" DeRegisterWorld: Method not implemented."); } - setValueY(y) { - this.y = y; + GetStartingPosition(worldIndex) { + return this.worlds[worldIndex].GetStartingPosition(); } - setValues(x, y) { - this.x = x; - this.y = y; + GetWorld(index) { + if (index > this.worlds.length) { + throw new Error(`index [${index}] out of range of world array (length: ${this.worlds.length})`); + } + return this.worlds[0]; } } -exports.Vector2 = Vector2; - +exports.WorldService = WorldService; -/***/ }), -/***/ 0: -/*!****************************!*\ - !*** multi ./src/index.ts ***! - \****************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/***/ }) -module.exports = __webpack_require__(/*! ./src/index.ts */"./src/index.ts"); +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +var exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.App = void 0; +const game_1 = __webpack_require__(/*! ./application/game */ 2126); +class App { + start() { + const game = new game_1.Game(); + game.Run(); + } +} +exports.App = App; +const application = new App(); +application.start(); -/***/ }) +})(); -/******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0NvcmUvdGltZXIuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vRW50aXRpZXMvQ3JlYXR1cmVzL2JhZGR5LnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9FbnRpdGllcy9DcmVhdHVyZXMvY3JlYXR1cmUuZGVmYXVsdC5zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vRW50aXRpZXMvQ3JlYXR1cmVzL2NyZWF0dXJlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9FbnRpdGllcy9DcmVhdHVyZXMvcGxheWVyLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9FbnRpdGllcy9fYmFzZS1lbnRpdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0VudGl0aWVzL2VudGl0eS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9FbnRpdGllcy9wbGF5ZXIuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvQ2FtZXJhL2dhbWUtY2FtZXJhLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL0NhbnZhcy9ncmFwaGljcy5jYW52YXMuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvRHJhdy9kcmF3YWJsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvRHJhdy9kcmF3aW5nLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL0h0bWwvZ3JhcGhpY3MuaHRtbC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9JbWFnZXMvSW1hZ2VIZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL01vZGVscy9ncmFwaGljcy5kcmF3YWJsZS1jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RleHR1cmVzL1RleHR1cmUyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvVGV4dHVyZXMvdGV4dHVyZS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9UaWxlcy9UaWxlVHlwZXMvR3JvdW5kVGlsZVR5cGVzL2RpcnQudGlsZXR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RpbGVzL1RpbGVUeXBlcy9Hcm91bmRUaWxlVHlwZXMvZ3Jhc3MudGlsZXR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RpbGVzL1RpbGVUeXBlcy9Hcm91bmRUaWxlVHlwZXMvc2FuZC50aWxldHlwZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvVGlsZXMvVGlsZVR5cGVzL0dyb3VuZFRpbGVUeXBlcy9zaGFsbG93LXdhdGVyLnRpbGV0eXBlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9UaWxlcy9UaWxlVHlwZXMvR3JvdW5kVGlsZVR5cGVzL3N0b25lLnRpbGV0eXBlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9UaWxlcy9UaWxlVHlwZXMvU3BhY2VUaWxlVHlwZXMvc3BhY2UudGlsZXR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RpbGVzL1RpbGVUeXBlcy9TcGFjZVRpbGVUeXBlcy9zdGFyLnRpbGV0eXBlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9UaWxlcy9UaWxlVHlwZXMvX2Jhc2UtdGlsZXR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RpbGVzL2RyYXdhYmxlLXRpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1RpbGVzL3RpbGUuZGVmYXVsdC5zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vR3JhcGhpY3MvVGlsZXMvdGlsZS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9HcmFwaGljcy9WaWV3cG9ydC9WaWV3cG9ydC5IZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL1ZpZXdwb3J0L3ZpZXdwb3J0LnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0dyYXBoaWNzL2dyYXBoaWNzLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0lucHV0L0lucHV0TWFuYWdlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vSW5wdXQvaW5wdXQtc3RhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL0lucHV0L2lucHV0Lm1vZGVsLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9TdGF0ZXMvR2FtZVN0YXRlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9TdGF0ZXMvTWVudVN0YXRlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9TdGF0ZXMvU2V0dGluZ3NTdGF0ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vU3RhdGVzL19CYXNlU3RhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL1N0YXRlcy9zdGF0ZS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9Ub29scy9yYW5kb21fZ2VuZXJhdG9ycy9yYW5kb21fZ3VpZC5nZW5lcmF0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL1Rvb2xzL3JhbmRvbV9nZW5lcmF0b3JzL3JhbmRvbV9udW1iZXIuZ2VuZXJhdG9ycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vVG9vbHMvcmFuZG9tX2dlbmVyYXRvcnMvcmFuZG9tX3N0cmluZy5nZW5lcmF0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL1dvcmxkL3dvcmxkLmpzb25maWxlcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vV29ybGQvd29ybGQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vV29ybGQvd29ybGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL19kZWJ1Zy9kZWJ1Zy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcGxpY2F0aW9uL19kZWJ1Zy9kZWJ1Zy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHBsaWNhdGlvbi9fZGVidWcvZGVidWdnYWJsZS1pdGVtcy5tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwbGljYXRpb24vZ2FtZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL251bWVyaWNzL2hlbHBlcnMvZGVncmVlcy5oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL251bWVyaWNzL2hlbHBlcnMvaW50ZXJzZWN0aW9uLmhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbnVtZXJpY3MvaGVscGVycy9udW1iZXIuaGVscGVyLnRzIiwid2VicGFjazovLy8uL3NyYy9udW1lcmljcy9oZWxwZXJzL3ZlY3RvcjIuaGVscGVyLnRzIiwid2VicGFjazovLy8uL3NyYy9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbnVtZXJp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SUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUF3QixDQUFDLENBQUM7UUFDN0IsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7U0FDdkY7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDMUMsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFTO1FBQ2YsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBQ0QsU0FBUyxDQUFDLENBQVM7UUFDZixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7SUFDRCxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7Q0FFSjtBQWxDRCwwQkFrQ0MiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiZXhwb3J0IGNsYXNzIFRpbWVyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIG5vdzogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBkZWx0YTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB0aW1lcjogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsYXN0VGltZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB0aWNrczogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsYXN0VGltZVRvb2s6IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIHRpbWVQZXJUaWNrOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGZwczogbnVtYmVyO1xyXG4gICAgY29uc3RydWN0b3IodGFyZ2V0RnBzOiBudW1iZXIgPSA2MCkge1xyXG4gICAgICAgIHRoaXMuZnBzID0gdGFyZ2V0RnBzO1xyXG4gICAgICAgIHRoaXMudGltZVBlclRpY2sgPSAxMDAwIC8gdGhpcy5mcHM7XHJcbiAgICAgICAgdGhpcy5kZWx0YSA9IDA7XHJcbiAgICAgICAgdGhpcy5ub3cgPSAwO1xyXG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgICB0aGlzLnRpbWVyID0gMDtcclxuICAgICAgICB0aGlzLnRpY2tzID0gMDtcclxuICAgICAgICB0aGlzLmxhc3RUaW1lVG9vayA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENoZWNrU2hvdWxkUnVuTG9vcCgpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLm5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgIHRoaXMuZGVsdGEgKz0gKHRoaXMubm93IC0gdGhpcy5sYXN0VGltZSkgLyB0aGlzLnRpbWVQZXJUaWNrO1xyXG4gICAgICAgIHRoaXMudGltZXIgKz0gdGhpcy5ub3cgLSB0aGlzLmxhc3RUaW1lO1xyXG4gICAgICAgIHRoaXMubGFzdFRpbWVUb29rID0gdGhpcy5ub3cgLSB0aGlzLmxhc3RUaW1lO1xyXG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSB0aGlzLm5vdztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVsdGEgPj0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBSVU5OSU5HIFNMT1dMWS4gZGlkIG5vdCByZW5kZXIuIERlbHRhIFske3RoaXMuZGVsdGF9XWApXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBVcGRhdGVUaWNrc0FuZFJlbmRlckFmdGVyTG9vcCgpIHtcclxuICAgICAgICB0aGlzLmRlbHRhLS07XHJcbiAgICAgICAgdGhpcy50aWNrcysrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyB0cnVlIGlmIGl0J3MgYSBnb29kIHRpbWUgdG8gcHJpbnQgdG8gXHJcbiAgICAgKiB0aGUgY29uc29sZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIEZwc1NlcnZpY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNob3VsZFByaW50RGVidWdEYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVyID4gMTAwMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHByaW50cyBkZWJ1ZyBkYXRhIGZyb20gdGhpcyBjbGFzc1xyXG4gICAgICogdG8gdGhlIGNvbnNvbGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgRnBzU2VydmljZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJpbnRDdXJyZW50RnBzVG9Db25zb2xlKCkge1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgdGlja3MgYW5kIGZyYW1lczogJHt0aGlzLnRpY2tzLnRvRml4ZWQoMil9XHJcbiAgICAgICAgbGFzdERlbHRhOiAke3RoaXMuZGVsdGEudG9GaXhlZCgyKX1cclxuICAgICAgICB0aW1lcjogJHt0aGlzLnRpbWVyLnRvRml4ZWQoMil9XHJcbiAgICAgICAgbGFzdFRpbWUgVG9vazogJHt0aGlzLmxhc3RUaW1lVG9vay50b0ZpeGVkKDIpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFJlc2V0VGltZXJzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRpbWVyID4gMTAwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tzID0gMDtcclxuICAgICAgICAgICAgdGhpcy50aW1lciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRMYXN0VXBkYXRlVGltZVRvb2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFRpbWVUb29rIC8gMTAwMDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENyZWF0dXJlIH0gZnJvbSBcIi4vY3JlYXR1cmVcIjtcclxuaW1wb3J0IHsgR3JhcGhpY3NTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL0dyYXBoaWNzL2dyYXBoaWNzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3BsYXllci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFBQkIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL0FBQkIubW9kZWxcIjtcclxuaW1wb3J0IHsgSW50ZXJzZWN0aW9uSGVscGVyIH0gZnJvbSBcIi4uLy4uLy4uL251bWVyaWNzL2hlbHBlcnMvaW50ZXJzZWN0aW9uLmhlbHBlclwiO1xyXG5pbXBvcnQgeyBSYW5kb21OdW1iZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi4vLi4vVG9vbHMvcmFuZG9tX2dlbmVyYXRvcnMvcmFuZG9tX251bWJlci5nZW5lcmF0b3JzXCI7XHJcbmltcG9ydCB7IFJhZGlhbnMsIERlZ3JlZXMsIEZhcnRoZXJSaWdodCB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9oZWxwZXJzL2RlZ3JlZXMuaGVscGVyXCI7XHJcbmltcG9ydCB7IEJldHdlZW4sIExlcnAgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvaGVscGVycy9udW1iZXIuaGVscGVyXCI7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9fYmFzZS1lbnRpdHlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCYWRkeSBleHRlbmRzIENyZWF0dXJlIHtcclxuICAgIHByaXZhdGUgcGxheWVyU2VydmljZTogUGxheWVyU2VydmljZTtcclxuICAgIHByaXZhdGUgZGlyZWN0aW9uOiBWZWN0b3IyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBWZWN0b3IyLCBzaXplOiBWZWN0b3IyLCBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgdGV4dHVyZVBhdGg6IHN0cmluZyxcclxuICAgICAgICBncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZSwgY29sb3VyOiBzdHJpbmcsXHJcbiAgICAgICAgcGxheWVyU2VydmljZTogUGxheWVyU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKHBvc2l0aW9uLCBzaXplLCBuYW1lLCB0ZXh0dXJlUGF0aCwgZ3JhcGhpY3NTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLnBsYXllclNlcnZpY2UgPSBwbGF5ZXJTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuY29sb3VyID0gY29sb3VyO1xyXG4gICAgICAgIHRoaXMubWF4U3BlZWQgPSBuZXcgVmVjdG9yMigxMCwgMTApO1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uID0gbmV3IFZlY3RvcjIoLjU1LCAuNik7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGZyaWN0aW9uID0gMC44NTsgLy8gUmFuZG9tTnVtYmVyR2VuZXJhdG9yLkdldFJhbmRvbU51bWJlcigxMDAsIDIwMCkgLyAxMDAwO1xyXG4gICAgICAgIC8vIHRoaXMuZnJpY3Rpb24gPSBuZXcgVmVjdG9yMihmcmljdGlvbixcclxuICAgICAgICAvLyAgICAgZnJpY3Rpb24pO1xyXG5cclxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IG5ldyBWZWN0b3IyKDAsIDApO1xyXG5cclxuXHJcbiAgICAgICAgLy8gdGhpcy52ZWxvY2l0eSA9IFJhbmRvbU51bWJlckdlbmVyYXRvci5HZXRSYW5kb21WZWN0b3IyKC0xMCwgMTAsIC0xMCwgMTApO1xyXG4gICAgICAgIHRoaXMucm90YXRpb25EZWdyZWVzID0gMDsvLyBSYW5kb21OdW1iZXJHZW5lcmF0b3IuR2V0UmFuZG9tTnVtYmVyKDAsIDM1OSk7XHJcbiAgICAgICAgdGhpcy50dXJuU3BlZWQgPSAuMDUxNTtcclxuICAgICAgICB0aGlzLnRocnVzdCA9IDE7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBUaWNrKGxhc3REZWx0YTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVBQUJCKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYXllckFBQkIgPSB0aGlzLnBsYXllclNlcnZpY2UuR2V0UGxheWVyKCkuZ2V0QUFCQigpO1xyXG4gICAgICAgIHRoaXMuTW92ZVRvUGxheWVyKHBsYXllckFBQkIpO1xyXG5cclxuICAgICAgICB0aGlzLk1vdmUobGFzdERlbHRhKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBSZW5kZXIoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gc3VwZXIuRHJhdyh0aGlzLmNvbG91cik7XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGlkZVdpdGhPYmplY3QoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnY29sbGlkaW5nIHdpdGggb2JqZWN0JylcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHR1cm5Ub1BsYXllcihwbGF5ZXJBQUJCOiBBQUJCKSB7XHJcbiAgICAgICAgbGV0IGR4ID0gcGxheWVyQUFCQi5HZXRDZW50ZXIoKS5nZXRWYWx1ZVgoKSAtIHRoaXMuZ2V0QUFCQigpLkdldENlbnRlcigpLmdldFZhbHVlWCgpO1xyXG4gICAgICAgIGxldCBkeSA9IHBsYXllckFBQkIuR2V0Q2VudGVyKCkuZ2V0VmFsdWVZKCkgLSB0aGlzLmdldEFBQkIoKS5HZXRDZW50ZXIoKS5nZXRWYWx1ZVkoKTtcclxuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLnNxcnQoZHggKiBkeSArIGR5ICogZHkpO1xyXG4gICAgICAgIGR4IC89IGxlbiA/IGxlbiA6IDAuMTtcclxuICAgICAgICBkeSAvPSBsZW4gPyBsZW4gOiAwLjE7XHJcblxyXG4gICAgICAgIGxldCBkaXJYID0gTWF0aC5jb3MoUmFkaWFucyh0aGlzLnJvdGF0aW9uRGVncmVlcykpO1xyXG4gICAgICAgIGxldCBkaXJZID0gTWF0aC5zaW4oUmFkaWFucyh0aGlzLnJvdGF0aW9uRGVncmVlcykpO1xyXG5cclxuICAgICAgICBkaXJYICs9IChkeCAtIGRpclgpICogMTtcclxuICAgICAgICBkaXJZICs9IChkeSAtIGRpclkpICogMTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm90YXRlVG8gPSBNYXRoLmF0YW4yKGRpclksIGRpclgpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IERlZ3JlZXMocm90YXRlVG8pICsgKDkwKTtcclxuICAgICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IExlcnAodGhpcy5yb3RhdGlvbkRlZ3JlZXMsIERlZ3JlZXMocm90YXRlVG8pICsgKC10aGlzLmFuZ2xlQWRqdXN0KSwgLjUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgTW92ZVRvUGxheWVyKHBsYXllckFBQkI6IEFBQkIpIHtcclxuICAgICAgICB0aGlzLnR1cm5Ub1BsYXllcihwbGF5ZXJBQUJCKTtcclxuICAgICAgICBjb25zdCByb3RhdGlvbkFzUmFkaWFucyA9IFJhZGlhbnModGhpcy5yb3RhdGlvbkRlZ3JlZXMgLSB0aGlzLmFuZ2xlQWRqdXN0KTtcclxuICAgICAgICBjb25zdCByb3RTaW4gPSBNYXRoLnNpbihyb3RhdGlvbkFzUmFkaWFucyk7XHJcbiAgICAgICAgY29uc3Qgcm90Q29zID0gTWF0aC5jb3Mocm90YXRpb25Bc1JhZGlhbnMpO1xyXG5cclxuICAgICAgICB0aGlzLnZlbG9jaXR5LnggLT0gKHJvdENvcyAqIHRoaXMudGhydXN0KTtcclxuICAgICAgICB0aGlzLnZlbG9jaXR5LnkgLT0gKHJvdFNpbiAqIHRoaXMudGhydXN0KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHJvdGF0aW9uQXNSYWRpYW5zID0gdGhpcy5yb3RhdGlvbkRlZ3JlZXMgLyBNYXRoLlBJICogMTgwO1xyXG4gICAgICAgIC8vIGNvbnN0IHJvdENvcyA9IE1hdGguc2luKHJvdGF0aW9uQXNSYWRpYW5zKTtcclxuICAgICAgICAvLyBjb25zdCByb3RTaW4gPSBNYXRoLmNvcyhyb3RhdGlvbkFzUmFkaWFucyk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudmVsb2NpdHkueCA9IChyb3RTaW4gKiB0aHJ1c3QpO1xyXG4gICAgICAgIC8vIHRoaXMudmVsb2NpdHkueSA9IChyb3RDb3MgKiB0aHJ1c3QpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgYmFkZHk6IFxyXG4gICAgICAgIC8vICByb3RhdGlvbjogJHt0aGlzLnJvdGF0aW9uRGVncmVlc31cclxuICAgICAgICAvLyAgQ29zUm90YXRpb246ICR7cm90Q29zfVxyXG4gICAgICAgIC8vICBTaW5Sb3RhdGlvbjogJHtyb3RTaW59XHJcbiAgICAgICAgLy8gIHZlbG9jaXR5OiAke3RoaXMudmVsb2NpdHkuY29uY2F0KCl9YCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy8gaWYgKEludGVyc2VjdGlvbkhlbHBlci5BYWJiVnNBYWJiKFxyXG4gICAgICAgIC8vICAgICB0aGlzLmdldEFBQkIoKSwgcGxheWVyQUFCQikgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmdldEFBQkIoKS5Jc0Fib3ZlKHBsYXllckFBQkIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNldERpcmVjdGlvbkRvd24oKTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMudmVsb2NpdHkueSArPSB0aGlzLmFjY2VsZXJhdGlvbi55O1xyXG4gICAgICAgIC8vICAgICAgICAgLy8gY29uc29sZS5sb2coJ2VudGl0eSBpcyBhYm92ZSBwbGF5ZXInKVxyXG4gICAgICAgIC8vICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0QUFCQigpLklzQmVsb3cocGxheWVyQUFCQikpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uVXAoKTtcclxuICAgICAgICAvLyAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdlbnRpdHkgaXMgYWJvdmUgcGxheWVyJylcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMudmVsb2NpdHkueSAtPSB0aGlzLmFjY2VsZXJhdGlvbi55OyAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZW50aXR5IGlzIGJlbG93IHBsYXllcicpXHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmdldEFBQkIoKS5Jc1JpZ2h0KHBsYXllckFBQkIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNldERpcmVjdGlvbkxlZnQoKTtcclxuICAgICAgICAvLyAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdlbnRpdHkgaXMgcmlnaHQgb2YgdGhlIHBsYXllcicpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy52ZWxvY2l0eS54ICs9IHRoaXMuYWNjZWxlcmF0aW9uLng7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBQUJCKCkuSXNMZWZ0KHBsYXllckFBQkIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNldERpcmVjdGlvblJpZ3RoKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAvLyBjb25zb2xlLmxvZygnZW50aXR5IGlzIGxlZnQgb2YgdGhlIHBsYXllcicpXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnZlbG9jaXR5LnggLT0gdGhpcy5hY2NlbGVyYXRpb24ueDtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcy52ZWxvY2l0eS54IC09ICh0aGlzLmdldERpcmVjdGlvbkhvcml6b250YWwoKSAqIHRoaXMuYWNjZWxlcmF0aW9uLngpIC8gNDtcclxuICAgICAgICAvLyB0aGlzLnZlbG9jaXR5LnkgKz0gKHRoaXMuZ2V0RGlyZWN0aW9uVmVydGljYWwoKSAqIHRoaXMuYWNjZWxlcmF0aW9uLnkpIC8gNDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERpcmVjdGlvblJpZ3RoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uLnNldFZhbHVlWCgxKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc2V0RGlyZWN0aW9uTGVmdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpcmVjdGlvbi5zZXRWYWx1ZVgoLTEpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzZXREaXJlY3Rpb25VcCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpcmVjdGlvbi5zZXRWYWx1ZVkoLTEpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzZXREaXJlY3Rpb25Eb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uLnNldFZhbHVlWSgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldERpcmVjdGlvbkhvcml6b250YWwoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24uZ2V0VmFsdWVYKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldERpcmVjdGlvblZlcnRpY2FsKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uLmdldFZhbHVlWSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENyZWF0dXJlRGVmYXVsdFNldHRpbmdzIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IRUFMVEg6IG51bWJlciA9IDEwMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NT1ZFTUVOVF9TUEVFRDogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDMuMCwgMy4wKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NT1ZFTUVOVF9TUEVFRF9NQVg6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigxMS4wLCAxMS4wKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NT1ZFTUVOVF9BQ0NFTEVSQVRJT046IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigzLjAsIDMuMCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTU9WRU1FTlRfVkVMT0NJVFk6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigzLCAzKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TSVpFOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMjAsIDIwKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GUklDVElPTjogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDAuOTUsIDAuOTUpO1xyXG59IiwiaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL19iYXNlLWVudGl0eVwiO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSBcIi4uLy4uLy4uL251bWVyaWNzL21vZGVscy9WZWN0b3IyLm1vZGVsXCI7XHJcbmltcG9ydCB7IEdyYXBoaWNzU2VydmljZSB9IGZyb20gXCIuLi8uLi9HcmFwaGljcy9ncmFwaGljcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENyZWF0dXJlRGVmYXVsdFNldHRpbmdzIH0gZnJvbSBcIi4vY3JlYXR1cmUuZGVmYXVsdC5zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBUZXh0dXJlMkQgfSBmcm9tIFwiLi4vLi4vR3JhcGhpY3MvVGV4dHVyZXMvVGV4dHVyZTJkXCI7XHJcbmltcG9ydCB7IERyYXdhYmxlQ2FudmFzIH0gZnJvbSBcIi4uLy4uL0dyYXBoaWNzL01vZGVscy9ncmFwaGljcy5kcmF3YWJsZS1jYW52YXNcIjtcclxuaW1wb3J0IHsgQUFCQiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBWZWN0b3IySGVscGVycyB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9oZWxwZXJzL3ZlY3RvcjIuaGVscGVyXCI7XHJcbmltcG9ydCB7IExlcnAgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvaGVscGVycy9udW1iZXIuaGVscGVyXCI7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcmVhdHVyZSBleHRlbmRzIEVudGl0eSB7XHJcbiAgICBncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgaGVhbHRoOiBudW1iZXI7XHJcbiAgICBwcm90ZWN0ZWQgc3BlZWQ6IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgbWF4U3BlZWQ6IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgdmVsb2NpdHk6IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgYWNjZWxlcmF0aW9uOiBWZWN0b3IyO1xyXG4gICAgcHJvdGVjdGVkIGRlY2VsZXJhdGlvbjogVmVjdG9yMjtcclxuICAgIHByb3RlY3RlZCBmcmljdGlvbjogVmVjdG9yMjtcclxuICAgIHByb3RlY3RlZCB0aHJ1c3Q6IG51bWJlcjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgdHVyblNwZWVkOiBudW1iZXIgPSAxO1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFuZ2xlQWRqdXN0OiBudW1iZXIgPSAtOTA7XHJcblxyXG5cclxuICAgIC8vIHByb3RlY3RlZCBjYW52YXNJZDogc3RyaW5nO1xyXG5cclxuICAgIC8vIHByb3RlY3RlZCB0ZXh0dXJlOiBUZXh0dXJlMkQ7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBWZWN0b3IyLCBzaXplOiBWZWN0b3IyLCBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgdGV4dHVyZVBhdGg6IHN0cmluZyxcclxuICAgICAgICBncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKHBvc2l0aW9uLCBzaXplLCBuYW1lLCAnMScsICdub190ZXh0X3lldCcpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3Bhc3NpbmcgaW5jb3JyZWN0IHRleHR1cmUgSUQgYW5kIGNhbnZhc0lkLCBhbmQgY2FudmFzIHRvIHN1cGVyJyk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlID0gZ3JhcGhpY3NTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmhlYWx0aCA9IENyZWF0dXJlRGVmYXVsdFNldHRpbmdzLkRFRkFVTFRfSEVBTFRIO1xyXG4gICAgICAgIHRoaXMuc3BlZWQgPSBDcmVhdHVyZURlZmF1bHRTZXR0aW5ncy5ERUZBVUxUX01PVkVNRU5UX1NQRUVEO1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSBuZXcgVmVjdG9yMigwLCAwKTtcclxuICAgICAgICB0aGlzLm1heFNwZWVkID0gQ3JlYXR1cmVEZWZhdWx0U2V0dGluZ3MuREVGQVVMVF9NT1ZFTUVOVF9TUEVFRF9NQVg7XHJcbiAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24gPSBDcmVhdHVyZURlZmF1bHRTZXR0aW5ncy5ERUZBVUxUX01PVkVNRU5UX0FDQ0VMRVJBVElPTjtcclxuICAgICAgICB0aGlzLmRlY2VsZXJhdGlvbiA9IFZlY3RvcjJIZWxwZXJzLkRpdmlkZUJ5U2NhbGUoQ3JlYXR1cmVEZWZhdWx0U2V0dGluZ3MuREVGQVVMVF9NT1ZFTUVOVF9BQ0NFTEVSQVRJT04sIDEpO1xyXG4gICAgICAgIHRoaXMuZnJpY3Rpb24gPSBDcmVhdHVyZURlZmF1bHRTZXR0aW5ncy5ERUZBVUxUX0ZSSUNUSU9OO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FudmFzSWQodGhpcy5ncmFwaGljc1NlcnZpY2UuUmVnaXN0ZXJEcmF3YWJsZUVudGl0eSgpKTtcclxuXHJcblxyXG4gICAgICAgIGlmICh0ZXh0dXJlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHRleHR1cmVQYXRoICE9PSBudWxsICYmIHRleHR1cmVQYXRoLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlSWQgPSB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZSh0ZXh0dXJlUGF0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VGV4dHVyZUlkKHRleHR1cmVJZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoYGNyZWF0dXJlIFske25hbWV9XSBkaWQgbm90IGhhdmUgYSB0ZXh0dXJlYCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIE1vdmUobGFzdERlbHRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLkNhcE1vdmVtZW50U3BlZWQoKTtcclxuICAgICAgICB0aGlzLkNhcFJvdGF0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVQb3NpdGlvbihsYXN0RGVsdGEpO1xyXG4gICAgICAgIHRoaXMuUmVkdWNlU3BlZWQoKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZUFBQkIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFJlZHVjZVNwZWVkKCkge1xyXG5cclxuICAgICAgICB0aGlzLnZlbG9jaXR5LnkgKj0gdGhpcy5mcmljdGlvbi55O1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkueCAqPSB0aGlzLmZyaWN0aW9uLng7XHJcblxyXG4gICAgICAgIC8vIGlmICh0aGlzLnZlbG9jaXR5LnkgPiAwKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMudmVsb2NpdHkueSAtPSB0aGlzLmZyaWN0aW9uLnk7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnZlbG9jaXR5LnkgPCAwKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnZlbG9jaXR5LnkgPSAwO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLnZlbG9jaXR5LnkgPCAwKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMudmVsb2NpdHkueSArPSB0aGlzLmZyaWN0aW9uLnk7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnZlbG9jaXR5LnkgPiAwKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnZlbG9jaXR5LnkgPSAwO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy52ZWxvY2l0eS54ID4gMCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnZlbG9jaXR5LnggLT0gdGhpcy5mcmljdGlvbi54O1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy52ZWxvY2l0eS54IDwgMCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy52ZWxvY2l0eS54ID0gMDtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy52ZWxvY2l0eS54IDwgMCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnZlbG9jaXR5LnggKz0gdGhpcy5mcmljdGlvbi54O1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy52ZWxvY2l0eS54ID4gMCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy52ZWxvY2l0eS54ID0gMDtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVwZGF0ZXMgdGhlIGNyZWF0dXJlJ3MgcG9zaXRpb25cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQG1lbWJlcm9mIENyZWF0dXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgVXBkYXRlUG9zaXRpb24obGFzdERlbHRhOiBudW1iZXIpIHtcclxuICAgICAgICAvLyB0aGlzLnBvc2l0aW9uLnggKz0gKHRoaXMudmVsb2NpdHkueCAqIChsYXN0RGVsdGEpICogNTApO1xyXG4gICAgICAgIC8vIHRoaXMucG9zaXRpb24ueSArPSAodGhpcy52ZWxvY2l0eS55ICogKGxhc3REZWx0YSkgKiA1MCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueCA9IExlcnAodGhpcy5wb3NpdGlvbi54LCB0aGlzLnBvc2l0aW9uLnggKyAodGhpcy52ZWxvY2l0eS54ICogKGxhc3REZWx0YSkgKiA1MCksIC44KTtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uLnkgPSBMZXJwKHRoaXMucG9zaXRpb24ueSwgdGhpcy5wb3NpdGlvbi55ICsgKHRoaXMudmVsb2NpdHkueSAqIChsYXN0RGVsdGEpICogNTApLCAuOCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjYXBzIHRoZSBjcmVhdHVyZSdzIG1vdmVtZW50IHNwZWVkIGF0XHJcbiAgICAgKiB0aGlzLm1heFNwZWVkXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZW1iZXJvZiBDcmVhdHVyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIENhcE1vdmVtZW50U3BlZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmVsb2NpdHkueCA+IHRoaXMubWF4U3BlZWQueCkge1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5LnggPSB0aGlzLm1heFNwZWVkLng7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZlbG9jaXR5LnggPCAtdGhpcy5tYXhTcGVlZC54KSB7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueCA9IC10aGlzLm1heFNwZWVkLng7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5LnkgPiB0aGlzLm1heFNwZWVkLnkpIHtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eS55ID0gdGhpcy5tYXhTcGVlZC55O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZWxvY2l0eS55IDwgLXRoaXMubWF4U3BlZWQueSkge1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5LnkgPSAtdGhpcy5tYXhTcGVlZC55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmVsb2NpdHkueCA8IDAuMSAmJiB0aGlzLnZlbG9jaXR5LnggPiAtMC4xKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5LnkgPCAwLjEgJiYgdGhpcy52ZWxvY2l0eS55ID4gLTAuMSkge1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5LnkgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIENhcFJvdGF0aW9uKCkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLnJvdGF0aW9uRGVncmVlcyA8IDApIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5yb3RhdGlvbkRlZ3JlZXMgPSAzNjAgLSAoLXRoaXMucm90YXRpb25EZWdyZWVzKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMucm90YXRpb25EZWdyZWVzIDwgMCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IDM1OTtcclxuICAgICAgICAvLyB9IGlmICh0aGlzLnJvdGF0aW9uRGVncmVlcyA+IDM2MCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IDA7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRIZWFsdGgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWFsdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEhlYWx0aChoZWFsdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaGVhbHRoID0gaGVhbHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTcGVlZCgpOiBWZWN0b3IyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zcGVlZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0U3BlZWQoc3BlZWQ6IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNwZWVkID0gc3BlZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1vdmUoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmVsb2NpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE1vdmUobW92ZTogVmVjdG9yMik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSBtb3ZlO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IENyZWF0dXJlIH0gZnJvbSBcIi4vY3JlYXR1cmVcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJbnB1dE1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vSW5wdXQvSW5wdXRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEdyYXBoaWNzU2VydmljZSB9IGZyb20gXCIuLi8uLi9HcmFwaGljcy9ncmFwaGljcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFJhbmRvbVN0cmluZ0dlbmVyYXRvciB9IGZyb20gXCIuLi8uLi9Ub29scy9yYW5kb21fZ2VuZXJhdG9ycy9yYW5kb21fc3RyaW5nLmdlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlMkQgfSBmcm9tIFwiLi4vLi4vR3JhcGhpY3MvVGV4dHVyZXMvVGV4dHVyZTJkXCI7XHJcbmltcG9ydCB7IERyYXdhYmxlQ2FudmFzIH0gZnJvbSBcIi4uLy4uL0dyYXBoaWNzL01vZGVscy9ncmFwaGljcy5kcmF3YWJsZS1jYW52YXNcIjtcclxuaW1wb3J0IHsgUmFkaWFucyB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9oZWxwZXJzL2RlZ3JlZXMuaGVscGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgQ3JlYXR1cmUge1xyXG4gICAgaW5wdXRNYW5hZ2VyOiBJbnB1dE1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBkZXRhaWxzRGl2OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcm90YXRpb25TcGVlZDogbnVtYmVyID0gNTtcclxuXHJcbiAgICBwcml2YXRlIHN0cmFmZVRocnVzdCA9IDEuNTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRpbmdGcmljdGlvbjogVmVjdG9yMjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwb3NpdGlvbjogVmVjdG9yMiwgc2l6ZTogVmVjdG9yMiwgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHRleHR1cmVQYXRoOiBzdHJpbmcsIGlucHV0TWFuYWdlcjogSW5wdXRNYW5hZ2VyLCBncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKHBvc2l0aW9uLCBzaXplLCBuYW1lLCB0ZXh0dXJlUGF0aCwgZ3JhcGhpY3NTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLnN0YXJ0aW5nRnJpY3Rpb24gPSB0aGlzLmZyaWN0aW9uO1xyXG4gICAgICAgIHRoaXMuaW5wdXRNYW5hZ2VyID0gaW5wdXRNYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMuaGVhbHRoID0gMTAwO1xyXG4gICAgICAgIHRoaXMuZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRhaWxzX2RpdicpO1xyXG4gICAgICAgIHRoaXMuY29sb3VyID0gJyNmZmYnO1xyXG4gICAgICAgIHRoaXMudGhydXN0ID0gMTtcclxuXHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVGljayhsYXN0RGVsdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuR2V0SW5wdXQoKTtcclxuICAgICAgICB0aGlzLk1vdmUobGFzdERlbHRhKTtcclxuICAgICAgICB0aGlzLmdyYXBoaWNzU2VydmljZS5nZXRHYW1lQ2FtZXJhU2VydmljZSgpLkxvb2tBdCh0aGlzLnBvc2l0aW9uLCB0aGlzLnNpemUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldElucHV0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuc2V0TW92ZShuZXcgVmVjdG9yMigwLCAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMuVXBkYXRlUGxheWVyU3BlZWRGcm9tSW5wdXQoKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZVBsYXllclJvdGF0aW9uRnJvbUlucHV0KCk7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVQbGF5ZXJTdHJhZmVGcm9tSW5wdXQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgnZGlyZWN0aW9uX2xlZnQnKSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLkFkZFRvUm90YXRpb24oLSh0aGlzLnJvdGF0aW9uU3BlZWQgKiB0aGlzLmlucHV0TWFuYWdlci5HZXRGb3JjZVZhbHVlKCdkaXJlY3Rpb25fbGVmdCcpKSk7XHJcblxyXG4gICAgICAgIC8vICAgICAvLyB0aGlzLkFkZFRvUm90YXRpb24oLXRoaXMucm90YXRpb25TcGVlZCk7XHJcbiAgICAgICAgLy8gICAgIC8vIHRoaXMudmVsb2NpdHkueCAtPSB0aGlzLmFjY2VsZXJhdGlvbi54O1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAodGhpcy5pbnB1dE1hbmFnZXIuSXNLZXlQcmVzc2VkKCdkaXJlY3Rpb25fcmlnaHQnKSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLkFkZFRvUm90YXRpb24odGhpcy5yb3RhdGlvblNwZWVkICogdGhpcy5pbnB1dE1hbmFnZXIuR2V0Rm9yY2VWYWx1ZSgnZGlyZWN0aW9uX3JpZ2h0JykpO1xyXG4gICAgICAgIC8vICAgICAvLyB0aGlzLnZlbG9jaXR5LnggKz0gdGhpcy5hY2NlbGVyYXRpb24ueDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgnJykpXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dE1hbmFnZXIuSXNLZXlQcmVzc2VkKCdhY3Rpb25fYScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3BhY2UgcHJlc3NlZCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgdGhpcy5tb3ZlbWVudC54ID0gJHt0aGlzLm1vdmVtZW50Lnh9YClcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFVwZGF0ZVBsYXllclJvdGF0aW9uRnJvbUlucHV0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlucHV0TWFuYWdlci5Jc0tleVByZXNzZWQoJ2F4ZXNfcGFkX2xlZnRfaG9yaXpvbnRhbCcpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkVG9Sb3RhdGlvbih0aGlzLnJvdGF0aW9uU3BlZWQgKlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dE1hbmFnZXIuR2V0Rm9yY2VWYWx1ZSgnYXhlc19wYWRfbGVmdF9ob3Jpem9udGFsJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0TWFuYWdlci5Jc0tleVByZXNzZWQoJ2RpcmVjdGlvbl9yaWdodCcpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvUm90YXRpb24odGhpcy5yb3RhdGlvblNwZWVkICpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0TWFuYWdlci5HZXRGb3JjZVZhbHVlKCdkaXJlY3Rpb25fcmlnaHQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgnZGlyZWN0aW9uX2xlZnQnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRUb1JvdGF0aW9uKC0odGhpcy5yb3RhdGlvblNwZWVkICpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0TWFuYWdlci5HZXRGb3JjZVZhbHVlKCdkaXJlY3Rpb25fbGVmdCcpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBVcGRhdGVQbGF5ZXJTcGVlZEZyb21JbnB1dCgpIHtcclxuICAgICAgICBjb25zdCByb3RhdGlvbkFzUmFkaWFucyA9IFJhZGlhbnModGhpcy5yb3RhdGlvbkRlZ3JlZXMgLSB0aGlzLmFuZ2xlQWRqdXN0KTtcclxuICAgICAgICBjb25zdCByb3RTaW4gPSBNYXRoLnNpbihyb3RhdGlvbkFzUmFkaWFucyk7XHJcbiAgICAgICAgY29uc3Qgcm90Q29zID0gTWF0aC5jb3Mocm90YXRpb25Bc1JhZGlhbnMpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgndHJpZ2dlcl90d29fcmlnaHQnKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmlucHV0TWFuYWdlci5Jc0tleVByZXNzZWQoJ2RpcmVjdGlvbl91cCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJUd29SaWdodEZvcmNlID1cclxuICAgICAgICAgICAgICAgIE1hdGgubWF4KHRoaXMuaW5wdXRNYW5hZ2VyLkdldEZvcmNlVmFsdWUoJ2RpcmVjdGlvbl91cCcpLFxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmlucHV0TWFuYWdlci5HZXRGb3JjZVZhbHVlKCd0cmlnZ2VyX3R3b19yaWdodCcpKSk7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueCAtPSAocm90Q29zICogKHRoaXMudGhydXN0ICogdHJpZ2dlclR3b1JpZ2h0Rm9yY2UpKTtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eS55IC09IChyb3RTaW4gKiAodGhpcy50aHJ1c3QgKiB0cmlnZ2VyVHdvUmlnaHRGb3JjZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pbnB1dE1hbmFnZXIuSXNLZXlQcmVzc2VkKCd0cmlnZ2VyX3R3b19sZWZ0JykgfHxcclxuICAgICAgICAgICAgdGhpcy5pbnB1dE1hbmFnZXIuSXNLZXlQcmVzc2VkKCdkaXJlY3Rpb25fZG93bicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJUd29MZWZ0Rm9yY2UgPSBNYXRoLm1heCh0aGlzLmlucHV0TWFuYWdlci5HZXRGb3JjZVZhbHVlKCd0cmlnZ2VyX3R3b19sZWZ0JyksXHJcbiAgICAgICAgICAgICAgICAodGhpcy5pbnB1dE1hbmFnZXIuR2V0Rm9yY2VWYWx1ZSgnZGlyZWN0aW9uX2Rvd24nKSkpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnZlbG9jaXR5LnggKz0gKHJvdENvcyAqICh0aGlzLnRocnVzdCAqIHRyaWdnZXJUd29MZWZ0Rm9yY2UpKTtcclxuICAgICAgICAgICAgLy8gdGhpcy52ZWxvY2l0eS55ICs9IChyb3RTaW4gKiAodGhpcy50aHJ1c3QgKiB0cmlnZ2VyVHdvTGVmdEZvcmNlKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJpY3Rpb24ueCA9IDAuODU7XHJcbiAgICAgICAgICAgIHRoaXMuZnJpY3Rpb24ueSA9IDAuODU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mcmljdGlvbiA9IG5ldyBWZWN0b3IyKHRoaXMuc3RhcnRpbmdGcmljdGlvbi5nZXRWYWx1ZVgoKSwgdGhpcy5zdGFydGluZ0ZyaWN0aW9uLmdldFZhbHVlWSgpKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgndHJpZ2dlcl9vbmVfcmlnaHQnKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyT25lUmlnaHRGb3JjZSA9IHRoaXMuaW5wdXRNYW5hZ2VyLkdldEZvcmNlVmFsdWUoJ3RyaWdnZXJfb25lX3JpZ2h0Jyk7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueCArPSAocm90U2luICogdHJpZ2dlck9uZVJpZ2h0Rm9yY2UpICogdGhpcy5zdHJhZmVUaHJ1c3Q7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueSAtPSAocm90Q29zICogdHJpZ2dlck9uZVJpZ2h0Rm9yY2UpICogdGhpcy5zdHJhZmVUaHJ1c3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlucHV0TWFuYWdlci5Jc0tleVByZXNzZWQoJ3RyaWdnZXJfb25lX2xlZnQnKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyT25lTGVmdEZvcmNlID0gdGhpcy5pbnB1dE1hbmFnZXIuR2V0Rm9yY2VWYWx1ZSgndHJpZ2dlcl9vbmVfcmlnaHQnKTtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eS54IC09IHJvdFNpbiAqIHRyaWdnZXJPbmVMZWZ0Rm9yY2U7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueSArPSByb3RDb3MgKiB0cmlnZ2VyT25lTGVmdEZvcmNlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIHRoaXMuZGV0YWlsc0Rpdi5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgcGxheWVyOiA8YnIgLz5cclxuICAgICAgICB2ZTogJHt0aGlzLnZlbG9jaXR5LmNvbmNhdCgzKX08YnIgLz5cclxuICAgICAgICBybzogJHt0aGlzLnJvdGF0aW9uRGVncmVlcy50b0ZpeGVkKDMpfURFRzxiciAvPlxyXG4gICAgICAgIHJvOiAke3JvdGF0aW9uQXNSYWRpYW5zLnRvRml4ZWQoMyl9UkFEPGJyIC8+XHJcbiAgICAgICAgdGg6ICR7dGhpcy50aHJ1c3QudG9GaXhlZCgzKX08YnIgLz5cclxuICAgICAgICByUzogJHtyb3RTaW4udG9GaXhlZCgzKX08YnIgLz5cclxuICAgICAgICByQzogJHtyb3RDb3MudG9GaXhlZCgzKX08YnIgLz5cclxuXHJcbiAgICAgICAgYDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgVXBkYXRlUGxheWVyU3RyYWZlRnJvbUlucHV0KCkge1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5pbnB1dE1hbmFnZXIuSXNLZXlQcmVzc2VkKCd0cmlnZ2VyX29uZV9yaWdodCcpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnZlbG9jaXR5LnggLT0gKHRoaXMuaW5wdXRNYW5hZ2VyLkdldEZvcmNlVmFsdWUoJ3RyaWdnZXJfb25lX3JpZ2h0JykgKiB0aGlzLmFjY2VsZXJhdGlvbi55KSA7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuaW5wdXRNYW5hZ2VyLklzS2V5UHJlc3NlZCgndHJpZ2dlcl9vbmVfbGVmdCcpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnZlbG9jaXR5LnggKz0gKHRoaXMuaW5wdXRNYW5hZ2VyLkdldEZvcmNlVmFsdWUoJ3RyaWdnZXJfb25lX2xlZnQnKSAqIHRoaXMuYWNjZWxlcmF0aW9uLnkpIDtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuaW1wb3J0IHsgR3VpZEdlbmVyYXRvciB9IGZyb20gXCIuLi9Ub29scy9yYW5kb21fZ2VuZXJhdG9ycy9yYW5kb21fZ3VpZC5nZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgQUFCQiB9IGZyb20gXCIuLi8uLi9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuLi9HcmFwaGljcy9EcmF3L2RyYXdhYmxlXCI7XHJcbmltcG9ydCB7IERyYXdhYmxlQ2FudmFzIH0gZnJvbSBcIi4uL0dyYXBoaWNzL01vZGVscy9ncmFwaGljcy5kcmF3YWJsZS1jYW52YXNcIjtcclxuaW1wb3J0IHsgVGV4dHVyZTJEIH0gZnJvbSBcIi4uL0dyYXBoaWNzL1RleHR1cmVzL1RleHR1cmUyZFwiO1xyXG5cclxuLy8gZXhwb3J0IGludGVyZmFjZSBJRW50aXR5IHtcclxuLy8gICAgIHBvc2l0aW9uOiBWZWN0b3IyO1xyXG4vLyAgICAgc2l6ZTogVmVjdG9yMjtcclxuLy8gICAgIG5hbWU6IHN0cmluZztcclxuLy8gICAgIGlkOiBzdHJpbmc7XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHkgZXh0ZW5kcyBEcmF3YWJsZSB7XHJcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb246IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2l6ZTogVmVjdG9yMjtcclxuICAgIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgaWQ6IHN0cmluZztcclxuXHJcblxyXG4gICAgLy8gY29uc3RydWN0b3IocG9zaXRpb246IFZlY3RvcjIsIHNpemU6IFZlY3RvcjIsIG5hbWU6IHN0cmluZywgY2FudmFzSWQ6IHN0cmluZywgdGV4dHVyZTogVGV4dHVyZTJELCB0ZXh0dXJlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3RydWN0b3IocG9zaXRpb246IFZlY3RvcjIsIHNpemU6IFZlY3RvcjIsIG5hbWU6IHN0cmluZywgY2FudmFzSWQ6IHN0cmluZywgdGV4dHVyZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihwb3NpdGlvbiwgc2l6ZSwgY2FudmFzSWQsIHRleHR1cmVJZCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IEd1aWRHZW5lcmF0b3IuTmV3R3VpZCgpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFic3RyYWN0IFRpY2sobGFzdERlbHRhOiBudW1iZXIpOiB2b2lkO1xyXG5cclxuXHJcbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9zaXRpb24oKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb247XHJcbiAgICB9XHJcbiAgICBzZXRQb3NpdGlvbihuZXdQb3NpdGlvbjogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gICAgc2V0UG9zaXRpb25YKG5ld1Bvc2l0aW9uWDogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbi54ID0gbmV3UG9zaXRpb25YO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvc2l0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBzZXRQb3NpdGlvblkobmV3UG9zaXRpb25ZOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uLnkgPSBuZXdQb3NpdGlvblk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0U2l6ZSgpOiBWZWN0b3IyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xyXG4gICAgfVxyXG4gICAgc2V0U2l6ZShuZXdTaXplOiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0QUFCQigpOiBBQUJCIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5BQUJCID09PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5VcGRhdGVBQUJCKCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLkFBQkI7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIFNldEFBQkIoQUFCQjogQUFCQik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QUFCQihBQUJCKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBVcGRhdGVBQUJCKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QUFCQihuZXcgQUFCQih0aGlzLnBvc2l0aW9uLCB0aGlzLnNpemUpKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9fYmFzZS1lbnRpdHlcIjtcclxuaW1wb3J0IHsgRHJhd2luZ1NlcnZpY2UgfSBmcm9tIFwiLi4vR3JhcGhpY3MvRHJhdy9kcmF3aW5nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR3JhcGhpY3NTZXJ2aWNlIH0gZnJvbSBcIi4uL0dyYXBoaWNzL2dyYXBoaWNzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgZ2FtZUVudGl0aWVzOiBFbnRpdHlbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgLy8gZHJhd2luZ1NlcnZpY2U6IERyYXdpbmdTZXJ2aWNlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5nYW1lRW50aXRpZXMgPSBuZXcgQXJyYXk8RW50aXR5PigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgVGlja0FsbEVudGl0aWVzKGxhc3REZWx0YTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdhbWVFbnRpdGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmdhbWVFbnRpdGllc1tpXS5UaWNrKGxhc3REZWx0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBSZW5kZXJBbGxFbnRpdGllcyhncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nYW1lRW50aXRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZ3JhcGhpY3NTZXJ2aWNlLmdldERyYXdpbmdTZXJ2aWNlKCkuRHJhdyh0aGlzLmdhbWVFbnRpdGllc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBSZWdpc3RlckVudGl0eShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZWdpc3RlcmluZyBhbiBlbnRpdHknKVxyXG4gICAgICAgIHRoaXMuZ2FtZUVudGl0aWVzLnB1c2goZW50aXR5KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuL0NyZWF0dXJlcy9wbGF5ZXJcIjtcclxuaW1wb3J0IHsgQUFCQiB9IGZyb20gXCIuLi8uLi9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBsYXllclNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllcjtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UGxheWVyKHBsYXllcjogUGxheWVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGxheWVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgcGxheWVyU2VydmljZS5TZXRQbGF5ZXIgd291bGQgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBwbGF5ZXJgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NldHRpbmcgcGxheWVyJyk7XHJcbiAgICAgICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0UGxheWVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcjtcclxuICAgIH0gIFxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vRW50aXRpZXMvX2Jhc2UtZW50aXR5XCI7XHJcbmltcG9ydCB7IFZpZXdwb3J0SGVscGVyIH0gZnJvbSBcIi4uL1ZpZXdwb3J0L1ZpZXdwb3J0LkhlbHBlclwiO1xyXG5pbXBvcnQgeyBWZWN0b3IySGVscGVycyB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9oZWxwZXJzL3ZlY3RvcjIuaGVscGVyXCI7XHJcbmltcG9ydCB7IEludGVyc2VjdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9oZWxwZXJzL2ludGVyc2VjdGlvbi5oZWxwZXJcIjtcclxuaW1wb3J0IHsgQUFCQiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdhbWVDYW1lcmFTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgb2Zmc2V0OiBWZWN0b3IyO1xyXG4gICAgcHJpdmF0ZSBkaXNwbGF5YWJsZVNpemU6IFZlY3RvcjI7XHJcbiAgICBwcml2YXRlIGFwcGx5V29ybGRCb3VuZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBwcml2YXRlIGNhbWVyYUFBQkI6IEFBQkI7XHJcbiAgICBwcml2YXRlIGxldmVsQUFCQjogQUFCQjtcclxuXHJcbiAgICAvKipcclxuICAgICAqQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBHYW1lQ2FtZXJhU2VydmljZS5cclxuXHJcbiAgICAgYXBwbHlXb3JsZEJvdW5kaW5nIHRlbGxzIHRoZSBjYW1lcmEgaWYgaXQgc2hvdWxkIGNvbnRpbnVlXHJcbiAgICAgbW92aW5nIHJpZ2h0IG9yIGxlZnQgaWYgaXQgcmVhY2hlcyB0aGUgZWRnZSBvZiB0aGUgbGV2ZWxcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4T2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geU9mZnNldFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcHBseVdvcmxkQm91bmRpbmdcclxuICAgICAqIEBtZW1iZXJvZiBHYW1lQ2FtZXJhU2VydmljZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcih4T2Zmc2V0OiBudW1iZXIsIHlPZmZzZXQ6IG51bWJlciwgYXBwbHlXb3JsZEJvdW5kaW5nOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMih4T2Zmc2V0LCB5T2Zmc2V0KTtcclxuICAgICAgICB0aGlzLmFwcGx5V29ybGRCb3VuZGluZyA9IGFwcGx5V29ybGRCb3VuZGluZztcclxuXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5YWJsZVNpemUgPSBWaWV3cG9ydEhlbHBlci5HZXRXaW5kb3dJbkFzcGVjdFJhdGlvKCk7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVQb3NpdGlvbkFuZFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0TGV2ZWxBQUJCKGxldmVsQUFCQjogQUFCQikge1xyXG4gICAgICAgIHRoaXMubGV2ZWxBQUJCID0gbGV2ZWxBQUJCO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXREZWJ1Z0luZm8oKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbYFxyXG4gICAgICAgIG9mZnNldDogICAgICR7dGhpcy5vZmZzZXQuY29uY2F0KDIpfSBcclxuICAgICAgICBzaXplOiAgICAgICAke3RoaXMuZGlzcGxheWFibGVTaXplLmNvbmNhdCgyKX1gXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNoZWNrcyBpZiB0d28gb2JqZWN0cyBpbnRlcnNlY3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IHNpemVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIEdhbWVDYW1lcmFTZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBJc09iZWN0T25TY3JlZW4ocG9zaXRpb246IFZlY3RvcjIsIHNpemU6IFZlY3RvcjIpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBvYmplY3RBQUJCOiBBQUJCID0gbmV3IEFBQkIocG9zaXRpb24sIHNpemUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLklzT2JqZWN0T25TY3JlZW5BQUJCKG9iamVjdEFBQkIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJc09iamVjdE9uU2NyZWVuQUFCQihBQUJCOiBBQUJCKSB7XHJcbiAgICAgICAgaWYgKEludGVyc2VjdGlvbkhlbHBlci5BYWJiVnNBYWJiKHRoaXMuY2FtZXJhQUFCQiwgQUFCQikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTW92ZUNhbWVyYSh4QW1vdW50OiBudW1iZXIsIHlBbW91bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2RvblxcJ3QgdXNlIE1vdmVDYW1lcmEnKTtcclxuICAgICAgICB0aGlzLm9mZnNldC54ICs9IHhBbW91bnQ7XHJcbiAgICAgICAgdGhpcy5vZmZzZXQueSArPSB5QW1vdW50O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIHNldHMgdGhlIGNhbWVyYSB0byBwb2ludHMgYXQgKGxvb2tzIGF0KSBhIHNwZWNpZmljIGVudGl0eSBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IGVudGl0eVBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IGVudGl0eVNpemVcclxuICAgICAqIEBtZW1iZXJvZiBHYW1lQ2FtZXJhU2VydmljZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9va0F0KGVudGl0eVBvc2l0aW9uOiBWZWN0b3IyLCBlbnRpdHlTaXplOiBWZWN0b3IyKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXBvcnRXaWR0aCA9IFZpZXdwb3J0SGVscGVyLkdldFdpbmRvd0luQXNwZWN0UmF0aW8oKS5nZXRWYWx1ZVgoKTtcclxuICAgICAgICBjb25zdCB2aWVwb3J0SGVpZ2h0ID0gVmlld3BvcnRIZWxwZXIuR2V0V2luZG93SW5Bc3BlY3RSYXRpbygpLmdldFZhbHVlWSgpO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXJYID0gZW50aXR5UG9zaXRpb24uZ2V0VmFsdWVYKCkgLSAodmllcG9ydFdpZHRoIC8gMikgKyAoZW50aXR5U2l6ZS5nZXRWYWx1ZVgoKSAvIDIpO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlclkgPSBlbnRpdHlQb3NpdGlvbi5nZXRWYWx1ZVkoKSAtICh2aWVwb3J0SGVpZ2h0IC8gMikgKyAoZW50aXR5U2l6ZS5nZXRWYWx1ZVkoKSAvIDIpO1xyXG5cclxuICAgICAgICB0aGlzLlNldE9mZnNldChuZXcgVmVjdG9yMihcclxuICAgICAgICAgICAgY2VudGVyWCxcclxuICAgICAgICAgICAgY2VudGVyWVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBTZXRPZmZzZXQocG9zaXRpb25WZWN0b3I6IFZlY3RvcjIpIHtcclxuICAgICAgICB0aGlzLm9mZnNldCA9IHBvc2l0aW9uVmVjdG9yO1xyXG4gICAgICAgIGlmICh0aGlzLmFwcGx5V29ybGRCb3VuZGluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQuZ2V0VmFsdWVYKCkgPCB0aGlzLmxldmVsQUFCQi5HZXRMZWZ0KCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0LnNldFZhbHVlWCh0aGlzLmxldmVsQUFCQi5HZXRMZWZ0KCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQuZ2V0VmFsdWVYKCkgPiB0aGlzLmxldmVsQUFCQi5HZXRSaWdodCgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldC5zZXRWYWx1ZVgodGhpcy5sZXZlbEFBQkIuR2V0UmlnaHQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQuZ2V0VmFsdWVZKCkgPCB0aGlzLmxldmVsQUFCQi5HZXRUb3AoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQuc2V0VmFsdWVZKHRoaXMubGV2ZWxBQUJCLkdldFRvcCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQuZ2V0VmFsdWVZKCkgPiB0aGlzLmxldmVsQUFCQi5HZXRCb3R0b20oKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQuc2V0VmFsdWVZKHRoaXMubGV2ZWxBQUJCLkdldEJvdHRvbSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlVwZGF0ZVBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgVXBkYXRlUG9zaXRpb25BbmRTaXplKCkge1xyXG4gICAgICAgIHRoaXMuY2FtZXJhQUFCQiA9IG5ldyBBQUJCKHRoaXMub2Zmc2V0LCB0aGlzLmRpc3BsYXlhYmxlU2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldE9mZnNldFgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQuZ2V0VmFsdWVYKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0T2Zmc2V0WSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldC5nZXRWYWx1ZVkoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRPZmZzZXRWZWN0b3IoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSHRtbFNlcnZpY2UgfSBmcm9tIFwiLi4vSHRtbC9ncmFwaGljcy5odG1sLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJhd2FibGVDYW52YXMgfSBmcm9tIFwiLi4vTW9kZWxzL2dyYXBoaWNzLmRyYXdhYmxlLWNhbnZhc1wiO1xyXG5pbXBvcnQgeyBWaWV3cG9ydEhlbHBlciB9IGZyb20gXCIuLi9WaWV3cG9ydC9WaWV3cG9ydC5IZWxwZXJcIjtcclxuaW1wb3J0IHsgR3VpZEdlbmVyYXRvciB9IGZyb20gXCIuLi8uLi9Ub29scy9yYW5kb21fZ2VuZXJhdG9ycy9yYW5kb21fZ3VpZC5nZW5lcmF0b3JcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDYW52YXNTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgaHRtbFNlcnZpY2U6IEh0bWxTZXJ2aWNlO1xyXG5cclxuICAgIHB1YmxpYyBtYWluQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuICAgIHB1YmxpYyBtYWluQ2FudmFzQ3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcbiAgICBwdWJsaWMgZHJhd2FibGVBcmVhczogQXJyYXk8RHJhd2FibGVDYW52YXM+O1xyXG5cclxuICAgIHZpZXdwb3J0V2lkdGg6IG51bWJlcjtcclxuICAgIHZpZXdwb3J0SGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaHRtbFNlcnZpY2U6IEh0bWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NyZWF0aW5nIGEgY2FudmFzIHNlcnZpY2UnKTtcclxuICAgICAgICB0aGlzLmh0bWxTZXJ2aWNlID0gaHRtbFNlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgSW5pdCgpIHtcclxuICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBWaWV3cG9ydEhlbHBlci5HZXRXaW5kb3dJbkFzcGVjdFJhdGlvRm9yQ2FudmFzKCk7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0U2l6ZS55O1xyXG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0U2l6ZS54O1xyXG5cclxuICAgICAgICB0aGlzLm1haW5DYW52YXMgPSB0aGlzLmh0bWxTZXJ2aWNlLmNyZWF0ZUNhbnZhcygnbWFpbl9jYW52YXMnLCBcclxuICAgICAgICAgICAgdGhpcy5odG1sU2VydmljZS5HZXRNYWluRGl2KCkuaWQsXHJcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCxcclxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCxcclxuICAgICAgICAgICAgWydwYXJlbnQnXSk7XHJcbiAgICAgICAgdGhpcy5tYWluQ2FudmFzQ3R4ID0gdGhpcy5tYWluQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgdGhpcy5kcmF3YWJsZUFyZWFzID0gbmV3IEFycmF5PERyYXdhYmxlQ2FudmFzPigpO1xyXG4gICAgfVxyXG5cclxuICAgIFJlZ2lzdGVyTmV3Q2FudmFzKGlkOiBzdHJpbmcgPSBudWxsKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgcmVnaXN0ZXJpbmcgYSBuZXcgY2FudmFzIHdpdGggaWQgJHtpZH1gKTtcclxuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWQgPSBHdWlkR2VuZXJhdG9yLk5ld0d1aWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5odG1sU2VydmljZS5jcmVhdGVDYW52YXMoaWQsIHRoaXMubWFpbkNhbnZhcy5pZCwgXHJcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCwgdGhpcy52aWV3cG9ydEhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5kcmF3YWJsZUFyZWFzLnB1c2gobmV3IERyYXdhYmxlQ2FudmFzKGNhbnZhcywgaWQsIHRoaXMudmlld3BvcnRXaWR0aCwgdGhpcy52aWV3cG9ydEhlaWdodCkpO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuXHJcbiAgICBHZXRNYWluQ2FudmFzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW5DYW52YXM7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0Q2FudmFzKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZHJhd2FibGVBcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcmF3YWJsZUFyZWFzW2ldLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2FibGVBcmVhc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gZ2V0IGEgY2FudmFzIG9mIGlkICR7aWR9YCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IEFBQkIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL0FBQkIubW9kZWxcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERyYXdhYmxlIHtcclxuICAgIHByaXZhdGUgY2FudmFzSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgQUFCQjogQUFCQjtcclxuICAgIHByb3RlY3RlZCBjb2xvdXI6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCB0ZXh0dXJlSWQ6IHN0cmluZztcclxuXHJcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb246IFZlY3RvcjI7XHJcbiAgICBwcm90ZWN0ZWQgc2l6ZTogVmVjdG9yMjtcclxuICAgIHByb3RlY3RlZCByb3RhdGlvbkRlZ3JlZXM6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwb3NpdGlvbjogVmVjdG9yMiwgc2l6ZTogVmVjdG9yMiwgY2FudmFzSWQ6IHN0cmluZywgdGV4dHVyZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgZHJhd2FibGUgY29uc3RydWN0b3JgKTtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcclxuICAgICAgICB0aGlzLkFBQkIgPSBuZXcgQUFCQih0aGlzLnBvc2l0aW9uLCB0aGlzLnNpemUpO1xyXG4gICAgICAgIHRoaXMuY2FudmFzSWQgPSBjYW52YXNJZDtcclxuICAgICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IDA7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlSWQgPSB0ZXh0dXJlSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnZhc0lkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldENhbnZhc0lkKGNhbnZhc0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNhbnZhc0lkID0gY2FudmFzSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFRleHR1cmVJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVJZDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBTZXRUZXh0dXJlSWQodGV4dHVyZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRleHR1cmVJZCA9IHRleHR1cmVJZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QUFCQigpOiBBQUJCIHtcclxuICAgICAgICBpZiAodGhpcy5BQUJCID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVBQUJCKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLkFBQkI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldEFBQkIoQUFCQjogQUFCQik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuQUFCQiA9IEFBQkI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIFVwZGF0ZUFBQkIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBQUJCKG5ldyBBQUJCKHRoaXMucG9zaXRpb24sIHRoaXMuc2l6ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRQb3NpdGlvblgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRQb3NpdGlvblkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRTaXplWCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXplLng7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0U2l6ZVkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZS55O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb2xvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29sb3VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbG91cjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyNmMDAnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0Um90YXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm90YXRpb25EZWdyZWVzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEFkZFRvUm90YXRpb24odmFsOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyArPSB2YWw7XHJcbiAgICAgICAgaWYgKHRoaXMucm90YXRpb25EZWdyZWVzID4gMzU5KSB7XHJcbiAgICAgICAgICAgIHRoaXMucm90YXRpb25EZWdyZWVzID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm90YXRpb25EZWdyZWVzIDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvdGF0aW9uRGVncmVlcyA9IDM1OTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgR3JhcGhpY3NTZXJ2aWNlIH0gZnJvbSBcIi4uL2dyYXBoaWNzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJhd2FibGVDYW52YXMgfSBmcm9tIFwiLi4vTW9kZWxzL2dyYXBoaWNzLmRyYXdhYmxlLWNhbnZhc1wiO1xyXG5pbXBvcnQgeyBBQUJCIH0gZnJvbSBcIi4uLy4uLy4uL251bWVyaWNzL21vZGVscy9BQUJCLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHR1cmUyRCB9IGZyb20gXCIuLi9UZXh0dXJlcy9UZXh0dXJlMmRcIjtcclxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tIFwiLi9kcmF3YWJsZVwiO1xyXG5pbXBvcnQgeyBDYW52YXNTZXJ2aWNlIH0gZnJvbSBcIi4uL0NhbnZhcy9ncmFwaGljcy5jYW52YXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBHYW1lQ2FtZXJhU2VydmljZSB9IGZyb20gXCIuLi9DYW1lcmEvZ2FtZS1jYW1lcmEuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEcmF3YWJsZVRpbGUgfSBmcm9tIFwiLi4vVGlsZXMvZHJhd2FibGUtdGlsZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlU2VydmljZSB9IGZyb20gXCIuLi9UZXh0dXJlcy90ZXh0dXJlLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcmF3aW5nU2VydmljZSB7XHJcbiAgICBwcml2YXRlIGNhbWVyYVNlcnZpY2U6IEdhbWVDYW1lcmFTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBjYW52YXNTZXJ2aWNlOiBDYW52YXNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0dXJlU2VydmljZTogVGV4dHVyZVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIGFsbG93VGV4dHVyZURyYXdpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBkcmF3QXNTdHJva2UgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNhbWVyYVNlcnZpY2U6IEdhbWVDYW1lcmFTZXJ2aWNlLFxyXG4gICAgICAgIGNhbnZhc1NlcnZpY2U6IENhbnZhc1NlcnZpY2UsXHJcbiAgICAgICAgdGV4dHVyZVNlcnZpY2U6IFRleHR1cmVTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlU2VydmljZSA9IHRleHR1cmVTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2VydmljZSA9IGNhbnZhc1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnY29uc3RydWN0aW5nIGRyYXdpbmcgc2VydmljZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEcmF3KGRyYXdhYmxlOiBEcmF3YWJsZSwgc2tpcENhbnZhc0NsZWFyOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkZWc6IG51bWJlciA9IGRyYXdhYmxlLkdldFJvdGF0aW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FtZXJhU2VydmljZS5Jc09iamVjdE9uU2NyZWVuQUFCQihkcmF3YWJsZS5nZXRBQUJCKCkpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYW52ID0gdGhpcy5jYW52YXNTZXJ2aWNlLkdldENhbnZhcyhkcmF3YWJsZS5nZXRDYW52YXNJZCgpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByYWQgPSBkZWcgKiAoTWF0aC5QSSAvIDE4MCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXBDYW52YXNDbGVhcikge1xyXG4gICAgICAgICAgICAgICAgY2Fudi5DbGVhckNhbnZhcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYW52LmN0eC5zYXZlKCk7XHJcbiAgICAgICAgICAgIC8vIGNhbnYuY3R4LnNjYWxlKDAuNSwgMC41KTtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9IGRyYXdhYmxlLkdldFNpemVYKCkgKyAoZHJhd2FibGUuR2V0UG9zaXRpb25YKCkgLSAoZHJhd2FibGUuR2V0U2l6ZVgoKSAvIDIpIC0gdGhpcy5jYW1lcmFTZXJ2aWNlLkdldE9mZnNldFgoKSk7Ly8gICsgKGRyYXdhYmxlLkdldFNpemVYKCkgLyAyKSk7Ly8gICsgdGhpcy5jYW1lcmFTZXJ2aWNlLkdldE9mZnNldFkoKTtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlWSA9IGRyYXdhYmxlLkdldFNpemVYKCkgKyAoZHJhd2FibGUuR2V0UG9zaXRpb25ZKCkgLSAoZHJhd2FibGUuR2V0U2l6ZVgoKSAvIDIpIC0gdGhpcy5jYW1lcmFTZXJ2aWNlLkdldE9mZnNldFkoKSk7Ly8gICsgKGRyYXdhYmxlLkdldFNpemVZKCkgLyAyKSk7Ly8gICsgdGhpcy5jYW1lcmFTZXJ2aWNlLkdldE9mZnNldFkoKTtcclxuICAgICAgICAgICAgY2Fudi5jdHgudHJhbnNsYXRlKFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWCxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVkpO1xyXG5cclxuICAgICAgICAgICAgY2Fudi5jdHgucm90YXRlKHJhZCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkcmF3TG9jYXRpb25YID0gLWRyYXdhYmxlLkdldFNpemVYKCkgLyAyOy8vICAvIDI7Ly8gIDtcclxuICAgICAgICAgICAgY29uc3QgZHJhd0xvY2F0aW9uWSA9IC1kcmF3YWJsZS5HZXRTaXplWSgpIC8gMjsvLyAgLyAyOy8vICAtIHRoaXMuY2FtZXJhU2VydmljZS5HZXRPZmZzZXRZKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyYXdTaXplWCA9IGRyYXdhYmxlLkdldFNpemVYKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyYXdTaXplWSA9IGRyYXdhYmxlLkdldFNpemVZKCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy50ZXh0dXJlU2VydmljZS5HZXRUZXh0dXJlKGRyYXdhYmxlLkdldFRleHR1cmVJZCgpKTtcclxuXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd1RleHR1cmVEcmF3aW5nICYmIHRleHR1cmUgJiYgdGV4dHVyZS5HZXRDYW5SZW5kZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5EcmF3QXNUZXh0dXJlKHRleHR1cmUsIGNhbnYsIGRyYXdMb2NhdGlvblgsIGRyYXdMb2NhdGlvblksIGRyYXdTaXplWCwgZHJhd1NpemVZKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPIHJlbW92ZSBvciBjaGFuZ2UgdGhpc1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGRyYXdhYmxlLkdldFRleHR1cmVJZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coYFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICB0ZXh0OiAke3RleHR1cmUuR2V0SWQoKX1cclxuICAgICAgICAgICAgICAgIC8vICAgICAgcmVuZDogJHt0ZXh0dXJlLkdldENhblJlbmRlcigpfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5EcmF3QXNSZWN0KGRyYXdhYmxlLCBjYW52LCBkcmF3TG9jYXRpb25YLCBkcmF3TG9jYXRpb25ZLCBkcmF3U2l6ZVgsIGRyYXdTaXplWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGRldHJhbnNsYXRlcyB0aGUgY2FudmFzXHJcbiAgICAgICAgICAgIGNhbnYuY3R4LnRyYW5zbGF0ZSgtKHRyYW5zbGF0ZVgpLCAtKHRyYW5zbGF0ZVkpKTtcclxuICAgICAgICAgICAgY2Fudi5jdHgucmVzdG9yZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHJvdGF0ZShjdHgpIHtcclxuICAgIC8vICAgICAvL0NvbnZlcnQgZGVncmVlcyB0byByYWRpYW4gXHJcbiAgICAvLyAgICAgdmFyIHJhZCA9IGRlZyAqIE1hdGguUEkgLyAxODA7XHJcblxyXG4gICAgLy8gICAgIC8vU2V0IHRoZSBvcmlnaW4gdG8gdGhlIGNlbnRlciBvZiB0aGUgaW1hZ2VcclxuICAgIC8vICAgICBjdHgudHJhbnNsYXRlKHggKyB3aWR0aCAvIDIsIHkgKyBoZWlnaHQgLyAyKTtcclxuXHJcbiAgICAvLyAgICAgLy9Sb3RhdGUgdGhlIGNhbnZhcyBhcm91bmQgdGhlIG9yaWdpblxyXG4gICAgLy8gICAgIGN0eC5yb3RhdGUocmFkKTtcclxuXHJcbiAgICAvLyAgICAgLy9kcmF3IHRoZSBpbWFnZSAgICBcclxuICAgIC8vICAgICBjdHguZHJhd0ltYWdlKGltZywgd2lkdGggLyAyICogKC0xKSwgaGVpZ2h0IC8gMiAqICgtMSksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgIC8vICAgICAvL3Jlc2V0IHRoZSBjYW52YXMgIFxyXG4gICAgLy8gICAgIGN0eC5yb3RhdGUocmFkICogKC0xKSk7XHJcbiAgICAvLyAgICAgY3R4LnRyYW5zbGF0ZSgoeCArIHdpZHRoIC8gMikgKiAoLTEpLCAoeSArIGhlaWdodCAvIDIpICogKC0xKSk7XHJcblxyXG4gICAgLy8gfVxyXG5cclxuICAgIERyYXdBc1RleHR1cmUodGV4dHVyZTogVGV4dHVyZTJELCBjYW52OiBEcmF3YWJsZUNhbnZhcyxcclxuICAgICAgICBkcmF3TG9jYXRpb25YOiBudW1iZXIsIGRyYXdMb2NhdGlvblk6IG51bWJlciwgZHJhd1NpemVYOiBudW1iZXIsIGRyYXdTaXplWTogbnVtYmVyKSB7XHJcblxyXG4gICAgICAgIGNhbnYuY3R4LnN0cm9rZVN0eWxlID0gJyNmZmYnO1xyXG4gICAgICAgIGNhbnYuY3R4LnN0cm9rZVJlY3QoXHJcbiAgICAgICAgICAgIGRyYXdMb2NhdGlvblgsXHJcbiAgICAgICAgICAgIGRyYXdMb2NhdGlvblksXHJcbiAgICAgICAgICAgIGRyYXdTaXplWCxcclxuICAgICAgICAgICAgZHJhd1NpemVZXHJcbiAgICAgICAgKTtcclxuXHJcblxyXG5cclxuICAgICAgICBjYW52LmN0eC5kcmF3SW1hZ2UodGV4dHVyZS5HZXRJbWFnZSgpLFxyXG4gICAgICAgICAgICBkcmF3TG9jYXRpb25YLFxyXG4gICAgICAgICAgICBkcmF3TG9jYXRpb25ZLFxyXG4gICAgICAgICAgICBkcmF3U2l6ZVgsXHJcbiAgICAgICAgICAgIGRyYXdTaXplWSk7XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIERyYXdBc1JlY3QoZHJhd2FibGU6IERyYXdhYmxlLCBjYW52OiBEcmF3YWJsZUNhbnZhcyxcclxuICAgICAgICBkcmF3TG9jYXRpb25YOiBudW1iZXIsIGRyYXdMb2NhdGlvblk6IG51bWJlciwgZHJhd1NpemVYOiBudW1iZXIsIGRyYXdTaXplWTogbnVtYmVyKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyYXdBc1N0cm9rZSkge1xyXG4gICAgICAgICAgICBjYW52LmN0eC5zdHJva2VTdHlsZSA9IGRyYXdhYmxlLkdldENvbG91cigpO1xyXG4gICAgICAgICAgICBjYW52LmN0eC5zdHJva2VSZWN0KFxyXG4gICAgICAgICAgICAgICAgZHJhd0xvY2F0aW9uWCxcclxuICAgICAgICAgICAgICAgIGRyYXdMb2NhdGlvblksXHJcbiAgICAgICAgICAgICAgICBkcmF3U2l6ZVgsXHJcbiAgICAgICAgICAgICAgICBkcmF3U2l6ZVlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW52LmN0eC5maWxsU3R5bGUgPSBkcmF3YWJsZS5HZXRDb2xvdXIoKTtcclxuICAgICAgICAgICAgY2Fudi5jdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICBkcmF3TG9jYXRpb25YLFxyXG4gICAgICAgICAgICAgICAgZHJhd0xvY2F0aW9uWSxcclxuICAgICAgICAgICAgICAgIGRyYXdTaXplWCxcclxuICAgICAgICAgICAgICAgIGRyYXdTaXplWVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIiwiZXhwb3J0IGNsYXNzIEh0bWxTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgbWFpbkRpdjogSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NyZWF0aW5nIEh0bWwgSGVscGVyIFNlcnZpY2UgaW4gR3JhcGhpY3MnKTtcclxuICAgIH1cclxuXHJcbiAgICBJbml0KCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTWFpbkRpdignbWFpbl9kaXYnKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgR2V0TWFpbkRpdigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYWluRGl2O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTWFpbkRpdihpZDogc3RyaW5nID0gJ21haW5fZGl2Jyk6IHN0cmluZyB7XHJcbiAgICAgICAgdGhpcy5tYWluRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5tYWluRGl2LmlkID0gaWQ7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1haW5EaXYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW5EaXYuaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNyZWF0ZUNhbnZhcyhpZDogc3RyaW5nLCBhdHRhdGNoVG86IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNsYXNzTGlzdDogc3RyaW5nW10gPSBudWxsKTogSFRNTENhbnZhc0VsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgIGNhbnZhcy5pZCA9IGlkO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgaWYgKGNsYXNzTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjYW52YXMuY2xhc3NMaXN0LmFkZChjbGFzc0xpc3RbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGF0dGF0Y2hUbykuYXBwZW5kQ2hpbGQoY2FudmFzKTtcclxuICAgICAgICByZXR1cm4gY2FudmFzO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIEltYWdlSGVscGVye1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYXNzZXRCYXNlUGF0aDogc3RyaW5nID0gJy4vYXNzZXRzL19kaXN0Lyc7XHJcbiAgICBzdGF0aWMgTmV3SW1hZ2UocGF0aDogc3RyaW5nKTogSFRNTEltYWdlRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoMTI4LCAxMjgpO1xyXG4gICAgICAgIGltYWdlLnNyYyA9IHRoaXMuYXNzZXRCYXNlUGF0aCArIHBhdGg7XHJcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgoZXZlbnQpID0+IHRoaXMub25FcnJvcihldmVudCkpO1xyXG4gICAgICAgIHJldHVybiBpbWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBvbkVycm9yKGVycm9yOiBzdHJpbmcgfCBFdmVudCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBsb2FkaW5nIGltYWdlJywgZXJyb3IpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0gICBcclxufSIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcmF3YWJsZUNhbnZhcyBleHRlbmRzIFZlY3RvcjIge1xyXG4gICAgcHVibGljIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBwdWJsaWMgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBzdXBlcih3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XHJcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBHZXRXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVgoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBHZXRIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVZKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENsZWFyQ2FudmFzKCkge1xyXG4gICAgICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmdldFZhbHVlWCgpLCB0aGlzLmdldFZhbHVlWSgpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFBhaW50SW1tZWRpYXRlbHkoKSB7XHJcbiAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzLCAwLCAwKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBHdWlkR2VuZXJhdG9yIH0gZnJvbSBcIi4uLy4uL1Rvb2xzL3JhbmRvbV9nZW5lcmF0b3JzL3JhbmRvbV9ndWlkLmdlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBJbWFnZUhlbHBlciB9IGZyb20gXCIuLi9JbWFnZXMvSW1hZ2VIZWxwZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0dXJlMkQge1xyXG4gICAgcHJpdmF0ZSBpZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSB1cmw6IHN0cmluZztcclxuICAgIHByaXZhdGUgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIGltYWdlQ2FuUmVuZGVyOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcclxuICAgICAgICB0aGlzLnVybCA9IHBhdGg7XHJcbiAgICAgICAgdGhpcy5pZCA9IEd1aWRHZW5lcmF0b3IuTmV3R3VpZCgpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBJbWFnZUhlbHBlci5OZXdJbWFnZSh0aGlzLnVybCk7XHJcbiAgICAgICAgdGhpcy5pbWFnZS5vbmxvYWQgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlQ2FuUmVuZGVyID0gdHJ1ZTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuaW1hZ2Uub25lcnJvciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDYW5SZW5kZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndGV4dDJkOiBpbWFnZSBjb3VsZCBub3QgcmVuZGVyJylcclxuICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0UGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0SWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldElkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0VXJsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRJbWFnZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgaW1hZ2VDYW5SZW5kZXIuIElmIHRoZSBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLCBcclxuICAgICAqIHRoaXMgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAbWVtYmVyb2YgVGV4dHVyZTJEXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDYW5SZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VDYW5SZW5kZXI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUZXh0dXJlMkQgfSBmcm9tIFwiLi9UZXh0dXJlMmRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0dXJlU2VydmljZSB7XHJcbiAgICB0ZXh0dXJlczogQXJyYXk8VGV4dHVyZTJEPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnY29uc3RydWN0aW5nIHRleHR1cmUgc2VydmljZScpO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBuZXcgQXJyYXk8VGV4dHVyZTJEPigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZXh0dXJlKHRleHR1cmVJZDogc3RyaW5nKTogVGV4dHVyZTJEIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGV4dHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRleHR1cmVJZCA9PT0gdGhpcy50ZXh0dXJlc1tpXS5HZXRJZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZWdpc3RlcnMgYSBuZXcgdGV4dHVyZSBpbiB0aGUgc2VydmljZS4gSWYgdGhlIHRleHR1cmUgYWxyZWFkeVxyXG4gICAgICogZXhpc3RzLCB0aHJvd3MgYW4gZXJyb3IgYW5kIHJldHVybnMgdGhlIGV4aXN0aW5nIG9uZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUGF0aFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBUZXh0dXJlU2VydmljZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVnaXN0ZXJOZXdUZXh0dXJlKHRleHR1cmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZXh0dXJlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzVGV4dFBhdGggPSB0aGlzLnRleHR1cmVzW2ldLkdldFBhdGgoKVxyXG4gICAgICAgICAgICBpZiAodGhpc1RleHRQYXRoID09PSB0ZXh0dXJlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignYXR0ZW1wdGVkIHRvIGNyZWF0ZSBhIHRleHR1cmUgYSBzZWNvbmQgdGltZScpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlc1tpXS5HZXRJZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHRleHR1cmVQYXRoKTtcclxuICAgICAgICB0aGlzLnRleHR1cmVzLnB1c2gobmV3VGV4dHVyZSk7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGB0ZXh0dXJlIHN0YWNrIGlzIG5vdyBbJHt0aGlzLnRleHR1cmVzLmxlbmd0aH1dIGxvbmdgKVxyXG4gICAgICAgIHJldHVybiBuZXdUZXh0dXJlLkdldElkKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaWxlVHlwZSB9IGZyb20gXCIuLi9fYmFzZS10aWxldHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERpcnRUaWxlVHlwZSBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL2RpcnQucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjOTE2RDQ5JywgdGV4dElkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFRpbGVUeXBlIH0gZnJvbSBcIi4uL19iYXNlLXRpbGV0eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NUaWxlVHlwZSBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL2dyYXNzLnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzQzODMzNycsIHRleHRJZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFzc1RpbGVUeXBlRGlydCBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL2dyYXNzX3dpdGhfZGlydF9taWRkbGUucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjODdDQzZGJywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyYXNzVGlsZVR5cGVEaXJ0VG9wIGV4dGVuZHMgVGlsZVR5cGUge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlUGF0aDogc3RyaW5nID0gJy9UaWxlcy9ncm91bmQvZ3Jhc3Nfd2l0aF9kaXJ0X3RvcC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyM0MzgzMzcnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NUaWxlVHlwZURpcnRSaWdodCBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL2dyYXNzX3dpdGhfZGlydF9yaWdodC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyM0MzgzMzcnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NUaWxlVHlwZURpcnRCb3R0b20gZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL2dyb3VuZC9ncmFzc193aXRoX2RpcnRfYm90dG9tLnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzQzODMzNycsIHRleHRJZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFzc1RpbGVUeXBlRGlydExlZnQgZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL2dyb3VuZC9ncmFzc193aXRoX2RpcnRfbGVmdC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyM0MzgzMzcnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NUaWxlVHlwZURpcnRNaWRkbGUgZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL2dyb3VuZC9ncmFzc193aXRoX2RpcnRfbWlkZGxlLnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzQzODMzNycsIHRleHRJZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IFRpbGVUeXBlIH0gZnJvbSBcIi4uL19iYXNlLXRpbGV0eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FuZFRpbGVUeXBlIGV4dGVuZHMgVGlsZVR5cGUge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlUGF0aDogc3RyaW5nID0gJy9UaWxlcy9ncm91bmQvc2FuZC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyNDMUMxMjgnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FuZFRpbGVUeXBlR3Jhc3NUb3AgZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL2dyb3VuZC9zYW5kX2dyYXNzX3RvcC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyNDMUMxMjgnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FuZFRpbGVUeXBlR3Jhc3NSaWdodCBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL3NhbmRfZ3Jhc3NfcmlnaHQucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjQzFDMTI4JywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhbmRUaWxlVHlwZUdyYXNzQm90dG9tIGV4dGVuZHMgVGlsZVR5cGUge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlUGF0aDogc3RyaW5nID0gJy9UaWxlcy9ncm91bmQvc2FuZF9ncmFzc19ib3R0b20ucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjQzFDMTI4JywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhbmRUaWxlVHlwZUdyYXNzTGVmdCBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL3NhbmRfZ3Jhc3NfbGVmdC5wbmcnO1xyXG4gICAgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgdGV4dElkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihpZCwgJyNDMUMxMjgnLCB0ZXh0SWQpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgVGlsZVR5cGUgfSBmcm9tIFwiLi4vX2Jhc2UtdGlsZXR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaGFsbG93V2F0ZXJUaWxlVHlwZSBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL3NoYWxsb3dfd2F0ZXIucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjNDM4MEU0JywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFRvcCBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL3NoYWxsb3dfd2F0ZXJfc2FuZF90b3AucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjNDM4MEU0JywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFJpZ2h0IGV4dGVuZHMgVGlsZVR5cGUge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlUGF0aDogc3RyaW5nID0gJy9UaWxlcy9ncm91bmQvc2hhbGxvd193YXRlcl9zYW5kX3JpZ2h0LnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzQzODBFNCcsIHRleHRJZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRCb3R0b20gZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL2dyb3VuZC9zaGFsbG93X3dhdGVyX3NhbmRfYm90dG9tLnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzQzODBFNCcsIHRleHRJZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRMZWZ0IGV4dGVuZHMgVGlsZVR5cGUge1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlUGF0aDogc3RyaW5nID0gJy9UaWxlcy9ncm91bmQvc2hhbGxvd193YXRlcl9zYW5kX2xlZnQucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjNDM4MEU0JywgdGV4dElkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFRpbGVUeXBlIH0gZnJvbSBcIi4uL19iYXNlLXRpbGV0eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3RvbmVUaWxlVHlwZSBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvZ3JvdW5kL3N0b25lLnBuZyc7XHJcbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0ZXh0SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCAnIzUyNTA0RicsIHRleHRJZCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaWxlVHlwZSB9IGZyb20gXCIuLi9fYmFzZS10aWxldHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNwYWNlVGlsZVR5cGUgZXh0ZW5kcyBUaWxlVHlwZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVQYXRoOiBzdHJpbmcgPSAnL1RpbGVzL3NwYWNlX3RpbGUucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjMUMxQzFCJywgdGV4dElkKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBUaWxlVHlwZSB9IGZyb20gXCIuLi9fYmFzZS10aWxldHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN0YXJUaWxlVHlwZSBleHRlbmRzIFRpbGVUeXBlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGV4dHVyZVBhdGg6IHN0cmluZyA9ICcvVGlsZXMvc3BhY2VfdGlsZTIucG5nJztcclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIHRleHRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsICcjMDYwOTQ4JywgdGV4dElkKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBUaWxlVHlwZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHR1cmVJZDogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhbGxiYWNrT3V0bGluZUNvbG91cjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIsIGZhbGxiYWNrT3V0bGluZUNvbG91cjogc3RyaW5nLFxyXG4gICAgICAgIHRleHR1cmVJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlSWQgPSB0ZXh0dXJlSWQ7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZmFsbGJhY2tPdXRsaW5lQ29sb3VyID0gZmFsbGJhY2tPdXRsaW5lQ29sb3VyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBUaWNrKCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VGV4dHVyZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZUlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRJZCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGYWxsYmFja0NvbG91cigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja091dGxpbmVDb2xvdXI7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gXCIuLi9EcmF3L2RyYXdhYmxlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJhd2FibGVUaWxlIGV4dGVuZHMgRHJhd2FibGUge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aWxlVHlwZUlkOiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IodGlsZVR5cGVJZDogbnVtYmVyLCBwb3NpdGlvbjogVmVjdG9yMiwgc2l6ZTogVmVjdG9yMiwgZmFsbGJhY2tPdXRsaW5lQ29sb3VyOiBzdHJpbmcsIGNhbnZhc0lkOiBzdHJpbmcsXHJcbiAgICAgICAgdGV4dHVyZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihwb3NpdGlvbiwgc2l6ZSwgY2FudmFzSWQsIHRleHR1cmVJZCk7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZUlkID0gdGlsZVR5cGVJZDtcclxuICAgICAgICB0aGlzLmNvbG91ciA9IGZhbGxiYWNrT3V0bGluZUNvbG91cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGlsZVR5cGVJZCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVUeXBlSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBvc2l0aW9uKCk6IFZlY3RvcjIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXplKCk6IFZlY3RvcjIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSBcIi4uLy4uLy4uL251bWVyaWNzL21vZGVscy9WZWN0b3IyLm1vZGVsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGlsZURlZmF1bHRTZXR0aW5ncyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfU0laRTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDY0LCA2NCk7XHJcbn0iLCJpbXBvcnQgeyBUaWxlVHlwZSB9IGZyb20gXCIuL1RpbGVUeXBlcy9fYmFzZS10aWxldHlwZVwiO1xyXG5pbXBvcnQgeyBDYW52YXNTZXJ2aWNlIH0gZnJvbSBcIi4uL0NhbnZhcy9ncmFwaGljcy5jYW52YXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTcGFjZVRpbGVUeXBlIH0gZnJvbSBcIi4vVGlsZVR5cGVzL1NwYWNlVGlsZVR5cGVzL3NwYWNlLnRpbGV0eXBlXCI7XHJcbmltcG9ydCB7IEdyYXBoaWNzU2VydmljZSB9IGZyb20gXCIuLi9ncmFwaGljcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuaW1wb3J0IHsgVGlsZURlZmF1bHRTZXR0aW5ncyB9IGZyb20gXCIuL3RpbGUuZGVmYXVsdC5zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBEcmF3YWJsZVRpbGUgfSBmcm9tIFwiLi9kcmF3YWJsZS10aWxlXCI7XHJcbmltcG9ydCB7IEdyYXNzVGlsZVR5cGUsIEdyYXNzVGlsZVR5cGVEaXJ0LCBHcmFzc1RpbGVUeXBlRGlydFRvcCwgR3Jhc3NUaWxlVHlwZURpcnRSaWdodCwgR3Jhc3NUaWxlVHlwZURpcnRMZWZ0LCBHcmFzc1RpbGVUeXBlRGlydEJvdHRvbSwgR3Jhc3NUaWxlVHlwZURpcnRNaWRkbGUgfSBmcm9tIFwiLi9UaWxlVHlwZXMvR3JvdW5kVGlsZVR5cGVzL2dyYXNzLnRpbGV0eXBlXCI7XHJcbmltcG9ydCB7IERyYXdhYmxlQ2FudmFzIH0gZnJvbSBcIi4uL01vZGVscy9ncmFwaGljcy5kcmF3YWJsZS1jYW52YXNcIjtcclxuaW1wb3J0IHsgU3RhclRpbGVUeXBlIH0gZnJvbSBcIi4vVGlsZVR5cGVzL1NwYWNlVGlsZVR5cGVzL3N0YXIudGlsZXR5cGVcIjtcclxuaW1wb3J0IHsgRGlydFRpbGVUeXBlIH0gZnJvbSBcIi4vVGlsZVR5cGVzL0dyb3VuZFRpbGVUeXBlcy9kaXJ0LnRpbGV0eXBlXCI7XHJcbmltcG9ydCB7IFNhbmRUaWxlVHlwZUdyYXNzVG9wLCBTYW5kVGlsZVR5cGUsIFNhbmRUaWxlVHlwZUdyYXNzUmlnaHQsIFNhbmRUaWxlVHlwZUdyYXNzQm90dG9tLCBTYW5kVGlsZVR5cGVHcmFzc0xlZnQgfSBmcm9tIFwiLi9UaWxlVHlwZXMvR3JvdW5kVGlsZVR5cGVzL3NhbmQudGlsZXR5cGVcIjtcclxuaW1wb3J0IHsgU2hhbGxvd1dhdGVyVGlsZVR5cGUsIFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFRvcCwgU2hhbGxvd1dhdGVyVGlsZVR5cGVTYW5kUmlnaHQsIFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZEJvdHRvbSwgU2hhbGxvd1dhdGVyVGlsZVR5cGVTYW5kTGVmdCB9IGZyb20gXCIuL1RpbGVUeXBlcy9Hcm91bmRUaWxlVHlwZXMvc2hhbGxvdy13YXRlci50aWxldHlwZVwiO1xyXG5pbXBvcnQgeyBTdG9uZVRpbGVUeXBlIH0gZnJvbSBcIi4vVGlsZVR5cGVzL0dyb3VuZFRpbGVUeXBlcy9zdG9uZS50aWxldHlwZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlMkQgfSBmcm9tIFwiLi4vVGV4dHVyZXMvVGV4dHVyZTJkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGlsZVNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgdGlsZVNpemU6IFZlY3RvcjIgPSBUaWxlRGVmYXVsdFNldHRpbmdzLkRFRkFVTFRfU0laRTtcclxuXHJcbiAgICBwdWJsaWMgdGlsZVR5cGVzOiBUaWxlVHlwZVtdID0gbmV3IEFycmF5PFRpbGVUeXBlPigyNTYpO1xyXG4gICAgcHJpdmF0ZSBzcGFjZVRpbGVUeXBlOiBUaWxlVHlwZTtcclxuICAgIHByaXZhdGUgc3RhclRpbGVUeXBlOiBUaWxlVHlwZTtcclxuXHJcbiAgICBwcml2YXRlIGdyYXNzVGlsZVR5cGU6IFRpbGVUeXBlO1xyXG4gICAgcHJpdmF0ZSBncmFzc1RpbGVUeXBlRGlydDogR3Jhc3NUaWxlVHlwZURpcnQ7XHJcbiAgICBwcml2YXRlIGdyYXNzVGlsZVR5cGVEaXJ0VG9wOiBHcmFzc1RpbGVUeXBlRGlydFRvcDtcclxuICAgIHByaXZhdGUgZ3Jhc3NUaWxlVHlwZURpcnRSaWdodDogR3Jhc3NUaWxlVHlwZURpcnRSaWdodDtcclxuICAgIHByaXZhdGUgZ3Jhc3NUaWxlVHlwZUJvdHRvbTogR3Jhc3NUaWxlVHlwZURpcnRCb3R0b207XHJcbiAgICBwcml2YXRlIGdyYXNzVGlsZVR5cGVMZWZ0OiBHcmFzc1RpbGVUeXBlRGlydExlZnQ7XHJcbiAgICBwcml2YXRlIGdyYXNzVGlsZVR5cGVNaWRkbGU6IEdyYXNzVGlsZVR5cGVEaXJ0TWlkZGxlO1xyXG5cclxuICAgIHByaXZhdGUgZGlydFRpbGVUeXBlOiBEaXJ0VGlsZVR5cGU7XHJcbiAgICBwcml2YXRlIHN0b25lVGlsZVR5cGU6IFN0b25lVGlsZVR5cGU7XHJcblxyXG4gICAgcHJpdmF0ZSBzYW5kVGlsZVR5cGU6IFNhbmRUaWxlVHlwZTtcclxuICAgIHByaXZhdGUgc2FuZFRpbGVUeXBlRGlydFRvcDogU2FuZFRpbGVUeXBlR3Jhc3NUb3A7XHJcbiAgICBwcml2YXRlIHNhbmRUaWxlVHlwZURpcnRSaWdodDogU2FuZFRpbGVUeXBlR3Jhc3NSaWdodDtcclxuICAgIHByaXZhdGUgc2FuZFRpbGVUeXBlQm90dG9tOiBTYW5kVGlsZVR5cGVHcmFzc0JvdHRvbTtcclxuICAgIHByaXZhdGUgc2FuZFRpbGVUeXBlTGVmdDogU2FuZFRpbGVUeXBlR3Jhc3NMZWZ0O1xyXG5cclxuICAgIHByaXZhdGUgc2hhbGxvd1dhdGVyVGlsZVR5cGU6IFNoYWxsb3dXYXRlclRpbGVUeXBlO1xyXG4gICAgcHJpdmF0ZSBzaGFsbG93V2F0ZXJUaWxlVHlwZURpcnRUb3A6IFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFRvcDtcclxuICAgIHByaXZhdGUgc2hhbGxvd1dhdGVyVGlsZVR5cGVEaXJ0UmlnaHQ6IFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFJpZ2h0O1xyXG4gICAgcHJpdmF0ZSBzaGFsbG93V2F0ZXJUaWxlVHlwZUJvdHRvbTogU2hhbGxvd1dhdGVyVGlsZVR5cGVTYW5kQm90dG9tO1xyXG4gICAgcHJpdmF0ZSBzaGFsbG93V2F0ZXJUaWxlVHlwZUxlZnQ6IFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZExlZnQ7XHJcblxyXG5cclxuXHJcbiAgICBwcml2YXRlIHRpbGVzOiBBcnJheTxEcmF3YWJsZVRpbGU+ID0gbmV3IEFycmF5PERyYXdhYmxlVGlsZT4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNhbnZhc1NlcnZpY2U6IENhbnZhc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIGdyYXBoaWNzU2VydmljZTogR3JhcGhpY3NTZXJ2aWNlO1xyXG5cclxuICAgIHByaXZhdGUgdGlsZUNhbnZhc0lkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2FudmFzU2VydmljZTogQ2FudmFzU2VydmljZSxcclxuICAgICAgICBncmFwaGljc1NlcnZpY2U6IEdyYXBoaWNzU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlID0gZ3JhcGhpY3NTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2VydmljZSA9IGNhbnZhc1NlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgSW5pdCgpIHtcclxuICAgICAgICB0aGlzLnRpbGVDYW52YXNJZCA9IHRoaXMuY2FudmFzU2VydmljZS5SZWdpc3Rlck5ld0NhbnZhcygpO1xyXG4gICAgICAgIHRoaXMuc3BhY2VUaWxlVHlwZSA9IG5ldyBTcGFjZVRpbGVUeXBlKDAsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKFNwYWNlVGlsZVR5cGUudGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLnN0YXJUaWxlVHlwZSA9IG5ldyBTdGFyVGlsZVR5cGUoMSwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoU3RhclRpbGVUeXBlLnRleHR1cmVQYXRoKSk7XHJcbiAgICAgICAgdGhpcy5ncmFzc1RpbGVUeXBlID0gbmV3IEdyYXNzVGlsZVR5cGUoMiwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoR3Jhc3NUaWxlVHlwZS50ZXh0dXJlUGF0aCkpO1xyXG5cclxuICAgICAgICB0aGlzLmdyYXNzVGlsZVR5cGVEaXJ0ID0gbmV3IEdyYXNzVGlsZVR5cGVEaXJ0KDMsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKEdyYXNzVGlsZVR5cGVEaXJ0LnRleHR1cmVQYXRoKSk7XHJcbiAgICAgICAgdGhpcy5ncmFzc1RpbGVUeXBlRGlydFRvcCA9IG5ldyBHcmFzc1RpbGVUeXBlRGlydFRvcCg0LCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShHcmFzc1RpbGVUeXBlRGlydFRvcC50ZXh0dXJlUGF0aCkpO1xyXG4gICAgICAgIHRoaXMuZ3Jhc3NUaWxlVHlwZURpcnRSaWdodCA9IG5ldyBHcmFzc1RpbGVUeXBlRGlydFJpZ2h0KDUsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKEdyYXNzVGlsZVR5cGVEaXJ0UmlnaHQudGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLmdyYXNzVGlsZVR5cGVCb3R0b20gPSBuZXcgR3Jhc3NUaWxlVHlwZURpcnRCb3R0b20oNiwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoR3Jhc3NUaWxlVHlwZURpcnRCb3R0b20udGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLmdyYXNzVGlsZVR5cGVMZWZ0ID0gbmV3IEdyYXNzVGlsZVR5cGVEaXJ0TGVmdCg3LCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShHcmFzc1RpbGVUeXBlRGlydExlZnQudGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLmdyYXNzVGlsZVR5cGVNaWRkbGUgPSBuZXcgR3Jhc3NUaWxlVHlwZURpcnRNaWRkbGUoOCwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoR3Jhc3NUaWxlVHlwZURpcnRNaWRkbGUudGV4dHVyZVBhdGgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXJ0VGlsZVR5cGUgPSBuZXcgRGlydFRpbGVUeXBlKDksIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKERpcnRUaWxlVHlwZS50ZXh0dXJlUGF0aCkpO1xyXG5cclxuICAgICAgICB0aGlzLnN0b25lVGlsZVR5cGUgPSBuZXcgU3RvbmVUaWxlVHlwZSgxMCwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoU3RvbmVUaWxlVHlwZS50ZXh0dXJlUGF0aCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNhbmRUaWxlVHlwZSA9IG5ldyBTYW5kVGlsZVR5cGUoMTEsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKFNhbmRUaWxlVHlwZS50ZXh0dXJlUGF0aCkpO1xyXG4gICAgICAgIHRoaXMuc2FuZFRpbGVUeXBlRGlydFRvcCA9IG5ldyBTYW5kVGlsZVR5cGVHcmFzc1RvcCgxMiwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoU2FuZFRpbGVUeXBlR3Jhc3NUb3AudGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLnNhbmRUaWxlVHlwZURpcnRSaWdodCA9IG5ldyBTYW5kVGlsZVR5cGVHcmFzc1JpZ2h0KDEzLCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShTYW5kVGlsZVR5cGVHcmFzc1JpZ2h0LnRleHR1cmVQYXRoKSk7XHJcbiAgICAgICAgdGhpcy5zYW5kVGlsZVR5cGVCb3R0b20gPSBuZXcgU2FuZFRpbGVUeXBlR3Jhc3NCb3R0b20oMTQsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKFNhbmRUaWxlVHlwZUdyYXNzQm90dG9tLnRleHR1cmVQYXRoKSk7XHJcbiAgICAgICAgdGhpcy5zYW5kVGlsZVR5cGVMZWZ0ID0gbmV3IFNhbmRUaWxlVHlwZUdyYXNzTGVmdCgxNSwgdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0VGV4dHVyZVNlcnZpY2UoKS5SZWdpc3Rlck5ld1RleHR1cmUoU2FuZFRpbGVUeXBlR3Jhc3NMZWZ0LnRleHR1cmVQYXRoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGUgPSBuZXcgU2hhbGxvd1dhdGVyVGlsZVR5cGUoMTYsIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLkdldFRleHR1cmVTZXJ2aWNlKCkuUmVnaXN0ZXJOZXdUZXh0dXJlKFNoYWxsb3dXYXRlclRpbGVUeXBlLnRleHR1cmVQYXRoKSk7XHJcbiAgICAgICAgdGhpcy5zaGFsbG93V2F0ZXJUaWxlVHlwZURpcnRUb3AgPSBuZXcgU2hhbGxvd1dhdGVyVGlsZVR5cGVTYW5kVG9wKDE3LCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRUb3AudGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLnNoYWxsb3dXYXRlclRpbGVUeXBlRGlydFJpZ2h0ID0gbmV3IFNoYWxsb3dXYXRlclRpbGVUeXBlU2FuZFJpZ2h0KDE4LCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRSaWdodC50ZXh0dXJlUGF0aCkpO1xyXG4gICAgICAgIHRoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGVCb3R0b20gPSBuZXcgU2hhbGxvd1dhdGVyVGlsZVR5cGVTYW5kQm90dG9tKDE5LCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRCb3R0b20udGV4dHVyZVBhdGgpKTtcclxuICAgICAgICB0aGlzLnNoYWxsb3dXYXRlclRpbGVUeXBlTGVmdCA9IG5ldyBTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRMZWZ0KDIwLCB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUZXh0dXJlU2VydmljZSgpLlJlZ2lzdGVyTmV3VGV4dHVyZShTaGFsbG93V2F0ZXJUaWxlVHlwZVNhbmRMZWZ0LnRleHR1cmVQYXRoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBUaWxlVHlwZXMoKTtcclxuICAgICAgICAvLyB0aGlzLnNldHVwVGlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cFRpbGVUeXBlcygpIHtcclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLnNwYWNlVGlsZVR5cGUuR2V0SWQoKV0gPSB0aGlzLnNwYWNlVGlsZVR5cGU7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zdGFyVGlsZVR5cGUuR2V0SWQoKV0gPSB0aGlzLnN0YXJUaWxlVHlwZTtcclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLmdyYXNzVGlsZVR5cGUuR2V0SWQoKV0gPSB0aGlzLmdyYXNzVGlsZVR5cGU7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5ncmFzc1RpbGVUeXBlRGlydC5HZXRJZCgpXSA9IHRoaXMuZ3Jhc3NUaWxlVHlwZURpcnQ7XHJcblxyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuZ3Jhc3NUaWxlVHlwZURpcnRUb3AuR2V0SWQoKV0gPSB0aGlzLmdyYXNzVGlsZVR5cGVEaXJ0VG9wO1xyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuZ3Jhc3NUaWxlVHlwZURpcnRSaWdodC5HZXRJZCgpXSA9IHRoaXMuZ3Jhc3NUaWxlVHlwZURpcnRSaWdodDtcclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLmdyYXNzVGlsZVR5cGVCb3R0b20uR2V0SWQoKV0gPSB0aGlzLmdyYXNzVGlsZVR5cGVCb3R0b207XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5ncmFzc1RpbGVUeXBlTGVmdC5HZXRJZCgpXSA9IHRoaXMuZ3Jhc3NUaWxlVHlwZUxlZnQ7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5ncmFzc1RpbGVUeXBlTWlkZGxlLkdldElkKCldID0gdGhpcy5ncmFzc1RpbGVUeXBlTWlkZGxlO1xyXG5cclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLmRpcnRUaWxlVHlwZS5HZXRJZCgpXSA9IHRoaXMuZGlydFRpbGVUeXBlO1xyXG5cclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLnN0b25lVGlsZVR5cGUuR2V0SWQoKV0gPSB0aGlzLnN0b25lVGlsZVR5cGU7XHJcblxyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuc2FuZFRpbGVUeXBlLkdldElkKCldID0gdGhpcy5zYW5kVGlsZVR5cGU7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zYW5kVGlsZVR5cGVEaXJ0VG9wLkdldElkKCldID0gdGhpcy5zYW5kVGlsZVR5cGVEaXJ0VG9wO1xyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuc2FuZFRpbGVUeXBlRGlydFJpZ2h0LkdldElkKCldID0gdGhpcy5zYW5kVGlsZVR5cGVEaXJ0UmlnaHQ7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zYW5kVGlsZVR5cGVCb3R0b20uR2V0SWQoKV0gPSB0aGlzLnNhbmRUaWxlVHlwZUJvdHRvbTtcclxuICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aGlzLnNhbmRUaWxlVHlwZUxlZnQuR2V0SWQoKV0gPSB0aGlzLnNhbmRUaWxlVHlwZUxlZnQ7XHJcblxyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGUuR2V0SWQoKV0gPSB0aGlzLnNoYWxsb3dXYXRlclRpbGVUeXBlO1xyXG4gICAgICAgIHRoaXMudGlsZVR5cGVzW3RoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGVEaXJ0VG9wLkdldElkKCldID0gdGhpcy5zaGFsbG93V2F0ZXJUaWxlVHlwZURpcnRUb3A7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zaGFsbG93V2F0ZXJUaWxlVHlwZURpcnRSaWdodC5HZXRJZCgpXSA9IHRoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGVEaXJ0UmlnaHQ7XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zaGFsbG93V2F0ZXJUaWxlVHlwZUJvdHRvbS5HZXRJZCgpXSA9IHRoaXMuc2hhbGxvd1dhdGVyVGlsZVR5cGVCb3R0b207XHJcbiAgICAgICAgdGhpcy50aWxlVHlwZXNbdGhpcy5zaGFsbG93V2F0ZXJUaWxlVHlwZUxlZnQuR2V0SWQoKV0gPSB0aGlzLnNoYWxsb3dXYXRlclRpbGVUeXBlTGVmdDtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgYSBWZWN0b3IgMiBjb250YWluaW5nIGEgc2l6ZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyW11bXX0gdGlsZXNcclxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfVxyXG4gICAgICogQG1lbWJlcm9mIFRpbGVTZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXR1cFRpbGVzRnJvbUFycmF5KHRpbGVzOiBudW1iZXJbXVtdKTogVmVjdG9yMiB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDAsIDApO1xyXG4gICAgICAgIC8vIGNvbnN0IGNhbnZJZCA9IGAke3RoaXMuZ3JhcGhpY3NTZXJ2aWNlLlJlZ2lzdGVyRHJhd2FibGVFbnRpdHkoJ3RleHRzJyl9YDtcclxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRpbGVzLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGlsZXNbeF0ubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGlsZXMucHVzaChuZXcgRHJhd2FibGVUaWxlKHRpbGVzW3hdW3ldLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ICogdGhpcy5HZXRUaWxlU2l6ZSgpLmdldFZhbHVlWCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4ICogdGhpcy5HZXRUaWxlU2l6ZSgpLmdldFZhbHVlWSgpKSxcclxuICAgICAgICAgICAgICAgICAgICBUaWxlRGVmYXVsdFNldHRpbmdzLkRFRkFVTFRfU0laRSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aWxlc1t4XVt5XV0uR2V0RmFsbGJhY2tDb2xvdXIoKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVDYW52YXNJZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVUeXBlc1t0aWxlc1t4XVt5XV0uR2V0VGV4dHVyZUlkKCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2l6ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBQcmVDbGVhckNhbnZhcygpIHtcclxuICAgICAgICBjb25zdCBjYW52ID0gdGhpcy5ncmFwaGljc1NlcnZpY2UuR2V0Q2FudmFzKHRoaXMudGlsZUNhbnZhc0lkKTtcclxuICAgICAgICBjYW52LkNsZWFyQ2FudmFzKCk7XHJcbiAgICB9XHJcbiAgICBSZWRuZXIoKSB7XHJcbiAgICAgICAgdGhpcy5QcmVDbGVhckNhbnZhcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmdyYXBoaWNzU2VydmljZS5nZXREcmF3aW5nU2VydmljZSgpLkRyYXcoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbGVzW2ldLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0VGlsZVNpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZVNpemU7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3cG9ydEhlbHBlciB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRTcXVhcmVJbkJyb3dzZXIoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgY29uc3QgaCA9IHRoaXMuR2V0QnJvd3NlckhlaWdodCgpIC0gNTtcclxuICAgICAgICBjb25zdCB3ID0gdGhpcy5HZXRCcm93c2VyV2lkdGgoKSAtIDU7XHJcbiAgICAgICAgaWYgKGggPCB3KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihoLCBoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodywgdyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0V2luZG93SW5Bc3BlY3RSYXRpbyhhc3BlY3RSYXRpb1dpZHRoOiBudW1iZXIgPSAxNiwgYXNwZWN0UmF0aW9IZWlnaHQ6IG51bWJlciA9IDksXHJcbiAgICAgICAgd2lkdGhQZXJjZW50OiBudW1iZXIgPSAxLCBoZWlnaHRQZXJjZW50OiBudW1iZXIgPSAxKSB7XHJcbiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBhc3BlY3RSYXRpb1dpZHRoIC8gYXNwZWN0UmF0aW9IZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkV2luZG93SGVpZ2h0ID0gdGhpcy5HZXRCcm93c2VySGVpZ2h0KCkgKiBoZWlnaHRQZXJjZW50O1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkV2luZG93V2lkdGggPSB0aGlzLkdldEJyb3dzZXJXaWR0aCgpICogd2lkdGhQZXJjZW50O1xyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5V2lkdGggPSBNYXRoLm1pbihhZGp1c3RlZFdpbmRvd1dpZHRoLCAoYWRqdXN0ZWRXaW5kb3dIZWlnaHQgKiBhc3BlY3RSYXRpbykpO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSBNYXRoLm1pbihhZGp1c3RlZFdpbmRvd0hlaWdodCwgKGFkanVzdGVkV2luZG93V2lkdGggLyBhc3BlY3RSYXRpbykpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIHdpbmRvdyBpbiBhIGdpdmVuIGFzcGVjdCByYXRpby4gXHJcbiAgICAgKlxyXG4gICAgICogQHN0YXRpY1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb1dpZHRoPTE2XVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb0hlaWdodD05XVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFBlcmNlbnQ9MV0gYmV0d2VlbiAwICYgMS4gU2hvdWxkIHVzdWFsbHkgYmUgdGhlIHNhbWUgYXMgaGVpZ2h0UGVyY2VudFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRQZXJjZW50PTFdIGJldHdlZW4gMCAmIDEuIFNob3VkbCB1c3VhbGx5IGJlIHRoZSBzYW1lIGFzIHdpZHRoUGVyY2VudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnRJZCBBbiBlbGVtZW50IHRvIHB1dCB0aGlzIGNhbnZhcyBpbnRvLiBDYW4gYmUgbnVsbCAod2lsbCB1c2UgdGhlIGZ1bGwgd2luZG93KVxyXG4gICAgICogQHJldHVybnMge1ZlY3RvcjJ9XHJcbiAgICAgKiBAbWVtYmVyb2YgVmlld3BvcnRIZWxwZXJcclxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfVxyXG4gICAgICogQG1lbWJlcm9mIFZpZXdwb3J0SGVscGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0V2luZG93SW5Bc3BlY3RSYXRpb0ZvckNhbnZhcyhhc3BlY3RSYXRpb1dpZHRoOiBudW1iZXIgPSAxNiwgYXNwZWN0UmF0aW9IZWlnaHQ6IG51bWJlciA9IDksXHJcbiAgICAgICAgd2lkdGhQZXJjZW50OiBudW1iZXIgPSAxLCBoZWlnaHRQZXJjZW50OiBudW1iZXIgPSAxLCBjYW52YXNhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsKTogVmVjdG9yMiB7XHJcblxyXG4gICAgICAgIGlmICghY2FudmFzYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZXR1cCB3aXRoIG5vIGNhbnZhc2FibGUgZWxlbWVudC4gV2lsbCB1c2UgdGhlIGVudGlyZSB3aW5kb3dgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHNldHVwIHdpdGggaWQgb2YgJHtjYW52YXNhYmxlRWxlbWVudC5pZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBhc3BlY3RSYXRpb1dpZHRoIC8gYXNwZWN0UmF0aW9IZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChoZWlnaHRQZXJjZW50ICE9PSB3aWR0aFBlcmNlbnQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCd3aW5kb3cgaGVpZ2h0IGFuZCB3aWR0aCBwZXJjZW50YWdlcyB0byBub3QgbWF0Y2guIFRoaXMgd2lsbCByZXN1bHQgaW4gYW4gYWJub3JtYWwgc2NyZWVuIHNpemUnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXNwZWN0UmF0aW9IZWlnaHQgPiBhc3BlY3RSYXRpb1dpZHRoKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzdGFydGluZyBpbiBwb3J0cmFpdCBtb2RlICgke2FzcGVjdFJhdGlvV2lkdGh9OiR7YXNwZWN0UmF0aW9IZWlnaHR9KWApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgc3RhcnRpbmcgaW4gbGFuZHNjYXBlIG1vZGUgKCR7YXNwZWN0UmF0aW9XaWR0aH06JHthc3BlY3RSYXRpb0hlaWdodH0pYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhZGp1c3RlZFdpbmRvd0hlaWdodCA9IHRoaXMuR2V0QnJvd3NlckhlaWdodChjYW52YXNhYmxlRWxlbWVudCkgKiBoZWlnaHRQZXJjZW50O1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkV2luZG93V2lkdGggPSB0aGlzLkdldEJyb3dzZXJXaWR0aChjYW52YXNhYmxlRWxlbWVudCkgKiB3aWR0aFBlcmNlbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlXaWR0aCA9IE1hdGgubWluKGFkanVzdGVkV2luZG93V2lkdGgsIChhZGp1c3RlZFdpbmRvd0hlaWdodCAqIGFzcGVjdFJhdGlvKSk7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheUhlaWdodCA9IE1hdGgubWluKGFkanVzdGVkV2luZG93SGVpZ2h0LCAoYWRqdXN0ZWRXaW5kb3dXaWR0aCAvIGFzcGVjdFJhdGlvKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIEdldEJyb3dzZXJXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBHZXRCcm93c2VySGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSBcIi4uLy4uLy4uL251bWVyaWNzL21vZGVscy9WZWN0b3IyLm1vZGVsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVmlld3BvcnRTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGJyb3dzZXJTaXplOiBWZWN0b3IyO1xyXG4gICAgcHJpdmF0ZSB2aWV3cG9ydFNpemU6IFZlY3RvcjI7XHJcblxyXG4gICAgcHJpdmF0ZSBhc3BlY3RSYXRpbzogVmVjdG9yMjtcclxuICAgIHByaXZhdGUgYXNwZWN0UmF0aW9DYWxjdWxhdGVkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHNpemVQZXJjZW50OiBWZWN0b3IyO1xyXG5cclxuICAgIHByaXZhdGUgbGlzdG5lcjogYW55O1xyXG5cclxuICAgIHByaXZhdGUgbGlzdGVuaW5nRm9yQnJvd3NlckNoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGFzcGVjdFJhdGlvOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMTYsIDkpLFxyXG4gICAgICAgIHNpemVQZXJjZW50OiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoMSwgMSkpIHtcclxuICAgICAgICB0aGlzLmFzcGVjdFJhdGlvID0gYXNwZWN0UmF0aW87XHJcbiAgICAgICAgdGhpcy5hc3BlY3RSYXRpb0NhbGN1bGF0ZWQgPSAodGhpcy5hc3BlY3RSYXRpby5nZXRWYWx1ZVgoKSAvIHRoaXMuYXNwZWN0UmF0aW8uZ2V0VmFsdWVZKCkpO1xyXG4gICAgICAgIHRoaXMuc2l6ZVBlcmNlbnQgPSBzaXplUGVyY2VudDtcclxuICAgICAgICB0aGlzLnNldHVwTGlzdG5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldHVwTGlzdG5lcigpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc2V0dGluZyB1cCBicm93c2VyIGxpc3RuZXInKVxyXG4gICAgICAgIHRoaXMubGlzdG5lciA9IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nRm9yQnJvd3NlckNoYW5nZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmluZ0ZvckJyb3dzZXJDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqR2V0cyBhIHdpbmRvdyBpbiBhIHRoZSBnYW1lJ3MgYXNwZWN0IHJhdGlvXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2NhbnZhc2FibGVFbGVtZW50PW51bGxdXHJcbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yMn1cclxuICAgICAqIEBtZW1iZXJvZiBWaWV3cG9ydFNlcnZpY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFdpbmRvd0luQXNwZWN0UmF0aW9Gb3JDYW52YXMoY2FudmFzYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCk6IFZlY3RvcjIge1xyXG5cclxuICAgICAgICBpZiAoIWNhbnZhc2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2V0dXAgd2l0aCBubyBjYW52YXNhYmxlIGVsZW1lbnQuIFdpbGwgdXNlIHRoZSBlbnRpcmUgd2luZG93YCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZXR1cCB3aXRoIGlkIG9mICR7Y2FudmFzYWJsZUVsZW1lbnQuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaXplUGVyY2VudC5nZXRWYWx1ZVgoKSAhPT0gdGhpcy5zaXplUGVyY2VudC5nZXRWYWx1ZVkoKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3dpbmRvdyBoZWlnaHQgYW5kIHdpZHRoIHBlcmNlbnRhZ2VzIHRvIG5vdCBtYXRjaC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhYm5vcm1hbCBzY3JlZW4gc2l6ZScpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmFzcGVjdFJhdGlvLmdldFZhbHVlWCgpID4gdGhpcy5hc3BlY3RSYXRpby5nZXRWYWx1ZVkoKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc3RhcnRpbmcgaW4gcG9ydHJhaXQgbW9kZSAoJHt0aGlzLmFzcGVjdFJhdGlvLmdldFZhbHVlWCgpIH06JHt0aGlzLmFzcGVjdFJhdGlvLmdldFZhbHVlWSgpfSlgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYHN0YXJ0aW5nIGluIGxhbmRzY2FwZSBtb2RlICgke3RoaXMuYXNwZWN0UmF0aW8uZ2V0VmFsdWVYKCkgfToke3RoaXMuYXNwZWN0UmF0aW8uZ2V0VmFsdWVZKCl9KWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaW5kb3dIZWlnaHQgPSB0aGlzLkdldEJyb3dzZXJIZWlnaHQoY2FudmFzYWJsZUVsZW1lbnQpICogdGhpcy5zaXplUGVyY2VudC5nZXRWYWx1ZVgoKTtcclxuICAgICAgICBjb25zdCBhZGp1c3RlZFdpbmRvd1dpZHRoID0gdGhpcy5HZXRCcm93c2VyV2lkdGgoY2FudmFzYWJsZUVsZW1lbnQpICogdGhpcy5zaXplUGVyY2VudC5nZXRWYWx1ZVkoKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGlzcGxheVdpZHRoID0gTWF0aC5taW4oYWRqdXN0ZWRXaW5kb3dXaWR0aCwgKGFkanVzdGVkV2luZG93SGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpb0NhbGN1bGF0ZWQpKTtcclxuICAgICAgICBjb25zdCBkaXNwbGF5SGVpZ2h0ID0gTWF0aC5taW4oYWRqdXN0ZWRXaW5kb3dIZWlnaHQsIChhZGp1c3RlZFdpbmRvd1dpZHRoIC8gdGhpcy5hc3BlY3RSYXRpb0NhbGN1bGF0ZWQpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7XHJcbiAgICB9IFxyXG5cclxuICAgIHB1YmxpYyBHZXRTcXVhcmVJbkJyb3dzZXIoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgY29uc3QgaCA9IHRoaXMuR2V0QnJvd3NlckhlaWdodCgpIC0gNTtcclxuICAgICAgICBjb25zdCB3ID0gdGhpcy5HZXRCcm93c2VyV2lkdGgoKSAtIDU7XHJcbiAgICAgICAgaWYgKGggPCB3KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihoLCBoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodywgdyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRXaW5kb3dJbkFzcGVjdFJhdGlvKCkge1xyXG4gXHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaW5kb3dIZWlnaHQgPSB0aGlzLkdldEJyb3dzZXJIZWlnaHQoKSAqIHRoaXMuc2l6ZVBlcmNlbnQuZ2V0VmFsdWVYKCk7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaW5kb3dXaWR0aCA9IHRoaXMuR2V0QnJvd3NlcldpZHRoKCkgKiB0aGlzLnNpemVQZXJjZW50LmdldFZhbHVlWSgpO1xyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5V2lkdGggPSBNYXRoLm1pbihhZGp1c3RlZFdpbmRvd1dpZHRoLCAoYWRqdXN0ZWRXaW5kb3dIZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvQ2FsY3VsYXRlZCkpO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSBNYXRoLm1pbihhZGp1c3RlZFdpbmRvd0hlaWdodCwgKGFkanVzdGVkV2luZG93V2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvQ2FsY3VsYXRlZCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEJyb3dzZXJXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0QnJvd3NlckhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRCcm93c2VyU2l6ZSgpOiBWZWN0b3IyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEJyb3dzZXJTaXplKGJyb3dzZXJTaXplOiBWZWN0b3IyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5icm93c2VyU2l6ZSA9IGJyb3dzZXJTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWaWV3cG9ydFNpemUoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Vmlld3BvcnRTaXplKHZpZXdwb3J0U2l6ZTogVmVjdG9yMik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld3BvcnRTaXplID0gdmlld3BvcnRTaXplO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBIdG1sU2VydmljZSB9IGZyb20gXCIuL0h0bWwvZ3JhcGhpY3MuaHRtbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENhbnZhc1NlcnZpY2UgfSBmcm9tIFwiLi9DYW52YXMvZ3JhcGhpY3MuY2FudmFzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVGlsZVNlcnZpY2UgfSBmcm9tIFwiLi9UaWxlcy90aWxlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR2FtZUNhbWVyYVNlcnZpY2UgfSBmcm9tIFwiLi9DYW1lcmEvZ2FtZS1jYW1lcmEuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEcmF3aW5nU2VydmljZSB9IGZyb20gXCIuL0RyYXcvZHJhd2luZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRleHR1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vVGV4dHVyZXMvdGV4dHVyZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFBQkIgfSBmcm9tIFwiLi4vLi4vbnVtZXJpY3MvbW9kZWxzL0FBQkIubW9kZWxcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyYXBoaWNzU2VydmljZSB7XHJcbiAgICBcclxuICAgIHByaXZhdGUgaHRtbFNlcnZpY2U6IEh0bWxTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBjYW52YXNTZXJ2aWNlOiBDYW52YXNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0aWxlU2VydmljZTogVGlsZVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIGdhbWVDYW1lcmFTZXJ2aWNlOiBHYW1lQ2FtZXJhU2VydmljZTtcclxuICAgIHByaXZhdGUgZHJhd2luZ1NlcnZpY2U6IERyYXdpbmdTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0dXJlU2VydmljZTogVGV4dHVyZVNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3N0YXJ0aW5nIGdyYXBoaWNzIHNlcnZpY2UnKTtcclxuICAgICAgICB0aGlzLmh0bWxTZXJ2aWNlID0gbmV3IEh0bWxTZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5jYW52YXNTZXJ2aWNlID0gbmV3IENhbnZhc1NlcnZpY2UodGhpcy5odG1sU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy50aWxlU2VydmljZSA9IG5ldyBUaWxlU2VydmljZSh0aGlzLmNhbnZhc1NlcnZpY2UsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZVNlcnZpY2UgPSBuZXcgVGV4dHVyZVNlcnZpY2UoKTtcclxuICAgICAgICBjb25zdCBhcHBseUNhbWVyYVdvcmxkQm91bmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdhbWVDYW1lcmFTZXJ2aWNlID0gbmV3IEdhbWVDYW1lcmFTZXJ2aWNlKDAsIDAsIGFwcGx5Q2FtZXJhV29ybGRCb3VuZGluZyk7XHJcbiAgICAgICAgdGhpcy5kcmF3aW5nU2VydmljZSA9IG5ldyBEcmF3aW5nU2VydmljZSh0aGlzLmdhbWVDYW1lcmFTZXJ2aWNlLCB0aGlzLmNhbnZhc1NlcnZpY2UsIHRoaXMudGV4dHVyZVNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgSW5pdEdyYXBoaWNzU2VydmljZSgpIHtcclxuICAgICAgICB0aGlzLmh0bWxTZXJ2aWNlLkluaXQoKTtcclxuICAgICAgICB0aGlzLmNhbnZhc1NlcnZpY2UuSW5pdCgpO1xyXG4gICAgICAgIHRoaXMudGlsZVNlcnZpY2UuSW5pdCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VGV4dHVyZVNlcnZpY2UoKTogVGV4dHVyZVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIEdldFRpbGVTZXJ2aWNlKCk6IFRpbGVTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2VydmljZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRHYW1lQ2FtZXJhU2VydmljZSgpOiBHYW1lQ2FtZXJhU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZUNhbWVyYVNlcnZpY2U7XHJcbiAgICB9XHJcbiAgICBnZXREcmF3aW5nU2VydmljZSgpOiBEcmF3aW5nU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd2luZ1NlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgUmVnaXN0ZXJEcmF3YWJsZUVudGl0eShpZDogc3RyaW5nID0gbnVsbCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzU2VydmljZS5SZWdpc3Rlck5ld0NhbnZhcyhpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0Q2FudmFzKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXNTZXJ2aWNlLkdldENhbnZhcyhpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgUmVuZGVyKCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZW5kZXJpbmcgaW4gZ3JhcGhpY3Mgc2VydmljZScpO1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2VydmljZS5tYWluQ2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLFxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NlcnZpY2UubWFpbkNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXNTZXJ2aWNlLm1haW5DYW52YXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhbnZhc1NlcnZpY2UuZHJhd2FibGVBcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NlcnZpY2UubWFpbkNhbnZhc0N0eC5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NlcnZpY2UuZHJhd2FibGVBcmVhc1tpXS5jYW52YXMsIDAsIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IElucHV0U3RhdGUgfSBmcm9tIFwiLi9pbnB1dC1zdGF0ZVwiO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSBcIi4uLy4uL251bWVyaWNzL21vZGVscy9WZWN0b3IyLm1vZGVsXCI7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dE1hbmFnZXIge1xyXG5cclxuICAgIHByaXZhdGUgaW5wdXRTdGF0ZTogSW5wdXRTdGF0ZTtcclxuXHJcbiAgICBjdXJyZW50SW5wdXRzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdmFsaWRJbnB1dHM6IEFycmF5PHN0cmluZz4gPSBbJ3cnLCAnYScsICdzJywgJ2QnLCAnICddO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIGdhbWVQYWRzOiBBcnJheTxHYW1lcGFkPiA9IEFycmF5PEdhbWVwYWQ+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlID0gbmV3IElucHV0U3RhdGUoKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudElucHV0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgdGhpcy5nYW1lUGFkcyA9IG5ldyBBcnJheTxHYW1lcGFkPigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogc2V0cyB1cCB0aGUgaW5wdXQgbWFuYWdlclxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBJbnB1dE1hbmFnZXJcclxuICAgICAqL1xyXG4gICAgSW5pdElucHV0TWFuYWdlcigpIHtcclxuICAgICAgICB0aGlzLmlucHV0U3RhdGUuSW5pdCgpO1xyXG4gICAgICAgIC8vIHJldHVybjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjaGVja3MgZm9yIG5ldyBpbnB1dHMuIFNob3VsZCBiZSBjYWxsZWQgaW4gYSBsb29wXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIElucHV0TWFuYWdlclxyXG4gICAgICovXHJcbiAgICBOZXdJbnB1dExvb3BDaGVjaygpIHtcclxuICAgICAgICB0aGlzLmlucHV0U3RhdGUuVXBkYXRlSW5wdXRzKCk7XHJcbiAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBSZWdpc3RlckdhbWVQYWQocGFkOiBHYW1lcGFkKSB7XHJcbiAgICAvLyAgICAgY29uc29sZS53YXJuKCdnYW1lcGFkIHJlZ2lzdGVyZWQnKTtcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oXCJHYW1lcGFkOiBjb25uZWN0ZWQgYXQgaW5kZXggJWQ6ICVzLiAlZCBidXR0b25zLCAlZCBheGVzLlwiLFxyXG4gICAgLy8gICAgICAgICBwYWQuaW5kZXgsIHBhZC5pZCxcclxuICAgIC8vICAgICAgICAgcGFkLmJ1dHRvbnMubGVuZ3RoLCBwYWQuYXhlcy5sZW5ndGgpO1xyXG4gICAgLy8gICAgIHRoaXMuZ2FtZVBhZHMgPSBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKTtcclxuICAgIC8vICAgICAvLyB0aGlzLmdhbWVQYWRzLnB1c2gocGFkKTsgLy8gID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzID8gbmF2aWdhdG9yLmdldEdhbWVwYWRzKCkgOiAobmF2aWdhdG9yLmdldEdhbWVwYWRzID8gbmF2aWdhdG9yLmdldEdhbWVwYWRzIDogW10pO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ2FtZVBhZHMubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgdGhpc0dwID0gdGhpcy5nYW1lUGFkc1tpXTtcclxuICAgIC8vICAgICAgICAgaWYgKHRoaXNHcCkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5kZXRhaWxzRGl2LmlubmVySFRNTCA9IFwiR2FtZXBhZCBjb25uZWN0ZWQgYXQgaW5kZXggXCIgKyB0aGlzR3AuaW5kZXggKyBcIjogXCIgKyB0aGlzR3AuaWQgK1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIFwiLiBJdCBoYXMgXCIgKyB0aGlzR3AuYnV0dG9ucy5sZW5ndGggKyBcIiBidXR0b25zIGFuZCBcIiArIHRoaXNHcC5heGVzLmxlbmd0aCArIFwiIGF4ZXMuXCI7XHJcblxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJpdmF0ZSBEZVJlZ2lzdGVyR2FtZVBhZChwYWQ6IEdhbWVwYWQpIHtcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oJ2RlcmVnaXN0ZXJpbmcgZ2FtZXBhZCcpO1xyXG4gICAgLy8gICAgIGRlbGV0ZSB0aGlzLmdhbWVQYWRzW3BhZC5pbmRleF07XHJcbiAgICAvLyAgICAgdGhpcy5SZXBvcnRUb0h0bWwoXCJnYW1lcGFkIERDXCIpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcHVibGljIG1ldGhvZCB0byBjaGVjayBpZiBhIGtleSBpcyBwcmVzc2VkIG9yIG5vdFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAbWVtYmVyb2YgSW5wdXRNYW5hZ2VyXHJcbiAgICAgKi9cclxuICAgIElzS2V5UHJlc3NlZChpbnB1dERlc2NyaXB0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dFN0YXRlLklzSW5wdXRQcmVzc2VkKGlucHV0RGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZ2V0cyB0aGUgZm9yY2UgdmFsdWUgZm9yIGEgZ2l2ZW4gaW5wdXQuIElmIGl0J3MgaW4gXHJcbiAgICAgKiBrZXlib2FyZCBtb2RlLCB0aGVuIGl0IGp1c3QgcmV0dXJucyAwIG9yIDFcclxuICAgICAqIFxyXG4gICAgICogSWYgaXQncyBpbiBrZXlib2FyZCBtb2RlLCB0aGVuIGl0IHJldHVybnMgYSB2YWx1ZSBvZiAtMS4wIHRvICsxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXREZXNjcmlwdGlvblxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqIEBtZW1iZXJvZiBJbnB1dE1hbmFnZXJcclxuICAgICAqL1xyXG4gICAgR2V0Rm9yY2VWYWx1ZShpbnB1dERlc2NyaXB0aW9uOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0U3RhdGUuR2V0Rm9yY2VWYWx1ZShpbnB1dERlc2NyaXB0aW9uKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbnB1dCB9IGZyb20gXCIuL2lucHV0Lm1vZGVsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRTdGF0ZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1lTVEVNX0tFWVM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgICdGMScsXHJcbiAgICAgICAgJ0YyJyxcclxuICAgICAgICAnRjMnLFxyXG4gICAgICAgICdGNCcsXHJcbiAgICAgICAgJ0Y1JyxcclxuICAgICAgICAnRjYnLFxyXG4gICAgICAgICdGNycsXHJcbiAgICAgICAgJ0Y4JyxcclxuICAgICAgICAnRjknLFxyXG4gICAgICAgICdGMTAnLFxyXG4gICAgICAgICdGMTEnLFxyXG4gICAgICAgICdGMTInLFxyXG4gICAgXTtcclxuICAgIHByaXZhdGUgc3RhdGljIERFRkFVTFRfTUFYX0lOUFVUUzogbnVtYmVyID0gNDtcclxuICAgIHByaXZhdGUgc3RhdGljIERFRkFVTFRfTUlOX0pPWVNUSUNLX1NFTlNJVElWSVRZOiBudW1iZXIgPSAwLjE7XHJcbiAgICBwcml2YXRlIGRldGFpbHNEaXY6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIHByaXZhdGUgcmVnaXN0ZXJlZEdhbWVQYWRzOiBHYW1lcGFkW107XHJcbiAgICBwcml2YXRlIGdhbWVQYWRzOiBHYW1lcGFkW107XHJcbiAgICBwcml2YXRlIGN1cnJlbnRJbnB1dHM6IEFycmF5PElucHV0PjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnRyb2xsaW5nV2l0aFBhZCA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2lucHV0U3RhdGU6IGNvbnN0cnVjdGluZyBpbnB1dCBzdGF0ZScpO1xyXG4gICAgICAgIHRoaXMuZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRhaWxzX2RpdicpO1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZEdhbWVQYWRzID0gbmV3IEFycmF5PEdhbWVwYWQ+KCk7XHJcbiAgICAgICAgdGhpcy5nYW1lUGFkcyA9IG5ldyBBcnJheTxHYW1lcGFkPigpO1xyXG4gICAgfVxyXG5cclxuICAgIEluaXQoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2lucHV0U3RhdGU6IGluaXQgaW5wdXRzdGF0ZScpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBJbnB1dHMoKTtcclxuICAgICAgICB0aGlzLlNldHVwR2FtZVBhZFJlZ2lzdHJhdGlvbldhdGNoKCk7XHJcbiAgICAgICAgdGhpcy5TZXR1cEtleWJvYXJkSW5wdXRXYXRjaCgpO1xyXG4gICAgICAgIHRoaXMuU2V0R2FtZVBhZE1vZGUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgU2V0R2FtZVBhZE1vZGUoY29udHJvbGxpbmdXaXRoUGFkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGluZ1dpdGhQYWQgPSBjb250cm9sbGluZ1dpdGhQYWQ7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xsaW5nV2l0aFBhZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNEaXYuaW5uZXJIVE1MID0gJ2NvbnRyb2xsaW5nIHdpdGggZ2FtZXBhZC4gUHJlc3MgPj4gayA8PCB0byB1c2Uga2V5Ym9hcmQgbW9kZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzRGl2LmlubmVySFRNTCA9ICdjb250cm9sbGluZyB3aXRoIGtleWJvYXJkLiBQcmVzcyA+PiBzZWxlY3QgPDwgdG8gdXNlIGdhbWVwYWQgbW9kZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBHZXRHYW1lUGFkTW9kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGluZ1dpdGhQYWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2dhbWVwYWQvI3JlbWFwcGluZ1xyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBJbnB1dFN0YXRlXHJcbiAgICAgKi9cclxuICAgIHNldHVwSW5wdXRzKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudElucHV0cyA9IG5ldyBBcnJheTxJbnB1dD4oKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJbnB1dHMucHVzaChcclxuICAgICAgICAgICAgbmV3IElucHV0KCdkaXJlY3Rpb25fbGVmdCcsICdhJywgMTQsIG51bGwpLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2RpcmVjdGlvbl9yaWdodCcsICdkJywgMTUsIG51bGwpLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2RpcmVjdGlvbl91cCcsICd3JywgMTIsIG51bGwpLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2RpcmVjdGlvbl9kb3duJywgJ3MnLCAxMywgbnVsbCksXHJcblxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2F4ZXNfcGFkX2xlZnRfaG9yaXpvbnRhbCcsIG51bGwsIG51bGwsIDApLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2F4ZXNfcGFkX2xlZnRfdmVydGljYWwnLCBudWxsLCBudWxsLCAxKSxcclxuICAgICAgICAgICAgbmV3IElucHV0KCdheGVzX3BhZF9yaWdodF9ob3Jpem9udGFsJywgbnVsbCwgbnVsbCwgMiksXHJcbiAgICAgICAgICAgIG5ldyBJbnB1dCgnYXhlc19wYWRfcmlnaHRfdmVydGljYWwnLCBudWxsLCBudWxsLCAzKSxcclxuXHJcbiAgICAgICAgICAgIG5ldyBJbnB1dCgndHJpZ2dlcl9vbmVfbGVmdCcsICdxJywgNCwgbnVsbCksXHJcbiAgICAgICAgICAgIG5ldyBJbnB1dCgndHJpZ2dlcl90d29fbGVmdCcsICd3JywgNiwgbnVsbCksXHJcbiAgICAgICAgICAgIG5ldyBJbnB1dCgndHJpZ2dlcl9vbmVfcmlnaHQnLCAnZScsIDUsIG51bGwpLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ3RyaWdnZXJfdHdvX3JpZ2h0JywgJ3MnLCA3LCBudWxsKSxcclxuXHJcbiAgICAgICAgICAgIC8vICdhY3Rpb25fe3ZhbH0nIHdoZXJlIHt2YWx9IGlzIHRoZSBcclxuICAgICAgICAgICAgLy8gbmFtZSBvZiB0aGUgYnV0dG9uIG9uIGFuIFhCb3gzNjAgY29udHJvbGxlclxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2FjdGlvbl9hJywgJyAnLCAwLCBudWxsKSxcclxuICAgICAgICAgICAgbmV3IElucHV0KCdhY3Rpb25feScsICd6JywgMywgbnVsbCksXHJcbiAgICAgICAgICAgIG5ldyBJbnB1dCgnYWN0aW9uX3gnLCAneCcsIDIsIG51bGwpLFxyXG4gICAgICAgICAgICBuZXcgSW5wdXQoJ2FjdGlvbl9iJywgJ2MnLCAxLCBudWxsKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgVXBkYXRlSW5wdXRzKCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbnB1dHN0YXRlOiB1cGRhdGluZyBpbnB1dHMuIFRoZXJlIGFyZSAnICsgdGhpcy5yZWdpc3RlcmVkR2FtZVBhZHMubGVuZ3RoICsgJyBwYWRzIGNvbm5lY3RlZCcpXHJcblxyXG4gICAgICAgIHRoaXMuVXBkYXRlR2FtZVBhZElucHV0cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgUmVzZXRJbnB1dHNCZWZvcmVHYW1lUGFkSW5wdXQoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaW5wdXQgb2YgdGhpcy5jdXJyZW50SW5wdXRzKSB7XHJcbiAgICAgICAgICAgIGlucHV0Lndhc1ByZXNzZWRQcmV2aW91c0NoZWNrID0gaW5wdXQucHJlc3NlZDtcclxuICAgICAgICAgICAgaW5wdXQucHJlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgVXBkYXRlR2FtZVBhZElucHV0cygpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVnaXN0ZXJlZEdhbWVQYWRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZFRvQ2hlY2sgPSB0aGlzLkdldEdhbWVQYWQoaSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldEdhbWVQYWRNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZXRJbnB1dHNCZWZvcmVHYW1lUGFkSW5wdXQoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGJ0bkluZGV4ID0gMDsgYnRuSW5kZXggPCBwYWRUb0NoZWNrLmJ1dHRvbnMubGVuZ3RoOyBidG5JbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2FtZVBhZEJ1dHRvblByZXNzZWQocGFkVG9DaGVjay5idXR0b25zW2J0bkluZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoVG9DdXJyZW50SW5wdXRzRnJvbUdhbWVQYWQoYnRuSW5kZXgsIHBhZFRvQ2hlY2suYnV0dG9uc1tidG5JbmRleF0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgaW5wdXRzdGF0ZTogYnRuICR7YnRuSW5kZXh9IGlzIHByZXNzZWRgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGF4ZXNJbmRleCA9IDA7IGF4ZXNJbmRleCA8IHBhZFRvQ2hlY2suYXhlcy5sZW5ndGg7IGF4ZXNJbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2FtZVBhZEF4ZXNQcmVzc2VkKHBhZFRvQ2hlY2suYXhlc1theGVzSW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hUb0N1cnJlbnRJbnB1dHNGcm9tR2FtZVBhZEF4ZXMoYXhlc0luZGV4LCBwYWRUb0NoZWNrLmF4ZXNbYXhlc0luZGV4XSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nYW1lUGFkQnV0dG9uUHJlc3NlZChwYWRUb0NoZWNrLmJ1dHRvbnNbOF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdpbnB1dHN0YXRlOiBpbiBnYW1lcGFkIG1vZGUnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldEdhbWVQYWRNb2RlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBJc0lucHV0UHJlc3NlZChpbnB1dERlc2NyaXB0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGxldCBpbnB1dCBvZiB0aGlzLmN1cnJlbnRJbnB1dHMpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0Lm5hbWUgPT09IGlucHV0RGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5wcmVzc2VkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIEdldEZvcmNlVmFsdWUoaW5wdXREZXNjcmlwdGlvbjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBmb3IgKGxldCBpbnB1dCBvZiB0aGlzLmN1cnJlbnRJbnB1dHMpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0Lm5hbWUgPT09IGlucHV0RGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5mb3JjZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNoZWNrcyBpZiB0aGlzIGtleSBpcyBpbiB0aGUgU1lTVEVNX0tFWVMgYXJyYXlcclxuICAgICAqIChpbmNsdWRlcyBrZXlzIGxpa2UgRjEgLSBGMTIpXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAbWVtYmVyb2YgSW5wdXRTdGF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzU3lzdGVtS2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKElucHV0U3RhdGUuU1lTVEVNX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgU2V0dXBLZXlib2FyZElucHV0V2F0Y2goKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1N5c3RlbUtleShldmVudC5rZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoVG9DdXJyZW50SW5wdXRzRnJvbUtleWJvYXJkKGV2ZW50LmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTeXN0ZW1LZXkoZXZlbnQua2V5KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvcEZyb21DdXJyZW50SW5wdXRzRnJvbUtleWJvYXJkKGV2ZW50LmtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnaycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGlucHV0c3RhdGU6IGNvbnRyb2xsaW5nIGJ5IGtleWJvYXJkYClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldEdhbWVQYWRNb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVzaFRvQ3VycmVudElucHV0c0Zyb21LZXlib2FyZChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLkdldEdhbWVQYWRNb2RlKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHRoaXNJbnB1dCBvZiB0aGlzLmN1cnJlbnRJbnB1dHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzSW5wdXQua2V5Ym9hcmRJZCA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc0lucHV0LnByZXNzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXNJbnB1dC5mb3JjZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYGlucHV0c3RhdGUgbWFya2VkICR7dGhpc0lucHV0Lm5hbWV9IGFzIHByZXNzZWQgd2l0aCBmb3JjZSAke3RoaXNJbnB1dC5mb3JjZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHBvcEZyb21DdXJyZW50SW5wdXRzRnJvbUtleWJvYXJkKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0R2FtZVBhZE1vZGUoKSA9PT0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGlucHV0IG9mIHRoaXMuY3VycmVudElucHV0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmtleWJvYXJkSWQgPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnByZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgaW5wdXRzdGF0ZSBtYXJrZWQgJHtpbnB1dC5uYW1lfSBhcyBwcmVzc2VkYClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVzaFRvQ3VycmVudElucHV0c0Zyb21HYW1lUGFkKGJ0bklkOiBudW1iZXIsIHB1c2hGb3JjZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgdGhpc0lucHV0IG9mIHRoaXMuY3VycmVudElucHV0cykge1xyXG4gICAgICAgICAgICBpZiAodGhpc0lucHV0LmdhbWVwYWRJZCA9PT0gYnRuSWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNJbnB1dC5wcmVzc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXNJbnB1dC5mb3JjZSA9IHB1c2hGb3JjZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBpbnB1dHN0YXRlIG1hcmtlZCAke3RoaXNJbnB1dC5uYW1lfSBhcyBwcmVzc2VkIHdpdGggZm9yY2UgJHt0aGlzSW5wdXQuZm9yY2V9YClcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1c2hUb0N1cnJlbnRJbnB1dHNGcm9tR2FtZVBhZEF4ZXMoYXhlc0luZGV4OiBudW1iZXIsIHB1c2hGb3JjZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgdGhpc0lucHV0IG9mIHRoaXMuY3VycmVudElucHV0cykge1xyXG4gICAgICAgICAgICBpZiAodGhpc0lucHV0LmdhbWVQYWRBeGVzSWQgPT09IGF4ZXNJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdGhpc0lucHV0LnByZXNzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpc0lucHV0LmZvcmNlID0gcHVzaEZvcmNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYGlucHV0c3RhdGUgbWFya2VkICR7dGhpc0lucHV0Lm5hbWV9IGFzIHByZXNzZWQgd2l0aCBmb3JjZSAke3RoaXNJbnB1dC5mb3JjZX1gKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcG9wRnJvbUN1cnJlbnRJbnB1dHNGcm9tR2FtZVBhZChidG5JZDogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaW5wdXQgb2YgdGhpcy5jdXJyZW50SW5wdXRzKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dC5nYW1lcGFkSWQgPT09IGJ0bklkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5wcmVzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgaW5wdXRzdGF0ZSBtYXJrZWQgJHtpbnB1dC5uYW1lfSBhcyBub3RgKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiBHYW1lUGFkIGNvZGUgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqICB3YXRjaGVzIGZvciB0aGUgZ2FtZSBwYWQgcmVnaXN0cmF0aW9uIGV2ZW50c1xyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBJbnB1dFN0YXRlXHJcbiAgICAgKi9cclxuICAgIFNldHVwR2FtZVBhZFJlZ2lzdHJhdGlvbldhdGNoKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpbnB1dHN0YXRlIHNldHRpbmcgdXAgcmVnaXN0cmF0aW9ucycpXHJcblxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdnYW1lcGFkY29ubmVjdGVkJywgKGU6IEdhbWVwYWRFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaW5wdXRzdGF0ZSBnb3QgZ2FtZXBhZCcpXHJcbiAgICAgICAgICAgIHRoaXMuUmVnaXN0ZXJHYW1lUGFkKGUuZ2FtZXBhZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRkaXNjb25uZWN0ZWQnLCAoZTogR2FtZXBhZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2lucHV0c3RhdGUgZ2FtZXBhZCB3YXMgZGlzY29ubmVjdGVkJyk7XHJcbiAgICAgICAgICAgIHRoaXMuRGVSZWdpc3RlckdhbWVQYWQoZS5nYW1lcGFkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBSZWdpc3RlckdhbWVQYWQoZ2FtZVBhZDogR2FtZXBhZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcImlucHV0c3RhdGU6IEdhbWVwYWQ6IGNvbm5lY3RlZCBhdCBpbmRleCAlZDogJXMuICVkIGJ1dHRvbnMsICVkIGF4ZXMuXCIsXHJcbiAgICAgICAgICAgIGdhbWVQYWQuaW5kZXgsIGdhbWVQYWQuaWQsXHJcbiAgICAgICAgICAgIGdhbWVQYWQuYnV0dG9ucy5sZW5ndGgsIGdhbWVQYWQuYXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZEdhbWVQYWRzW2dhbWVQYWQuaW5kZXhdID0gZ2FtZVBhZDtcclxuICAgICAgICB0aGlzLmRldGFpbHNEaXYuaW5uZXJIVE1MID0gJ0dhbWVwYWQgaGFzIGJlZW4gY29ubmVjdGVkJztcclxuXHJcblxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBEZVJlZ2lzdGVyR2FtZVBhZChnYW1lUGFkOiBHYW1lcGFkKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcImlucHV0c3RhdGU6IEdhbWVwYWQ6IGNvbm5lY3RlZCBhdCBpbmRleCAlZDogJXMuICVkIGJ1dHRvbnMsICVkIGF4ZXMuXCIsXHJcbiAgICAgICAgICAgIGdhbWVQYWQuaW5kZXgsIGdhbWVQYWQuaWQsXHJcbiAgICAgICAgICAgIGdhbWVQYWQuYnV0dG9ucy5sZW5ndGgsIGdhbWVQYWQuYXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuR2V0R2FtZVBhZHMoKTtcclxuICAgICAgICB0aGlzLmRldGFpbHNEaXYuaW5uZXJIVE1MID0gJ2lucHV0c3RhdGU6IEdhbWVwYWQgaGFzIGJlZW4gZGlzY29ubmVjdGVkJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldEdhbWVQYWRzKCkge1xyXG4gICAgICAgIHRoaXMuZ2FtZVBhZHMgPSBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgR2V0R2FtZVBhZChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5nZXRHYW1lcGFkcygpW2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdhbWVQYWRBeGVzUHJlc3NlZChheGVzOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gKGF4ZXMgPiBJbnB1dFN0YXRlLkRFRkFVTFRfTUlOX0pPWVNUSUNLX1NFTlNJVElWSVRZIHx8IGF4ZXMgPCAtSW5wdXRTdGF0ZS5ERUZBVUxUX01JTl9KT1lTVElDS19TRU5TSVRJVklUWSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnYW1lUGFkQnV0dG9uUHJlc3NlZChidG46IEdhbWVwYWRCdXR0b24pIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YoYnRuKSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoYnRuKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgLy8gZmlyZWZveFxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZ2FtZXBhZDogZmYnKVxyXG4gICAgICAgICAgICBpZiAoYnRuLnByZXNzZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbnB1dHN0YXRlOiBidXR0b24gaXMgcHJlc3NlZCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGJ0bi52YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5wdXRzdGF0ZTogZ2FtZXBhZDogY2hyb21lJylcclxuICAgICAgICAgICAgcmV0dXJuIGJ0biA9PT0gMS4wO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBJbnB1dCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBuYW1lOiBzdHJpbmcsIFxyXG4gICAgICAgIGtleWJvYXJkSWQ6IHN0cmluZywgXHJcbiAgICAgICAgZ2FtZXBhZElkOiBudW1iZXIsIFxyXG4gICAgICAgIGdhbWVQYWRBeGVzSWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5rZXlib2FyZElkID0ga2V5Ym9hcmRJZDtcclxuICAgICAgICB0aGlzLmdhbWVwYWRJZCA9IGdhbWVwYWRJZDtcclxuICAgICAgICB0aGlzLmdhbWVQYWRBeGVzSWQgPSBnYW1lUGFkQXhlc0lkO1xyXG4gICAgfVxyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAga2V5Ym9hcmRJZDogc3RyaW5nO1xyXG4gICAgZ2FtZXBhZElkOiBudW1iZXI7XHJcbiAgICBnYW1lUGFkQXhlc0lkOiBudW1iZXI7XHJcbiAgICBwcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yY2U6IG51bWJlciA9IDA7XHJcblxyXG4gICAgd2FzUHJlc3NlZFByZXZpb3VzQ2hlY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG4iLCJpbXBvcnQgeyBCYXNlU3RhdGUgfSBmcm9tIFwiLi9fQmFzZVN0YXRlXCI7XHJcbmltcG9ydCB7IEdhbWVDYW1lcmFTZXJ2aWNlIH0gZnJvbSBcIi4uL0dyYXBoaWNzL0NhbWVyYS9nYW1lLWNhbWVyYS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdyYXBoaWNzU2VydmljZSB9IGZyb20gXCIuLi9HcmFwaGljcy9ncmFwaGljcy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR2FtZVN0YXRlIGV4dGVuZHMgQmFzZVN0YXRlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyYXBoaWNzU2VydmljZTogR3JhcGhpY3NTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnY29uc3RydWN0aW5nIEdhbWVTdGF0ZScpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFRpY2soKTogdm9pZCB7XHJcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgICAgIC8vIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLmdldEdhbWVDYW1lcmFTZXJ2aWNlKCkuTW92ZUNhbWVyYSgxLCAwKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFJlbmRlcigpOiB2b2lkIHtcclxuICAgICAgICAvLyBjb25zb2xlLmVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEJhc2VTdGF0ZSB9IGZyb20gXCIuL19CYXNlU3RhdGVcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTWVudVN0YXRlIGV4dGVuZHMgQmFzZVN0YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGNvbnN0cnVjdGluZyBNZW51U3RhdGVgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVGljaygpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBSZW5kZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VTdGF0ZSB9IGZyb20gXCIuL19CYXNlU3RhdGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1N0YXRlIGV4dGVuZHMgQmFzZVN0YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGNvbnN0cnVjdGluZyBTZXR0aW5nc1N0YXRlYCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFRpY2soKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBSZW5kZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG59XHJcbiIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU3RhdGUge1xyXG5cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBUaWNrKCk6IHZvaWQ7XHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgUmVuZGVyKCk6IHZvaWQ7XHJcbn0gIiwiaW1wb3J0IHsgQmFzZVN0YXRlIH0gZnJvbSBcIi4vX0Jhc2VTdGF0ZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN0YXRlU2VydmljZSB7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRTdGF0ZTogQmFzZVN0YXRlID0gbnVsbDtcclxuXHJcblxyXG4gICAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBCYXNlU3RhdGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEdldFN0YXRlKCk6IEJhc2VTdGF0ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlO1xyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCBjbGFzcyBHdWlkR2VuZXJhdG9yIHtcclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyBhIG5ldyBndWlkXHJcbiAgICAgKiBcclxuICAgICAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzXHJcbiAgICAgKlxyXG4gICAgICogQGV4cG9ydFxyXG4gICAgICogQHJldHVybnMgYSBndWlkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBOZXdHdWlkKCkge1xyXG4gICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSYW5kb21OdW1iZXJHZW5lcmF0b3Ige1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXJcclxuICAgICAqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICogQG1lbWJlcm9mIFJhbmRvbU51bWJlckdlbmVyYXRvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFJhbmRvbU51bWJlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZ2VuZXJhdGVzIGEgcmFuZG9tIFZlY3RvciAyXHJcbiAgICAgKlxyXG4gICAgICogQHN0YXRpY1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhYXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluWVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heFlcclxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfVxyXG4gICAgICogQG1lbWJlcm9mIFJhbmRvbU51bWJlckdlbmVyYXRvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFJhbmRvbVZlY3RvcjIoXHJcbiAgICAgICAgbWluWDogbnVtYmVyLCBtYXhYOiBudW1iZXIsIFxyXG4gICAgICAgIG1pblk6IG51bWJlciwgbWF4WTogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHRoaXMuR2V0UmFuZG9tTnVtYmVyKG1pblgsIG1heFgpLFxyXG4gICAgICAgICAgICB0aGlzLkdldFJhbmRvbU51bWJlcihtaW5ZLCBtYXhZKSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUmFuZG9tU3RyaW5nR2VuZXJhdG9yIHtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRSYW5kb21IZXhDb2xvdXIoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJyMnICsgKE1hdGgucmFuZG9tKCkgKiAweEZGRkZGRiA8PCAwKS50b1N0cmluZygxNik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgKiBhcyBqc29uIGZyb20gJy4uLy4uL2Fzc2V0cy9fZGlzdC9Xb3JsZHMvd29ybGRzLmpzb24nO1xyXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gJy4vd29ybGQnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWwnO1xyXG5cclxuLyoqXHJcbiAqIHRoaXMgaXMgaW4gYSBkaWZmZXJlbnQgZmlsZSBiZWNhdXNlIGFkZGluZyAuanNvbiBmaWxlc1xyXG4gKiBjYXVzZXMgVlNDb2RlIHRvIG9ubHkgd2FudCB0byBsb2FkIC5qcyBpbXBvcnRzLCBhbmQgbm90XHJcbiAqIC50cyBpbXBvcnRzXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIFdvcmxkSnNvbkZpbGVMb2FkZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBXb3JsZEpzb25GaWxlTG9hZGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIHdvcmxkQ291bnQ6IG51bWJlciA9IDI7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFdvcmxkcygpOiBXb3JsZFtdIHtcclxuICAgICAgICBjb25zdCB3b3JsZEFyciA9IG5ldyBBcnJheTxXb3JsZD4oKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud29ybGRDb3VudDsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGpzb25baV07XHJcbiAgICAgICAgICAgIHdvcmxkQXJyLnB1c2gobmV3IFdvcmxkKFxyXG4gICAgICAgICAgICAgICAgbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICAgICAgd29ybGQudGlsZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLnRpbGVzWzBdLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICBuZXcgVmVjdG9yMihcclxuICAgICAgICAgICAgICAgICAgICB3b3JsZC5zdGFydC54LFxyXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLnN0YXJ0LnkpLFxyXG4gICAgICAgICAgICAgICAgd29ybGQudGlsZXMsXHJcbiAgICAgICAgICAgICAgICB3b3JsZC53b3JsZElkXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd29ybGRBcnI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWwnO1xyXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gJy4vd29ybGQnO1xyXG5pbXBvcnQgeyBXb3JsZEpzb25GaWxlTG9hZGVyIH0gZnJvbSAnLi93b3JsZC5qc29uZmlsZXMnO1xyXG5pbXBvcnQgeyBUaWxlU2VydmljZSB9IGZyb20gJy4uL0dyYXBoaWNzL1RpbGVzL3RpbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IEFBQkIgfSBmcm9tICcuLi8uLi9udW1lcmljcy9tb2RlbHMvQUFCQi5tb2RlbCc7XHJcbmltcG9ydCB7IFZlY3RvcjJIZWxwZXJzIH0gZnJvbSAnLi4vLi4vbnVtZXJpY3MvaGVscGVycy92ZWN0b3IyLmhlbHBlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgV29ybGRTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGN1cnJlbnRXb3JsZElkOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSB3b3JsZHM6IFdvcmxkW10gPSBuZXcgQXJyYXk8V29ybGQ+KCk7XHJcbiAgICBwcml2YXRlIHRpbGVTZXJ2aWNlOiBUaWxlU2VydmljZTtcclxuICAgIHByaXZhdGUgc2l6ZTogVmVjdG9yMjtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IodGlsZVNlcnZpY2U6IFRpbGVTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy50aWxlU2VydmljZSA9IHRpbGVTZXJ2aWNlO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIEluaXQoKSB7XHJcbiAgICAgICAgdGhpcy53b3JsZHMgPSBXb3JsZEpzb25GaWxlTG9hZGVyLkdldFdvcmxkcygpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGB0aGlzLndvcmxkcyA9ICR7SlNPTi5zdHJpbmdpZnkodGhpcy53b3JsZHMpfSBsZW5ndGggaXMgJHt0aGlzLndvcmxkcy5sZW5ndGh9YCk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnc2V0dGluZyBjdXJyZW50IHdvcmxkIHRvIGluZGV4IDAnKTtcclxuICAgICAgICB0aGlzLlNldFdvcmxkKDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTZXRXb3JsZChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5EZVJlZ2lzdGVyV29ybGQoKTtcclxuICAgICAgICB0aGlzLnRpbGVTZXJ2aWNlLnNldHVwVGlsZXNGcm9tQXJyYXkodGhpcy5HZXRXb3JsZChpbmRleCkuR2V0VGlsZXMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFdvcmxkU2l6ZSgpOiBBQUJCIHtcclxuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMudGlsZVNlcnZpY2UuR2V0VGlsZVNpemUoKTtcclxuICAgICAgICB0aGlzLnNpemUgPSBWZWN0b3IySGVscGVycy5NdWx0aXBseUJ5U2NhbGUodGlsZVNpemUsIDIpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGB0aGlzLnNpemU6ICR7dGhpcy5zaXplfWApO1xyXG4gICAgICAgIGNvbnN0IHdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMigwLCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBQUJCKFxyXG4gICAgICAgICAgICB3b3JsZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0aGlzLnNpemVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBEZVJlZ2lzdGVyV29ybGQoKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIiBEZVJlZ2lzdGVyV29ybGQ6IE1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0U3RhcnRpbmdQb3NpdGlvbih3b3JsZEluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53b3JsZHNbd29ybGRJbmRleF0uR2V0U3RhcnRpbmdQb3NpdGlvbigpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0V29ybGQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMud29ybGRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZGV4IFske2luZGV4fV0gb3V0IG9mIHJhbmdlIG9mIHdvcmxkIGFycmF5IChsZW5ndGg6ICR7dGhpcy53b3JsZHMubGVuZ3RofSlgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzWzBdO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCIuLi8uLi9udW1lcmljcy9tb2RlbHMvVmVjdG9yMi5tb2RlbFwiO1xyXG5leHBvcnQgY2xhc3MgV29ybGQge1xyXG4gICAgLy8gcHJpdmF0ZSBnYW1lOiBHYW1lO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIGlkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGFyZWE6IFZlY3RvcjIgPSBuZXcgVmVjdG9yMigyMCwgMjApO1xyXG4gICAgcHJpdmF0ZSBzcGF3bjogVmVjdG9yMjtcclxuICAgIHByaXZhdGUgdGlsZXM6IG51bWJlcltdW107XHJcbiAgICBjb25zdHJ1Y3RvcihhcmVhOiBWZWN0b3IyLCBzcGF3bjogVmVjdG9yMiwgXHJcbiAgICAgICAgdGlsZXM6IG51bWJlcltdW10sIGlkOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgdGhpcy5zcGF3biA9IHNwYXduOyBcclxuICAgICAgICAgICAgdGhpcy50aWxlcyA9IHRpbGVzO1xyXG4gICAgICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0VGlsZXMgKCk6IG51bWJlcltdW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEdldFN0YXJ0aW5nUG9zaXRpb24oKSB7XHJcbiAgICAgICByZXR1cm4gdGhpcy5zcGF3bjsgXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG59ICIsImltcG9ydCB7IElEZWJ1Z1NlcnZpY2UgfSBmcm9tIFwiLi9kZWJ1Zy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlYnVnS3ZwIH0gZnJvbSBcIi4vZGVidWdnYWJsZS1pdGVtcy5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERlYnVnQ29tcG9uZW50IHtcclxuICAgIHByaXZhdGUgX2RlYnVnU2VydmljZTogSURlYnVnU2VydmljZTtcclxuICAgIHByaXZhdGUgZGVidWdJbmZvRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IElEZWJ1Z1NlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1NlcnZpY2UgPSBkZWJ1Z1NlcnZpY2U7XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBJbml0RGVidWdDb21wb25lbnQobWFpbkRpdklkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZURlYnVnRGl2KG1haW5EaXZJZCk7XHJcbiAgICAgICAgdGhpcy50aWNrKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGNyZWF0ZURlYnVnRGl2KHBhcmVudEVsZW1lbnRJZDogc3RyaW5nLCBpZDogc3RyaW5nID0gJ2VsX2RlYnVnX2luZm8nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnU2VydmljZS5Jc0luRGVidWdNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbWFpbkRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudEVsZW1lbnRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGVidWdJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICB0aGlzLmRlYnVnSW5mb0VsZW1lbnQuaWQgPSBpZDtcclxuICAgICAgICAgICAgbWFpbkRpdi5hcHBlbmRDaGlsZCh0aGlzLmRlYnVnSW5mb0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLlB1c2hPclVwZGF0ZUluRGVidWdBcnJheSgnRGVidWcgSW5mbycgKyBpLCAnZGVidWcgdmFsdWUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZGVidWdTZXJ2aWNlLlBvcEZyb21EZWJ1Z0FycmF5KCdEZWJ1ZyBJbmZvJylcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlYnVnSW5mb0VsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRpY2soKSB7XHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMudGlja3MrKztcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndXBkYXRpbmcgZGVidWdnZXInKVxyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRpY2soKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgVXBkYXRlKCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZGVidWdTZXJ2aWNlLkdldERlYnVnSW5mbygpLCBudWxsLCAyKVxyXG4gICAgICAgIGxldCBEZWJ1Z3NBc1N0cmluZyA9ICcnO1xyXG4gICAgICAgIGNvbnN0IGRlYnVnSW5mb0FycmF5ID0gdGhpcy5kZWJ1Z1NlcnZpY2UuR2V0RGVidWdJbmZvKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWJ1Z0luZm9BcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBEZWJ1Z3NBc1N0cmluZyArPSB0aGlzLkdldFRlbXBsYXRlRm9yS3ZwKGRlYnVnSW5mb0FycmF5W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0luZm9FbGVtZW50LmlubmVySFRNTCA9IERlYnVnc0FzU3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIEdldFRlbXBsYXRlRm9yS3ZwKGl0ZW06IERlYnVnS3ZwKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRlYnVnX2l0ZW1cIj5cclxuICAgICAgICAgICAgPHByZSBjbGFzcz1cImtleVwiPlxyXG4gICAgICAgICAgICAgICAgJHtpdGVtLktleX1cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShpdGVtLlZhbHVlKX1cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgPC9kaXY+YFxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRGVidWdnYWJsZUl0ZW1zLCBEZWJ1Z0t2cCB9IGZyb20gXCIuL2RlYnVnZ2FibGUtaXRlbXMubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURlYnVnU2VydmljZSB7XHJcbiAgICBJc0luRGVidWdNb2RlKCk6IGJvb2xlYW47XHJcbiAgICBQdXNoT3JVcGRhdGVJbkRlYnVnQXJyYXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkO1xyXG4gICAgUG9wRnJvbURlYnVnQXJyYXkoa2V5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gICAgR2V0RGVidWdJbmZvKCk6IEFycmF5PERlYnVnS3ZwPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERlYnVnU2VydmljZSBpbXBsZW1lbnRzIElEZWJ1Z1NlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBpbkRlYnVnTW9kZTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgRGVidWdJbmZvOiBEZWJ1Z2dhYmxlSXRlbXM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5EZWJ1Z01vZGU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2Fybihgc3RhcnRpbmcgZGVidWcgc2VydmljZS4gaW5EZWJ1Z01vZGUgWyR7aW5EZWJ1Z01vZGV9XWApO1xyXG4gICAgICAgIHRoaXMuaW5EZWJ1Z01vZGUgPSBpbkRlYnVnTW9kZTtcclxuICAgICAgICB0aGlzLkRlYnVnSW5mbyA9IG5ldyBEZWJ1Z2dhYmxlSXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSXNJbkRlYnVnTW9kZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbkRlYnVnTW9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGVidWdJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkRlYnVnSW5mby5kZWJ1Z0l0ZW1zO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFB1c2hPclVwZGF0ZUluRGVidWdBcnJheShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBhZGRpbmcgaXRlbSAke2tleX0gdG8gZGVidWcgYXJyYXlgKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tGb3JFeGlzdGluZyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRGVidWdJbmZvLmRlYnVnSXRlbXMucHVzaChuZXcgRGVidWdLdnAoa2V5LCB2YWx1ZSkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuUG9wRnJvbURlYnVnQXJyYXkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QdXNoT3JVcGRhdGVJbkRlYnVnQXJyYXkoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYHN1Y2Nlc3NmdWxseSB1cGRhdGVkIFske2tleX1dIGluIGRlYnVnIEtWUGApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGF0dGVtcHRlZCB0byBwdXNoIG9yIHVwZGF0ZSBbJHtrZXl9XSwgYnV0IHRoZSBpdGVtIGRpZG4ndCBleGlzdCBpbiB0aGUgS1ZQYClcclxuICAgIH1cclxuICAgIHB1YmxpYyBQb3BGcm9tRGVidWdBcnJheShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGByZW1vdmluZyBpdGVtICR7a2V5fSB0byBkZWJ1ZyBhcnJheWApO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5EZWJ1Z0luZm8uZGVidWdJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EZWJ1Z0luZm8uZGVidWdJdGVtc1tpXS5LZXkgPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5EZWJ1Z0luZm8uZGVidWdJdGVtcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgYXR0ZW1wdGVkIHRvIHJlbW92ZSBbJHtrZXl9IGZyb20gZGVidWcgS1ZQLCBidXQgaXQgY291bGRuJ3QgYmUgZm91bmRdYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tGb3JFeGlzdGluZyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIERlYnVnZ2FibGVJdGVtcyB7XHJcbiAgICBkZWJ1Z0l0ZW1zOiBBcnJheTxEZWJ1Z0t2cD47XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnSXRlbXMgPSBuZXcgQXJyYXk8RGVidWdLdnA+KCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIERlYnVnS3ZwIHtcclxuICAgIEtleTogc3RyaW5nO1xyXG4gICAgVmFsdWU6IGFueTtcclxuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5LZXkgPSBrZXk7XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5wdXRNYW5hZ2VyIH0gZnJvbSBcIi4vSW5wdXQvSW5wdXRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IElEZWJ1Z1NlcnZpY2UsIERlYnVnU2VydmljZSB9IGZyb20gJy4vX2RlYnVnL2RlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZWJ1Z0NvbXBvbmVudCB9IGZyb20gXCIuL19kZWJ1Zy9kZWJ1Zy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vRW50aXRpZXMvX2Jhc2UtZW50aXR5XCI7XHJcbmltcG9ydCB7IENyZWF0dXJlIH0gZnJvbSBcIi4vRW50aXRpZXMvQ3JlYXR1cmVzL2NyZWF0dXJlXCI7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vbnVtZXJpY3MvbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuaW1wb3J0IHsgQmFzZVN0YXRlIH0gZnJvbSBcIi4vU3RhdGVzL19CYXNlU3RhdGVcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlIH0gZnJvbSBcIi4vU3RhdGVzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi9TdGF0ZXMvc3RhdGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNZW51U3RhdGUgfSBmcm9tIFwiLi9TdGF0ZXMvTWVudVN0YXRlXCI7XHJcbmltcG9ydCB7IFNldHRpbmdzU3RhdGUgfSBmcm9tIFwiLi9TdGF0ZXMvU2V0dGluZ3NTdGF0ZVwiO1xyXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi9FbnRpdGllcy9DcmVhdHVyZXMvcGxheWVyXCI7XHJcbmltcG9ydCB7IEdyYXBoaWNzU2VydmljZSB9IGZyb20gXCIuL0dyYXBoaWNzL2dyYXBoaWNzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFkZHkgfSBmcm9tIFwiLi9FbnRpdGllcy9DcmVhdHVyZXMvYmFkZHlcIjtcclxuaW1wb3J0IHsgUmFuZG9tU3RyaW5nR2VuZXJhdG9yIH0gZnJvbSBcIi4vVG9vbHMvcmFuZG9tX2dlbmVyYXRvcnMvcmFuZG9tX3N0cmluZy5nZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIH0gZnJvbSBcIi4vVG9vbHMvcmFuZG9tX2dlbmVyYXRvcnMvcmFuZG9tX251bWJlci5nZW5lcmF0b3JzXCI7XHJcbmltcG9ydCB7IFdvcmxkU2VydmljZSB9IGZyb20gXCIuL1dvcmxkL3dvcmxkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR2FtZUNhbWVyYVNlcnZpY2UgfSBmcm9tIFwiLi9HcmFwaGljcy9DYW1lcmEvZ2FtZS1jYW1lcmEuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tIFwiLi9HcmFwaGljcy9WaWV3cG9ydC92aWV3cG9ydC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBsYXllclNlcnZpY2UgfSBmcm9tIFwiLi9FbnRpdGllcy9wbGF5ZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlIH0gZnJvbSBcIi4vRW50aXRpZXMvZW50aXR5LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJhd2luZ1NlcnZpY2UgfSBmcm9tIFwiLi9HcmFwaGljcy9EcmF3L2RyYXdpbmcuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tIFwiLi9Db3JlL3RpbWVyLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHYW1lIHtcclxuICAgIHByaXZhdGUgdmlld3BvcnRTZXJ2aWNlOiBWaWV3cG9ydFNlcnZpY2U7XHJcbiAgICBwcml2YXRlIGdyYXBoaWNzU2VydmljZTogR3JhcGhpY3NTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBwbGF5ZXJTZXJ2aWNlOiBQbGF5ZXJTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBpbnB1dE1hbmFnZXI6IElucHV0TWFuYWdlcjtcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBJRGVidWdTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZTtcclxuICAgIHByaXZhdGUgd29ybGRTZXJ2aWNlOiBXb3JsZFNlcnZpY2U7XHJcbiAgICBwcml2YXRlIGRlYnVnQ29tcG9uZW50OiBEZWJ1Z0NvbXBvbmVudDtcclxuICAgIHByaXZhdGUgdGltZXJTZXJ2aWNlOiBUaW1lclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIGVudGl0eVNlcnZpY2U6IEVudGl0eVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHJ1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF1bmNoTWVzc2FnZTogc3RyaW5nID0gJ1N0YXJ0JztcclxuXHJcbiAgICBwcml2YXRlIGdhbWVTdGF0ZTogR2FtZVN0YXRlO1xyXG4gICAgcHJpdmF0ZSBtZW51U3RhdGU6IE1lbnVTdGF0ZTtcclxuICAgIHByaXZhdGUgc2V0dGluZ3NTdGF0ZTogU2V0dGluZ3NTdGF0ZTtcclxuXHJcbiAgICBnYW1lRW50aXRpZXM6IEVudGl0eVtdO1xyXG4gICAgcHJpdmF0ZSBwZXJmb3JtYW5jZUluZm9EaXY6IEhUTUxFbGVtZW50O1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlSW5mb0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZXJmb3JtYW5jZV9kaXYnKTtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlSW5mb0Rpdi5pbm5lckhUTUwgPSBgd2FpdGluZyBmb3IgcGVyZiBkYXRhYDtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydFNlcnZpY2UgPSBuZXcgVmlld3BvcnRTZXJ2aWNlKCk7XHJcbiAgICAgICAgY29uc3QgbG9hZGVkSW5EZWJ1Z01vZGUgPSB0aGlzLmNoZWNrRGVidWdNb2RlRnJvbVF1ZXJ5U3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5ncmFwaGljc1NlcnZpY2UgPSBuZXcgR3JhcGhpY3NTZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UgPSBuZXcgU3RhdGVTZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2UgPSBuZXcgRGVidWdTZXJ2aWNlKGxvYWRlZEluRGVidWdNb2RlKTtcclxuICAgICAgICB0aGlzLmRlYnVnQ29tcG9uZW50ID0gbmV3IERlYnVnQ29tcG9uZW50KHRoaXMuZGVidWdTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmlucHV0TWFuYWdlciA9IG5ldyBJbnB1dE1hbmFnZXIoKTtcclxuICAgICAgICB0aGlzLnRpbWVyU2VydmljZSA9IG5ldyBUaW1lclNlcnZpY2UoNjApO1xyXG4gICAgICAgIHRoaXMud29ybGRTZXJ2aWNlID0gbmV3IFdvcmxkU2VydmljZSh0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUaWxlU2VydmljZSgpKTtcclxuICAgICAgICB0aGlzLmVudGl0eVNlcnZpY2UgPSBuZXcgRW50aXR5U2VydmljZSgpO1xyXG4gICAgICAgIHRoaXMucGxheWVyU2VydmljZSA9IG5ldyBQbGF5ZXJTZXJ2aWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgUnVuKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdSdW4gY2FsbGVkIGluIGdhbWUudHMnKTtcclxuICAgICAgICB0aGlzLkluaXQoKTtcclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuTG9vcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEluaXQoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmxhdW5jaE1lc3NhZ2UgKyAnIHdpbGwgbm93IGJlIHBvc3RlZCB0byB0aGUgZG9jdW1lbnQgJyk7XHJcbiAgICAgICAgdGhpcy5TZXR1cFN0YXRlcygpO1xyXG4gICAgICAgIHRoaXMuaW5wdXRNYW5hZ2VyLkluaXRJbnB1dE1hbmFnZXIoKTtcclxuICAgICAgICB0aGlzLmdyYXBoaWNzU2VydmljZS5Jbml0R3JhcGhpY3NTZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy53b3JsZFNlcnZpY2UuSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLmdldEdhbWVDYW1lcmFTZXJ2aWNlKCkuU2V0TGV2ZWxBQUJCKHRoaXMud29ybGRTZXJ2aWNlLkdldFdvcmxkU2l6ZSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckVudGl0aWVzKCk7XHJcbiAgICAgICAgLy8gdGhpcy5jYW52YXNNYW5hZ2VyLkluaXRDYW52YXNNYW5hZ2VyKCdtYWluX2RpdicsIHRoaXMuZ2FtZUVudGl0aWVzKTtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z1NlcnZpY2UuSXNJbkRlYnVnTW9kZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXR0aW5nIHVwIHdpdGggZGVidWcgaW5mbycpO1xyXG4gICAgICAgICAgICB0aGlzLmRlYnVnQ29tcG9uZW50LkluaXREZWJ1Z0NvbXBvbmVudCgnbWFpbl9kaXYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF1bmNoTWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFNldHVwU3RhdGVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2FtZVN0YXRlID0gbmV3IEdhbWVTdGF0ZSh0aGlzLmdyYXBoaWNzU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5tZW51U3RhdGUgPSBuZXcgTWVudVN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1N0YXRlID0gbmV3IFNldHRpbmdzU3RhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUodGhpcy5nYW1lU3RhdGUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIGxvb3BzIGNvbnRpbnVvdXNseSB3aGVuZXZlciB0aGUgYnJvd3NlciBpcyByZWFkeVxyXG4gICAgICogZm9yIGEgbmV3IGZyYW1lXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIEdhbWVcclxuICAgICAqL1xyXG4gICAgTG9vcCgpIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lclNlcnZpY2UuQ2hlY2tTaG91bGRSdW5Mb29wKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0RGVsdGEgPSB0aGlzLnRpbWVyU2VydmljZS5HZXRMYXN0VXBkYXRlVGltZVRvb2soKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZShsYXN0RGVsdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVuZGVyKGxhc3REZWx0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lclNlcnZpY2UuVXBkYXRlVGlja3NBbmRSZW5kZXJBZnRlckxvb3AoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlByaW50RGVidWdJbmZvVG9Db25zb2xlKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZXJTZXJ2aWNlLlJlc2V0VGltZXJzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5Mb29wKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBwcmludHMgZGVidWcgaW5mbyBmcm9tIHZhcmlvdXMgcGxhY2VzIGluIHRoZSBcclxuICAgICAqIGFwcGxpY2F0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZW1iZXJvZiBHYW1lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJpbnREZWJ1Z0luZm9Ub0NvbnNvbGUocHJpbnRUb0NvbnNvbGU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpbnRUb0h0bWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRpbWVyU2VydmljZS5TaG91bGRQcmludERlYnVnRGF0YSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuY2xlYXIoKTtcclxuICAgICAgICAgICAgbGV0IGRlYnVnSW5mb3JtYXRpb246IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICAgICAgZGVidWdJbmZvcm1hdGlvbi5wdXNoKCdGUFMgU2VydjogJyArIHRoaXMudGltZXJTZXJ2aWNlLlByaW50Q3VycmVudEZwc1RvQ29uc29sZSgpKTtcclxuICAgICAgICAgICAgZGVidWdJbmZvcm1hdGlvbi5wdXNoKCdDYW0gU2VydjogJyArIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlLmdldEdhbWVDYW1lcmFTZXJ2aWNlKCkuR2V0RGVidWdJbmZvKCkpO1xyXG4gICAgICAgICAgICBpZiAocHJpbnRUb0NvbnNvbGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgZGVidWdJbmZvcm1hdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyVjICcgKyBsaW5lICsgJyAnLCAnYmFja2dyb3VuZDogIzAwMDsgY29sb3I6d2hpdGU7ICcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJpbnRUb0h0bWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybWFuY2VJbmZvRGl2LmlubmVySFRNTCA9IGA8cHJlPiR7ZGVidWdJbmZvcm1hdGlvbi5qb2luKCdcXG4nKX08L3ByZT5gO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBkZWJ1Z0luZm9ybWF0aW9uID0gQXJyYXk8c3RyaW5nPigwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgVXBkYXRlKGxhc3REZWx0YTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGVTZXJ2aWNlLkdldFN0YXRlKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dE1hbmFnZXIuTmV3SW5wdXRMb29wQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLkdldFN0YXRlKCkuVGljaygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlTZXJ2aWNlLlRpY2tBbGxFbnRpdGllcyhsYXN0RGVsdGEpO1xyXG4gICAgICAgICAgICAvLyAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdhbWVFbnRpdGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgIHRoaXMuZ2FtZUVudGl0aWVzW2ldLlRpY2soKTtcclxuICAgICAgICAgICAgLy8gIH1cclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBSZW5kZXIobGFzdERlbHRhOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UuR2V0U3RhdGUoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmdyYXBoaWNzU2VydmljZS5HZXRUaWxlU2VydmljZSgpLlJlZG5lcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlTZXJ2aWNlLlJlbmRlckFsbEVudGl0aWVzKHRoaXMuZ3JhcGhpY3NTZXJ2aWNlKTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuR2V0U3RhdGUoKS5SZW5kZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5ncmFwaGljc1NlcnZpY2UuUmVuZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrRGVidWdNb2RlRnJvbVF1ZXJ5U3RyaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgICAgY29uc3QgZGVidWdNb2RlUGFyYW0gPSB1cmxQYXJhbXMuZ2V0KCdpbkRlYnVnTW9kZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWJ1Z01vZGVQYXJhbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXJFbnRpdGllcyhiYWRkeUNvdW50OiBudW1iZXIgPSA3NSk6IHZvaWQge1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgICBjb25zdCBzaGlwcyA9IFtcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDEucG5nJyxcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDIucG5nJyxcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDMucG5nJyxcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDQucG5nJyxcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDUucG5nJyxcclxuICAgICAgICAgICAgJ21ldGFsaWNfMDYucG5nJyxcclxuICAgICAgICAgICAgJ29yYW5nZV8wMS5wbmcnLFxyXG4gICAgICAgICAgICAnb3JhbmdlXzAyLnBuZycsXHJcbiAgICAgICAgICAgICdvcmFuZ2VfMDMucG5nJyxcclxuICAgICAgICAgICAgJ29yYW5nZV8wNC5wbmcnLFxyXG4gICAgICAgICAgICAnb3JhbmdlXzA1LnBuZycsXHJcbiAgICAgICAgICAgICdvcmFuZ2VfMDYucG5nJ1xyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZW50aXR5U2l6ZTogVmVjdG9yMiA9IG5ldyBWZWN0b3IyKDMwLCAzMCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYWRkeUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2VMb2MgPSBSYW5kb21OdW1iZXJHZW5lcmF0b3IuR2V0UmFuZG9tTnVtYmVyKDAsIDYpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaW1hZ2UgbG9jIHdpbGwgYmUgJyArIGltYWdlTG9jKTtcclxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gbmV3IEJhZGR5KFxyXG4gICAgICAgICAgICAgICAgLy8gbmV3IFZlY3RvcjIoNTAwLCAzMDApLFxyXG4gICAgICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yLkdldFJhbmRvbVZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICAgICAgMCwgdGhpcy52aWV3cG9ydFNlcnZpY2UuR2V0QnJvd3NlcldpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgMCwgdGhpcy52aWV3cG9ydFNlcnZpY2UuR2V0QnJvd3NlckhlaWdodCgpKSxcclxuICAgICAgICAgICAgICAgIGVudGl0eVNpemUsXHJcbiAgICAgICAgICAgICAgICAnYmFkZHknICsgaS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgJy9TaGlwcy8nICsgc2hpcHNbaW1hZ2VMb2NdLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaGljc1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBSYW5kb21TdHJpbmdHZW5lcmF0b3IuR2V0UmFuZG9tSGV4Q29sb3VyKCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllclNlcnZpY2VcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5U2VydmljZS5SZWdpc3RlckVudGl0eShlbnRpdHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wbGF5ZXJTZXJ2aWNlLlNldFBsYXllcihuZXcgUGxheWVyKFxyXG4gICAgICAgICAgICBuZXcgVmVjdG9yMihcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLkdldEJyb3dzZXJXaWR0aCgpIC8gMixcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLkdldEJyb3dzZXJIZWlnaHQoKSAvIDIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgVmVjdG9yMigwLCAwKSxcclxuICAgICAgICAgICAgbmV3IFZlY3RvcjIoNTAsIDUwKSxcclxuICAgICAgICAgICAgJ3BsYXllcicsXHJcbiAgICAgICAgICAgICdTaGlwcy9sYXJnZV9wdXJwbGVfMDEucG5nJyxcclxuICAgICAgICAgICAgdGhpcy5pbnB1dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JhcGhpY3NTZXJ2aWNlKSk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmVudGl0eVNlcnZpY2UuUmVnaXN0ZXJFbnRpdHkodGhpcy5wbGF5ZXJTZXJ2aWNlLkdldFBsYXllcigpKTtcclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIGVudGl0aWVzO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2FtZSB9IGZyb20gJy4vYXBwbGljYXRpb24vZ2FtZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQXBwIHtcclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGNvbnN0IGdhbWUgPSBuZXcgR2FtZSgpOyAgICAgXHJcbiAgICAgICAgZ2FtZS5SdW4oKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgYXBwbGljYXRpb24gPSBuZXcgQXBwKCk7XHJcbmFwcGxpY2F0aW9uLnN0YXJ0KCk7IiwiZXhwb3J0IGNsYXNzIERlZ3JlZXNIZWxwZXIge1xyXG5cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBjb252ZXJ0cyBkZWdyZWVzIGludG8gcmFkaWFuc1xyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWdyZWVzXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gUmFkaWFucyhkZWdyZWVzOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBkZWdyZWVzICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBjb252ZXJ0cyByYWRpYW5zIGludG8gZGVncmVlc1xyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpIHtcclxuICAgIHJldHVybiByYWRpYW5zICogMTgwIC8gTWF0aC5QSTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZhcnRoZXJSaWdodChmcm9tRGVncmVlczogbnVtYmVyLCB0b0RlZ3JlZXM6IG51bWJlcikge1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59IiwiaW1wb3J0IHsgQUFCQiB9IGZyb20gXCIuLi9tb2RlbHMvQUFCQi5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEludGVyc2VjdGlvbkhlbHBlciB7XHJcbiAgICAvLyBjaGVja3MgaWYgdHdvIEFBQkJzIGludGVyc2VjdCAocmVjdGFuZ2xlIG9ubHkpXHJcbiAgICBwdWJsaWMgc3RhdGljIEFhYmJWc0FhYmIobGVmdDogQUFCQiwgcmlnaHQ6IEFBQkIpIHtcclxuICAgICAgICBpZiAoKGxlZnQubWF4LmdldFZhbHVlWCgpIDwgcmlnaHQubWluLmdldFZhbHVlWCgpKSB8fCAobGVmdC5taW4uZ2V0VmFsdWVYKCkgPiByaWdodC5tYXguZ2V0VmFsdWVYKCkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChsZWZ0Lm1heC5nZXRWYWx1ZVkoKSA8IHJpZ2h0Lm1pbi5nZXRWYWx1ZVkoKSkgfHwgKGxlZnQubWluLmdldFZhbHVlWSgpID4gcmlnaHQubWF4LmdldFZhbHVlWSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxufSIsImV4cG9ydCBmdW5jdGlvbiBCZXR3ZWVuKHg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4geCA+PSBtaW4gJiYgeCA8PSBtYXg7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTGVycChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgYW10OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICgxLWFtdCkgKiBzdGFydCArIGFtdCAqIGVuZDtcclxufSIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi4vbW9kZWxzL1ZlY3RvcjIubW9kZWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBWZWN0b3IySGVscGVycyB7XHJcbiAgICAvKlxyXG4gICogYWRkcyB0d28gVmVjdG9yMiB0b2dldGhlciBhbmQgcmV0dXJucyBhIG5ldyBWZWN0b3IyXHJcbiAgKiBjb250YWluaW5nIHRoZSByZXN1bHRzXHJcbiAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQWRkKGxlZnQ6IFZlY3RvcjIsIHJpZ2h0OiBWZWN0b3IyKTogVmVjdG9yMiB7XHJcbiAgICAgICAgY29uc3QgdmVjWCA9IGxlZnQuZ2V0VmFsdWVYKCkgKyByaWdodC5nZXRWYWx1ZVgoKTtcclxuICAgICAgICBjb25zdCB2ZWNZID0gbGVmdC5nZXRWYWx1ZVkoKSArIHJpZ2h0LmdldFZhbHVlWSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodmVjWCwgdmVjWSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb21wYXJlcyB0d28gVmVjdG9yIDJzIGZvciBlcXVhbGl0eVxyXG4gICAgICogSWYgdGhlIHZlY3RvcnMgYXJlIGlkZW50aWNhLCB0aGlzIHJldHVybnMgdHJ1ZSBvdGhlcndpc2UgcmV0dXJucyBmYWxzZVxyXG4gICAgICpcclxuICAgICAqIEBzdGF0aWNcclxuICAgICAqIEBwYXJhbSB7VmVjdG9yMn0gbGVmdFxyXG4gICAgICogQHBhcmFtIHtWZWN0b3IyfSByaWdodFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgVmVjdG9yMkhlbHBlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb21wYXJlRXF1YWxpdHkobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIShsZWZ0LmdldFZhbHVlWCgpICE9PSByaWdodC5nZXRWYWx1ZVgoKSB8fCBsZWZ0LmdldFZhbHVlWSgpICE9PSByaWdodC5nZXRWYWx1ZVkoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICogZGl2aWRlcyB0aGUgZmlyc3QgdmVjdG9yIGJ5IHRoZSBzZWNvbmRcclxuICAgICogdGhpcyBpcyBub3Qgc2NhbGFyIGRpdmlzaW9uXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBEaXZpZGUobGVmdDogVmVjdG9yMiwgcmlnaHQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcclxuICAgICAgICBjb25zdCB2ZWNYID0gbGVmdC5nZXRWYWx1ZVgoKSAvIHJpZ2h0LmdldFZhbHVlWCgpO1xyXG4gICAgICAgIGNvbnN0IHZlY1kgPSBsZWZ0LmdldFZhbHVlWSgpIC8gcmlnaHQuZ2V0VmFsdWVZKCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHZlY1gsIHZlY1kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAqIGRpdmlkZXMgYSBnaXZlbiBzb3VyY2UgdmVjdG9yMiBieSBhIHNjYWxlIGZhY3RvclxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRGl2aWRlQnlTY2FsZShzb3VyY2U6IFZlY3RvcjIsIHNjYWxlRmFjdG9yOiBudW1iZXIpOiBWZWN0b3IyIHtcclxuICAgICAgICBjb25zdCBmYWN0b3I6IG51bWJlciA9IDEgLyBzY2FsZUZhY3RvcjtcclxuXHJcbiAgICAgICAgY29uc3QgdmVjWCA9IHNvdXJjZS5nZXRWYWx1ZVgoKSAqIGZhY3RvcjtcclxuICAgICAgICBjb25zdCB2ZWNZID0gc291cmNlLmdldFZhbHVlWSgpICogZmFjdG9yO1xyXG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMih2ZWNYLCB2ZWNZKTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgKiBnZXRzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9ycyxcclxuICAgICogcmV0dXJucyBhcyBhIG51bWJlciAoZmxvYXQ/KVxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRG90KGxlZnQ6IFZlY3RvcjIsIHJpZ2h0OiBWZWN0b3IyKTogbnVtYmVyIHtcclxuXHJcbiAgICAgICAgY29uc3QgdmVjWCA9IGxlZnQuZ2V0VmFsdWVYKCkgKiByaWdodC5nZXRWYWx1ZVgoKTtcclxuICAgICAgICBjb25zdCB2ZWNZID0gbGVmdC5nZXRWYWx1ZVkoKSAqIHJpZ2h0LmdldFZhbHVlWSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmVjWCArIHZlY1k7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTdWJ0cmFjdChsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMik6IFZlY3RvcjIge1xyXG4gICAgICAgIGNvbnN0IHZlY1ggPSBsZWZ0LmdldFZhbHVlWCgpIC0gcmlnaHQuZ2V0VmFsdWVYKCk7XHJcbiAgICAgICAgY29uc3QgdmVjWSA9IGxlZnQuZ2V0VmFsdWVZKCkgLSByaWdodC5nZXRWYWx1ZVkoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHZlY1gsIHZlY1kpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVPZihzb3VyY2U6IFZlY3RvcjIpIHtcclxuICAgICAgICBjb25zdCB2ZWNYID0gLXNvdXJjZS5nZXRWYWx1ZVgoKTtcclxuICAgICAgICBjb25zdCB2ZWNZID0gLXNvdXJjZS5nZXRWYWx1ZVkoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodmVjWCwgdmVjWSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBNdWx0aXBseShsZWZ0OiBWZWN0b3IyLCByaWdodDogVmVjdG9yMikge1xyXG4gICAgICAgIGNvbnN0IHZlY1ggPSBsZWZ0LmdldFZhbHVlWCgpICogcmlnaHQuZ2V0VmFsdWVYKCk7XHJcbiAgICAgICAgY29uc3QgdmVjWSA9IGxlZnQuZ2V0VmFsdWVZKCkgKiByaWdodC5nZXRWYWx1ZVkoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodmVjWCwgdmVjWSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIE11bHRpcGx5QnlTY2FsZShzb3VyY2U6IFZlY3RvcjIsIHNjYWxlRmFjdG9yOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB2ZWNYID0gc291cmNlLmdldFZhbHVlWCgpICogc2NhbGVGYWN0b3I7XHJcbiAgICAgICAgY29uc3QgdmVjWSA9IHNvdXJjZS5nZXRWYWx1ZVkoKSAqIHNjYWxlRmFjdG9yO1xyXG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMih2ZWNYLCB2ZWNZKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiLi9WZWN0b3IyLm1vZGVsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQUFCQiB7XHJcbiAgICBtaW46IFZlY3RvcjI7XHJcbiAgICBtYXg6IFZlY3RvcjI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocG9zaXRpb246IFZlY3RvcjIsIHNpemU6IFZlY3RvcjIpIHtcclxuICAgICAgICB0aGlzLm1pbiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICBwb3NpdGlvbi5nZXRWYWx1ZVgoKSxcclxuICAgICAgICAgICAgcG9zaXRpb24uZ2V0VmFsdWVZKCkpO1xyXG4gICAgICAgIHRoaXMubWF4ID0gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLmdldFZhbHVlWCgpICsgc2l6ZS5nZXRWYWx1ZVgoKSxcclxuICAgICAgICAgICAgcG9zaXRpb24uZ2V0VmFsdWVZKCkgKyBzaXplLmdldFZhbHVlWSgpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRDZW50ZXIoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgY29uc3QgeCA9ICgodGhpcy5tYXgueCAtIHRoaXMubWluLngpIC8gMikgKyB0aGlzLm1pbi54O1xyXG4gICAgICAgIGNvbnN0IHkgPSAoKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSAvIDIpICsgdGhpcy5taW4ueTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICB4LCB5XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRUb3AoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5taW4uZ2V0VmFsdWVZKCk7XHJcbiAgICB9IFxyXG4gICAgcHVibGljIEdldEJvdHRvbSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heC5nZXRWYWx1ZVkoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRMZWZ0KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWluLmdldFZhbHVlWCgpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEdldFJpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4LmdldFZhbHVlWCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJc0Fib3ZlKHRhcmdldDogQUFCQik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLkdldEJvdHRvbSgpIDwgdGFyZ2V0LkdldFRvcCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSXNCZWxvdyh0YXJnZXQ6IEFBQkIpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5HZXRUb3AoKSA+IHRhcmdldC5HZXRCb3R0b20oKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJc1JpZ2h0KHRhcmdldDogQUFCQik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLkdldFJpZ2h0KCkgPCB0YXJnZXQuR2V0TGVmdCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIElzTGVmdCh0YXJnZXQ6IEFBQkIpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5HZXRMZWZ0KCkgPiB0YXJnZXQuR2V0UmlnaHQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBWZWN0b3IyIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgIH1cclxuXHJcbiAgICBjb25jYXQoZGVjaW1hbFBsYWNlczogbnVtYmVyID0gLTEpIHtcclxuICAgICAgICBpZiAoZGVjaW1hbFBsYWNlcyA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgeDpbJHt0aGlzLngudG9GaXhlZChkZWNpbWFsUGxhY2VzKX1dLCB5Olske3RoaXMueS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpfV1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYHg6WyR7dGhpcy54fV0sIHk6WyR7dGhpcy55fV1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlWCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy54O1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWVZKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWVYKHg6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICB9XHJcbiAgICBzZXRWYWx1ZVkoeTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlcyh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgIH1cclxuXHJcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +/******/ })() +; +//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/dist/bundle.js.map b/dist/bundle.js.map new file mode 100644 index 0000000..ba6026c --- /dev/null +++ b/dist/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://march/./src/application/Graphics/Viewport/Viewport.Helper.ts","webpack://march/./src/application/World/world.ts","webpack://march/./src/application/Graphics/Viewport/viewport.service.ts","webpack://march/./src/application/states/_BaseState.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts","webpack://march/./src/application/Core/timer.service.ts","webpack://march/./src/application/Entities/_base-entity.ts","webpack://march/./src/application/Graphics/Tiles/drawable-tile.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts","webpack://march/./src/numerics/helpers/number.helper.ts","webpack://march/./src/application/Input/input.model.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts","webpack://march/./src/application/game.ts","webpack://march/./src/application/Input/input-state.ts","webpack://march/./src/application/Entities/Creatures/creature.ts","webpack://march/./src/numerics/models/Vector2.model.ts","webpack://march/./src/application/states/MenuState.ts","webpack://march/./src/application/Entities/Creatures/creature.default.settings.ts","webpack://march/./src/application/Graphics/Camera/game-camera.service.ts","webpack://march/./src/numerics/helpers/vector2.helper.ts","webpack://march/./src/application/_debug/debuggable-items.model.ts","webpack://march/./src/application/Graphics/Textures/texture.service.ts","webpack://march/./src/application/Graphics/Images/ImageHelper.ts","webpack://march/./src/application/Graphics/graphics.service.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts","webpack://march/./src/application/World/world.jsonfiles.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts","webpack://march/./src/application/_debug/debug.component.ts","webpack://march/./src/numerics/models/AABB.model.ts","webpack://march/./src/application/Input/InputManager.ts","webpack://march/./src/application/Tools/random_generators/random_number.generators.ts","webpack://march/./src/application/Graphics/Tiles/tile.service.ts","webpack://march/./src/application/_debug/debug.service.ts","webpack://march/./src/application/Graphics/Tiles/tile.default.settings.ts","webpack://march/./src/application/Graphics/Textures/Texture2d.ts","webpack://march/./src/numerics/helpers/intersection.helper.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts","webpack://march/./src/application/Graphics/Draw/drawing.service.ts","webpack://march/./src/application/Tools/random_generators/random_guid.generator.ts","webpack://march/./src/application/Graphics/Draw/drawable.ts","webpack://march/./src/application/Graphics/Html/graphics.html.service.ts","webpack://march/./src/application/Graphics/Models/graphics.drawable-canvas.ts","webpack://march/./src/application/Entities/player.service.ts","webpack://march/./src/application/Entities/Creatures/baddy.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts","webpack://march/./src/application/states/GameState.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts","webpack://march/./src/numerics/helpers/degrees.helper.ts","webpack://march/./src/application/Entities/Creatures/player.ts","webpack://march/./src/application/Tools/random_generators/random_string.generator.ts","webpack://march/./src/application/states/SettingsState.ts","webpack://march/./src/application/states/state.service.ts","webpack://march/./src/application/Graphics/Canvas/graphics.canvas.service.ts","webpack://march/./src/application/Entities/entity.service.ts","webpack://march/./src/application/World/world.service.ts","webpack://march/webpack/bootstrap","webpack://march/./src/index.ts"],"sourcesContent":["import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class ViewportHelper {\n\n public static GetSquareInBrowser(): Vector2 {\n const h = this.GetBrowserHeight() - 5;\n const w = this.GetBrowserWidth() - 5;\n if (h < w) {\n return new Vector2(h, h);\n } else {\n return new Vector2(w, w);\n }\n }\n\n public static GetWindowInAspectRatio(aspectRatioWidth: number = 16, aspectRatioHeight: number = 9,\n widthPercent: number = 1, heightPercent: number = 1) {\n const aspectRatio = aspectRatioWidth / aspectRatioHeight;\n\n const adjustedWindowHeight = this.GetBrowserHeight() * heightPercent;\n const adjustedWindowWidth = this.GetBrowserWidth() * widthPercent;\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio));\n \n return new Vector2(displayWidth, displayHeight);\n }\n\n /**\n * Gets a window in a given aspect ratio. \n *\n * @static\n * @param {number} [aspectRatioWidth=16]\n * @param {number} [aspectRatioHeight=9]\n * @param {number} [widthPercent=1] between 0 & 1. Should usually be the same as heightPercent\n * @param {number} [heightPercent=1] between 0 & 1. Shoudl usually be the same as widthPercent\n * @param {string} elementId An element to put this canvas into. Can be null (will use the full window)\n * @returns {Vector2}\n * @memberof ViewportHelper\n * @returns {Vector2}\n * @memberof ViewportHelper\n */\n public static GetWindowInAspectRatioForCanvas(aspectRatioWidth: number = 16, aspectRatioHeight: number = 9,\n widthPercent: number = 1, heightPercent: number = 1, canvasableElement: HTMLElement = null): Vector2 {\n\n if (!canvasableElement) {\n console.warn(`setup with no canvasable element. Will use the entire window`);\n } else {\n console.warn(`setup with id of ${canvasableElement.id}`);\n }\n const aspectRatio = aspectRatioWidth / aspectRatioHeight;\n\n if (heightPercent !== widthPercent) {\n console.warn('window height and width percentages to not match. This will result in an abnormal screen size')\n }\n if (aspectRatioHeight > aspectRatioWidth) {\n console.log(`starting in portrait mode (${aspectRatioWidth}:${aspectRatioHeight})`);\n } else {\n console.info(`starting in landscape mode (${aspectRatioWidth}:${aspectRatioHeight})`);\n }\n\n const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * heightPercent;\n const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * widthPercent;\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio));\n\n return new Vector2(displayWidth, displayHeight);\n }\n\n private static GetBrowserWidth(element: HTMLElement = null) {\n if (!element) {\n return window.innerWidth;\n } else {\n return element.clientWidth;\n\n }\n }\n private static GetBrowserHeight(element: HTMLElement = null) {\n if (!element) {\n return window.innerHeight;\n } else {\n return element.clientHeight;\n }\n }\n}","import { Vector2 } from \"../../numerics/models/Vector2.model\";\nexport class World {\n // private game: Game;\n \n private id: number;\n private area: Vector2 = new Vector2(20, 20);\n private spawn: Vector2;\n private tiles: number[][];\n constructor(area: Vector2, spawn: Vector2, \n tiles: number[][], id: number) {\n this.area = area;\n this.spawn = spawn; \n this.tiles = tiles;\n this.id = id;\n }\n public GetTiles (): number[][] {\n return this.tiles;\n }\n public GetStartingPosition() {\n return this.spawn; \n }\n public GetId() {\n return this.id;\n }\n \n \n} ","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class ViewportService {\n\n private browserSize: Vector2;\n private viewportSize: Vector2;\n\n private aspectRatio: Vector2;\n private aspectRatioCalculated: number;\n private sizePercent: Vector2;\n\n private listner: any;\n\n private listeningForBrowserChanges: boolean = false;\n constructor(\n aspectRatio: Vector2 = new Vector2(16, 9),\n sizePercent: Vector2 = new Vector2(1, 1)) {\n this.aspectRatio = aspectRatio;\n this.aspectRatioCalculated = (this.aspectRatio.getValueX() / this.aspectRatio.getValueY());\n this.sizePercent = sizePercent;\n this.setupListner();\n }\n\n setupListner() {\n console.log('setting up browser listner')\n this.listner = window.addEventListener('resize', () => {\n this.listeningForBrowserChanges = true;\n setTimeout(() => {\n\n this.listeningForBrowserChanges = false;\n }, 5000);\n });\n }\n\n\n /**\n *Gets a window in a the game's aspect ratio\n *\n * @param {HTMLElement} [canvasableElement=null]\n * @returns {Vector2}\n * @memberof ViewportService\n */\n public GetWindowInAspectRatioForCanvas(canvasableElement: HTMLElement = null): Vector2 {\n\n if (!canvasableElement) {\n console.warn(`setup with no canvasable element. Will use the entire window`);\n } else {\n console.warn(`setup with id of ${canvasableElement.id}`);\n }\n \n\n if (this.sizePercent.getValueX() !== this.sizePercent.getValueY()) {\n console.warn('window height and width percentages to not match. This will result in an abnormal screen size')\n }\n if (this.aspectRatio.getValueX() > this.aspectRatio.getValueY()) {\n console.log(`starting in portrait mode (${this.aspectRatio.getValueX() }:${this.aspectRatio.getValueY()})`);\n } else {\n console.info(`starting in landscape mode (${this.aspectRatio.getValueX() }:${this.aspectRatio.getValueY()})`);\n }\n\n const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * this.sizePercent.getValueX();\n const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * this.sizePercent.getValueY();\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated));\n\n return new Vector2(displayWidth, displayHeight);\n } \n\n public GetSquareInBrowser(): Vector2 {\n const h = this.GetBrowserHeight() - 5;\n const w = this.GetBrowserWidth() - 5;\n if (h < w) {\n return new Vector2(h, h);\n } else {\n return new Vector2(w, w);\n }\n }\n\n public GetWindowInAspectRatio() {\n \n const adjustedWindowHeight = this.GetBrowserHeight() * this.sizePercent.getValueX();\n const adjustedWindowWidth = this.GetBrowserWidth() * this.sizePercent.getValueY();\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated));\n\n return new Vector2(displayWidth, displayHeight);\n }\n\n\n public GetBrowserWidth(element: HTMLElement = null) {\n if (!element) {\n return window.innerWidth;\n } else {\n return element.clientWidth;\n\n }\n }\n public GetBrowserHeight(element: HTMLElement = null) {\n if (!element) {\n return window.innerHeight;\n } else {\n return element.clientHeight;\n }\n }\n\n public getBrowserSize(): Vector2 {\n return this.browserSize;\n }\n\n private setBrowserSize(browserSize: Vector2): void {\n this.browserSize = browserSize;\n }\n\n public getViewportSize(): Vector2 {\n return this.viewportSize;\n }\n\n private setViewportSize(viewportSize: Vector2): void {\n this.viewportSize = viewportSize;\n }\n\n\n}","export abstract class BaseState {\n\n public abstract Tick(): void;\n public abstract Render(): void;\n} ","export class TileType {\n\n protected readonly id: number;\n private readonly textureId: string;\n protected readonly fallbackOutlineColour: string;\n\n constructor(id: number, fallbackOutlineColour: string,\n textureId: string) {\n this.textureId = textureId;\n this.id = id;\n this.fallbackOutlineColour = fallbackOutlineColour;\n }\n\n public Tick(): void {\n\n }\n\n public GetTextureId(): string {\n return this.textureId;\n }\n\n public GetId(): number {\n return this.id;\n }\n\n public GetFallbackColour() {\n return this.fallbackOutlineColour;\n }\n}\n","export class TimerService {\n private now: number;\n private delta: number;\n private timer: number;\n private lastTime: number;\n private ticks: number;\n private lastTimeTook: number;\n\n private timePerTick: number;\n private fps: number;\n constructor(targetFps: number = 60) {\n this.fps = targetFps;\n this.timePerTick = 1000 / this.fps;\n this.delta = 0;\n this.now = 0;\n this.lastTime = performance.now();\n this.timer = 0;\n this.ticks = 0;\n this.lastTimeTook = 0;\n }\n\n public CheckShouldRunLoop(): boolean {\n this.now = performance.now();\n this.delta += (this.now - this.lastTime) / this.timePerTick;\n this.timer += this.now - this.lastTime;\n this.lastTimeTook = this.now - this.lastTime;\n this.lastTime = this.now;\n\n if (this.delta >= 1) {\n return true;\n }\n console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`)\n return false;\n }\n\n public UpdateTicksAndRenderAfterLoop() {\n this.delta--;\n this.ticks++;\n }\n\n /**\n * returns true if it's a good time to print to \n * the console\n *\n * @returns {boolean}\n * @memberof FpsService\n */\n public ShouldPrintDebugData(): boolean {\n return this.timer > 1000;\n }\n\n /**\n * prints debug data from this class\n * to the console\n *\n * @memberof FpsService\n */\n public PrintCurrentFpsToConsole() {\n return `\n ticks and frames: ${this.ticks.toFixed(2)}\n lastDelta: ${this.delta.toFixed(2)}\n timer: ${this.timer.toFixed(2)}\n lastTime Took: ${this.lastTimeTook.toFixed(2)}`;\n }\n\n public ResetTimers() {\n if (this.timer > 1000) {\n this.ticks = 0;\n this.timer = 0;\n }\n }\n\n public GetLastUpdateTimeTook() {\n return this.lastTimeTook / 1000;\n }\n}","import { Vector2 } from \"../../numerics/models/Vector2.model\";\nimport { GuidGenerator } from \"../Tools/random_generators/random_guid.generator\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\nimport { Drawable } from \"../Graphics/Draw/drawable\";\nimport { DrawableCanvas } from \"../Graphics/Models/graphics.drawable-canvas\";\nimport { Texture2D } from \"../Graphics/Textures/Texture2d\";\n\n// export interface IEntity {\n// position: Vector2;\n// size: Vector2;\n// name: string;\n// id: string;\n// }\n\nexport abstract class Entity extends Drawable {\n protected position: Vector2;\n protected size: Vector2;\n protected name: string;\n protected id: string;\n\n\n // constructor(position: Vector2, size: Vector2, name: string, canvasId: string, texture: Texture2D, textureId: string) {\n constructor(position: Vector2, size: Vector2, name: string, canvasId: string, textureId: string) {\n super(position, size, canvasId, textureId);\n this.id = GuidGenerator.NewGuid();\n this.name = name;\n }\n\n public abstract Tick(lastDelta: number): void;\n\n\n getName(): string {\n return this.name;\n }\n\n getId(): string {\n return this.name;\n }\n\n getPosition(): Vector2 {\n return this.position;\n }\n setPosition(newPosition: Vector2): Vector2 {\n this.position = newPosition;\n return this.getPosition();\n }\n setPositionX(newPositionX: number): Vector2 {\n this.position.x = newPositionX;\n return this.getPosition();\n }\n setPositionY(newPositionY: number): Vector2 {\n this.position.y = newPositionY;\n return this.getPosition();\n }\n\n\n getSize(): Vector2 {\n return this.size;\n }\n setSize(newSize: Vector2): Vector2 {\n this.size = newSize;\n return this.getSize();\n }\n\n // getAABB(): AABB {\n // if (this.AABB === undefined) {\n // this.UpdateAABB();\n // }\n // return this.AABB;\n // }\n\n protected SetAABB(AABB: AABB): void {\n this.setAABB(AABB);\n }\n protected UpdateAABB(): void {\n this.setAABB(new AABB(this.position, this.size));\n }\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { Drawable } from \"../Draw/drawable\";\n\nexport class DrawableTile extends Drawable {\n private readonly tileTypeId: number;\n\n constructor(tileTypeId: number, position: Vector2, size: Vector2, fallbackOutlineColour: string, canvasId: string,\n textureId: string) {\n super(position, size, canvasId, textureId);\n this.tileTypeId = tileTypeId;\n this.colour = fallbackOutlineColour;\n }\n\n public getTileTypeId(): number {\n return this.tileTypeId;\n }\n\n public getPosition(): Vector2 {\n return this.position;\n }\n\n public getSize(): Vector2 {\n return this.size;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class StarTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/space_tile2.png';\n constructor(id: number, textId: string) {\n super(id, '#060948', textId);\n }\n}","export function Between(x: number, min: number, max: number): boolean {\n return x >= min && x <= max;\n}\n\n\nexport function Lerp(start: number, end: number, amt: number): number {\n return (1-amt) * start + amt * end;\n}","export class Input {\n constructor(\n name: string, \n keyboardId: string, \n gamepadId: number, \n gamePadAxesId: number) {\n this.name = name;\n this.keyboardId = keyboardId;\n this.gamepadId = gamepadId;\n this.gamePadAxesId = gamePadAxesId;\n }\n name: string;\n keyboardId: string;\n gamepadId: number;\n gamePadAxesId: number;\n pressed: boolean = false;\n\n force: number = 0;\n\n wasPressedPreviousCheck: boolean = false;\n}\n","import { TileType } from \"../_base-tiletype\";\n\nexport class SpaceTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/space_tile.png';\n constructor(id: number, textId: string) {\n super(id, '#1C1C1B', textId);\n }\n}\n","import { InputManager } from \"./Input/InputManager\";\nimport { IDebugService, DebugService } from './_debug/debug.service';\nimport { DebugComponent } from \"./_debug/debug.component\";\nimport { Entity } from \"./Entities/_base-entity\";\nimport { Creature } from \"./Entities/Creatures/creature\";\nimport { Vector2 } from \"../numerics/models/Vector2.model\";\nimport { BaseState } from \"./states/_BaseState\";\nimport { GameState } from \"./states/GameState\";\nimport { StateService } from \"./states/state.service\";\nimport { MenuState } from \"./states/MenuState\";\nimport { SettingsState } from \"./states/SettingsState\";\nimport { Player } from \"./Entities/Creatures/player\";\nimport { GraphicsService } from \"./Graphics/graphics.service\";\nimport { Baddy } from \"./Entities/Creatures/baddy\";\nimport { RandomStringGenerator } from \"./Tools/random_generators/random_string.generator\";\nimport { RandomNumberGenerator } from \"./Tools/random_generators/random_number.generators\";\nimport { WorldService } from \"./World/world.service\";\nimport { GameCameraService } from \"./Graphics/Camera/game-camera.service\";\nimport { ViewportService } from \"./Graphics/Viewport/viewport.service\";\nimport { PlayerService } from \"./Entities/player.service\";\nimport { EntityService } from \"./Entities/entity.service\";\nimport { DrawingService } from \"./Graphics/Draw/drawing.service\";\nimport { TimerService } from \"./Core/timer.service\";\n\nexport class Game {\n private viewportService: ViewportService;\n private graphicsService: GraphicsService;\n private playerService: PlayerService;\n private inputManager: InputManager;\n private debugService: IDebugService;\n private stateService: StateService;\n private worldService: WorldService;\n private debugComponent: DebugComponent;\n private timerService: TimerService;\n private entityService: EntityService;\n private running: boolean = false;\n private readonly launchMessage: string = 'Start';\n\n private gameState: GameState;\n private menuState: MenuState;\n private settingsState: SettingsState;\n\n gameEntities: Entity[];\n private performanceInfoDiv: HTMLElement;\n\n\n constructor() {\n this.performanceInfoDiv = document.getElementById('performance_div');\n this.performanceInfoDiv.innerHTML = `waiting for perf data`;\n\n this.viewportService = new ViewportService();\n const loadedInDebugMode = this.checkDebugModeFromQueryString();\n this.graphicsService = new GraphicsService();\n this.stateService = new StateService();\n this.debugService = new DebugService(loadedInDebugMode);\n this.debugComponent = new DebugComponent(this.debugService);\n this.inputManager = new InputManager();\n this.timerService = new TimerService(60);\n this.worldService = new WorldService(this.graphicsService.GetTileService());\n this.entityService = new EntityService();\n this.playerService = new PlayerService();\n }\n\n Run() {\n console.log('Run called in game.ts');\n this.Init();\n this.running = true;\n this.Loop();\n }\n\n Init(): string {\n console.log(this.launchMessage + ' will now be posted to the document ');\n this.SetupStates();\n this.inputManager.InitInputManager();\n this.graphicsService.InitGraphicsService();\n this.worldService.Init();\n this.graphicsService.getGameCameraService().SetLevelAABB(this.worldService.GetWorldSize());\n\n this.registerEntities();\n // this.canvasManager.InitCanvasManager('main_div', this.gameEntities);\n if (this.debugService.IsInDebugMode()) {\n console.log('setting up with debug info');\n this.debugComponent.InitDebugComponent('main_div');\n }\n return this.launchMessage;\n }\n\n private SetupStates() {\n this.gameState = new GameState(this.graphicsService);\n this.menuState = new MenuState();\n this.settingsState = new SettingsState();\n\n this.stateService.setState(this.gameState);\n }\n\n\n /**\n * loops continuously whenever the browser is ready\n * for a new frame\n *\n * @memberof Game\n */\n Loop() {\n requestAnimationFrame(() => {\n if (this.running) {\n if (this.timerService.CheckShouldRunLoop()) {\n const lastDelta = this.timerService.GetLastUpdateTimeTook();\n this.Update(lastDelta);\n this.Render(lastDelta);\n this.timerService.UpdateTicksAndRenderAfterLoop();\n }\n\n this.PrintDebugInfoToConsole(false, true);\n this.timerService.ResetTimers();\n }\n this.Loop();\n });\n }\n\n /**\n * prints debug info from various places in the \n * application\n *\n * @private\n * @memberof Game\n */\n private PrintDebugInfoToConsole(printToConsole: boolean = false, printToHtml: boolean = false) {\n if (this.timerService.ShouldPrintDebugData()) {\n // console.clear();\n let debugInformation: string[] = new Array();\n debugInformation.push('FPS Serv: ' + this.timerService.PrintCurrentFpsToConsole());\n debugInformation.push('Cam Serv: ' + this.graphicsService.getGameCameraService().GetDebugInfo());\n if (printToConsole) {\n for (let line of debugInformation) {\n if (line.length > 0) {\n console.log('%c ' + line + ' ', 'background: #000; color:white; ');\n }\n }\n }\n if (printToHtml) {\n this.performanceInfoDiv.innerHTML = `
${debugInformation.join('\\n')}
`;\n }\n\n // debugInformation = Array(0);\n }\n }\n\n Update(lastDelta: number) {\n if (this.stateService.GetState() !== null) {\n this.inputManager.NewInputLoopCheck();\n\n this.stateService.GetState().Tick();\n\n this.entityService.TickAllEntities(lastDelta);\n // for (let i = 0; i < this.gameEntities.length; i++) {\n // this.gameEntities[i].Tick();\n // }\n\n\n }\n }\n\n Render(lastDelta: number) {\n if (this.stateService.GetState() !== null) {\n this.graphicsService.GetTileService().Redner();\n\n this.entityService.RenderAllEntities(this.graphicsService);\n this.stateService.GetState().Render();\n this.graphicsService.Render();\n }\n }\n\n checkDebugModeFromQueryString(): boolean {\n const urlParams = new URLSearchParams(window.location.search);\n const debugModeParam = urlParams.get('inDebugMode');\n\n return JSON.parse(debugModeParam);\n }\n\n registerEntities(baddyCount: number = 75): void {\n\n\n\n\n const ships = [\n 'metalic_01.png',\n 'metalic_02.png',\n 'metalic_03.png',\n 'metalic_04.png',\n 'metalic_05.png',\n 'metalic_06.png',\n 'orange_01.png',\n 'orange_02.png',\n 'orange_03.png',\n 'orange_04.png',\n 'orange_05.png',\n 'orange_06.png'\n ];\n const entitySize: Vector2 = new Vector2(30, 30);\n for (let i = 0; i < baddyCount; i++) {\n const imageLoc = RandomNumberGenerator.GetRandomNumber(0, 6);\n console.log('image loc will be ' + imageLoc);\n const entity = new Baddy(\n // new Vector2(500, 300),\n RandomNumberGenerator.GetRandomVector2(\n 0, this.viewportService.GetBrowserWidth(),\n 0, this.viewportService.GetBrowserHeight()),\n entitySize,\n 'baddy' + i.toString(),\n '/Ships/' + ships[imageLoc],\n this.graphicsService,\n RandomStringGenerator.GetRandomHexColour(),\n this.playerService\n );\n\n this.entityService.RegisterEntity(entity);\n }\n\n this.playerService.SetPlayer(new Player(\n new Vector2(\n this.viewportService.GetBrowserWidth() / 2,\n this.viewportService.GetBrowserHeight() / 2),\n // new Vector2(0, 0),\n new Vector2(50, 50),\n 'player',\n 'Ships/large_purple_01.png',\n this.inputManager,\n this.graphicsService));\n\n\n this.entityService.RegisterEntity(this.playerService.GetPlayer());\n\n // return entities;\n }\n}","import { Input } from \"./input.model\";\n\nexport class InputState {\n\n private static SYSTEM_KEYS: string[] = [\n 'F1',\n 'F2',\n 'F3',\n 'F4',\n 'F5',\n 'F6',\n 'F7',\n 'F8',\n 'F9',\n 'F10',\n 'F11',\n 'F12',\n ];\n private static DEFAULT_MAX_INPUTS: number = 4;\n private static DEFAULT_MIN_JOYSTICK_SENSITIVITY: number = 0.1;\n private detailsDiv: HTMLElement;\n\n private registeredGamePads: Gamepad[];\n private gamePads: Gamepad[];\n private currentInputs: Array;\n\n private controllingWithPad = false;\n constructor() {\n console.log('inputState: constructing input state');\n this.detailsDiv = document.getElementById('details_div');\n this.registeredGamePads = new Array();\n this.gamePads = new Array();\n }\n\n Init() {\n console.log('inputState: init inputstate');\n this.setupInputs();\n this.SetupGamePadRegistrationWatch();\n this.SetupKeyboardInputWatch();\n this.SetGamePadMode(false);\n }\n\n private SetGamePadMode(controllingWithPad: boolean): void {\n this.controllingWithPad = controllingWithPad;\n if (controllingWithPad) {\n this.detailsDiv.innerHTML = 'controlling with gamepad. Press >> k << to use keyboard mode';\n } else {\n this.detailsDiv.innerHTML = 'controlling with keyboard. Press >> select << to use gamepad mode';\n }\n }\n private GetGamePadMode() {\n return this.controllingWithPad;\n }\n\n\n /**\n * // https://w3c.github.io/gamepad/#remapping\n *\n * @memberof InputState\n */\n setupInputs() {\n this.currentInputs = new Array();\n this.currentInputs.push(\n new Input('direction_left', 'a', 14, null),\n new Input('direction_right', 'd', 15, null),\n new Input('direction_up', 'w', 12, null),\n new Input('direction_down', 's', 13, null),\n\n new Input('axes_pad_left_horizontal', null, null, 0),\n new Input('axes_pad_left_vertical', null, null, 1),\n new Input('axes_pad_right_horizontal', null, null, 2),\n new Input('axes_pad_right_vertical', null, null, 3),\n\n new Input('trigger_one_left', 'q', 4, null),\n new Input('trigger_two_left', 'w', 6, null),\n new Input('trigger_one_right', 'e', 5, null),\n new Input('trigger_two_right', 's', 7, null),\n\n // 'action_{val}' where {val} is the \n // name of the button on an XBox360 controller\n new Input('action_a', ' ', 0, null),\n new Input('action_y', 'z', 3, null),\n new Input('action_x', 'x', 2, null),\n new Input('action_b', 'c', 1, null),\n );\n }\n\n\n public UpdateInputs() {\n // console.log('inputstate: updating inputs. There are ' + this.registeredGamePads.length + ' pads connected')\n\n this.UpdateGamePadInputs();\n }\n\n private ResetInputsBeforeGamePadInput() {\n for (let input of this.currentInputs) {\n input.wasPressedPreviousCheck = input.pressed;\n input.pressed = false;\n }\n }\n private UpdateGamePadInputs() {\n for (let i = 0; i < this.registeredGamePads.length; i++) {\n const padToCheck = this.GetGamePad(i);\n if (this.GetGamePadMode()) {\n this.ResetInputsBeforeGamePadInput();\n for (let btnIndex = 0; btnIndex < padToCheck.buttons.length; btnIndex++) {\n if (this.gamePadButtonPressed(padToCheck.buttons[btnIndex])) {\n this.pushToCurrentInputsFromGamePad(btnIndex, padToCheck.buttons[btnIndex].value);\n // console.log(`inputstate: btn ${btnIndex} is pressed`)\n }\n }\n for (let axesIndex = 0; axesIndex < padToCheck.axes.length; axesIndex++) {\n if (this.gamePadAxesPressed(padToCheck.axes[axesIndex])) {\n this.pushToCurrentInputsFromGamePadAxes(axesIndex, padToCheck.axes[axesIndex])\n }\n }\n } else {\n if (this.gamePadButtonPressed(padToCheck.buttons[8])) {\n console.warn('inputstate: in gamepad mode');\n this.SetGamePadMode(true);\n }\n }\n }\n }\n\n\n IsInputPressed(inputDescription: string): boolean {\n for (let input of this.currentInputs) {\n if (input.name === inputDescription) {\n return input.pressed;\n }\n }\n return false;\n }\n GetForceValue(inputDescription: string): number {\n for (let input of this.currentInputs) {\n if (input.name === inputDescription) {\n return input.force;\n }\n }\n return 0;\n }\n\n /**\n * checks if this key is in the SYSTEM_KEYS array\n * (includes keys like F1 - F12)\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof InputState\n */\n private isSystemKey(key: string) {\n if (InputState.SYSTEM_KEYS.includes(key)) {\n return true;\n }\n return false;\n }\n\n private SetupKeyboardInputWatch() {\n window.addEventListener('keydown', event => {\n if (!this.isSystemKey(event.key)) {\n event.preventDefault();\n this.pushToCurrentInputsFromKeyboard(event.key);\n }\n });\n\n window.addEventListener('keyup', event => {\n if (!this.isSystemKey(event.key)) {\n\n event.preventDefault();\n this.popFromCurrentInputsFromKeyboard(event.key);\n if (event.key === 'k') {\n console.warn(`inputstate: controlling by keyboard`)\n this.SetGamePadMode(false);\n }\n }\n });\n }\n pushToCurrentInputsFromKeyboard(key: string) {\n if (this.GetGamePadMode() === false) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.keyboardId === key) {\n thisInput.pressed = true;\n thisInput.force = 1;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n }\n popFromCurrentInputsFromKeyboard(key: string) {\n if (this.GetGamePadMode() === false) {\n\n for (let input of this.currentInputs) {\n if (input.keyboardId === key) {\n input.pressed = false;\n // console.log(`inputstate marked ${input.name} as pressed`)\n return;\n }\n }\n }\n }\n\n pushToCurrentInputsFromGamePad(btnId: number, pushForce: number) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.gamepadId === btnId) {\n thisInput.pressed = true;\n thisInput.force = pushForce;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n pushToCurrentInputsFromGamePadAxes(axesIndex: number, pushForce: number) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.gamePadAxesId === axesIndex) {\n thisInput.pressed = true;\n thisInput.force = pushForce;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n popFromCurrentInputsFromGamePad(btnId: number) {\n for (let input of this.currentInputs) {\n if (input.gamepadId === btnId) {\n input.pressed = false;\n // console.log(`inputstate marked ${input.name} as not`)\n return;\n }\n }\n }\n\n\n /* GamePad code */\n\n /**\n * watches for the game pad registration events\n *\n * @memberof InputState\n */\n SetupGamePadRegistrationWatch() {\n console.log('inputstate setting up registrations')\n\n window.addEventListener('gamepadconnected', (e: GamepadEvent) => {\n console.log('inputstate got gamepad')\n this.RegisterGamePad(e.gamepad);\n });\n window.addEventListener('gamepaddisconnected', (e: GamepadEvent) => {\n console.error('inputstate gamepad was disconnected');\n this.DeRegisterGamePad(e.gamepad);\n });\n }\n\n\n private RegisterGamePad(gamePad: Gamepad) {\n console.warn(\"inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n gamePad.index, gamePad.id,\n gamePad.buttons.length, gamePad.axes.length);\n this.registeredGamePads[gamePad.index] = gamePad;\n this.detailsDiv.innerHTML = 'Gamepad has been connected';\n\n\n }\n private DeRegisterGamePad(gamePad: Gamepad) {\n console.error(\"inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n gamePad.index, gamePad.id,\n gamePad.buttons.length, gamePad.axes.length);\n this.GetGamePads();\n this.detailsDiv.innerHTML = 'inputstate: Gamepad has been disconnected';\n }\n\n private GetGamePads() {\n this.gamePads = navigator.getGamepads();\n }\n private GetGamePad(index: number) {\n return navigator.getGamepads()[index];\n }\n\n private gamePadAxesPressed(axes: number) {\n return (axes > InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY || axes < -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY);\n }\n\n private gamePadButtonPressed(btn: GamepadButton) {\n // console.log(typeof(btn));\n if (typeof (btn) === 'object') {\n // firefox\n // console.log('gamepad: ff')\n if (btn.pressed) {\n // console.log('inputstate: button is pressed')\n }\n return btn.value;\n } else {\n // console.log('inputstate: gamepad: chrome')\n return btn === 1.0;\n }\n }\n}","import { Entity } from \"../_base-entity\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { CreatureDefaultSettings } from \"./creature.default.settings\";\nimport { Texture2D } from \"../../Graphics/Textures/Texture2d\";\nimport { DrawableCanvas } from \"../../Graphics/Models/graphics.drawable-canvas\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Vector2Helpers } from \"../../../numerics/helpers/vector2.helper\";\nimport { Lerp } from \"../../../numerics/helpers/number.helper\";\n\n\n\nexport abstract class Creature extends Entity {\n graphicsService: GraphicsService;\n\n protected health: number;\n protected speed: Vector2;\n protected maxSpeed: Vector2;\n protected velocity: Vector2;\n protected acceleration: Vector2;\n protected deceleration: Vector2;\n protected friction: Vector2;\n protected thrust: number;\n\n protected turnSpeed: number = 1;\n protected readonly angleAdjust: number = -90;\n\n\n // protected canvasId: string;\n\n // protected texture: Texture2D;\n\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string,\n graphicsService: GraphicsService) {\n super(position, size, name, '1', 'no_text_yet');\n console.error('passing incorrect texture ID and canvasId, and canvas to super');\n\n this.graphicsService = graphicsService;\n\n this.health = CreatureDefaultSettings.DEFAULT_HEALTH;\n this.speed = CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED;\n this.velocity = new Vector2(0, 0);\n this.maxSpeed = CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX;\n this.acceleration = CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION;\n this.deceleration = Vector2Helpers.DivideByScale(CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION, 1);\n this.friction = CreatureDefaultSettings.DEFAULT_FRICTION;\n this.setCanvasId(this.graphicsService.RegisterDrawableEntity());\n\n\n if (texturePath !== undefined && texturePath !== null && texturePath.length) {\n const textureId = this.graphicsService.GetTextureService().RegisterNewTexture(texturePath);\n this.SetTextureId(textureId);\n } else {\n console.error(new Error(`creature [${name}] did not have a texture`));\n }\n\n }\n\n public Move(lastDelta: number): void {\n this.CapMovementSpeed();\n this.CapRotation();\n this.UpdatePosition(lastDelta);\n this.ReduceSpeed();\n this.UpdateAABB();\n }\n\n private ReduceSpeed() {\n\n this.velocity.y *= this.friction.y;\n this.velocity.x *= this.friction.x;\n\n // if (this.velocity.y > 0) {\n // this.velocity.y -= this.friction.y;\n // if (this.velocity.y < 0) {\n // this.velocity.y = 0;\n // }\n // } else if (this.velocity.y < 0) {\n // this.velocity.y += this.friction.y;\n // if (this.velocity.y > 0) {\n // this.velocity.y = 0;\n // }\n // }\n\n // if (this.velocity.x > 0) {\n // this.velocity.x -= this.friction.x;\n // if (this.velocity.x < 0) {\n // this.velocity.x = 0;\n // }\n // } else if (this.velocity.x < 0) {\n // this.velocity.x += this.friction.x;\n // if (this.velocity.x > 0) {\n // this.velocity.x = 0;\n // }\n // }\n }\n\n /**\n * updates the creature's position\n *\n * @private\n * @memberof Creature\n */\n private UpdatePosition(lastDelta: number) {\n // this.position.x += (this.velocity.x * (lastDelta) * 50);\n // this.position.y += (this.velocity.y * (lastDelta) * 50);\n\n this.position.x = Lerp(this.position.x, this.position.x + (this.velocity.x * (lastDelta) * 50), .8);\n this.position.y = Lerp(this.position.y, this.position.y + (this.velocity.y * (lastDelta) * 50), .8);\n }\n\n /**\n * caps the creature's movement speed at\n * this.maxSpeed\n *\n * @private\n * @memberof Creature\n */\n private CapMovementSpeed() {\n if (this.velocity.x > this.maxSpeed.x) {\n this.velocity.x = this.maxSpeed.x;\n } else if (this.velocity.x < -this.maxSpeed.x) {\n this.velocity.x = -this.maxSpeed.x;\n }\n if (this.velocity.y > this.maxSpeed.y) {\n this.velocity.y = this.maxSpeed.y;\n } else if (this.velocity.y < -this.maxSpeed.y) {\n this.velocity.y = -this.maxSpeed.y;\n }\n\n if (this.velocity.x < 0.1 && this.velocity.x > -0.1) {\n this.velocity.x = 0;\n }\n if (this.velocity.y < 0.1 && this.velocity.y > -0.1) {\n this.velocity.y = 0;\n }\n }\n\n private CapRotation() {\n // if (this.rotationDegrees < 0) {\n // this.rotationDegrees = 360 - (-this.rotationDegrees);\n // }\n // if (this.rotationDegrees < 0) {\n // this.rotationDegrees = 359;\n // } if (this.rotationDegrees > 360) {\n // this.rotationDegrees = 0;\n // }\n }\n\n public getHealth(): number {\n return this.health;\n }\n\n public setHealth(health: number): void {\n this.health = health;\n }\n\n public getSpeed(): Vector2 {\n return this.speed;\n }\n\n public setSpeed(speed: Vector2): void {\n this.speed = speed;\n }\n\n public getMove(): Vector2 {\n return this.velocity;\n }\n\n public setMove(move: Vector2): void {\n this.velocity = move;\n }\n\n}","export class Vector2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n concat(decimalPlaces: number = -1) {\n if (decimalPlaces > -1) {\n return `x:[${this.x.toFixed(decimalPlaces)}], y:[${this.y.toFixed(decimalPlaces)}]`;\n }\n return `x:[${this.x}], y:[${this.y}]`;\n }\n\n getValueX() {\n return this.x;\n }\n getValueY() {\n return this.y;\n }\n\n setValueX(x: number) {\n this.x = x;\n }\n setValueY(y: number) {\n this.y = y;\n }\n setValues(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n}","import { BaseState } from \"./_BaseState\";\n\n\nexport class MenuState extends BaseState {\n constructor() {\n super();\n console.log(`constructing MenuState`);\n }\n\n public Tick(): void {\n console.error(\"Method not implemented.\");\n\n }\n\n public Render(): void {\n console.error(\"Method not implemented.\");\n\n }\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class CreatureDefaultSettings {\n public static readonly DEFAULT_HEALTH: number = 100;\n public static readonly DEFAULT_MOVEMENT_SPEED: Vector2 = new Vector2(3.0, 3.0);\n public static readonly DEFAULT_MOVEMENT_SPEED_MAX: Vector2 = new Vector2(11.0, 11.0);\n public static readonly DEFAULT_MOVEMENT_ACCELERATION: Vector2 = new Vector2(3.0, 3.0);\n public static readonly DEFAULT_MOVEMENT_VELOCITY: Vector2 = new Vector2(3, 3);\n public static readonly DEFAULT_SIZE: Vector2 = new Vector2(20, 20);\n public static readonly DEFAULT_FRICTION: Vector2 = new Vector2(0.95, 0.95);\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { Entity } from \"../../Entities/_base-entity\";\nimport { ViewportHelper } from \"../Viewport/Viewport.Helper\";\nimport { Vector2Helpers } from \"../../../numerics/helpers/vector2.helper\";\nimport { IntersectionHelper } from \"../../../numerics/helpers/intersection.helper\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\n\nexport class GameCameraService {\n private offset: Vector2;\n private displayableSize: Vector2;\n private applyWorldBounding: boolean;\n\n private cameraAABB: AABB;\n private levelAABB: AABB;\n\n /**\n *Creates an instance of GameCameraService.\n\n applyWorldBounding tells the camera if it should continue\n moving right or left if it reaches the edge of the level\n * @param {number} xOffset\n * @param {number} yOffset\n * @param {boolean} applyWorldBounding\n * @memberof GameCameraService\n */\n constructor(xOffset: number, yOffset: number, applyWorldBounding: boolean) {\n this.offset = new Vector2(xOffset, yOffset);\n this.applyWorldBounding = applyWorldBounding;\n\n this.displayableSize = ViewportHelper.GetWindowInAspectRatio();\n this.UpdatePositionAndSize();\n }\n\n public SetLevelAABB(levelAABB: AABB) {\n this.levelAABB = levelAABB;\n }\n\n public GetDebugInfo(): string[] {\n return [`\n offset: ${this.offset.concat(2)} \n size: ${this.displayableSize.concat(2)}`];\n }\n\n /**\n * checks if two objects intersect\n *\n * @param {Vector2} position\n * @param {Vector2} size\n * @returns {boolean}\n * @memberof GameCameraService\n */\n public IsObectOnScreen(position: Vector2, size: Vector2): boolean {\n const objectAABB: AABB = new AABB(position, size);\n return this.IsObjectOnScreenAABB(objectAABB);\n }\n\n public IsObjectOnScreenAABB(AABB: AABB) {\n if (IntersectionHelper.AabbVsAabb(this.cameraAABB, AABB)) {\n return true;\n } else {\n return false;\n }\n }\n\n public MoveCamera(xAmount: number, yAmount: number): void {\n console.error('don\\'t use MoveCamera');\n this.offset.x += xAmount;\n this.offset.y += yAmount;\n }\n\n\n /**\n * sets the camera to points at (looks at) a specific entity \n *\n * @param {Vector2} entityPosition\n * @param {Vector2} entitySize\n * @memberof GameCameraService\n */\n public LookAt(entityPosition: Vector2, entitySize: Vector2): void {\n\n const vieportWidth = ViewportHelper.GetWindowInAspectRatio().getValueX();\n const vieportHeight = ViewportHelper.GetWindowInAspectRatio().getValueY();\n\n const centerX = entityPosition.getValueX() - (vieportWidth / 2) + (entitySize.getValueX() / 2);\n const centerY = entityPosition.getValueY() - (vieportHeight / 2) + (entitySize.getValueY() / 2);\n\n this.SetOffset(new Vector2(\n centerX,\n centerY\n ));\n }\n private SetOffset(positionVector: Vector2) {\n this.offset = positionVector;\n if (this.applyWorldBounding) {\n if (this.offset.getValueX() < this.levelAABB.GetLeft()) {\n this.offset.setValueX(this.levelAABB.GetLeft());\n }\n\n if (this.offset.getValueX() > this.levelAABB.GetRight()) {\n this.offset.setValueX(this.levelAABB.GetRight());\n }\n\n\n if (this.offset.getValueY() < this.levelAABB.GetTop()) {\n this.offset.setValueY(this.levelAABB.GetTop());\n }\n if (this.offset.getValueY() > this.levelAABB.GetBottom()) {\n this.offset.setValueY(this.levelAABB.GetBottom());\n }\n }\n this.UpdatePositionAndSize();\n }\n UpdatePositionAndSize() {\n this.cameraAABB = new AABB(this.offset, this.displayableSize);\n }\n\n public GetOffsetX(): number {\n return this.offset.getValueX();\n }\n public GetOffsetY(): number {\n return this.offset.getValueY();\n }\n public GetOffsetVector(): Vector2 {\n return this.offset;\n }\n}","import { Vector2 } from \"../models/Vector2.model\";\n\nexport class Vector2Helpers {\n /*\n * adds two Vector2 together and returns a new Vector2\n * containing the results\n */\n public static Add(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() + right.getValueX();\n const vecY = left.getValueY() + right.getValueY();\n\n return new Vector2(vecX, vecY);\n }\n\n /**\n * compares two Vector 2s for equality\n * If the vectors are identica, this returns true otherwise returns false\n *\n * @static\n * @param {Vector2} left\n * @param {Vector2} right\n * @returns {boolean}\n * @memberof Vector2Helpers\n */\n public static CompareEquality(left: Vector2, right: Vector2): boolean {\n return !(left.getValueX() !== right.getValueX() || left.getValueY() !== right.getValueY());\n }\n\n /*\n * divides the first vector by the second\n * this is not scalar division\n */\n public static Divide(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() / right.getValueX();\n const vecY = left.getValueY() / right.getValueY();\n return new Vector2(vecX, vecY);\n }\n\n /*\n * divides a given source vector2 by a scale factor\n */\n public static DivideByScale(source: Vector2, scaleFactor: number): Vector2 {\n const factor: number = 1 / scaleFactor;\n\n const vecX = source.getValueX() * factor;\n const vecY = source.getValueY() * factor;\n return new Vector2(vecX, vecY);\n }\n\n /*\n * gets the dot product of two vectors,\n * returns as a number (float?)\n */\n public static Dot(left: Vector2, right: Vector2): number {\n\n const vecX = left.getValueX() * right.getValueX();\n const vecY = left.getValueY() * right.getValueY();\n\n return vecX + vecY;\n }\n\n public static Subtract(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() - right.getValueX();\n const vecY = left.getValueY() - right.getValueY();\n\n return new Vector2(vecX, vecY);\n }\n\n public static NegativeOf(source: Vector2) {\n const vecX = -source.getValueX();\n const vecY = -source.getValueY();\n return new Vector2(vecX, vecY);\n }\n\n public static Multiply(left: Vector2, right: Vector2) {\n const vecX = left.getValueX() * right.getValueX();\n const vecY = left.getValueY() * right.getValueY();\n return new Vector2(vecX, vecY);\n }\n public static MultiplyByScale(source: Vector2, scaleFactor: number) {\n const vecX = source.getValueX() * scaleFactor;\n const vecY = source.getValueY() * scaleFactor;\n return new Vector2(vecX, vecY);\n }\n}","export class DebuggableItems {\n debugItems: Array;\n constructor() {\n this.debugItems = new Array();\n }\n}\nexport class DebugKvp {\n Key: string;\n Value: any;\n constructor(key: string, value: any) {\n this.Key = key;\n this.Value = value;\n }\n}","import { Texture2D } from \"./Texture2d\";\n\nexport class TextureService {\n textures: Array;\n\n constructor() {\n console.log('constructing texture service');\n this.textures = new Array();\n }\n\n public GetTexture(textureId: string): Texture2D {\n for (let i = 0; i < this.textures.length; i++) {\n if (textureId === this.textures[i].GetId()) {\n return this.textures[i];\n }\n }\n }\n\n\n /**\n * registers a new texture in the service. If the texture already\n * exists, throws an error and returns the existing one\n *\n * @param {string} texturePath\n * @returns {string}\n * @memberof TextureService\n */\n public RegisterNewTexture(texturePath: string): string {\n for (let i = 0; i < this.textures.length; i++) {\n const thisTextPath = this.textures[i].GetPath()\n if (thisTextPath === texturePath) {\n console.error('attempted to create a texture a second time')\n return this.textures[i].GetId();\n }\n }\n const newTexture = new Texture2D(texturePath);\n this.textures.push(newTexture);\n console.warn(`texture stack is now [${this.textures.length}] long`)\n return newTexture.GetId();\n }\n}","export class ImageHelper{\n private static readonly assetBasePath: string = './assets/_dist/';\n static NewImage(path: string): HTMLImageElement {\n const image = new Image(128, 128);\n image.src = this.assetBasePath + path;\n image.onerror = ((event) => this.onError(event));\n return image;\n }\n\n private static onError(error: string | Event) {\n console.log('error loading image', error);\n return;\n } \n}","import { HtmlService } from \"./Html/graphics.html.service\";\nimport { CanvasService } from \"./Canvas/graphics.canvas.service\";\nimport { TileService } from \"./Tiles/tile.service\";\nimport { GameCameraService } from \"./Camera/game-camera.service\";\nimport { DrawingService } from \"./Draw/drawing.service\";\nimport { TextureService } from \"./Textures/texture.service\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\nimport { Vector2 } from \"../../numerics/models/Vector2.model\";\n\nexport class GraphicsService {\n \n private htmlService: HtmlService;\n private canvasService: CanvasService;\n private tileService: TileService;\n private gameCameraService: GameCameraService;\n private drawingService: DrawingService;\n private textureService: TextureService;\n\n constructor() {\n console.log('starting graphics service');\n this.htmlService = new HtmlService();\n this.canvasService = new CanvasService(this.htmlService);\n this.tileService = new TileService(this.canvasService, this);\n this.textureService = new TextureService();\n const applyCameraWorldBounding = false;\n this.gameCameraService = new GameCameraService(0, 0, applyCameraWorldBounding);\n this.drawingService = new DrawingService(this.gameCameraService, this.canvasService, this.textureService);\n }\n\n\n\n InitGraphicsService() {\n this.htmlService.Init();\n this.canvasService.Init();\n this.tileService.Init();\n\n }\n\n public GetTextureService(): TextureService {\n return this.textureService;\n }\n\n GetTileService(): TileService {\n return this.tileService;\n }\n public getGameCameraService(): GameCameraService {\n return this.gameCameraService;\n }\n getDrawingService(): DrawingService {\n return this.drawingService;\n }\n\n RegisterDrawableEntity(id: string = null): string {\n return this.canvasService.RegisterNewCanvas(id);\n }\n\n GetCanvas(id: string) {\n return this.canvasService.GetCanvas(id);\n }\n\n Render() {\n // console.log('rendering in graphics service');\n this.canvasService.mainCanvasCtx.clearRect(0, 0,\n this.canvasService.mainCanvas.width, this.canvasService.mainCanvas.height);\n\n for (let i = 0; i < this.canvasService.drawableAreas.length; i++) {\n this.canvasService.mainCanvasCtx.drawImage(\n this.canvasService.drawableAreas[i].canvas, 0, 0);\n }\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class DirtTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/dirt.png';\n constructor(id: number, textId: string) {\n super(id, '#916D49', textId);\n }\n}","import * as json from '../../assets/_dist/Worlds/worlds.json';\nimport { World } from './world';\nimport { Vector2 } from '../../numerics/models/Vector2.model';\n\n/**\n * this is in a different file because adding .json files\n * causes VSCode to only want to load .js imports, and not\n * .ts imports\n *\n * @export\n * @class WorldJsonFileLoader\n */\nexport class WorldJsonFileLoader {\n private static worldCount: number = 2;\n constructor() {\n\n }\n public static GetWorlds(): World[] {\n const worldArr = new Array();\n for (let i = 0; i < this.worldCount; i++) {\n\n const world = json[i];\n worldArr.push(new World(\n new Vector2(\n world.tiles.length,\n world.tiles[0].length),\n new Vector2(\n world.start.x,\n world.start.y),\n world.tiles,\n world.worldId\n ));\n }\n return worldArr;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class ShallowWaterTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_top.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_right.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_left.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}","import { IDebugService } from \"./debug.service\";\nimport { DebugKvp } from \"./debuggable-items.model\";\n\nexport class DebugComponent {\n private _debugService: IDebugService;\n private debugInfoElement: HTMLElement;\n\n constructor(private debugService: IDebugService) {\n this._debugService = debugService;\n\n\n }\n\n InitDebugComponent(mainDivId: string) {\n this.createDebugDiv(mainDivId);\n this.tick();\n }\n private createDebugDiv(parentElementId: string, id: string = 'el_debug_info'): HTMLElement {\n if (this.debugService.IsInDebugMode()) {\n const mainDiv = document.getElementById(parentElementId);\n this.debugInfoElement = document.createElement('div');\n this.debugInfoElement.id = id;\n mainDiv.appendChild(this.debugInfoElement);\n for (let i = 0; i < 10; i++) {\n this.debugService.PushOrUpdateInDebugArray('Debug Info' + i, 'debug value')\n }\n // this.debugService.PopFromDebugArray('Debug Info')\n\n return this.debugInfoElement;\n }\n }\n\n tick() {\n // setTimeout(() => {\n // this.ticks++;\n // });\n requestAnimationFrame(() => {\n // console.log('updating debugger')\n this.Update();\n this.tick();\n })\n }\n Update() {\n // console.log(this.debugService.GetDebugInfo(), null, 2)\n let DebugsAsString = '';\n const debugInfoArray = this.debugService.GetDebugInfo();\n for (let i = 0; i < debugInfoArray.length; i++) {\n // DebugsAsString += this.GetTemplateForKvp(debugInfoArray[i]);\n }\n this.debugInfoElement.innerHTML = DebugsAsString;\n }\n\n GetTemplateForKvp(item: DebugKvp) {\n throw new Error('not implemented')\n return `\n
\n
\n                ${item.Key}\n            
\n
\n                ${JSON.stringify(item.Value)}\n            
\n
`\n }\n}","import { Vector2 } from \"./Vector2.model\";\n\nexport class AABB {\n min: Vector2;\n max: Vector2;\n\n constructor(position: Vector2, size: Vector2) {\n this.min = new Vector2(\n position.getValueX(),\n position.getValueY());\n this.max = new Vector2(\n position.getValueX() + size.getValueX(),\n position.getValueY() + size.getValueY()\n );\n }\n public GetCenter(): Vector2 {\n const x = ((this.max.x - this.min.x) / 2) + this.min.x;\n const y = ((this.max.y - this.min.y) / 2) + this.min.y;\n\n return new Vector2(\n x, y\n );\n }\n public GetTop(): number {\n return this.min.getValueY();\n } \n public GetBottom(): number {\n return this.max.getValueY();\n }\n public GetLeft(): number {\n return this.min.getValueX();\n }\n public GetRight(): number {\n return this.max.getValueX();\n }\n\n public IsAbove(target: AABB): boolean {\n if (this.GetBottom() < target.GetTop()) {\n return true;\n }\n return false; \n }\n\n public IsBelow(target: AABB): boolean {\n if (this.GetTop() > target.GetBottom()) {\n return true;\n }\n return false;\n }\n\n public IsRight(target: AABB): boolean {\n if (this.GetRight() < target.GetLeft()) {\n return true;\n }\n return false;\n }\n\n public IsLeft(target: AABB): boolean {\n if (this.GetLeft() > target.GetRight()) {\n return true;\n }\n return false;\n }\n\n}","import { InputState } from \"./input-state\";\nimport { Vector2 } from \"../../numerics/models/Vector2.model\";\n\n\n\nexport class InputManager {\n\n private inputState: InputState;\n\n currentInputs: Array;\n private static readonly validInputs: Array = ['w', 'a', 's', 'd', ' '];\n\n\n private gamePads: Array = Array();\n\n constructor() {\n this.inputState = new InputState();\n\n\n this.currentInputs = new Array();\n this.gamePads = new Array();\n }\n\n /**\n * sets up the input manager\n *\n * @memberof InputManager\n */\n InitInputManager() {\n this.inputState.Init();\n // return;\n\n }\n\n /**\n * checks for new inputs. Should be called in a loop\n *\n * @memberof InputManager\n */\n NewInputLoopCheck() {\n this.inputState.UpdateInputs();\n // throw new Error(\"Method not implemented.\");\n }\n\n // private RegisterGamePad(pad: Gamepad) {\n // console.warn('gamepad registered');\n // console.warn(\"Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n // pad.index, pad.id,\n // pad.buttons.length, pad.axes.length);\n // this.gamePads = navigator.getGamepads();\n // // this.gamePads.push(pad); // = navigator.getGamepads ? navigator.getGamepads() : (navigator.getGamepads ? navigator.getGamepads : []);\n\n // for (let i = 0; i < this.gamePads.length; i++) {\n // const thisGp = this.gamePads[i];\n // if (thisGp) {\n // this.detailsDiv.innerHTML = \"Gamepad connected at index \" + thisGp.index + \": \" + thisGp.id +\n // \". It has \" + thisGp.buttons.length + \" buttons and \" + thisGp.axes.length + \" axes.\";\n\n // }\n // }\n // }\n // private DeRegisterGamePad(pad: Gamepad) {\n // console.warn('deregistering gamepad');\n // delete this.gamePads[pad.index];\n // this.ReportToHtml(\"gamepad DC\");\n // }\n\n\n\n\n /**\n * public method to check if a key is pressed or not\n *\n * @param {string} key\n * @returns\n * @memberof InputManager\n */\n IsKeyPressed(inputDescription: string): boolean {\n return this.inputState.IsInputPressed(inputDescription);\n }\n\n /**\n * gets the force value for a given input. If it's in \n * keyboard mode, then it just returns 0 or 1\n * \n * If it's in keyboard mode, then it returns a value of -1.0 to +1.0\n *\n * @param {string} inputDescription\n * @returns {number}\n * @memberof InputManager\n */\n GetForceValue(inputDescription: string): number {\n return this.inputState.GetForceValue(inputDescription);\n }\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class RandomNumberGenerator {\n\n\n /**\n * Generates a random number\n *\n * @static\n * @param {number} min\n * @param {number} max\n * @returns {number}\n * @memberof RandomNumberGenerator\n */\n public static GetRandomNumber(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * generates a random Vector 2\n *\n * @static\n * @param {number} minX\n * @param {number} maxX\n * @param {number} minY\n * @param {number} maxY\n * @returns {Vector2}\n * @memberof RandomNumberGenerator\n */\n public static GetRandomVector2(\n minX: number, maxX: number, \n minY: number, maxY: number): Vector2 {\n return new Vector2(this.GetRandomNumber(minX, maxX),\n this.GetRandomNumber(minY, maxY));\n }\n}","import { TileType } from \"./TileTypes/_base-tiletype\";\nimport { CanvasService } from \"../Canvas/graphics.canvas.service\";\nimport { SpaceTileType } from \"./TileTypes/SpaceTileTypes/space.tiletype\";\nimport { GraphicsService } from \"../graphics.service\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { TileDefaultSettings } from \"./tile.default.settings\";\nimport { DrawableTile } from \"./drawable-tile\";\nimport { GrassTileType, GrassTileTypeDirt, GrassTileTypeDirtTop, GrassTileTypeDirtRight, GrassTileTypeDirtLeft, GrassTileTypeDirtBottom, GrassTileTypeDirtMiddle } from \"./TileTypes/GroundTileTypes/grass.tiletype\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { StarTileType } from \"./TileTypes/SpaceTileTypes/star.tiletype\";\nimport { DirtTileType } from \"./TileTypes/GroundTileTypes/dirt.tiletype\";\nimport { SandTileTypeGrassTop, SandTileType, SandTileTypeGrassRight, SandTileTypeGrassBottom, SandTileTypeGrassLeft } from \"./TileTypes/GroundTileTypes/sand.tiletype\";\nimport { ShallowWaterTileType, ShallowWaterTileTypeSandTop, ShallowWaterTileTypeSandRight, ShallowWaterTileTypeSandBottom, ShallowWaterTileTypeSandLeft } from \"./TileTypes/GroundTileTypes/shallow-water.tiletype\";\nimport { StoneTileType } from \"./TileTypes/GroundTileTypes/stone.tiletype\";\nimport { Texture2D } from \"../Textures/Texture2d\";\n\nexport class TileService {\n\n private tileSize: Vector2 = TileDefaultSettings.DEFAULT_SIZE;\n\n public tileTypes: TileType[] = new Array(256);\n private spaceTileType: TileType;\n private starTileType: TileType;\n\n private grassTileType: TileType;\n private grassTileTypeDirt: GrassTileTypeDirt;\n private grassTileTypeDirtTop: GrassTileTypeDirtTop;\n private grassTileTypeDirtRight: GrassTileTypeDirtRight;\n private grassTileTypeBottom: GrassTileTypeDirtBottom;\n private grassTileTypeLeft: GrassTileTypeDirtLeft;\n private grassTileTypeMiddle: GrassTileTypeDirtMiddle;\n\n private dirtTileType: DirtTileType;\n private stoneTileType: StoneTileType;\n\n private sandTileType: SandTileType;\n private sandTileTypeDirtTop: SandTileTypeGrassTop;\n private sandTileTypeDirtRight: SandTileTypeGrassRight;\n private sandTileTypeBottom: SandTileTypeGrassBottom;\n private sandTileTypeLeft: SandTileTypeGrassLeft;\n\n private shallowWaterTileType: ShallowWaterTileType;\n private shallowWaterTileTypeDirtTop: ShallowWaterTileTypeSandTop;\n private shallowWaterTileTypeDirtRight: ShallowWaterTileTypeSandRight;\n private shallowWaterTileTypeBottom: ShallowWaterTileTypeSandBottom;\n private shallowWaterTileTypeLeft: ShallowWaterTileTypeSandLeft;\n\n\n\n private tiles: Array = new Array();\n\n private canvasService: CanvasService;\n private graphicsService: GraphicsService;\n\n private tileCanvasId: string;\n\n constructor(canvasService: CanvasService,\n graphicsService: GraphicsService) {\n this.graphicsService = graphicsService;\n this.canvasService = canvasService;\n }\n\n Init() {\n this.tileCanvasId = this.canvasService.RegisterNewCanvas();\n this.spaceTileType = new SpaceTileType(0, this.graphicsService.GetTextureService().RegisterNewTexture(SpaceTileType.texturePath));\n this.starTileType = new StarTileType(1, this.graphicsService.GetTextureService().RegisterNewTexture(StarTileType.texturePath));\n this.grassTileType = new GrassTileType(2, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileType.texturePath));\n\n this.grassTileTypeDirt = new GrassTileTypeDirt(3, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirt.texturePath));\n this.grassTileTypeDirtTop = new GrassTileTypeDirtTop(4, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtTop.texturePath));\n this.grassTileTypeDirtRight = new GrassTileTypeDirtRight(5, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtRight.texturePath));\n this.grassTileTypeBottom = new GrassTileTypeDirtBottom(6, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtBottom.texturePath));\n this.grassTileTypeLeft = new GrassTileTypeDirtLeft(7, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtLeft.texturePath));\n this.grassTileTypeMiddle = new GrassTileTypeDirtMiddle(8, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtMiddle.texturePath));\n\n this.dirtTileType = new DirtTileType(9, this.graphicsService.GetTextureService().RegisterNewTexture(DirtTileType.texturePath));\n\n this.stoneTileType = new StoneTileType(10, this.graphicsService.GetTextureService().RegisterNewTexture(StoneTileType.texturePath));\n\n this.sandTileType = new SandTileType(11, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileType.texturePath));\n this.sandTileTypeDirtTop = new SandTileTypeGrassTop(12, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassTop.texturePath));\n this.sandTileTypeDirtRight = new SandTileTypeGrassRight(13, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassRight.texturePath));\n this.sandTileTypeBottom = new SandTileTypeGrassBottom(14, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassBottom.texturePath));\n this.sandTileTypeLeft = new SandTileTypeGrassLeft(15, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassLeft.texturePath));\n\n this.shallowWaterTileType = new ShallowWaterTileType(16, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileType.texturePath));\n this.shallowWaterTileTypeDirtTop = new ShallowWaterTileTypeSandTop(17, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandTop.texturePath));\n this.shallowWaterTileTypeDirtRight = new ShallowWaterTileTypeSandRight(18, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandRight.texturePath));\n this.shallowWaterTileTypeBottom = new ShallowWaterTileTypeSandBottom(19, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandBottom.texturePath));\n this.shallowWaterTileTypeLeft = new ShallowWaterTileTypeSandLeft(20, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandLeft.texturePath));\n\n this.setupTileTypes();\n // this.setupTiles();\n }\n\n setupTileTypes() {\n this.tileTypes[this.spaceTileType.GetId()] = this.spaceTileType;\n this.tileTypes[this.starTileType.GetId()] = this.starTileType;\n this.tileTypes[this.grassTileType.GetId()] = this.grassTileType;\n this.tileTypes[this.grassTileTypeDirt.GetId()] = this.grassTileTypeDirt;\n\n this.tileTypes[this.grassTileTypeDirtTop.GetId()] = this.grassTileTypeDirtTop;\n this.tileTypes[this.grassTileTypeDirtRight.GetId()] = this.grassTileTypeDirtRight;\n this.tileTypes[this.grassTileTypeBottom.GetId()] = this.grassTileTypeBottom;\n this.tileTypes[this.grassTileTypeLeft.GetId()] = this.grassTileTypeLeft;\n this.tileTypes[this.grassTileTypeMiddle.GetId()] = this.grassTileTypeMiddle;\n\n this.tileTypes[this.dirtTileType.GetId()] = this.dirtTileType;\n\n this.tileTypes[this.stoneTileType.GetId()] = this.stoneTileType;\n\n this.tileTypes[this.sandTileType.GetId()] = this.sandTileType;\n this.tileTypes[this.sandTileTypeDirtTop.GetId()] = this.sandTileTypeDirtTop;\n this.tileTypes[this.sandTileTypeDirtRight.GetId()] = this.sandTileTypeDirtRight;\n this.tileTypes[this.sandTileTypeBottom.GetId()] = this.sandTileTypeBottom;\n this.tileTypes[this.sandTileTypeLeft.GetId()] = this.sandTileTypeLeft;\n\n this.tileTypes[this.shallowWaterTileType.GetId()] = this.shallowWaterTileType;\n this.tileTypes[this.shallowWaterTileTypeDirtTop.GetId()] = this.shallowWaterTileTypeDirtTop;\n this.tileTypes[this.shallowWaterTileTypeDirtRight.GetId()] = this.shallowWaterTileTypeDirtRight;\n this.tileTypes[this.shallowWaterTileTypeBottom.GetId()] = this.shallowWaterTileTypeBottom;\n this.tileTypes[this.shallowWaterTileTypeLeft.GetId()] = this.shallowWaterTileTypeLeft;\n\n\n }\n\n\n /**\n * returns a Vector 2 containing a size\n *\n * @param {number[][]} tiles\n * @returns {Vector2}\n * @memberof TileService\n */\n public setupTilesFromArray(tiles: number[][]): Vector2 {\n const size: Vector2 = new Vector2(0, 0);\n // const canvId = `${this.graphicsService.RegisterDrawableEntity('texts')}`;\n for (let x = 0; x < tiles.length; x++) {\n for (let y = 0; y < tiles[x].length; y++) {\n this.tiles.push(new DrawableTile(tiles[x][y],\n new Vector2(\n y * this.GetTileSize().getValueX(),\n x * this.GetTileSize().getValueY()),\n TileDefaultSettings.DEFAULT_SIZE,\n this.tileTypes[tiles[x][y]].GetFallbackColour(),\n this.tileCanvasId,\n this.tileTypes[tiles[x][y]].GetTextureId()));\n }\n }\n return size;\n }\n\n\n private PreClearCanvas() {\n const canv = this.graphicsService.GetCanvas(this.tileCanvasId);\n canv.ClearCanvas();\n }\n Redner() {\n this.PreClearCanvas();\n for (let i = 0; i < this.tiles.length; i++) {\n this.graphicsService.getDrawingService().Draw(\n this.tiles[i],\n true);\n }\n }\n\n\n public GetTileSize() {\n return this.tileSize;\n }\n}\n\n","import { DebuggableItems, DebugKvp } from \"./debuggable-items.model\";\n\nexport interface IDebugService {\n IsInDebugMode(): boolean;\n PushOrUpdateInDebugArray(key: string, value: any): void;\n PopFromDebugArray(key: string): boolean;\n GetDebugInfo(): Array;\n}\n\nexport class DebugService implements IDebugService {\n private inDebugMode: boolean;\n private DebugInfo: DebuggableItems;\n\n constructor(inDebugMode: boolean = false) {\n console.warn(`starting debug service. inDebugMode [${inDebugMode}]`);\n this.inDebugMode = inDebugMode;\n this.DebugInfo = new DebuggableItems();\n }\n\n public IsInDebugMode(): boolean {\n return this.inDebugMode;\n }\n\n public GetDebugInfo() {\n return this.DebugInfo.debugItems;\n }\n public PushOrUpdateInDebugArray(key: string, value: any): void {\n console.log(`adding item ${key} to debug array`);\n if (!this.checkForExisting(key)) {\n this.DebugInfo.debugItems.push(new DebugKvp(key, value));\n return;\n } else {\n if (this.PopFromDebugArray(key)) {\n this.PushOrUpdateInDebugArray(key, value);\n console.info(`successfully updated [${key}] in debug KVP`);\n return;\n }\n }\n console.error(`attempted to push or update [${key}], but the item didn't exist in the KVP`)\n }\n public PopFromDebugArray(key: string): boolean {\n console.log(`removing item ${key} to debug array`);\n for (let i = 0; i < this.DebugInfo.debugItems.length; i++) {\n if (this.DebugInfo.debugItems[i].Key === key) {\n this.DebugInfo.debugItems.splice(i, 1);\n return;\n }\n }\n console.error(`attempted to remove [${key} from debug KVP, but it couldn't be found]`);\n return false;\n }\n\n private checkForExisting(key: string): boolean {\n return false;\n }\n\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class TileDefaultSettings {\n public static readonly DEFAULT_SIZE: Vector2 = new Vector2(64, 64);\n}","import { GuidGenerator } from \"../../Tools/random_generators/random_guid.generator\";\nimport { ImageHelper } from \"../Images/ImageHelper\";\n\nexport class Texture2D {\n private id: string;\n private url: string;\n private image: HTMLImageElement;\n private imageCanRender: boolean;\n private path: string;\n\n constructor(path: string) {\n this.path = path;\n this.url = path;\n this.id = GuidGenerator.NewGuid();\n this.image = ImageHelper.NewImage(this.url);\n this.image.onload = (() => {\n this.imageCanRender = true;\n })\n this.image.onerror = (() => {\n this.imageCanRender = false;\n console.error('text2d: image could not render')\n })\n\n }\n\n public GetPath() {\n return this.path;\n }\n\n /**\n * GetId\n */\n public GetId() {\n return this.id;\n }\n\n /**\n * GetUrl\n */\n public GetImage() {\n return this.image;\n }\n\n /**\n * returns imageCanRender. If the image is successfully loaded, \n * this returns true. Otherwise returns false\n *\n * @returns\n * @memberof Texture2D\n */\n public GetCanRender() {\n return this.imageCanRender;\n }\n}","import { AABB } from \"../models/AABB.model\";\n\nexport class IntersectionHelper {\n // checks if two AABBs intersect (rectangle only)\n public static AabbVsAabb(left: AABB, right: AABB) {\n if ((left.max.getValueX() < right.min.getValueX()) || (left.min.getValueX() > right.max.getValueX())) {\n return false;\n }\n if ((left.max.getValueY() < right.min.getValueY()) || (left.min.getValueY() > right.max.getValueY())) {\n return false;\n }\n\n return true;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class StoneTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/stone.png';\n constructor(id: number, textId: string) {\n super(id, '#52504F', textId);\n }\n}","import { GraphicsService } from \"../graphics.service\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Texture2D } from \"../Textures/Texture2d\";\nimport { Drawable } from \"./drawable\";\nimport { CanvasService } from \"../Canvas/graphics.canvas.service\";\nimport { GameCameraService } from \"../Camera/game-camera.service\";\nimport { DrawableTile } from \"../Tiles/drawable-tile\";\nimport { TextureService } from \"../Textures/texture.service\";\n\nexport class DrawingService {\n private cameraService: GameCameraService;\n private canvasService: CanvasService;\n private textureService: TextureService;\n private allowTextureDrawing: boolean = true;\n private drawAsStroke = true;\n\n constructor(\n cameraService: GameCameraService,\n canvasService: CanvasService,\n textureService: TextureService) {\n this.textureService = textureService;\n this.canvasService = canvasService;\n this.cameraService = cameraService;\n console.log('constructing drawing service');\n }\n\n public Draw(drawable: Drawable, skipCanvasClear: boolean = false) {\n const deg: number = drawable.GetRotation();\n if (this.cameraService.IsObjectOnScreenAABB(drawable.getAABB())) {\n\n const canv = this.canvasService.GetCanvas(drawable.getCanvasId());\n\n var rad = deg * (Math.PI / 180);\n\n if (!skipCanvasClear) {\n canv.ClearCanvas();\n }\n\n canv.ctx.save();\n // canv.ctx.scale(0.5, 0.5);\n const translateX = drawable.GetSizeX() + (drawable.GetPositionX() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetX());// + (drawable.GetSizeX() / 2));// + this.cameraService.GetOffsetY();\n const translateY = drawable.GetSizeX() + (drawable.GetPositionY() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetY());// + (drawable.GetSizeY() / 2));// + this.cameraService.GetOffsetY();\n canv.ctx.translate(\n translateX,\n translateY);\n\n canv.ctx.rotate(rad);\n\n const drawLocationX = -drawable.GetSizeX() / 2;// / 2;// ;\n const drawLocationY = -drawable.GetSizeY() / 2;// / 2;// - this.cameraService.GetOffsetY();\n const drawSizeX = drawable.GetSizeX();\n const drawSizeY = drawable.GetSizeY();\n\n const texture = this.textureService.GetTexture(drawable.GetTextureId());\n\n\n if (this.allowTextureDrawing && texture && texture.GetCanRender()) {\n this.DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY);\n } else if (false) {\n //TODO remove or change this\n } else {\n // if (drawable.GetTextureId()) {\n // console.log(`\n // text: ${texture.GetId()}\n // rend: ${texture.GetCanRender()}`);\n // }\n this.DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY);\n }\n\n // detranslates the canvas\n canv.ctx.translate(-(translateX), -(translateY));\n canv.ctx.restore();\n }\n }\n\n // private rotate(ctx) {\n // //Convert degrees to radian \n // var rad = deg * Math.PI / 180;\n\n // //Set the origin to the center of the image\n // ctx.translate(x + width / 2, y + height / 2);\n\n // //Rotate the canvas around the origin\n // ctx.rotate(rad);\n\n // //draw the image \n // ctx.drawImage(img, width / 2 * (-1), height / 2 * (-1), width, height);\n\n // //reset the canvas \n // ctx.rotate(rad * (-1));\n // ctx.translate((x + width / 2) * (-1), (y + height / 2) * (-1));\n\n // }\n\n DrawAsTexture(texture: Texture2D, canv: DrawableCanvas,\n drawLocationX: number, drawLocationY: number, drawSizeX: number, drawSizeY: number) {\n\n canv.ctx.strokeStyle = '#fff';\n canv.ctx.strokeRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n\n\n\n canv.ctx.drawImage(texture.GetImage(),\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY);\n\n\n }\n\n private DrawAsRect(drawable: Drawable, canv: DrawableCanvas,\n drawLocationX: number, drawLocationY: number, drawSizeX: number, drawSizeY: number) {\n\n if (this.drawAsStroke) {\n canv.ctx.strokeStyle = drawable.GetColour();\n canv.ctx.strokeRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n } else {\n canv.ctx.fillStyle = drawable.GetColour();\n canv.ctx.fillRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n }\n }\n}\n\n","\nexport class GuidGenerator {\n /**\n * returns a new guid\n * \n * https://stackoverflow.com/a/2117523\n *\n * @export\n * @returns a guid\n */\n static NewGuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n\n }\n}","import { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport abstract class Drawable {\n private canvasId: string;\n private AABB: AABB;\n protected colour: string;\n protected textureId: string;\n\n protected position: Vector2;\n protected size: Vector2;\n protected rotationDegrees: number;\n\n constructor(position: Vector2, size: Vector2, canvasId: string, textureId: string) {\n console.log(`drawable constructor`);\n this.position = position;\n this.size = size;\n this.AABB = new AABB(this.position, this.size);\n this.canvasId = canvasId;\n this.rotationDegrees = 0;\n this.textureId = textureId;\n }\n\n public getCanvasId(): string {\n return this.canvasId;\n }\n\n protected setCanvasId(canvasId: string): void {\n this.canvasId = canvasId;\n }\n\n public GetTextureId(): string {\n return this.textureId;\n }\n public SetTextureId(textureId: string): void {\n this.textureId = textureId;\n }\n\n public getAABB(): AABB {\n if (this.AABB === undefined) {\n this.UpdateAABB();\n }\n return this.AABB;\n }\n\n protected setAABB(AABB: AABB): void {\n this.AABB = AABB;\n }\n\n protected UpdateAABB(): void {\n this.setAABB(new AABB(this.position, this.size));\n }\n\n public GetPositionX() {\n return this.position.x;\n }\n public GetPositionY() {\n return this.position.y;\n }\n public GetSizeX() {\n return this.size.x;\n }\n public GetSizeY() {\n return this.size.y;\n }\n\n public GetColour() {\n if (this.colour) {\n return this.colour;\n } else {\n return '#f00';\n }\n }\n\n public GetRotation() {\n return this.rotationDegrees;\n }\n public AddToRotation(val: number) {\n this.rotationDegrees += val;\n if (this.rotationDegrees > 359) {\n this.rotationDegrees = 0;\n } else if (this.rotationDegrees < 0) {\n this.rotationDegrees = 359;\n }\n }\n}\n","export class HtmlService {\n private mainDiv: HTMLDivElement;\n\n constructor() {\n console.log('creating Html Helper Service in Graphics');\n }\n\n Init() {\n this.createMainDiv('main_div');\n }\n\n\n GetMainDiv() {\n return this.mainDiv;\n }\n\n private createMainDiv(id: string = 'main_div'): string {\n this.mainDiv = document.createElement('div');\n this.mainDiv.id = id;\n document.body.appendChild(this.mainDiv);\n return this.mainDiv.id;\n }\n\n public createCanvas(id: string, attatchTo: string, width: number, height: number, classList: string[] = null): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.id = id;\n canvas.width = width;\n canvas.height = height;\n if (classList != null) {\n for (let i = 0; i < classList.length; i++) {\n canvas.classList.add(classList[i]);\n }\n }\n document.getElementById(attatchTo).appendChild(canvas);\n return canvas;\n }\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class DrawableCanvas extends Vector2 {\n public canvas: HTMLCanvasElement;\n public ctx: CanvasRenderingContext2D;\n public id: string;\n constructor(canvas: HTMLCanvasElement, id: string,\n width: number, height: number) {\n super(width, height);\n this.id = id;\n this.canvas = canvas;\n this.ctx = this.canvas.getContext('2d');\n }\n\n protected GetWidth() {\n return this.getValueX();\n }\n protected GetHeight() {\n return this.getValueY();\n }\n\n public ClearCanvas() {\n this.ctx.clearRect(0, 0, this.getValueX(), this.getValueY());\n\n }\n\n public PaintImmediately() {\n this.ctx.drawImage(this.canvas, 0, 0);\n }\n\n}","import { Player } from \"./Creatures/player\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\n\nexport class PlayerService {\n private player: Player;\n constructor() {\n\n }\n\n public SetPlayer(player: Player) {\n if (this.player !== undefined) {\n console.error(`playerService.SetPlayer would overwrite the existing player`);\n } else {\n console.warn('setting player');\n this.player = player;\n }\n\n }\n public GetPlayer() {\n return this.player;\n } \n\n \n}","import { Creature } from \"./creature\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { PlayerService } from \"../player.service\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { IntersectionHelper } from \"../../../numerics/helpers/intersection.helper\";\nimport { RandomNumberGenerator } from \"../../Tools/random_generators/random_number.generators\";\nimport { Radians, Degrees, FartherRight } from \"../../../numerics/helpers/degrees.helper\";\nimport { Between, Lerp } from \"../../../numerics/helpers/number.helper\";\nimport { Entity } from \"../_base-entity\";\n\nexport class Baddy extends Creature {\n private playerService: PlayerService;\n private direction: Vector2;\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string,\n graphicsService: GraphicsService, colour: string,\n playerService: PlayerService) {\n super(position, size, name, texturePath, graphicsService);\n this.playerService = playerService;\n this.colour = colour;\n this.maxSpeed = new Vector2(10, 10);\n this.acceleration = new Vector2(.55, .6);\n\n // const friction = 0.85; // RandomNumberGenerator.GetRandomNumber(100, 200) / 1000;\n // this.friction = new Vector2(friction,\n // friction);\n\n this.direction = new Vector2(0, 0);\n\n\n // this.velocity = RandomNumberGenerator.GetRandomVector2(-10, 10, -10, 10);\n this.rotationDegrees = 0;// RandomNumberGenerator.GetRandomNumber(0, 359);\n this.turnSpeed = .0515;\n this.thrust = 1;\n\n }\n\n public Tick(lastDelta: number): void {\n this.UpdateAABB();\n\n const playerAABB = this.playerService.GetPlayer().getAABB();\n this.MoveToPlayer(playerAABB);\n\n this.Move(lastDelta);\n }\n public Render(): void {\n // super.Draw(this.colour);\n }\n\n collideWithObject(entity: Entity) {\n console.log('colliding with object')\n }\n\n private turnToPlayer(playerAABB: AABB) {\n let dx = playerAABB.GetCenter().getValueX() - this.getAABB().GetCenter().getValueX();\n let dy = playerAABB.GetCenter().getValueY() - this.getAABB().GetCenter().getValueY();\n const len = Math.sqrt(dx * dy + dy * dy);\n dx /= len ? len : 0.1;\n dy /= len ? len : 0.1;\n\n let dirX = Math.cos(Radians(this.rotationDegrees));\n let dirY = Math.sin(Radians(this.rotationDegrees));\n\n dirX += (dx - dirX) * 1;\n dirY += (dy - dirY) * 1;\n\n const rotateTo = Math.atan2(dirY, dirX);\n\n // this.rotationDegrees = Degrees(rotateTo) + (90);\n this.rotationDegrees = Lerp(this.rotationDegrees, Degrees(rotateTo) + (-this.angleAdjust), .5);\n }\n\n private MoveToPlayer(playerAABB: AABB) {\n this.turnToPlayer(playerAABB);\n const rotationAsRadians = Radians(this.rotationDegrees - this.angleAdjust);\n const rotSin = Math.sin(rotationAsRadians);\n const rotCos = Math.cos(rotationAsRadians);\n\n this.velocity.x -= (rotCos * this.thrust);\n this.velocity.y -= (rotSin * this.thrust);\n\n\n // const rotationAsRadians = this.rotationDegrees / Math.PI * 180;\n // const rotCos = Math.sin(rotationAsRadians);\n // const rotSin = Math.cos(rotationAsRadians);\n\n // this.velocity.x = (rotSin * thrust);\n // this.velocity.y = (rotCos * thrust);\n\n // console.log(`baddy: \n // rotation: ${this.rotationDegrees}\n // CosRotation: ${rotCos}\n // SinRotation: ${rotSin}\n // velocity: ${this.velocity.concat()}`);\n\n\n\n // if (IntersectionHelper.AabbVsAabb(\n // this.getAABB(), playerAABB) === false) {\n // if (this.getAABB().IsAbove(playerAABB)) {\n // this.setDirectionDown();\n // this.velocity.y += this.acceleration.y;\n // // console.log('entity is above player')\n // } else if (this.getAABB().IsBelow(playerAABB)) {\n // this.setDirectionUp();\n // // console.log('entity is above player')\n // this.velocity.y -= this.acceleration.y; // console.log('entity is below player')\n // }\n\n // if (this.getAABB().IsRight(playerAABB)) {\n // this.setDirectionLeft();\n // // console.log('entity is right of the player');\n // this.velocity.x += this.acceleration.x;\n // } else if (this.getAABB().IsLeft(playerAABB)) {\n // this.setDirectionRigth();\n // // console.log('entity is left of the player')\n // this.velocity.x -= this.acceleration.x;\n // }\n // }\n\n // this.velocity.x -= (this.getDirectionHorizontal() * this.acceleration.x) / 4;\n // this.velocity.y += (this.getDirectionVertical() * this.acceleration.y) / 4;\n }\n\n private setDirectionRigth(): void {\n this.direction.setValueX(1);\n }\n private setDirectionLeft(): void {\n this.direction.setValueX(-1);\n }\n private setDirectionUp(): void {\n this.direction.setValueY(-1);\n }\n private setDirectionDown(): void {\n this.direction.setValueY(1);\n }\n\n private getDirectionHorizontal(): number {\n return this.direction.getValueX();\n }\n private getDirectionVertical(): number {\n return this.direction.getValueY();\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class SandTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_top.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_right.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_left.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}","import { BaseState } from \"./_BaseState\";\nimport { GameCameraService } from \"../Graphics/Camera/game-camera.service\";\nimport { GraphicsService } from \"../Graphics/graphics.service\";\n\nexport class GameState extends BaseState {\n\n constructor(private graphicsService: GraphicsService) {\n super();\n console.log('constructing GameState')\n }\n\n public Tick(): void {\n // console.error(\"Method not implemented.\");\n // this.graphicsService.getGameCameraService().MoveCamera(1, 0);\n\n }\n\n public Render(): void {\n // console.error(\"Method not implemented.\");\n }\n\n\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class GrassTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirt extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_middle.png';\n constructor(id: number, textId: string) {\n super(id, '#87CC6F', textId);\n }\n}\n\nexport class GrassTileTypeDirtTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_top.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_right.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_left.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtMiddle extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_middle.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\n","export class DegreesHelper {\n\n}\n\n\n/**\n * converts degrees into radians\n *\n * @export\n * @param {number} degrees\n * @returns\n */\nexport function Radians(degrees: number) {\n return degrees * Math.PI / 180;\n}\n\n\n/**\n * converts radians into degrees\n *\n * @export\n * @param {number} radians\n * @returns\n */\nexport function Degrees(radians: number) {\n return radians * 180 / Math.PI;\n}\n\nexport function FartherRight(fromDegrees: number, toDegrees: number) {\n\n return true;\n}","import { Creature } from \"./creature\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { InputManager } from \"../../Input/InputManager\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { RandomStringGenerator } from \"../../Tools/random_generators/random_string.generator\";\nimport { Texture2D } from \"../../Graphics/Textures/Texture2d\";\nimport { DrawableCanvas } from \"../../Graphics/Models/graphics.drawable-canvas\";\nimport { Radians } from \"../../../numerics/helpers/degrees.helper\";\n\nexport class Player extends Creature {\n inputManager: InputManager;\n\n private detailsDiv: HTMLElement;\n private rotationSpeed: number = 5;\n\n private strafeThrust = 1.5;\n private readonly startingFriction: Vector2;\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string, inputManager: InputManager, graphicsService: GraphicsService) {\n super(position, size, name, texturePath, graphicsService);\n this.startingFriction = this.friction;\n this.inputManager = inputManager;\n this.health = 100;\n this.detailsDiv = document.getElementById('details_div');\n this.colour = '#fff';\n this.thrust = 1;\n\n\n\n }\n\n public Tick(lastDelta: number): void {\n this.GetInput();\n this.Move(lastDelta);\n this.graphicsService.getGameCameraService().LookAt(this.position, this.size);\n }\n\n\n private GetInput(): void {\n // this.setMove(new Vector2(0, 0));\n\n this.UpdatePlayerSpeedFromInput();\n this.UpdatePlayerRotationFromInput();\n this.UpdatePlayerStrafeFromInput();\n\n // if (this.inputManager.IsKeyPressed('direction_left')) {\n // this.AddToRotation(-(this.rotationSpeed * this.inputManager.GetForceValue('direction_left')));\n\n // // this.AddToRotation(-this.rotationSpeed);\n // // this.velocity.x -= this.acceleration.x;\n // }\n // if (this.inputManager.IsKeyPressed('direction_right')) {\n // this.AddToRotation(this.rotationSpeed * this.inputManager.GetForceValue('direction_right'));\n // // this.velocity.x += this.acceleration.x;\n // }\n if (this.inputManager.IsKeyPressed(''))\n\n if (this.inputManager.IsKeyPressed('action_a')) {\n console.log('space pressed')\n }\n // console.log(`this.movement.x = ${this.movement.x}`)\n }\n\n private UpdatePlayerRotationFromInput() {\n if (this.inputManager.IsKeyPressed('axes_pad_left_horizontal')) {\n this.AddToRotation(this.rotationSpeed *\n this.inputManager.GetForceValue('axes_pad_left_horizontal'));\n } else {\n if (this.inputManager.IsKeyPressed('direction_right')) {\n this.AddToRotation(this.rotationSpeed *\n this.inputManager.GetForceValue('direction_right'));\n }\n if (this.inputManager.IsKeyPressed('direction_left')) {\n this.AddToRotation(-(this.rotationSpeed *\n this.inputManager.GetForceValue('direction_left')));\n }\n }\n }\n\n private UpdatePlayerSpeedFromInput() {\n const rotationAsRadians = Radians(this.rotationDegrees - this.angleAdjust);\n const rotSin = Math.sin(rotationAsRadians);\n const rotCos = Math.cos(rotationAsRadians);\n\n\n if (this.inputManager.IsKeyPressed('trigger_two_right') ||\n this.inputManager.IsKeyPressed('direction_up')) {\n const triggerTwoRightForce =\n Math.max(this.inputManager.GetForceValue('direction_up'),\n (this.inputManager.GetForceValue('trigger_two_right')));\n this.velocity.x -= (rotCos * (this.thrust * triggerTwoRightForce));\n this.velocity.y -= (rotSin * (this.thrust * triggerTwoRightForce));\n }\n if (this.inputManager.IsKeyPressed('trigger_two_left') ||\n this.inputManager.IsKeyPressed('direction_down')) {\n const triggerTwoLeftForce = Math.max(this.inputManager.GetForceValue('trigger_two_left'),\n (this.inputManager.GetForceValue('direction_down')));\n // this.velocity.x += (rotCos * (this.thrust * triggerTwoLeftForce));\n // this.velocity.y += (rotSin * (this.thrust * triggerTwoLeftForce));\n this.friction.x = 0.85;\n this.friction.y = 0.85;\n } else {\n this.friction = new Vector2(this.startingFriction.getValueX(), this.startingFriction.getValueY());\n }\n\n\n\n if (this.inputManager.IsKeyPressed('trigger_one_right')) {\n const triggerOneRightForce = this.inputManager.GetForceValue('trigger_one_right');\n this.velocity.x += (rotSin * triggerOneRightForce) * this.strafeThrust;\n this.velocity.y -= (rotCos * triggerOneRightForce) * this.strafeThrust;\n }\n if (this.inputManager.IsKeyPressed('trigger_one_left')) {\n const triggerOneLeftForce = this.inputManager.GetForceValue('trigger_one_right');\n this.velocity.x -= rotSin * triggerOneLeftForce;\n this.velocity.y += rotCos * triggerOneLeftForce;\n }\n\n\n\n\n\n this.detailsDiv.innerHTML = `\n player:
\n ve: ${this.velocity.concat(3)}
\n ro: ${this.rotationDegrees.toFixed(3)}DEG
\n ro: ${rotationAsRadians.toFixed(3)}RAD
\n th: ${this.thrust.toFixed(3)}
\n rS: ${rotSin.toFixed(3)}
\n rC: ${rotCos.toFixed(3)}
\n\n `;\n }\n\n protected UpdatePlayerStrafeFromInput() {\n // if (this.inputManager.IsKeyPressed('trigger_one_right')) {\n // this.velocity.x -= (this.inputManager.GetForceValue('trigger_one_right') * this.acceleration.y) ;\n // }\n // if (this.inputManager.IsKeyPressed('trigger_one_left')) {\n // this.velocity.x += (this.inputManager.GetForceValue('trigger_one_left') * this.acceleration.y) ;\n // }\n }\n}\n","export class RandomStringGenerator {\n\n\n public static GetRandomHexColour(): string {\n return '#' + (Math.random() * 0xFFFFFF << 0).toString(16);\n }\n}","import { BaseState } from \"./_BaseState\";\n\nexport class SettingsState extends BaseState {\n constructor() {\n super();\n console.log(`constructing SettingsState`);\n }\n\n public Tick(): void {\n console.error(\"Method not implemented.\");\n }\n\n public Render(): void {\n console.error(\"Method not implemented.\");\n }\n}\n","import { BaseState } from \"./_BaseState\";\n\nexport class StateService {\n private currentState: BaseState = null;\n\n\n public setState(state: BaseState): void {\n this.currentState = state;\n }\n public GetState(): BaseState {\n return this.currentState;\n }\n}","import { HtmlService } from \"../Html/graphics.html.service\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { ViewportHelper } from \"../Viewport/Viewport.Helper\";\nimport { GuidGenerator } from \"../../Tools/random_generators/random_guid.generator\";\n\nexport class CanvasService {\n private htmlService: HtmlService;\n\n public mainCanvas: HTMLCanvasElement;\n public mainCanvasCtx: CanvasRenderingContext2D;\n public drawableAreas: Array;\n\n viewportWidth: number;\n viewportHeight: number;\n\n constructor(htmlService: HtmlService) {\n console.log('creating a canvas service');\n this.htmlService = htmlService;\n }\n\n Init() {\n const viewportSize = ViewportHelper.GetWindowInAspectRatioForCanvas();\n this.viewportHeight = viewportSize.y;\n this.viewportWidth = viewportSize.x;\n\n this.mainCanvas = this.htmlService.createCanvas('main_canvas', \n this.htmlService.GetMainDiv().id,\n this.viewportWidth,\n this.viewportHeight,\n ['parent']);\n this.mainCanvasCtx = this.mainCanvas.getContext('2d');\n this.drawableAreas = new Array();\n }\n\n RegisterNewCanvas(id: string = null): string {\n console.log(`registering a new canvas with id ${id}`);\n if (id === null) {\n id = GuidGenerator.NewGuid();\n }\n const canvas = this.htmlService.createCanvas(id, this.mainCanvas.id, \n this.viewportWidth, this.viewportHeight);\n this.drawableAreas.push(new DrawableCanvas(canvas, id, this.viewportWidth, this.viewportHeight));\n return id;\n }\n\n GetMainCanvas() {\n return this.mainCanvas;\n }\n\n GetCanvas(id: string) {\n for (let i = 0; i < this.drawableAreas.length; i++) {\n if (this.drawableAreas[i].id === id) {\n return this.drawableAreas[i];\n }\n }\n console.error(`failed to get a canvas of id ${id}`);\n }\n}\n\n","import { Entity } from \"./_base-entity\";\nimport { DrawingService } from \"../Graphics/Draw/drawing.service\";\nimport { GraphicsService } from \"../Graphics/graphics.service\";\n\nexport class EntityService {\n private gameEntities: Entity[];\n\n constructor(\n // drawingService: DrawingService\n ) {\n this.gameEntities = new Array();\n }\n\n\n public TickAllEntities(lastDelta: number) {\n for (let i = 0; i < this.gameEntities.length; i++) {\n this.gameEntities[i].Tick(lastDelta);\n }\n }\n\n public RenderAllEntities(graphicsService: GraphicsService) {\n for (let i = 0; i < this.gameEntities.length; i++) {\n graphicsService.getDrawingService().Draw(this.gameEntities[i]);\n }\n }\n\n public RegisterEntity(entity: Entity) {\n console.log('registering an entity')\n this.gameEntities.push(entity);\n }\n}","import { Vector2 } from '../../numerics/models/Vector2.model';\nimport { World } from './world';\nimport { WorldJsonFileLoader } from './world.jsonfiles';\nimport { TileService } from '../Graphics/Tiles/tile.service';\nimport { AABB } from '../../numerics/models/AABB.model';\nimport { Vector2Helpers } from '../../numerics/helpers/vector2.helper';\n\nexport class WorldService {\n\n private currentWorldId: number = 0;\n private worlds: World[] = new Array();\n private tileService: TileService;\n private size: Vector2;\n\n\n constructor(tileService: TileService) {\n this.tileService = tileService;\n \n }\n\n Init() {\n this.worlds = WorldJsonFileLoader.GetWorlds();\n console.log(`this.worlds = ${JSON.stringify(this.worlds)} length is ${this.worlds.length}`);\n\n console.info('setting current world to index 0');\n this.SetWorld(2);\n }\n\n public SetWorld(index: number) {\n this.DeRegisterWorld();\n this.tileService.setupTilesFromArray(this.GetWorld(index).GetTiles());\n }\n\n public GetWorldSize(): AABB {\n const tileSize = this.tileService.GetTileSize();\n this.size = Vector2Helpers.MultiplyByScale(tileSize, 2);\n console.log(`this.size: ${this.size}`);\n const worldPosition = new Vector2(0, 0);\n\n return new AABB(\n worldPosition,\n this.size\n );\n }\n\n\n DeRegisterWorld() {\n console.error(\" DeRegisterWorld: Method not implemented.\");\n }\n\n\n public GetStartingPosition(worldIndex: number) {\n return this.worlds[worldIndex].GetStartingPosition();\n }\n\n\n public GetWorld(index: number) {\n if (index > this.worlds.length) {\n throw new Error(`index [${index}] out of range of world array (length: ${this.worlds.length})`);\n }\n return this.worlds[0];\n }\n\n}\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { Game } from './application/game';\n\nexport class App {\n start() {\n const game = new Game(); \n game.Run();\n }\n}\n\nconst application = new App();\napplication.start();"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/css/style.css b/dist/css/style.css index d18dd3a..bb78b3d 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -21,70 +21,85 @@ time, mark, audio, video { font-size: 100%; font: inherit; vertical-align: baseline; - box-sizing: border-box; } + box-sizing: border-box; +} /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { - display: block; } + display: block; +} body { - line-height: 1; } + line-height: 1; +} ol, ul { - list-style: none; } + list-style: none; +} blockquote, q { - quotes: none; } + quotes: none; +} blockquote:before, blockquote:after, q:before, q:after { - content: ''; - content: none; } + content: ""; + content: none; +} table { border-collapse: collapse; - border-spacing: 0; } + border-spacing: 0; +} #el_canvasable { height: 100%; - width: 100%; } + width: 100%; +} div.in_debug_mode #el_canvasable { height: 100%; - width: 100%; } - + width: 100%; +} div.in_debug_mode #el_debug_info { position: absolute; right: 0; height: 100%; width: 30%; color: #c0c0c0; - background-color: rgba(45, 45, 45, 0.5); } + background-color: rgba(45, 45, 45, 0.5); +} body { - background: #ff0000; } + background: #ff0000; +} body, html { height: 100%; - width: 100%; } + width: 100%; +} body { - background: #2F4F4F; } + background: #2F4F4F; +} #main_div { width: 100%; height: 100%; display: flex; - align-items: center; } + align-items: center; +} canvas { background: transparent; display: block; margin: 0 auto; - box-sizing: border-box; } - canvas.parent { - background: black; } + box-sizing: border-box; +} +canvas.parent { + background: black; +} .notice-holder { padding: 20px; @@ -94,9 +109,13 @@ canvas { color: white; position: absolute; left: 0; - top: 0; } - .notice-holder #details_div, .notice-holder #performance_div { - position: relative; - width: auto; - border: 1px dashed pink; - padding: 1rem; } + top: 0; +} +.notice-holder #details_div, .notice-holder #performance_div { + position: relative; + width: auto; + border: 1px dashed pink; + padding: 1rem; +} + +/*# sourceMappingURL=style.css.map */ diff --git a/dist/css/style.css.map b/dist/css/style.css.map new file mode 100644 index 0000000..a59ec6a --- /dev/null +++ b/dist/css/style.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../src/scss/reset.scss","../../src/scss/debug-mode.scss","../../src/scss/_settings.scss","../../src/scss/_main.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAaC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;AACA;AAAA;EAEC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;;;AAED;EACC;EACA;;;AC/CD;EACE;EACA;;;AAGA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA,OCXS;EDYT;;;AETJ;EACI,YDPK;;;ACcT;EACC;EACA;;;AAED;EACC,YDjBe;;;ACmBhB;EACC;EACA;EACA;EACD;;;AAEA;EACC;EACG;EACH;EAEA;;AACA;EACC;;;AAGF;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;EACA","file":"style.css"} \ No newline at end of file diff --git a/dist/webpack.config.js b/dist/webpack.config.js deleted file mode 100644 index 88e5976..0000000 --- a/dist/webpack.config.js +++ /dev/null @@ -1,66 +0,0 @@ -const path = require('path'); -const CopyPlugin = require('copy-webpack-plugin'); -module.exports = { - mode: 'development', - entry: ['./src/index.ts'], - devtool: 'inline-source-map', - devServer: { - contentBase: './dist', - watchOptions: { - ignored: /node_modules/ - } - // compress: true, - // port: 9000 - }, - module: { - rules: [ - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/ - } - // { - // test: /\.scss$/, - // use: [ - // { - // loader: 'file-loader', - // options: { - // name: 'css/app.css' - // } - // }, - // { - // loader: 'style-loader', - // options: { - // sourceMap: true - // } - // }, - // { - // loader: 'css-loader', - // options: { - // sourceMap: true - // } - // }, - // { - // loader: 'sass-loader', - // options: { - // sourceMap: true - // } - // } - // ] - // } - ] - }, - resolve: { - extensions: ['.tsx', '.ts', '.js'] - }, - output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'dist') - }, - plugins: [ - new CopyPlugin([ - { from: 'src/assets/_dist', to: 'assets/_dist' } - ]) - ] -}; -//# sourceMappingURL=webpack.config.js.map \ No newline at end of file diff --git a/dist/webpack.config.js.map b/dist/webpack.config.js.map deleted file mode 100644 index 484ced5..0000000 --- a/dist/webpack.config.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"webpack.config.js","sourceRoot":"","sources":["../webpack.config.js"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAElD,MAAM,CAAC,OAAO,GAAG;IACb,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,CAAC,gBAAgB,CAAC;IACzB,OAAO,EAAE,mBAAmB;IAC5B,SAAS,EAAE;QACP,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE;YACV,OAAO,EAAE,cAAc;SAC1B;QACD,kBAAkB;QAClB,aAAa;KAChB;IACD,MAAM,EAAE;QACJ,KAAK,EAAE;YACH;gBACI,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,cAAc;aAC1B;YACD,IAAI;YACJ,uBAAuB;YACvB,aAAa;YACb,YAAY;YACZ,qCAAqC;YACrC,yBAAyB;YACzB,sCAAsC;YACtC,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,sCAAsC;YACtC,yBAAyB;YACzB,kCAAkC;YAClC,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,oCAAoC;YACpC,yBAAyB;YACzB,kCAAkC;YAClC,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,qCAAqC;YACrC,yBAAyB;YACzB,kCAAkC;YAClC,gBAAgB;YAChB,YAAY;YACZ,QAAQ;YACR,IAAI;SACP;KACJ;IACD,OAAO,EAAE;QACL,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;KACrC;IACD,MAAM,EAAE;QACJ,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;KACxC;IACD,OAAO,EAAE;QACL,IAAI,UAAU,CAAC;YACX,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,cAAc,EAAC;SAClD,CAAC;KACL;CACJ,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index a43b61a..11117ad 100644 --- a/package.json +++ b/package.json @@ -5,38 +5,39 @@ "description": "messing", "main": "index.ts", "dependencies": { - "concurrently": "^4.1.0", - "copy-webpack-plugin": "^5.0.2", - "tsyringe": "^3.0.1" + "@types/node": "^22.15.20", + "concurrently": "^8.2.2", + "copy-webpack-plugin": "^11.0.0", + "tsyringe": "^4.10.0" }, "devDependencies": { - "@types/chai": "^4.1.7", - "@types/mocha": "^5.2.6", - "chai": "^4.2.0", - "copyfiles": "^2.1.0", - "css-loader": "^2.1.1", - "file-loader": "^3.0.1", - "html-loader": "^0.5.5", - "lodash": "^4.17.11", - "mocha": "^6.1.4", - "node-sass": "^4.11.0", - "sass-loader": "^7.1.0", - "style-loader": "^0.23.1", - "ts-loader": "^5.3.3", - "ts-node": "^8.1.0", - "typescript": "^3.4.1", - "url-loader": "^1.1.2", - "webpack": "^4.29.6", - "webpack-cli": "^3.3.0", - "webpack-dev-server": "^3.2.1" + "@types/chai": "^4.3.11", + "@types/mocha": "^10.0.6", + "chai": "^4.3.10", + "copyfiles": "^2.4.1", + "css-loader": "^6.10.0", + "file-loader": "^6.2.0", + "html-loader": "^4.2.0", + "lodash": "^4.17.21", + "mocha": "^10.3.0", + "sass": "^1.72.0", + "sass-loader": "^14.1.1", + "style-loader": "^3.3.4", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "typescript": "^5.8.3", + "url-loader": "^4.1.1", + "vite": "^6.3.5", + "vite-plugin-checker": "^0.9.3", + "webpack": "^5.99.8", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.2" }, "scripts": { - "build": "concurrently \"webpack\" \"copyfiles --flat src/index.html dist\"", - "build:sass": "node-sass --include-path sass ./src/scss/_main.scss ./dist/css/style.css", - "watch": "concurrently \"webpack --watch\" ", - "start": "concurrently \"webpack-dev-server --open\" \"copyfiles --flat src/index.html dist\" \"node-sass --include-path sass ./src/scss/_main.scss ./dist/css/style.css\"", - "test": "mocha -r ts-node/register tests/**/*.spec.ts" + "dev": "vite", + "build": "vite build", + "preview": "vite preview" }, "author": "", "license": "ISC" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..a75cb49 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4621 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/node': + specifier: ^22.15.20 + version: 22.15.20 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + copy-webpack-plugin: + specifier: ^11.0.0 + version: 11.0.0(webpack@5.99.9) + tsyringe: + specifier: ^4.10.0 + version: 4.10.0 + devDependencies: + '@types/chai': + specifier: ^4.3.11 + version: 4.3.20 + '@types/mocha': + specifier: ^10.0.6 + version: 10.0.10 + chai: + specifier: ^4.3.10 + version: 4.5.0 + copyfiles: + specifier: ^2.4.1 + version: 2.4.1 + css-loader: + specifier: ^6.10.0 + version: 6.11.0(webpack@5.99.9) + file-loader: + specifier: ^6.2.0 + version: 6.2.0(webpack@5.99.9) + html-loader: + specifier: ^4.2.0 + version: 4.2.0(webpack@5.99.9) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + mocha: + specifier: ^10.3.0 + version: 10.8.2 + sass: + specifier: ^1.72.0 + version: 1.89.0 + sass-loader: + specifier: ^14.1.1 + version: 14.2.1(sass@1.89.0)(webpack@5.99.9) + style-loader: + specifier: ^3.3.4 + version: 3.3.4(webpack@5.99.9) + ts-loader: + specifier: ^9.5.1 + version: 9.5.2(typescript@5.8.3)(webpack@5.99.9) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.15.20)(typescript@5.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(file-loader@6.2.0(webpack@5.99.9))(webpack@5.99.9) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.15.20)(sass@1.89.0)(terser@5.39.2) + vite-plugin-checker: + specifier: ^0.9.3 + version: 0.9.3(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.20)(sass@1.89.0)(terser@5.39.2)) + webpack: + specifier: ^5.99.8 + version: 5.99.9(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + webpack-dev-server: + specifier: ^4.15.2 + version: 4.15.2(webpack-cli@5.1.4)(webpack@5.99.9) + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@rollup/rollup-android-arm-eabi@4.41.0': + resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.41.0': + resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.41.0': + resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.41.0': + resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.0': + resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.41.0': + resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.41.0': + resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.41.0': + resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.41.0': + resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.41.0': + resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + cpu: [x64] + os: [win32] + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@4.17.22': + resolution: {integrity: sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.16': + resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.15.20': + resolution: {integrity: sha512-A6BohGFRGHAscJsTslDCA9JG7qSJr/DWUvrvY8yi9IgnGtMxCyat7vvQ//MFa0DnLsyuS3wYTpLdw4Hf+Q5JXw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + html-loader@4.2.0: + resolution: {integrity: sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@5.1.2: + resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + launch-editor@2.10.0: + resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.41.0: + resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@14.2.1: + resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sass@1.89.0: + resolution: {integrity: sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-loader@3.3.4: + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.39.2: + resolution: {integrity: sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==} + engines: {node: '>=10'} + hasBin: true + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-loader@9.5.2: + resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-plugin-checker@0.9.3: + resolution: {integrity: sha512-Tf7QBjeBtG7q11zG0lvoF38/2AVUzzhMNu+Wk+mcsJ00Rk/FpJ4rmUviVJpzWkagbU13cGXvKpt7CMiqtxVTbQ==} + engines: {node: '>=14.16'} + peerDependencies: + '@biomejs/biome': '>=1.7' + eslint: '>=7' + meow: ^13.2.0 + optionator: ^0.9.4 + stylelint: '>=16' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: ~2.2.10 + peerDependenciesMeta: + '@biomejs/biome': + optional: true + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + watchpack@2.4.3: + resolution: {integrity: sha512-adBYQLivcg1jbdKEJeqScJJFvgm4qY9+3tXw+jdG6lkVeqRJEtiQmSWjmth8GKmDZuX7sYM4YFxQsf0AzMfGGw==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-dev-middleware@5.3.4: + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + webpack-dev-server@4.15.2: + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.99.9: + resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/runtime@7.27.1': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@discoveryjs/json-ext@0.5.7': {} + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@rollup/rollup-android-arm-eabi@4.41.0': + optional: true + + '@rollup/rollup-android-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-x64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.0': + optional: true + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.15.20 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.15.20 + + '@types/chai@4.3.20': {} + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.6 + '@types/node': 22.15.20 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.15.20 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.7 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.7': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.15.20 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.15.20 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.22': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.16': + dependencies: + '@types/node': 22.15.20 + + '@types/json-schema@7.0.15': {} + + '@types/mime@1.3.5': {} + + '@types/mocha@10.0.10': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.15.20 + + '@types/node@22.15.20': + dependencies: + undici-types: 6.21.0 + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.0': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.15.20 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.22 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.15.20 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.15.20 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.15.20 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + optionalDependencies: + webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.99.9) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + assertion-error@1.1.0: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001718: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chrome-trace-event@1.0.4: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@10.0.1: {} + + commander@2.20.3: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.2 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + copy-webpack-plugin@11.0.0(webpack@5.99.9): + dependencies: + fast-glob: 3.3.3 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + webpack: 5.99.9(webpack-cli@5.1.4) + + copyfiles@2.4.1: + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + + core-util-is@1.0.3: {} + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@6.11.0(webpack@5.99.9): + dependencies: + icss-utils: 5.1.0(postcss@8.5.3) + postcss: 8.5.3 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) + postcss-modules-scope: 3.2.1(postcss@8.5.3) + postcss-modules-values: 4.0.0(postcss@8.5.3) + postcss-value-parser: 4.2.0 + semver: 7.7.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + + cssesc@3.0.0: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.27.1 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.1(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + define-lazy-prop@2.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@1.0.3: + optional: true + + detect-node@2.1.0: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.155: {} + + emoji-regex@8.0.0: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@4.5.0: {} + + entities@6.0.0: {} + + envinfo@7.14.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-loader@6.2.0(webpack@5.99.9): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.99.9(webpack-cli@5.1.4) + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.9: {} + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-monkey@1.0.6: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handle-thing@2.0.1: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-entities@2.6.0: {} + + html-loader@4.2.0(webpack@5.99.9): + dependencies: + html-minifier-terser: 7.2.0 + parse5: 7.3.0 + webpack: 5.99.9(webpack-cli@5.1.4) + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.39.2 + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.10: {} + + http-proxy-middleware@2.0.9(@types/express@4.17.22): + dependencies: + '@types/http-proxy': 1.17.16 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.22 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + + ignore@5.3.2: {} + + immutable@5.1.2: {} + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-stream@2.0.1: {} + + is-unicode-supported@0.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.15.20 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + kind-of@6.0.3: {} + + launch-editor@2.10.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + mkdirp@1.0.4: {} + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + nanoid@3.3.11: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-addon-api@7.1.1: + optional: true + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + noms@0.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + object-inspect@1.13.4: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-try@2.2.0: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parse5@7.3.0: + dependencies: + entities: 6.0.0 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.3): + dependencies: + icss-utils: 5.1.0(postcss@8.5.3) + postcss: 8.5.3 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.3): + dependencies: + icss-utils: 5.1.0(postcss@8.5.3) + postcss: 8.5.3 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + process-nextick-args@2.0.1: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + relateurl@0.2.7: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.41.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.41.0 + '@rollup/rollup-android-arm64': 4.41.0 + '@rollup/rollup-darwin-arm64': 4.41.0 + '@rollup/rollup-darwin-x64': 4.41.0 + '@rollup/rollup-freebsd-arm64': 4.41.0 + '@rollup/rollup-freebsd-x64': 4.41.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 + '@rollup/rollup-linux-arm-musleabihf': 4.41.0 + '@rollup/rollup-linux-arm64-gnu': 4.41.0 + '@rollup/rollup-linux-arm64-musl': 4.41.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-musl': 4.41.0 + '@rollup/rollup-linux-s390x-gnu': 4.41.0 + '@rollup/rollup-linux-x64-gnu': 4.41.0 + '@rollup/rollup-linux-x64-musl': 4.41.0 + '@rollup/rollup-win32-arm64-msvc': 4.41.0 + '@rollup/rollup-win32-ia32-msvc': 4.41.0 + '@rollup/rollup-win32-x64-msvc': 4.41.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass-loader@14.2.1(sass@1.89.0)(webpack@5.99.9): + dependencies: + neo-async: 2.6.2 + optionalDependencies: + sass: 1.89.0 + webpack: 5.99.9(webpack-cli@5.1.4) + + sass@1.89.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.2 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + slash@4.0.0: {} + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + spawn-command@0.0.2: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + style-loader@3.3.4(webpack@5.99.9): + dependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.2.2: {} + + terser-webpack-plugin@5.3.14(webpack@5.99.9): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.39.2 + webpack: 5.99.9(webpack-cli@5.1.4) + + terser@5.39.2: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + thunky@1.1.0: {} + + tiny-invariant@1.3.3: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.9): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.1 + micromatch: 4.0.8 + semver: 7.7.2 + source-map: 0.7.4 + typescript: 5.8.3 + webpack: 5.99.9(webpack-cli@5.1.4) + + ts-node@10.9.2(@types/node@22.15.20)(typescript@5.8.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.15.20 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + + type-detect@4.1.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript@5.8.3: {} + + undici-types@6.21.0: {} + + unicorn-magic@0.3.0: {} + + unpipe@1.0.0: {} + + untildify@4.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-loader@4.1.1(file-loader@6.2.0(webpack@5.99.9))(webpack@5.99.9): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.99.9(webpack-cli@5.1.4) + optionalDependencies: + file-loader: 6.2.0(webpack@5.99.9) + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + vite-plugin-checker@0.9.3(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.20)(sass@1.89.0)(terser@5.39.2)): + dependencies: + '@babel/code-frame': 7.27.1 + chokidar: 4.0.3 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.2 + strip-ansi: 7.1.0 + tiny-invariant: 1.3.3 + tinyglobby: 0.2.13 + vite: 6.3.5(@types/node@22.15.20)(sass@1.89.0)(terser@5.39.2) + vscode-uri: 3.1.0 + optionalDependencies: + typescript: 5.8.3 + + vite@6.3.5(@types/node@22.15.20)(sass@1.89.0)(terser@5.39.2): + dependencies: + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.41.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.15.20 + fsevents: 2.3.3 + sass: 1.89.0 + terser: 5.39.2 + + vscode-uri@3.1.0: {} + + watchpack@2.4.3: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.99.9) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.99.9) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack@5.99.9) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.99.9(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + optionalDependencies: + webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.99.9) + + webpack-dev-middleware@5.3.4(webpack@5.99.9): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.3.2 + webpack: 5.99.9(webpack-cli@5.1.4) + + webpack-dev-server@4.15.2(webpack-cli@5.1.4)(webpack@5.99.9): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.22 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.0 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.21.2 + graceful-fs: 4.2.11 + html-entities: 2.6.0 + http-proxy-middleware: 2.0.9(@types/express@4.17.22) + ipaddr.js: 2.2.0 + launch-editor: 2.10.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.3.2 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 5.3.4(webpack@5.99.9) + ws: 8.18.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.99.9(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.1 + browserslist: 4.24.5 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + watchpack: 2.4.3 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.99.9) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@8.18.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/src/application/Core/timer.service.ts b/src/application/Core/timer.service.ts index 634fef6..86523a8 100644 --- a/src/application/Core/timer.service.ts +++ b/src/application/Core/timer.service.ts @@ -29,7 +29,8 @@ export class TimerService { if (this.delta >= 1) { return true; } - console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`) + + // console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`) return false; } diff --git a/src/application/Graphics/Textures/texture.service.ts b/src/application/Graphics/Textures/texture.service.ts index a09ba24..3f2bf95 100644 --- a/src/application/Graphics/Textures/texture.service.ts +++ b/src/application/Graphics/Textures/texture.service.ts @@ -35,7 +35,7 @@ export class TextureService { } const newTexture = new Texture2D(texturePath); this.textures.push(newTexture); - console.warn(`texture stack is now [${this.textures.length}] long`) + // console.warn(`texture stack is now [${this.textures.length}] long`) return newTexture.GetId(); } } \ No newline at end of file diff --git a/src/application/World/world.jsonfiles.ts b/src/application/World/world.jsonfiles.ts index d546686..8e38b1d 100644 --- a/src/application/World/world.jsonfiles.ts +++ b/src/application/World/world.jsonfiles.ts @@ -1,4 +1,4 @@ -import * as json from '../../assets/_dist/Worlds/worlds.json'; +import * as jsonImport from '../../assets/_dist/Worlds/worlds.json'; import { World } from './world'; import { Vector2 } from '../../numerics/models/Vector2.model'; @@ -13,23 +13,39 @@ import { Vector2 } from '../../numerics/models/Vector2.model'; export class WorldJsonFileLoader { private static worldCount: number = 2; constructor() { - } public static GetWorlds(): World[] { const worldArr = new Array(); - for (let i = 0; i < this.worldCount; i++) { - - const world = json[i]; - worldArr.push(new World( - new Vector2( - world.tiles.length, - world.tiles[0].length), - new Vector2( - world.start.x, - world.start.y), - world.tiles, - world.worldId - )); + console.log('JSON structure:', JSON.stringify(jsonImport).substring(0, 100)); // Debug output + + // Handle different possible JSON structures + const worldsData = Array.isArray(jsonImport) ? jsonImport : + jsonImport.default ? jsonImport.default : + jsonImport.worlds ? jsonImport.worlds : null; + + if (!worldsData) { + console.error('Could not find worlds data in the imported JSON'); + return worldArr; + } + + const count = Math.min(this.worldCount, worldsData.length); + for (let i = 0; i < count; i++) { + console.log(`loading world ${i}`); + const world = worldsData[i]; + if (world) { + worldArr.push(new World( + new Vector2( + world.tiles.length, + world.tiles[0].length), + new Vector2( + world.start.x, + world.start.y), + world.tiles, + world.worldId + )); + } else { + console.error(`world at index ${i} is undefined`); + } } return worldArr; } diff --git a/src/application/game.ts b/src/application/game.ts index 47c5ecd..583f3a5 100644 --- a/src/application/game.ts +++ b/src/application/game.ts @@ -4,11 +4,11 @@ import { DebugComponent } from "./_debug/debug.component"; import { Entity } from "./Entities/_base-entity"; import { Creature } from "./Entities/Creatures/creature"; import { Vector2 } from "../numerics/models/Vector2.model"; -import { BaseState } from "./States/_BaseState"; -import { GameState } from "./States/GameState"; -import { StateService } from "./States/state.service"; -import { MenuState } from "./States/MenuState"; -import { SettingsState } from "./States/SettingsState"; +import { BaseState } from "./states/_BaseState"; +import { GameState } from "./states/GameState"; +import { StateService } from "./states/state.service"; +import { MenuState } from "./states/MenuState"; +import { SettingsState } from "./states/SettingsState"; import { Player } from "./Entities/Creatures/player"; import { GraphicsService } from "./Graphics/graphics.service"; import { Baddy } from "./Entities/Creatures/baddy"; diff --git a/src/index.html b/src/index.html index 147ea9b..880b5e3 100644 --- a/src/index.html +++ b/src/index.html @@ -16,6 +16,6 @@ - + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3943ee2..8696593 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,14 @@ { - "compilerOptions": { - "target": "es2016", - "module": "commonjs", - "jsx": "react", - "sourceMap": true, - "outDir": "./dist/", - "noImplicitAny": true, - "allowJs": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "resolveJsonModule": true, - "esModuleInterop": true - } + "compilerOptions": { + "target": "ES6", + "module": "ESNext", + "moduleResolution": "node", + "strict": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + + }, + "include": ["src"] } \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..9ff21ac --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,28 @@ +// vite.config.ts +import { defineConfig } from 'vite' +import path from 'path' + +export default defineConfig({ + root: 'src', + build: { + outDir: '../dist', + emptyOutDir: true, + sourcemap: true, + minify: 'esbuild', + assetsDir: 'assets', + rollupOptions: { + input: path.resolve(__dirname, 'src/index.html'), + output: { + assetFileNames: 'assets/[name]-[hash][extname]' + } + } + }, + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + } + }, + define: { + 'process.env.NODE_ENV': '"production"' + } +}) \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 9e50346..09d4058 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,65 +2,115 @@ const path = require('path'); const CopyPlugin = require('copy-webpack-plugin'); module.exports = { - mode: 'development', - entry: ['./src/index.ts'], // , './scss/_main.scss'], - devtool: 'inline-source-map', - devServer: { - contentBase: './dist', - watchOptions: { - ignored: /node_modules/ - } - // compress: true, - // port: 9000 + mode: 'development', + entry: ['./src/index.ts'], + devtool: 'source-map', // improved source map option + + // Updated devServer configuration for webpack-dev-server v4+ + devServer: { + static: { + directory: path.join(__dirname, 'dist'), + }, + watchFiles: { + paths: ['src/**/*'], + options: { + ignored: /node_modules/, + }, }, - module: { - rules: [ - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/ + compress: true, + port: 9000, + hot: true, // Enable Hot Module Replacement + open: true, // Automatically open browser + }, + + // Module rules + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + // Uncommented and updated SCSS handling + { + test: /\.scss$/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + sourceMap: true + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true, + // Implementation specifically set to use Dart Sass + implementation: require('sass') } - // { - // test: /\.scss$/, - // use: [ - // { - // loader: 'file-loader', - // options: { - // name: 'css/app.css' - // } - // }, - // { - // loader: 'style-loader', - // options: { - // sourceMap: true - // } - // }, - // { - // loader: 'css-loader', - // options: { - // sourceMap: true - // } - // }, - // { - // loader: 'sass-loader', - // options: { - // sourceMap: true - // } - // } - // ] - // } + } ] - }, - resolve: { - extensions: ['.tsx', '.ts', '.js'] - }, - output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'dist') - }, - plugins: [ - new CopyPlugin([ - { from: 'src/assets/_dist', to: 'assets/_dist'} - ]) + }, + // New asset module for handling images, fonts, etc. + { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/resource', + generator: { + filename: 'assets/images/[hash][ext][query]' + } + }, + // New asset module for handling fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + generator: { + filename: 'assets/fonts/[hash][ext][query]' + } + } ] -}; + }, + + resolve: { + extensions: ['.tsx', '.ts', '.js'] + }, + + output: { + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + clean: true, // Clean the output directory before emit + publicPath: '/' // Base path for all assets + }, + + // Updated plugin syntax for webpack 5 + plugins: [ + new CopyPlugin({ + patterns: [ + { from: 'src/assets/_dist', to: 'assets/_dist' } + ] + }) + ], + + // Cache for faster rebuilds + cache: { + type: 'filesystem', + buildDependencies: { + config: [__filename] + } + }, + + // Optimization for production builds + optimization: { + moduleIds: 'deterministic', // Enables long-term caching + splitChunks: { + chunks: 'all', // Split vendor modules into separate chunks + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + chunks: 'all' + } + } + } + } +}; \ No newline at end of file From 22e3e38e83b1e0bf50f816d67572ec4c64b9b520 Mon Sep 17 00:00:00 2001 From: LLaverty Date: Tue, 20 May 2025 20:18:53 +0100 Subject: [PATCH 2/2] moves to a vite based app instead of webpacl --- dist/.gitkeep | 1 + dist/assets/_dist/Ships/large_purple_01.png | Bin 4497 -> 0 bytes dist/assets/_dist/Ships/metalic_01.png | Bin 1985 -> 0 bytes dist/assets/_dist/Ships/metalic_02.png | Bin 1933 -> 0 bytes dist/assets/_dist/Ships/metalic_03.png | Bin 2030 -> 0 bytes dist/assets/_dist/Ships/metalic_04.png | Bin 2096 -> 0 bytes dist/assets/_dist/Ships/metalic_05.png | Bin 2064 -> 0 bytes dist/assets/_dist/Ships/metalic_06.png | Bin 2027 -> 0 bytes dist/assets/_dist/Ships/orange_01.png | Bin 2057 -> 0 bytes dist/assets/_dist/Ships/orange_02.png | Bin 2272 -> 0 bytes dist/assets/_dist/Ships/orange_03.png | Bin 2145 -> 0 bytes dist/assets/_dist/Ships/orange_04.png | Bin 2132 -> 0 bytes dist/assets/_dist/Ships/orange_05.png | Bin 2164 -> 0 bytes dist/assets/_dist/Ships/orange_06.png | Bin 2259 -> 0 bytes .../_dist/Tiles/bg_starfield - Copy.png | Bin 8686 -> 0 bytes dist/assets/_dist/Tiles/bg_starfield.png | Bin 8686 -> 0 bytes dist/assets/_dist/Tiles/grass.png | Bin 11382 -> 0 bytes dist/assets/_dist/Tiles/ground/dirt.png | Bin 7341 -> 0 bytes .../Tiles/ground/dirt_with_grass_middle.png | Bin 10948 -> 0 bytes dist/assets/_dist/Tiles/ground/grass.png | Bin 11677 -> 0 bytes .../Tiles/ground/grass_with_dirt_bottom.png | Bin 11126 -> 0 bytes .../Tiles/ground/grass_with_dirt_left.png | Bin 10793 -> 0 bytes .../Tiles/ground/grass_with_dirt_middle.png | Bin 10591 -> 0 bytes .../Tiles/ground/grass_with_dirt_right.png | Bin 10868 -> 0 bytes .../Tiles/ground/grass_with_dirt_top.png | Bin 10868 -> 0 bytes dist/assets/_dist/Tiles/ground/sand.png | Bin 11101 -> 0 bytes .../_dist/Tiles/ground/sand_grass_bottom.png | Bin 11160 -> 0 bytes .../_dist/Tiles/ground/sand_grass_left.png | Bin 11661 -> 0 bytes .../_dist/Tiles/ground/sand_grass_right.png | Bin 11636 -> 0 bytes .../_dist/Tiles/ground/sand_grass_top.png | Bin 11139 -> 0 bytes .../_dist/Tiles/ground/shallow_water.png | Bin 11237 -> 0 bytes .../ground/shallow_water_sand_bottom.png | Bin 11133 -> 0 bytes .../Tiles/ground/shallow_water_sand_left.png | Bin 11481 -> 0 bytes .../Tiles/ground/shallow_water_sand_right.png | Bin 11493 -> 0 bytes .../Tiles/ground/shallow_water_sand_top.png | Bin 11099 -> 0 bytes dist/assets/_dist/Tiles/ground/stone.png | Bin 6791 -> 0 bytes dist/assets/_dist/Tiles/space_tile - Copy.png | Bin 1004 -> 0 bytes dist/assets/_dist/Tiles/space_tile.png | Bin 1004 -> 0 bytes dist/assets/_dist/Tiles/space_tile2.png | Bin 2449 -> 0 bytes dist/assets/_dist/Worlds/worlds.json | 72 - dist/bundle.js | 3270 ----------------- dist/bundle.js.map | 1 - dist/css/style.css | 121 - dist/css/style.css.map | 1 - dist/index.html | 3 +- package.json | 2 +- pnpm-lock.yaml | 2 +- readme.md | 26 +- src/index.ts | 1 + vite.config.ts | 1 + 50 files changed, 29 insertions(+), 3472 deletions(-) create mode 100644 dist/.gitkeep delete mode 100644 dist/assets/_dist/Ships/large_purple_01.png delete mode 100644 dist/assets/_dist/Ships/metalic_01.png delete mode 100644 dist/assets/_dist/Ships/metalic_02.png delete mode 100644 dist/assets/_dist/Ships/metalic_03.png delete mode 100644 dist/assets/_dist/Ships/metalic_04.png delete mode 100644 dist/assets/_dist/Ships/metalic_05.png delete mode 100644 dist/assets/_dist/Ships/metalic_06.png delete mode 100644 dist/assets/_dist/Ships/orange_01.png delete mode 100644 dist/assets/_dist/Ships/orange_02.png delete mode 100644 dist/assets/_dist/Ships/orange_03.png delete mode 100644 dist/assets/_dist/Ships/orange_04.png delete mode 100644 dist/assets/_dist/Ships/orange_05.png delete mode 100644 dist/assets/_dist/Ships/orange_06.png delete mode 100644 dist/assets/_dist/Tiles/bg_starfield - Copy.png delete mode 100644 dist/assets/_dist/Tiles/bg_starfield.png delete mode 100644 dist/assets/_dist/Tiles/grass.png delete mode 100644 dist/assets/_dist/Tiles/ground/dirt.png delete mode 100644 dist/assets/_dist/Tiles/ground/dirt_with_grass_middle.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass_with_dirt_bottom.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass_with_dirt_left.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass_with_dirt_middle.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass_with_dirt_right.png delete mode 100644 dist/assets/_dist/Tiles/ground/grass_with_dirt_top.png delete mode 100644 dist/assets/_dist/Tiles/ground/sand.png delete mode 100644 dist/assets/_dist/Tiles/ground/sand_grass_bottom.png delete mode 100644 dist/assets/_dist/Tiles/ground/sand_grass_left.png delete mode 100644 dist/assets/_dist/Tiles/ground/sand_grass_right.png delete mode 100644 dist/assets/_dist/Tiles/ground/sand_grass_top.png delete mode 100644 dist/assets/_dist/Tiles/ground/shallow_water.png delete mode 100644 dist/assets/_dist/Tiles/ground/shallow_water_sand_bottom.png delete mode 100644 dist/assets/_dist/Tiles/ground/shallow_water_sand_left.png delete mode 100644 dist/assets/_dist/Tiles/ground/shallow_water_sand_right.png delete mode 100644 dist/assets/_dist/Tiles/ground/shallow_water_sand_top.png delete mode 100644 dist/assets/_dist/Tiles/ground/stone.png delete mode 100644 dist/assets/_dist/Tiles/space_tile - Copy.png delete mode 100644 dist/assets/_dist/Tiles/space_tile.png delete mode 100644 dist/assets/_dist/Tiles/space_tile2.png delete mode 100644 dist/assets/_dist/Worlds/worlds.json delete mode 100644 dist/bundle.js delete mode 100644 dist/bundle.js.map delete mode 100644 dist/css/style.css delete mode 100644 dist/css/style.css.map diff --git a/dist/.gitkeep b/dist/.gitkeep new file mode 100644 index 0000000..d7be189 --- /dev/null +++ b/dist/.gitkeep @@ -0,0 +1 @@ +# this is here to help keep the directory \ No newline at end of file diff --git a/dist/assets/_dist/Ships/large_purple_01.png b/dist/assets/_dist/Ships/large_purple_01.png deleted file mode 100644 index 4740265661289be0d7b0864fd3fec4635cc02892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4497 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 diff --git a/dist/assets/_dist/Ships/metalic_01.png b/dist/assets/_dist/Ships/metalic_01.png deleted file mode 100644 index 2ad6de98ac231129890228fab0a2289dd202876e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1985 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-5G9Y+7Ri=r0$&)K?Yw&bO*!Q*AmsXON&kW~I!-|y zO$Us)R9}fHX7C@B%kpwbSs?E?L7sK_?q~OEXIP)ByuY|3Pa^HynK!o8=j+bQvz)c= zwGZp8WrpGmO6vsfJeu**vi~Q$ty>Jggt`IaGSO!&GhQ;iNIUoRkl|NL-ZNp0JAUqY zA^XjTVMpEB6Vur`D)pUy9Gq*cxZ+Rc`ROf&f{T})_u@VCy{lr+JDc_AO+tPrHN5y? z5r|(`UxK)tTY*UR|v(iMyco`|rMu0oxvX-Zwek)hBId>%MT_ zy-v^C>Pf~C-eG*V?SHfxH<~&8IVNLm6)fa-c7dU7`&O4%{rl@TUiR#+jL*&LSR1#a zqu=+r=bHE(A3MJ8`TxeFqu`s^W9eM=GtFk#3WO)wS{7by+Ml!F{nD2|Hl5)yv$IO7 zS=?)9%%FQ=&ZUs1mH^#5((jU@|%KSgZL91r88%MBMPUlw?&V$}1>aO$zt`APqrYj6Cut`+2c(&{sJ ztDWVNGYeCWZG5)z)7x$5`{(&`a3AV>Iyc8S@m@~O^Ls*v-I>f4i)^kOu{ostR^`oY zz6`#C25u=A{}|;BlOyhwhUT=-y{`V>;A>;d(V2?bh6aplB-#^PCq{i?tTaE#{-kb^ z`Ye!Z+zXY_li z9b#T&L~blPcVl0YxAZZIXDb*?JQG%LIlP)7>h{*CWJQP9SEaU2UZ)Yj)o9nVvLQq8 z?Tx6YLyH9-Bo(&@CLd3*OWCctR(6`F+%bdpGweGSC|=@u<+o?Q$?Egq=HA(FJPxPct6#aUOZ1K1317~h zZp#S*dX~yRpKts4@5~>SIP>RQKcDUSu&DAdBamp>DXN=#^)06%KTNjti*fakENZ7s(<&E1#y22UUkg( zTQbW{GE~oX!>cPA>#fUb*gns?%N*mxI-ylTo&C>ipYYYyugw?x`n_uTd4NSh(d{@} zrM0Q*X~8~=`<$N}xg4AplpW$ZTWWQGGlMbfKW+ntFk69Y)?djhL6xeftDnm{r-UW| DqxK!$ diff --git a/dist/assets/_dist/Ships/metalic_02.png b/dist/assets/_dist/Ships/metalic_02.png deleted file mode 100644 index d5a4f68154a3200f852e0863b75714d9dd0e3fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1933 zcmaJ?eOME99N$pnt>i@%4UzMh1rO|<4R&n^>=>*ZAulo%(z!cejoYp5*b9P!W}r}t ziexGZDj|pl80G}D0wSTuOexI}P$>e!G)qE+ZYtIv(LHzf`~H5<=kxi#KF@DkOmyUn zjxRY!(<7!^8{5{BUGQ9z0*($H8`ftcU^ z3Kdc)vp`k6oRG^_KuR2AD6ANU3Dc5n3Prfwq*W-@C;_ZT(^MJ}c=z0S5Kti^Fp(!? z$+TiLT@{t3L*ufdX9oZr7MsIlkuRUl4up7oh!X@ndqC2g4oQV# zVaYRJ00>iwSJ zWim*r(Gv=d5|zRtkW^r(R0zZi4h-T+U>+wTSi)vU1cygNh)ILR2@~_U5(#UX3**X6 z4Al_RT;v}ve@3o#6fiC68Af#~1Bys=I0igP8B)z03wK7nXIy0FSORC{GRa_=*2ey; z(bGrd^jOX3V@qzH4?e0Pr(H*mb%nV27KJjKDuu)1O+SpRPKk;Sb1zHbd&A)8zCOM# zXU=c^uBtTD?~0wnt_r|D%XfRhl07cJ_+@REgWC!^hL+mfh+`brj`!HEO-?=*(Y4%h ze3`>`mhWI=@26?|ywVJJoAo`11~2rDbR9U`YfSyAOYm^0A)v6NVJvCi>(}Sm4?@`? zhwj}`R}YU(P6P&_!hMFCBjSV+8`{q5kX^}2BFFIdoE7xAgNxAs_eR)%*3~bWyGI81 zbxs5g@oF{~wuc%S?u^kzQGafdBi(jewk*!B7+A=xIwEUqJhA41cts!Hlhcv6!@H{A zHuLoHsDSHB8~y#gAF3W%Hd?-?FQg{H!$EBe79MWds+d1oa!CZNUf%oKo~w?bEzO(S z-o5RAZMaTuIhJ>(gqF9x{KiE?ZtthHOXG|cYj)D%mL&r}9;+#Aa>^?mKI-K4ZP2|H z?P+~zcBQYS%!QKMf7!t>kZq@ivNxYO2yHC*b;%nD=6UtUeHG(giz0R?hS9E*wd^>or+=;k^3V zC8weEd0+17a=cKj-4?vZz2mFB`7xgDi&fYF^yZ0z;rXE%&VZ$s+L`~+?xw>hUw!3+ zFK9~c>byXQfn|YfdoS|Gelq9y9spnR>==6Ge&sKf_ZGNObGz<$4=1%<+1P#*vBmB+ zV-qi!ihZUY;mdw(l@QX;zAZVPGnJaPck1NnIoD6AXJtexxn{7lCc)lhTQ)@8t{2h|rmHl)<{&NW>gs_3RnAR9K!nRx7((nxpq8eDa3 zTSv|Diw$1$fZyz!IFl*$!PLm|(zB%N1PA|chn-$-lgWLqb6AIhl*)f{QH_49;I*H0J>bbJa*bQx4I%i=YAJT^KbxNMoyra?{(IXe^hb)I)c0` z20Tm&^-4H&e&#KOdy>t>jw=U8F10mGlv~7+Ig?J`HwYK?xK`8rys44-^0I}_dq2Ap zoKPN8v~?~q&~Q7r)$n_X+p3}m!uri?_ScFon-iC^iNl2gR$`0bba0Owi+T#|-3))}C{bCzMp{1u2b)hEImC+x$01&jua< diff --git a/dist/assets/_dist/Ships/metalic_03.png b/dist/assets/_dist/Ships/metalic_03.png deleted file mode 100644 index d694151741918221e7b83d13ae73e8eeb14d98ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030 zcmaJ?ZBP^E8jXO6f}#irT5%1YQa*9@@Yx2DAK#JV(*X3-PzsuW6n9xdEV!l zd2_?Vf;Mj0z5$2BZ43$KL|`My_*s}^|7erNli1*ha)oFloPerDDhL-KfyEFIA{Qk> z5s*ldp3)65aX3@FR3Jo!`~wUSmJ>uq3_&ATVr(3a>8DYOKpBJrVkl9nVBu$5+VOx? z!oo*W_$0nE5K58;XQ-gaj4%P1Ap_|Wyq_wIfe|$#C6P=Z8BbJDP)Q^z)tgQAh(J`5HF z*p^>UW(6Cn?(zh#gP*Wv6QPxrd#f&r{S52uUlq4yAF^Q?hC6I>4_>sjGn_0+@-u%W zd{HxIZr}9v_q!C8hRp@xH|6aEF`d_ttIsnMhd$e6RbEE-nlGdO+Dlg(CcX|UJnvmN zHdd6H!E|!TBl7#I#$Pe%7bO9;%@-n*ujswRr)$FXT8h&K(p0|1 zGJokM8Mp1)z#Y&hvlBdUuV_2Xa>U@?{Nk2=#5Vn9W7ZeV+64+Tf2qY@-~Gcei$mqQ zxa)0N>fD5B0I%B4yJ(~*E~k6etBE|9Uu@%WB7eV2tJ@80v!8nRTAx>u2I$d;B~KKS z@AB<5y!0Fw$sw6`K8u}h5ak!Rg=!?ZJz{+RI@`J(Yj3taE<5R}ynXq&TVreckUp^B^3H8mlYP-^s;kZ1olT~n8|tTQ zSk-Mgm^I{su%)7pYy$=#4JS_oRg?h-lbqsXim#o?LW`+$`GQ2y!)YYIPt|klN-sL7 zpRbBo&v(&``&w3@j$^mGS_<4;3YVkUxhC>$@Id?GGR07`bgjCi%Ifz|)z09*bV0j1 zfsX!^(E0C7k9wYv&BfSfA0?eXw14sLob!`E3Oad1A-(&oH9!90yI;4I6hg9H+htSi znEP|@_9lW1@A8vrqs~Y2TQT`L6e=E%^nkF0p>` zY+vmWUa1vxyv9P(cjnJ|$UymXfqt+;ce4IUNL?AdKz|5#hrRwxssWs1RLTgi9InXv)7OFCK| z=gW_$>^h!)n^uMEO-gIL_;7Ju9ltuLcIblcT=yx0bA!js^k7c!afjyb>hCuJ17DSR z1}BV~yg;gEx2<3M&6m$=S{38v4^A9uqJDU5;knjP^Lb%$^297|AaKp%o!viQLQ>sb wVl%f6@qbZNbd^nk|FB+C_q*j*`I%VZN;itDYhv%cZ@hs+xM7?IcKq@G0P|)+DgXcg diff --git a/dist/assets/_dist/Ships/metalic_04.png b/dist/assets/_dist/Ships/metalic_04.png deleted file mode 100644 index 8cd0d73dc8e1d8c84c91603fa8b8c76e44577d21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2096 zcmaJ?c~}#78XiG`fVeAiC{_p&5ivI;LP*d+5|UPsBQ3!@Bm+c9CL|LR5af~)L=I)S zDj-nrt_78973C^&h+RV2atW42Py_*`T`hR+#ERWNmYrv2e#i5^@ArMb?|o)60{nf= zO>Ip905IoqSwYB1)ITOh$UDSfE*%-xz-$2=428pLp#lV$Vkitm^Q6KEFbEWiV`JJu zIsh1ABzyrZ@Y_xkK~lU>kHKrCa)b>4^sO4XP!t8i=rAxsB4c1?YU?p*iI{;2q4*K~ zBv`k6UFfi|RX~REiX*wvC{!AG3;M%_L82+d z;j|zY=R+)H#lS?uu$)F9sMTt`+7%BeA_yc84-dTtnT$gaIAyF17HV)Z<@yB$7N`^{ zByv~+$85ktfKT43wKg!CKAC3t*FoH%XCy?+&eMt*IKfnJEl}bONm2eRF zXTJYaSjmr-gM=VZ38@q!q;cWv^`Yc69|b6cAq5|Tq8CmvAQFNhWh5j=`vgm_~7R^=$hVJ27F)hnB zTRT{Ib3y~d_TqBMmkS%-rZu-6t#sDvPE1^=zB2AHe}i?~inEfz?aGN=89%(?%_oT($?~dkML7^S@w>W zLDVmPH5+6UR*Pr6Za+V=vZcE{;|R{KhYS5o$R1ZpYD!~J1hX|>1Vt{mj8wt zY9){gR#qmD{R-7Tc5L%G7lyUMH=pz`u_}IKAD6P4R)$)&e`g}Qw}|Uz=3?T!t63a- z$ZNgz^XuwP!4Amo(DR!6IzDQT)8CiWiB(^>0r5|oT#jqCfvv7hX~5v7Q-Q|)8t(8? zYIJC;>3xXzwyJg&e7-}=US2NkrC4x6tu&_JYLXgDO-7vGN^0#WD5iB`r1PXfJU;ThJ;u^-$$2cFQ`%Xiz5i@t=>uwM7@kGXYwzgx(YpHnC7`bXU*>r(Wcn9^ z9bf%gx6_L@(a&|VZt~Um*;Mx39-H-hUZOhN9}N_=Yk}97xyF+-Yc0o&x8N_gcR#AW z{`t+xdlT7LW=`$BntyUFD>jh5hFk6Ei0vsz-qHh+XI48LwX0Gc{K`B-yS*jLBspD$ z8vdrw770?%G(LQ>@Sf;2bynQo|W-BZ`QWu=GQUO71I}gK0&$SjQb`$|FaNJgL5j@@WU14 z)FajB-?*4ObM5rK18~2u4o>;3VfL?r#E~~I+^cmJ+2N>}wuFHC)rO+}M#H>yw;uA2 z8I2ESEJYbf25+=tMLirNyRRHAPy^+-A8U%hON8H^9IP_3-hU-kZN6cU+xD;I1i&Oo zIG=dwqR8V-sR7nvR#&k?ik2CjXyqDt37v(xx=(5vV{&(=tE=;h%Wqabof|x$v@y_N z2U_O+FQ+)byy)gPigmRkFOEgoci3mZ!x4^X^2r*6~zbM%~C6Q?D_ztPl&! zAjj^xWv6=5oVupPg^e#>j)a~VeI>a$++7!R*Of^!$3CrL3@nrCtY>twxp>XKkh}cw zCf=ydbI&v8?kSd~S>{ho8xno#spEMg>pu~{pdM~C_TJ{i^tQ1rPKvKUHO(gf1CZv7 zcETQ&6o*3ao%$%g^>e_^;znQN^(n@tw@V^>gR^(pTEJXBXWhWIbT#_$yS3uEB{>~g z_j7J_1(RBDVKp`hzdIbiWbnGQ_J`;M6)B36^q7*KhF_VHa$y5~ojT~n$$W0W-h5|= zZ4FbP70X~_QfYW&7X^C@PGQ?m&QCo#ZKpP{?5HW*It%T}CVE-MY;FARTFDecGB^Kx zpGjMCQT$nr;8+1s96C1m?&`Z&L#?Uf8;7cN^kq?-rzWcaL%_c(f>beFx>5fR=dt}+ J-+J#)`44QLQsDpq diff --git a/dist/assets/_dist/Ships/metalic_05.png b/dist/assets/_dist/Ships/metalic_05.png deleted file mode 100644 index ff5532c41ac95b19ffc79bf7f5bdfa864227d160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064 zcmaJ?Yg7|w8jeAz;7T!4SZJ|BPysbJE+IrN0+W~&V!0^+5e&&-B1tAB1B9!HB88PI z3c9ce6j?>ELS4Wsh(JZKLTR^a5D0<5(gTY`YzZJ}6DxLqEIVgrzRP)@=Y8Mrea`uE z1NZLPU}9~8LZLP=8DOw(B<#6n#BtquSZ^=DLr&ERh#-Um$VEc2j4JoUzSX7b=K5^{ z7I+Im;ykgxC&gw30)DU*0$lOVI4+Sy0?1@M$;FjSChY{Ah$JThQTLK@Bp0eHnd;;Q zynC>^Xi{D*H5jD7i=|t6V)+Onp%Ms5NlEx5XFM!DOdz?tyX!TaoNzh>PL?c2IC7j= zX1AgMLNcyYAVCDM7|<(nV&DYC6RXSg_Yy>s_p)NyyJONF7(vdF5J-5UzN8f(i}nAZ zBGG%a3<-w*$oGE=%R-YS5Fr?n!3k2Xu5qz;`cM+8pA_OCurw5gg)65R$cGVF#)l<< zUkDj+2os2TaFWdNEuO`qGQ~24Bj!R(&=aduzzYOCD&5JKNCD|Y7k3w55{X9fb#-?G z-N-~b-IYkA`OsFlAk0k=L1JWu%lm^%T9vD}f=Hr^3_?;tBE+LhVG;1QWU64*Txhga z_1*zHRw)Y=nF&?i*> zY%GGs*ym$jrj<7eZH-!JW<}nQj)w~E_*kRx28MZ78!fw*jKTI%BN(^VJIQPfk8K3K z@p(>$Zh6*Uj1d|g?F67WmQ14RTRu4`sr!HPIcM6bLEMu|HZ=GxC z@TsV-SF{z?&P6HC#b@5nxNBd(85so%%u^%J1~tEt^Bo$zkW2KDH~FaKqiKtmeqIW( zri6cGFjO7%h4~sZ-1w=CCBDhaHZ4%R5SV8IqspwJ@CC=mpKR$K(nhmg^QUKh!|QT( zTauAwn~U@z-Vy0Tw({3cGOx5`lv~c&pGP-a-urjDBI^k;h%w&%s@&rIwWtWRa4N`BE9vgq ziKv2etlyXwzSv2K{i^7vY;f^VE+srY6tSP^`0gJB(+bz)L)Y(At2-*ze_U_)xB6zg zjR3}ed-s-1aHjH-68FKa-5=bk-)NCmWqZPu;Nt3t@sVY=w$s^~H=t?9;^s3I{ges+ zbx}7xmhs-k4i!xSr|!jj)LoB5z^#NULFoM9M!4L@vhMMKZN~#{{6j-$)}V@Ok5ZXM zd_6bkU7(%5aA3^&%%eE;SOVHRp@yZ@&V8sjdLT5t6vS?7J+JA>HyuwH`?|&)i zzZ}`X#HfF?a@U5qw3XU_OW!@5_E$3H;8g6vW}GlPz4-5KXhLbRMQw2&u1}?e|2%Xk z)2R}O`tVUIcx=5eHz1n^&zG91S_QWI$NI`rhjEy+pbK5kHhi|_BO^+cYCI%trhL~$ z3-zX{nCI>Mrl$Q~sXdjghE1{HOQYABV6e}zkepYYi#$vWMP->Aa2JP;PPw;V37cKr zx5%%ZvQYFMEfwuwp5J;_Y5=2KE-GFf>^tO)u=WVYgwJ-t=E2 zvY9;}<)MX>?LVA0I44$4v>58 zcj0GSGOBty8_sq)l1gzHdCish-sy@{Pd1FB7st}?K1u1q5eg5~nM-W$F~4`zjyC!U z!Y?x2KeDo7DNSMOn=rY*>-|Nyc*3 z&`gz0f6WP@{{*AnhwNx_<8uq+=pP-lEslcZoF!oW4pu}3C!f0yp2P%N^&Oe`p=4^3 zJYrV-&v49_&6G;X%TpxoqnE}`AnLTRQ4W zYH#edx7%aVqnQ2@ccjW-_<5-Hv=a7i6&uOrm`62LZi*Z_^fs>+g z+J4${DMQ0}II<9VMuUs`bm3?2pk}`E&gi@rRrgvRJ&?X+kXYQ23${INA_-f-{+g6u fude$Kw6LQU71k}>rl`hI^mjCqwimqadnoHSg!Wb2 diff --git a/dist/assets/_dist/Ships/metalic_06.png b/dist/assets/_dist/Ships/metalic_06.png deleted file mode 100644 index 47b86b3a3b69c7a5c6e545a21041d610d118fbb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2027 zcmaJ?Yg7|w8Xk};8>ChRQ2`wWy09#{LIR0InhOZlAP^R!QXwP*$;MMOeEOCk|0Ww*n}bJlxmy}0KR@YwOFEnF)$X6m#f&&XhSmu%B5^5 zk}jYK)I3-w4@}m;!sOs^NwPx1ltO+RL0=sU7f`~O7}P0usZf@V4ZYE2;d9eA83Nxx zFa;a>-IPcW0`d?I4AM!SLvX7R?)c`#^X! zjWmuG#t(QK3tzDz8HTA@WU^MPC22iLh$fy)Wipv24H}JzBZz2{3KQ#yD%5#ife)h+ zja-e%5fx}s6vrZo7#qT!{+@zT{Z3YezC9-Vz{onWnoK28OexI+1%m$%RVv@1Q7jDp z!|(qTM#GcTFgXlHkwlFIFI=3nDU_PU)4*a3(S#$&uK808ks%m@$`Cck6EZ-zNV!Ui zXwkpC!3zYeAQg&l^bam)L9VG4lxjROAJ)h}g{1)+LPOB;urRE)gT}r;kA^qea6R)|-?QszNZwRNn)ye;#(<7}wZzti35WXRI|nHDwMg?R}iNb=1|F__rS}&`&)B zE{)!cw5>!gqIvQsSsUD~i~hPyIEJKcRC zCr8FOOl=Er`f=9L?@^Mw{*YP7FYR`VIpzCxHvhPs0`FE#6|_y47k!5&Ias23pJ!Ip zm$y!+cO0!wp3Ev+rGK>g9A|R5^`vNxjjnVgp!7GR{k?NB;;236{%L1BY35#5a_p0< zzVWWzH*H{Mz@DY;+xkV9^~cUCCClw z6}6+0K6{PmPXzgSz$>5K>H2;|S4L-vH54DWWsh~Lem|?b{SZ~Py(PC`LQ=PkK=%V< zwqC#X>%{v-Jy$mR9CZujmnV$+Z7e#@}UdNDER zKAqPbTeh8JFc($N{bHT)dh;RCM5LQy8QQX_@rliYgTUeuPhCSs!mDTO@#MY)uMTxB z$Nu>fDBpumix?}H{jBozbY!Nqgy!E>hI^d&YDLn6ef2j-+Z>M8ZFknN>`8uwe0_1@ zx!AgiVxJw6xoVGVF&>X~j_FIg>yLmtKd5>nCC{7`%j(t>%+Eh`x6Ey?@V%fZI&#>! z#AKb)_1)-~?#6*1rbnO*C*d*6me9aI*HUNrE>+n#2w5F+%7K6f{wtX4V}T0)S$1zr z=kopnH)AmH{0gM#&1Ax3Bb8IG0S+6wI9pSjJL$zP7S(`oCfIT135QKi6dvv1sg=2t z{Li9NKV3{5j;(;r9MaZ85Jh7=7x`!Vd!db7f= zh|S80fmH?VGmzQ32t`lj8uZJ$8AI-qN^ZY(geYY5AnkiYcU{|yw(+DZ%<6A#j^^d_ zgR4HQ*?TjZFL>Q}<5It6@mJsOjIwg`wA!)vbaq`%M#m8GU{haf^!P=^z9F%d8+k=q tSK3@_D988(L4Do)WtDf0;Nv-q)c~jR_3ZHF7Ln=t4e}4>f5VO0{~v+zN}~V( diff --git a/dist/assets/_dist/Ships/orange_01.png b/dist/assets/_dist/Ships/orange_01.png deleted file mode 100644 index cfeb138891f88acc06ed2ebb83daaa65425719e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 zcmaJ?Yg7|w8Xic16x2ZJBEqtSz=C3P1p*lf2uUDp8zcz=>!lEqfdn#{m;?wHMFUci zs?h4{3JAt4qA0d1R6(@0a#2Jsg_SM_Y7ej?P&X2!LN~F(?vJH&X6Cz`=Xu`u{od!C zuQ(<;a;2?{EdT&3qc|+SX(XFJjJ4?>Z~6LD)38R(PEZSw6m^zR2?1eZBpJd*!NOFC z4++KDJKCUN06^iTu?gw~?#G}Afr&yhhNyuRCN=;BhiVi;Q97i?B}1uFIRig+^EMtQ z6*KVh0bDXy!Gt7IPL2{1Kt^zd-{99enG&gUP z@VK`Sbvgt8TT%(!7#tH(Lbw2;A3;Q>P;fLFk>VdfqftJ@QOOi4iEMgl1d2ZxKm)0P zxOWfU6iq2k0r{+mcd<+>24138D?kz{D=Ukb(pvso3g&Klf z<+-T9f>a`=|97+K)m5@-4C}R;sws?v$5=4!tB!~jX z6wq*MKFdEC$}BK$J?wAU%i{9z+d_pt9+H6bd^iC?b%` zVzMbzGMP-LQ~ejYEJTz6Lvr;ZSG>fflb7Y1tpF=bky(&ZnhA*`ln9J_TQVqJJ{Q)q zdhfX6WpfE)FUuvFk|CKJ`#+6d+%mbxJYBM_X|ZH{NN#ew(qwB)b!7$spm#>G!eTW~ zCbn=nvAhpL5PP17^F7@bG-1X5Qh#UP_q{%f*+Tz{Q>fkNbWP#_rw!JzOIF~uPEd)W z`XO5DF@SBHK3B~N^EmIN`-B5FG&W5&H}-GHnk+Y_W8PQDUSGP z!ih^|BFA9Y+Y^D^6v?GaF6B*MG#e{rg1d23B<%NXhi*N%unut1^rauJ_1=9zcLCe- zU1!T&=gb;A>L$PX8&U}UC-+AY-S9Z9ZriRao4_2snR~M~ZOc^wt#nGw7#z}Xvsi_iv9WedIpsAKCmCAJFl<(||FISE7_soa3%3^ag{lPC}(d|fU z*Jd{GYIXkOs>|+{9oN$UtF6!aKXNl4Y4&a{an+c8z`!SChBlsGT~dL;vHUaJHZZ@DtT`RCHj_`W>*iMzn77`I)W<<%8R>PEV6s z!%5AM&rV;Q;!m$>w-Exw!2rT8?B!cLFl>`Yn9upunC;_U z#}l}ZC+-*Hr^8La+_g$Z%0c@2K#V?p;^hT_=s|p|NyyjI?lgmqv z@84Zu>3n$J^4zQI&h>Q_kIn{jjK$%gM&RpFu+IgvJ1NxWRO;jMDBl@Bfj!zw~ z&^CrWXHL+x(FQ~Ia}Up4_jDAf+q==-P18KzWvsm->*YnBZhmE%+Vi&>N8pj>TEWig z;Sk-fOZO{-KBwn*{L9&39FuKrbJ!Q|UG-)P12qjD$#vH=Mhww=XHuNULtcY!zJAy0 z4BSH0?TE`r)7lIf z*8e#N`x*Q`W545^@z78B4P!CZt^>BWx%oC$CF;M<*Unsbw)m&_!H)Ty2%u%w%FX73 zO#_|l&-f&|LPC`Lg1vr9B0Ggz+rF(&@CTf0*2T(iOZ)T&M-3y?(t89zEWP=*W#Q;O ziHLo1L(8WYE7sTg?^9YP;eBj99lOZW+L!Q^1{4N8^6sUAo3K)Vt#~D&eGCRmhQTXWQwVg!dAi_@O0TA+_l8Z;ti-T2vqX bE7}=|sc*BZF531-^W_}Hj%L+`Cu#o!)rCY) diff --git a/dist/assets/_dist/Ships/orange_02.png b/dist/assets/_dist/Ships/orange_02.png deleted file mode 100644 index e23af4190e44b9c8f007c82258fa75b74b197851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2272 zcmaJ@XH-+^7QF}}LJ$!hDV7k#0fiI@fkXnP&pZD*wR?KJ8NuMk1FG5gm#Wi5UVAAhDoG5bnWcM1%eygOw0_3v>hk zbp$&gL=-~XLSRB%BtwNkO1OL_8vq=gC42^x1B&30U^JUYM2uf)M!?xDA|lw1hNkf; zU<}(mQ2^2ty#ttu944NHaCU+_N(f2;E+}HaCET4nAwfb!eAOi==c;WK0{#^u;t&yk zClx~Tg;O8_2)9GpS~JlY3>=3;Vz72N9L5T6gT~mP(8?EQjlmM^a0DBB__qh4j3!`3 z5&WsH-(o3OL_~~8#3!IoVzC%0wnajMXcPvI$E!4KY^;?CYheOU#E@9?gl6*!R8Yti zu=yf3#Dl988Ie$&h=@>T`gaLj{&!iP@Y^vd4-6$?@KG2fT2<0KkVgCeP%ig7S}5`d z|H=1%3JU`g_#nz36hd(Vrm}HSW~xwp0!08aM35i=f_BcIqHhc&f`l;;A5Nj;;1|5n?y2`$(l}{_@%hFRtT4KVd6-%2jc3@n2WHZo3$DXzu_HwE>SGs&-% zSl`j^Y|@TinRLX03H-EuLH%VsII+Vq)qx)s=l6w(^B0|6p{} zroYx{G8+YL-jP0j4^cVNPr>TVdaInOZrsbf6CV|_XFfDA;=~uKR8gOz}~eYTAn4I~FnmkTn+DI6da%aS}g> zIT~ay6VlQYtDuz}z)R6rGItYeEY(#@%Wvl>I$ad9?c~a=#oaTE;@=JoJdk&ENz}BF z*>#5IM`{cLg;S%=VRKdmbH||3x+R;x)CF(E*YmrQ%YvKS{a@&K{>K1>aXvkK9luPt zBAvYWc;SnYydZE;=J9Ff9aJyx>9S0T*l>&ftSoo#TDTSJvtjG1(g%*YYN28AzArQq zoF@*#ygYsA@FunNmOs~Sye-qm0Gq?d8s*78$rFWlcTLtcp&fVLxIe3?S>+`0{ao*a z$QUWBXCA+hzcznhH)6W^%^_=(uroEaQ})?s9;Y^3dTq4%T&`B>asOsn7+0^0dMQwI^)Pk1sk0l5nC&>ScczXCU6J*Mq{a zeY?!CM2C^W;h%MTQKzLt*kIDW+=^&V$jvymwaW5gxs2kvloU-I-*gtx*mA$j&TG1> zS|{p_G|dz*l%C!(p5s-t=px)eV|C}k66C4h=vt)C8UG8ftWsN;CFctIw9+n7*W66C z`c-ptK1V)OtWKz^(>B;$xfW@}dG^FdG8F>JrV zD4FC6H#PEJSA3a%LcKzIZgEHY&(&{x5lBl($$rwFR|e+T={bA*i14&* zz3TNgh+~?`zO&_h^}ZPwmkou4L|jkYz;gfxQr#x>lQ~n_G8;oXSf3u20TYtI#=M2A zW3$|kwgq&%dv36O{p#0WM*Z}C{04!;hHG>uucfR|SV;<;kGedG?rbV9iI_A!4cy*jC?FKc$Px3=~g{i66|XT!yY#B0oQRzmBb>+?)*s`^5;TMl>4 i>BIK@VW(0S8UpKPdzL;Kaqd>#IXqmvsnz7|>Hh`zqq(dA diff --git a/dist/assets/_dist/Ships/orange_03.png b/dist/assets/_dist/Ships/orange_03.png deleted file mode 100644 index 71ee69aa0c6efba7446c339024a1f48495354e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145 zcmaJ?YgiN477b!hh!jN;DWr}81*_x*BqTf{Ap}AVLWl(wgpdp*Kr$hjn20>&VFe1P zphZdn1(Eu0E6|DxNKwHG$fHul2c+s%)Bu-vtL09t*!$yh=bM?c&-vC`d!4iQ_nqv( z0AEv+k4;c0lqtuL#Y0A-{#$H>{6iMZ>_-MG*e4VYhN5A$Kmnq>L{Jn6aHN75kOvAx zyA#?#cNEGHC*g;}q1?@MAtc2M^ccKGDo5BTlsiKs7YO4(7>EL6Br*@&@a0AvAQ5@s zLR`2+uG||GOZ*ZQU~pmpUzivtq=|40PrzM6M+BrGEC4jpc$t!}@xZ;)r6aL^nScY{ zLEtzK+~1}`xq*N;qyPaIypyAlNFo6g3ZCTbLZOg00%RhIOdujJ#gXJpccIY9RN(!C zL$WDE(R3b*{XQ2m^T3H=SWYJp)M_DM$&LuZQMp?N3p9>0rR|&o z3sedf5;-h^WPn~#5Cy4V4;A7o|9_s4`B7(pYD6G(WXeoJ#eF8BXKrP2>* zCCmf=@%ul8mHgdukiY|#kV+v$3KwmwPbH^&D?kAZDfkc+KX;0OVhDzmVn_~n2U7rt z5Q$6#sg>*B;kjHoN2Y`YG9k!edEgKQyhI|R(@0ELS0a^0_MthENItHvOr|T_+neI! z3Qd!f#&_ns@7 z-;3+KTmoW-pfBuy6?$$7=^lOfp>2`LhsFnGNVhAHwqDycZW2*YK=-gKELN8(8ee-T^)Be5FQ-C(3;09o45Z(L0o3 zoWt(oNf+cDVI~K{rZ{cv_HRS4HD2kB|E%O?iam|0w4ZwPN>}>5CUUaOZR&RM@a=Dk zmC?UtzO1)9>}S_%m+Zcw{Z{$aR;#UNqn=r=KY0z4y=I;1LG3~Gf&m8Me8pg8&rf@) z(#$~gwu-^D<>PIwYoDz)J-gveM{Um`iDk3jY)#<I} zhhwE-@g1yvoDs{;ozG%CshiZ8r(aIExqEL~o!jOdANta%LNUqw@qri{XO!NAG1ip! zfnRQ;1|7~S#Gtv13Z1U5A104gK}K~V!kuexRs4H*s9sx6RbGh7x5%EzzYd_P>M*e4 z?9Qel%yg-*mRic`dkgOGudgXX+}+D+`CNJ2MKweEEB~DAm8kNV^(A+gG8}&3+#!yo z`IMLTEB|F<4g*0kxAM-GEfPH`*KJ8u4M^KFyF>xWkCX9MttB0P%hz?Zpqzi2GCMtV z^s|{%W$!nfAYpW?eNQ1bNWCkoz(QhvPw``LWlYrQp3&jgzXVtIKW9K!3{5q?gC+Rc z#`6X!@l4X)%s(XkJ4eUbDy+hK=|}ER&b!ePntm~0uY~$;*j#QK`Mx-enjAr}%t!B| zCuQW;AN@W0M1ajmALKFF6mcnhi(_?9@5N$qz>cy%8jE#p8NS#CFQXr#7Q!v0=4`{i z{=Cbrfif7k?p7BrSC7=um7m2XauiMTLx%P>c2khAIwh<@FrnPl(@zDqTW zuI_G4tN6EV>!y{`&8r4m3?8S{QGN&~hyT1bhvj>T?V8Y(VdigkB0zPVNPC_o%oLg@ zrEaM%!d%sTQjQ%dzQ|h?Ti4k#L_v~N$+tsc|HlcO| ztA)+FDsx`mcRi0!`1%j;+P3ZBY39O8V)HKJV?=FR^=n~mdBQ`n&En3eWwz-?OD>0i zhUiCO{1t{fw>n_6mkr5yCLFh7%S_{`3Ia>nvni_@}UZU%x@ z4ZwX%u|sE#tVo{AlS8eu3!t@dc~Slu@&@tF`ka(b)9%R0ug&wumV`aZQY*qQDO$zW6n{Cj?eshwAVLyFV(DTA6!d>jO&ogB& zUyQfEGQ9A!qG^%Un)+k?{&Xz+Y5IY$jnCMVX@-Q3jTPRHbz}wiBkUb?Y3%A7!|bPx zW{k&4Pwr3mqhO|*G*Uoh&Y=uZ5&i2U_fWAh`b(eV6Tmvp Hj7K) diff --git a/dist/assets/_dist/Ships/orange_04.png b/dist/assets/_dist/Ships/orange_04.png deleted file mode 100644 index bac4116c4ff5a4da39189f29c3d0fb606ef37281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2132 zcmaJ?dsGuw9vF<2 zy{jJz002|GIF5(#xZ!jGEG6)b7=l_VH?RR9V6$4z7f2ukOoBvW83RA1y@m(HLIysb z%Jt^TgP;^~NTvdc&5Vc>WJ&}yA%62FFhET=2uLA>52~eUG9_Kjz`xa{8}>#s5f8qF zAQA@tub_C`C@=_CKp>Ui<0bGWkw9Nx0*ONP^(A?NWN#9g=xum?y+{-~)t6581K&M( zgExgRnI6Lme&@?@V&GE{L{29XRVo!htj?L&O+J38yOrhQ=kk7+uNfK?;bEz=}8+PFt*ER0@p1$`n`*2F3b< z>*K{TA*@omzr}O8bdF4k@MQvs!(!kK3IwrONZ-h&kx9PPKr)-=Ln5&^(tIe?AU_tB z9n2;N`BA8gTox=ymqIdRkt_V08?+?XI0{m^!7~d|h%+EzumYBXZ&Rj=myU(Dq~1HO zaOqf>OLB>ZV2H-X{#T&?6^604ihLFX0A_t07Bf!$;NPEe zQf#Ab-i+)jN;E4ZzS}Qg@qH}mSCF4d>C&U8xy^*HJtx&LwWxf zp>ChWZQRywVt%LnB(JxE=rr1trwj0}Gk1HHKz>X;j0uhnO_dJa=|4u-fB&`hi%=N- zV~FIR3G}HX6nRBa;Ao+`c`mfyF)noYZkYc3?-g#Bi;fYc-Hw_x+|;$<BaZo`9(W55{jxdE7kt0^B1W=PGc=C>ukp- z*xK?F&z!tUP3U<26^DBRQ&(A6C`pobtzy-#HsLtbIn21sdi}&rFr}Ng`lO3G`AUR8 z4LZ<6lL3YQu;03Z%75IQS*E_9Zp(BN{?z4!BRztVG;9%@`{ z-1hufhV`p&;#-V)9)3NJTNX)+RP5J_E+AWv%ma3ZK3#=!`y(l_dWNuKOHj5M_Tb~M7mtq7Q@sjzZ%=tKNBWyS63b1kbwKV zHv`M)v9-3>NPcM_ad$rBI`;bx*8wDhOa=;9Q#0EGA7$%2B66PFRdFlrtUU@H_td$% zq(1e$cQX*XBVpPuxwg6r*nO~y0+(itYaNX zbqeNN^>n2>lT(~{b=ipzJoNcPx`C69R125=ntis+m*^vpW(jR_+&1iW;ceckkmA!472<@|KgeeKor&x^00IqJ6{_w>0v zZtq;c#z_+Ihs}O4S99;mrHr%$_v)^kf2EH~ZtdNSx!dawX~vjS)eFtP%s0L!t6pfc zqI){uG;fTOnO&Sr-8KmG?VG68&&Rq63w|y2nR!?<)Tp;EvI11qNGnThS6Y7eS@VO_ pI;YD6&O`GHy0r_|$L-&scLJQ@g5|dmAli7(bJ!8AF9UaK{sTafSq=aI diff --git a/dist/assets/_dist/Ships/orange_05.png b/dist/assets/_dist/Ships/orange_05.png deleted file mode 100644 index 5078ed0eeb6e7bfd309d67e278f079eaa8320b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2164 zcmaJ@X;c&E8lDnF#fu^!uILz!pcVpI2qdx?2*?(SAp&ASLNY)OBoihRlOVEHFnR!y z?TU)B*y75LrBt?awa6-5l%hhl3JoG<6$Meb6D#)qxZF82^L^iYp67YjAKyuDuYEe& zo3sG{&~bBRva!`t{jJc#{(c&BC$MEB>g3_&gwV{8Dhb&!j>ya)&dL!dB$$PPdLa|0d}@a^z^RxC@F z*a-?3xJDz8PqY_@7ahT)@$nA!psk#a2?!yS3(AF&A_-k?hySEY$M$No1s?naK_l$& ze+A{w@&=t?1OlxHWOJS+kqA<$1R}+XN+p_sBugU6!V-I_=0pnJib^M0gP$Kf<_+P8 z(%DRx&%Use9X=dI#dHe`nM_8IkqIyoWoNOj29J{kc5W_ z#Haukfoer=2rNbI@K~gOr63f4krhckmkBGFg`6w4AQCLqDJ=q7tp5)c3csKwC>#1a z-v22q;V8tA1sjsUQiO*!F4S1@4v#4i1Oh(Y$;FCHv1TwRG>RjU=xoEVVNe-F8p)DMrc$iP zR*PIF%##Ws5xU6b|IKw=lB*sCp&0Ybgb=|Ii0^{HLhw_{bivZG*et2{naf`~7TS_r z3oIB5bz}dl(TgT*deqx5V~ZWW3_c{nrX9h?y7Xw&UI5S>c4IO)^2ehAtZfj!w? z9P&M@h;6K-(gW^Z+KJcF{yve=ZxC0}y}LIZtUb9iQF)ww%6+3>07ckeARGmc++P+C{iB_@TsIxG ztA9=0ijUomYdRaq%`SSzg<)}?D<%%iJUykgwF0>@PduE|`n<81=I19Tl_w$a~j zojq2R8(E*9Uw)$^L-VxOR?@`Ok7nQ9TzlPdWUqA6-^GA7b$@kp%tpD?Bp){bKG`9S zFG@aVl>A28Tot1`8Jm9E*tbtfp7?g<30Jt}=H=9CH`C`AZy27D@ryGIDibpm!>=`( z{9s9Qht#EF3RmKr7O64Y`;KyevbyK_uOe_8$N9<_Gh193W?7?MK2VnCKL?cdWh1#c ziiAqv?%|7emtv=Lzm^k6TWiBKUn$<)4WwT-_6=&xCS5hzo+6vc92jA4jyL@54?7QX}6rlvcjoCoHAuUxtyb zyyH=teK#%JoV7}N1iV9ZgaOysuD=qGH->{FAv7yDgM{m8Ut5loS$Z9EOo7FSl zuU3^6NE}tlbVWlSA1{ z*WWCN(<=3usZu;RTHo=_W9z`S@YZ#2k4_vGjY;$#Z8T1RE2M$v|Cscw6h*P5_+Sae z#_j8jS|Nq}41DKgQ)uivPOFXMz1mTm@pf*!>ey93 zqu-ATb-$|dD(PukFK;TOfXsasKP#WVBSgUf=u z&K-%Ig8s}?IllZ5&5z4TYk65w=iXmCz4JvVIvRc1nE@aC7!zmN*6{{s$&%kEH+r diff --git a/dist/assets/_dist/Ships/orange_06.png b/dist/assets/_dist/Ships/orange_06.png deleted file mode 100644 index b578d59c8209cd2098b0fdb5f6070f7df6621845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2259 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 myr|_}S@rLP>7xWs8h`}471i00001b5ch_0Itp) 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 T4*Ym)00000NkvXXu0mjfg%9q9 diff --git a/dist/assets/_dist/Tiles/ground/dirt_with_grass_middle.png b/dist/assets/_dist/Tiles/ground/dirt_with_grass_middle.png deleted file mode 100644 index 26c6cfe0a8bc53cc1d1bbcfc2dc51144fa6efc1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10948 zcmV;#Dm&GQP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DDp^THK~!i%g?a~A zllR*969P#{NWus!gh0aHdv6c~1jXIDY8@T6wY9C?t?jYnZBK2hr>(8EwrU-90Rl1v z1lfC&ga9EBAd~EnL6Yz0_+EX_cfR*~U$0B9hxk1I=N`ZNcmM9(qUzt zvU2dFkDg7-&hGE(YG`P9at<8$!V5193=F`v)oPuboUE!EKX4!;E-vo={rfR7F+!oR zy}e`GwylGMgGotA@X6JyS2Hp)R#sLL6B9c+Iv5Pbg9i_ilauv&J)C*%+BKO>=IiUb zb?esZ>S`w^CtF)vINS#QCL|>6-@hL&;PqOq7M_7?cx7;K@bt7IFE0%*>&oA&A$~(vr8g_sq-;oM5q7AT;&$oUX1eEEWsKy!_5P8#iu* z_`*?BQ&ToJ>z2dG==~XCUS3`k6B8T`=h(4hB9VxhkU$|2AS5FrBbzqmT)cSkz%$QC zB@&%Zw|)P90tN%`7#kaNadCkoz{$WsCcFk>^W8V!`1$#Pd+;YDBm@Em7v90aUV(ub zX=%d6MS(zIXEZ{FlivE8tdr0@J>hXM0#4RwGy?;J`S}~*`ki;qz5DLV*{9BjIVi#l zH(xvdJ-o=I)#CAZcy?}X?uD0LT3%d?jg19o(C_apVzb%){{G^wCE-r@Pkw_%C2kZa~AUqJ! z^73-H&?*#uPd{fCFYq}W@CqJ*7b%82u(r1FEI8o4>v@Ka0Z{7c>G{q(zkJr-=C;a* z>|vIk&TMXOhQOtzr9l+991h%k`SN9WDf+El8zB5}2b@(^)hv}RfuWFM zGMNnV`~COd7Z(=+FmMCh4Gv5_UD zps_*?R1RR{`t|D&5l($o^wzE2)z$DgV56m_-P_v>4sUI3g`a)|o6DCjK?LD?%a)82 zTX#SI{6WC??Ck8CPS@Vv4uCmy=umWW@|{21$3{C!N=m?UlgR`T?CI&TaddQqXhF?E zq`&*_GYBWt2baq|ckZ%(Qd0le3RnPjW^Zo~j{Wh+y_}q!ANM+>>@AIsi27J%9d@w>wV&{y;JO-cfu0{Q1$*Q97LtCIT{nGtQhjKCTmqphjJx7!l;rqeoDJk&%(X!M=m-?XQ3O)9Ayxn0J$%0}6vYe%#GVeT)FUh`>L%8p8e0L>t( z+~BTDt8LAto*hN5qZ@p#3m@3|`2xd0X!a2HxZP;D@QO!SWI9*B_*6*x69U|{X%l1~ z0wz6Md|NNlJF(hPSut#rW>FTUwNoKv@KNwf^RvAyc-5QcIgTKJ9@J&oq>(o=# z)smH!7vHTuO1TeyF~X(~hJ3IVb>+&Hs;a7phzK5slecS^P9_5jfdi>j z>P&MD01}{?9p6T6>zq0#nZ*}ko}>X;+vi{8f$Qn z#$edk+N#IK1U#M=Wp$^xi*;gF$0Nu5By~-rP^(2!vIje-1~6HNWTmUYc0lf)N{Boe{l$ab*RH z3PUDySGej-zdO-}uk6DPyz@?TWhIoTot+)j0F6ooP(aXuD$(!lErJX{)yTl*@?n46hyUS1Gf=n~K$peqAd&`0v) z!o$NWD=YI~dE12r~(&0B{QQRS5>iO)AVvfLcC~Y5&y1!YDZ@M9rC4l{SCOM&Ih8{1r<=D|s)0^`Og}0! zr9YIfuC4;NLeo?z6k(B(Esq|dUnoq3_6}*q3VF^(6?h5C8Db9v+9_Om9HQ153~Ofd zt}Wl)pSxpXv%y@Cs3_nB4~j=1Jz{#G9r5)AhXq%gmt4)WHnUOw(Y(&K$o%3prU(DU zTWj8C@6b@7H3W?S(JhV)V*&!q2r@MIP)JgP^#E>^0}4kVSW#B+7P!vnYFv$C$dc$L z8`D~8cr|7byEBQysbW|Cjcl4!ciA2L~mc}B)dU-8NmSa3(v^0WTp#VB#q$G16)kml07;Fsq zpnzaP@Lv4hi5!JetCjWim~}d7U*GAp3-e6%dY>T>0DcM<%j)R~UICrUXJ^eAjEc)O zi9}`x2c<#T)88H!mf(muKHH7dJBYp(g{nK*1Uw#)1MLi=3@B2mr05?`9;PQIZY(Vo zaJhh5C=@smumx0b+I?vLgF9|TF>yYr^{@ObYHRT+_ftd360)D)@|_AjnK-Xogn&U) z8y_2s4Tx2fY=Jj8KrbMeU6YzDO+Zk}HC<$Ct{i2KD=w}V*1zxa{;lS(vhubFX1Iu} z%j)1DLZyNc{15~2aq~%4krth;o+2}R3~vPO zlmGnl<(Dp@W1Orl)zvBa`4T=KS_70O6ftmoO-=J_f3I)!W6ghX`_%3W6 zMz;rSw$!Sfphw`?{8)isfgYou zYO0?f9@b(oZL4i1S^Fw}`J&+9%bvjjbF2vzg>o$F*uYW`%F9bLK2C{=@d*kNG&In% zvXslqOC2315{bXa7e%|z#W|l-vNNLAmV#hzs)=IwwQ>~@_0hLdf-u=VRp7?=OL?)heEI*t?%*5Oq9!H zRs=C?wd-Z=;9y50jZKd!x!jPDc$raVb|j@|m(C046@30Urx#gW#WJWw9C3bT%G5W~ zk6ZpQ=Sw|JKd)5k>Ra+Q9+m-6wL((>Hy|~TO$a~8ho($C=<3&eUz_#Otp$6qt1FDl%LtvG7@3HW z35xl7ZujHl>{5DcEYGTjqI^E_1sy@RtWqEvjV*(*Iy3}GqxkrA^)@cDCskctIVpSh zxb9&QX0c>4H0;e@n{`H=mW)=b)8fbX3Z8wIBVapFsRpZc+O$NXl89vDigpEFL9`H6C>3IlK-)&?^~oCwmy~je zV#PHtYi52(Vuv6wsQlRFx-F)-esu>m?cvIR*xqb%u#+FZVwxVwKJ^`OWpR0V4*lin z6WtFVu6J*x637)q5zI|Mw`Zkw2sB!)oXwxKbH&mzbfPnnKQV0U>DkBcOG`+Tqb%Ek zw@q3^+MyvFlc}7W>$DDSci%4AfML2YDI|)>&vy9rpUd8ORiqYaCMFCx+$g7qE98U9 zawIr%6dW`L&6;9u&fAamcMr1*v$&!laFHI7?s4IVI7D?OLl^2i{*Pbj?;V>Db6K>} zXM|@I++K8?Qv-@3Nf-b;%sObw^2C9oN5g`GV2TG3cK`lRLP8*jq)SdSAf1qZ0vhzD z*u`#YcFHn7oxAD4$e&kuEsqd7jkCgeD*7p|%?h{;J=o66t435KmWefHP2XtmTK~Wg zpLCx&uxsPd!^_w;{m2Lq4l+3j3b8Qda4tUgO8I9P3dQPRRjE{sgAM8a8GYaUf+Tu$ z_H{aDq*4$HP~5`8_+)vtLuwFo65v+*%#^h+0qR6htT42|xQl)&IZ(8;1PTd$2c;Sm zspcT{A7{5oE@+4AMN9 z5xg)rW9Q9QAIRYj- zg+);wxesJA3^3qBcXu~>Z(0b9wjdv1$^`WfUF?+)J{ZNxzpOb^mi5x8VLsF=RAbS| zZII%$tysqTmlWRyeOu|?7gJKQ+}8)-#t?~f3v(Gcn^x2-pcCavCDsiGVs=h2r&ozI zk=XHTmy^=UhUGJw)zvgwnk>>*Gc)J6rDWjNbr`#$lm~Czu%Xe8Cm;Ws_jPN98^dRR8R%0R3`V#KKGRZbLcJ1BCrG1obM~`5xhduy|WIb9k z)^Im<*Dirdh5X0RJl*I(Br4f#IT}6NS#MdCX|ZT~nxheg()9Ox$HuTa>aA+6k?9)l z7(T#$OlB~kyew>XYHTT6$VED2w$U^oR-n1wJC|h)`+}f?5ByIr=h;X}IFmr2C*vd) z)rPrQdP>UK?z2zl9E8{#dU}Q;o&3`im-&32orE7w-sZLKxYXHw*$9&s5D_Q_XkX}1 zf&oIl?bxv(FE5}`_y^EJrsBfRv8vqIokk}su_Q$PO@lR>>KqsdciMS)7}RnEk6#vv zR!2ucVNNV@;KfQDR=%*{9pLX062P4pB|1AB2m}lTSwZ;o_Bq|zTs@nrhR*2PTItIw>B1H_RDS zD`a)@GS+no>dp#afuEpWZGe@*XvEeQ&=1!G1H4U}HZ_@>py_r?x}h1Lrk=Lh%nS(% zN%usf-4`?$5S*<6F`Sz}CoxM3FP*a9?B*o0`pk?Lsmb0%O3vQ;%`#uYSry$@(K zByaC<_wXgvlA>i?Z4YQhA$p3g#mFLdoq`aZX0+v$@IpdiXt*l&F=eM|vy@MX?|%Tln`cQ?5j?%R^GZ0wkbO{B$pgYpNSz& zU%x(?%LvTeJx-AWho+>Y0Nuj`21$mW>ka@JRaQ2IhX+DZAZ8H}5lkNDH^R)P12oOY zMWeTG3tWm`tVv&Ow5h3={|C!D6q|e16i# zfr~#rb@K0wfZ#Pd80O5-cb3)5G$wP!Vu5ZA{m3sod|_k+d{8$u8jJ=MnJm-@0Z|Ta z4qRKVduBL)nLji$G&?>L5Egc1njSu7`l91MS|&4rU_fy;H8p{n0_&j+*4G5^2aU#a zx!ld0H^WQ=0zE7&)Y;7qhJQAP?ORy5AYHhOTz=m1d62=7xIni+GswXoH=<9f|4DP4Q@EOxj}O{AATO*f=H!M zQN_nULFNVOg$3cGM;5()Y;25#kf4g@%F8dtU&Ohte?ts~1kWNG1LO*r2Ws`>)2HD& zF)iJgZ_^<1^V$w^+>5SF=-X=Vd@k#to<@0w?3G~^AbzkOQY^F|GTKKbq;oQHyB3Kp#QG$3YJVjrh zkx0D5y&f16qO`Sz__0R2tpk#RSC7pu%z}1w^z-Y#e?2xUpQqRMp$5){o|_@etQH5k zq;H7*v`a8H^}p-~nwz_qmiW*eeqZZWR}4|}6V+t$8lth%=}_pJ;b9_!;TRp>UwPdl zDr`o!pqrQ=B_(Nld#46E8Zg5b6MhxBi!e0Ln)wbwLP2nD$RrTPQb^)T-$+(0W%I~xj0q$$`O2kcjwjLfSn<4i|&igXy^XP zeqfFhJSv!5QBm>V><0h_Pxb?!efIv7{lLwUq~aEwFU}X}1;Jti0s~e3{TmOw1jsuR zaK^^ozUJz;S90&zbc38jY#5B9gKw&ahp!>m;8#dD2y(2iFL6tvyPsbi5@(Z0g3nch zgH$XP`RDctQK^1<{Nt@lpB@`M)?IZ^eWCI9%okE`#u zv)YyAttVb(6%`eM>HqJ3z=jkQ1mFSdAvGXiz!OkN`B^!KkL+eE*fa_a$R4^nVl*~% zH2`Y&)s_A6bQ?J#Vb9Bcn=ZVc5Sf6INa}z15^flt875+gV5_&AHz2SupiuP9eJf)1 zD#!xt;=;rI?EDZ0g9>v^N=k0#hOPVFh9MXOY`ZCB->(VKRvq8mc=?NCn}avoXbhk` z=#i1K@&|Dz4}-4m>+3sz{yfMBu(P|O;$(GmXJ_Zg2!DM)5EvNv*M0zgf;0kY{qYfU zXZK^VTmnwRV+%T+3xxtS1%vM+U8{=4LSh-5wgx@XJ}s*xDrMvJnnKyrqrltBdwO_7 z{jvG^uC}ftje$4zY2LJMd|cwO=0>A+cRbpXx}$Tl)7it>HzGQTn)E@y={`4} z=-qmQzpZszEDt2)7VKdu7T=71J8D*We~tHnDe8aP4-5_tLQj6OAAra`*$?DP9WE|6 z;OX>*%F2bwNrXg-Nk{;-tQQIi6bjDGO+P(t6^k_z$+TENq&w%*bH|NBpqH}T!^B|U zu8Tj7)ZgE@|L{y*)!f)Hjz%+F9a|xLM!?}J1lb%+z`9PR+*nFVHU^EixbYs_&;UdSHOU;PRSoL*QS2l_Dsw#EUtGiBP z+%YrFbwJi)i_xgnA~rS>ynLR;az5V&HT`e<0kFZ>*LQtC0H*W#d=R8|TJ6)XzB<^} z21)~B`GI+zOy5xlr4xMH{N;i(O<~V%W)hey#+As3$S3=Oi^CV)Vq>)q*3yD!s;-FYC3gYBs ze%RlM<{kDu!gX0uUh8FS$#^&L!-m(tP(~2{QSXuz7y(TQstfFa@IBcNz>xW$`vI^X zK!5LEZuJWnUj8Tk^yov<`8 z@YjA|zNIB^`(BI_arst-Z$^6MQ03hGthg&%Kol(b%1?TSm_<5bCtK)y#4`gO$I+Y!oYprZ+8;Ok# z%g@gT+p4Ns|L&B29T{MEH7=S=0?#GT!@89fkemtx$Z!oVR>k5c`vIw1$}2CoLVvZh zlj?K?XJ;cGKYQht$=ltys+n6_%*xE?O><;->-n>jW3t)tss8Uy-oJhBO=3wb!gJcEy$RxdjE#y#AN{0H`jxTnK#t#0JpT z-n~1zJ31fl3pUx?BXe_({{D1#`oaRw+QNV4==($L4g|Q>)z#A3&24R=#6_)9C}e+s zzsN|XQu%Z2&-Z`&I_%9oR9C8rW8{z!2-&t7mLd#@c?olP~gV@cRyeQ!3Mzy zEv^5|2iVyWC=^#$SHKwvq~2ckKL6eg`T2<14CP;iRB=DeMm-a}*wy8Passl-{_Sn% z@uxvAJsx}f+m}PAfPmcWji|#3+Qw!Ui-l5Q&%Cnh(XT&wP&@#^Q#WozghzyhgdubC zXh!tp$G%z`tN)1Z|GA!NrRNB)Az?jy|&xmPh&^K!Ynb6v|Y}s=3=us$K zFawbMga+kOC|DW#ou>-^se+pSbw7}llmyMo#>VuvF7)_bGrz7`@_5)L-aFVanBe2G ztkX^Pw0;$J{vSjCNcB#gnjJD=u}$ih9Vt(15RKk!REtH{@s;2gw@GpO*wWIjtCxS- zc(1bdg2uyv;6PZVI*XK|?5Fome{=1QW7jH-{6mwNa0Vd6fHLs-ymgImrKiPic8$-! z7In;pOa}a{hq%8V!vC-Pf!f+`^zqH<%+%D4rKNZj3YZbxg&KIW9{_dT*w}cUDyTP< zxpYY@Tbcw61i}E6r8JxWtUZmkx5s!9Mb|q>>EWt}4@cSEE4HY!!Dk03a}jx2TB8=G z{`t{SC~j4#MdgWCG_?pjd#-PPT&i5_byx4oJ29dfai`N&N}1$ZyTKv{tqP5n_51JQ z=d$9Ga%Nbg%)5NZ9^l?LIM|@o!YuKx`+F=*!T2h9XMjkzs7sZsQ4>`XrGKd^7#K1kwU`vE*2)85_= zHTTEWj;QR=p~1oT_aHbgFQGu-%Va(fKZpvBa`6xRzUHIc;;mlpUh~353WK2)3aunU zY+?q@lcvdDr&GYsce82zZl3{x4oO2NfTPG(17OT5_r87F3?&s(CqyYY}{Q#m?Ljgeh{MY@! z&hKvoiP2${3|GnX)brXz1v8#W+oSX-0pUbzPvItyvI9+_5Q|y&t}5m7g#7%G*%2t71-$@@xVpMJIXStvw-CC_%r0~dzdTV(P7Nhp>aB8IxVEGD z+UT#?;6MuuJx=7A{pGCHR+JBwL1h4>QYUE z=qBd@94TV~{(kk=98O_Grkle{zmz@&A0gxUgaZq_{ zj*d1em3LNF$7kPQG8s8R1rw89GQ@1_XiM<*?YsWFsJ}nFpa5RvHl?E0@<2`8IrHh! zKOXQO*MEBS*ohOzpb2 z+TucVN%l-8(Md+UJ+vXi-Pxsu-m&T4+yh6K#mjy)Kc!X~l#y|&oqA#PMz8IG#K%gY zEYM>Ti9|it3!Gk7R`lS(1L(P~M$M*81(1aQWj}zmS_uR~S{&p1@2_}yQMg?0i!UBJ zf9~9&ci+XfO`XJ~{uZE=G&kEanHB`mEi8D21p3rWCd9}4`v+Vx4O-ReLBpJJV!|5X zzNAu0Y~y4Z+92^ ztTPH23UfKsA!GoE5vmb>1@Zx^1O-}A(WH?J4<9}ZE=5O2qgX$^38f7lgLCiz%*4>n zAcKG?up338AmJH*99{npq>z1h0FHoz;G$&fRv4Oq6QFMZ7G?4kD7&58cfhCsS{D>A z%-QfKOmm52ks=n$x~nD=$>0CS$REY8A1T~! zM{jJ~whaISoePQ(!VITnY}l|oKhNj!;1lo-s0Au`{d=MRc0T}#gTUXvf8WMnkPmgi z0NT^j0|O{b4shrC7kV}}Q!Ey^3eH2ThbAak5I8wHfiefJ0(VwbRe=TLA+AB4=4^8i=jEdHPkd5 z{p`yxlkDxUU%w7*96$*N!G~}UBm}wyJO$1Gc1K3I$;ok9d3hE* zT6;#X#p@6DJ}&ug_`z-D+^V9DITXiWcRIuZ$QsTBi^0}?@4YuWv|hMy__}5e3xhC2 z4*@9-M#F(jCKDpazVIdcXY$Gv+kCr`c%jqHaX?&jyGfS5aW z>=*<_w6FjvF4(%Y^3EM-6p%*{gK^2p9giPFg+Y~^6+rEaG^XR%$GzY0+!%4 zpu-OQTJy^XuYvpq5CZ(b2u};V!307BVgyft=Kwaa3`#LAJRFb%BMXowydCU@7s1W& zMnDH>v-q+yPXYmg4mYoVJG~>G3Esi zi|@bB@bG|YfndR;0ki>(2QdbJz$U;6*Z^G!unL7lpwY&9d&|noz(lwKJb|JDoC9@2 m2y8SONCm_iG7udd{eJ+1r9q}>ox=eD000000001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DEiy?&K~!i%Wtn$$ zQ)jyFx3tx*YD<=6xkz%Ai`*+N*kB9<6KWbsCL|&znMtOlObY2h z2!!4V7+i3-TgdMmX#%;B$-Uk7vw`O&)UdHE4>w6Sm?Wb*ACfHOG>p- zjY6RqB_%Y7=61WG$|A@Vy!@~K+}ykwJnK&CPSR}tZu5EYP`IUqDiT5K>(F`S%K7tP z0W(W8Z|A%XP6LI0@YetB2gjdcg9SXA_UN#6xVf@cvq%hJn;6ry@@2J-nZ zTyFRFr(_m2GC7si(qOaMm`tX1aWNw=4^*YBpiJwwc@d-}r^M(m`ux7&T?Lf%&bZ|} zy7yZtSiM8vynF8()HhD7p77tiXJg^Av$J=K_q+0mzC=PZGDzU@G*(S4E$y1+dP{x_ zM20H(6%W-Pwm0HDPN(bC2)-tN0kcrUt(iXg@fSU}zP|l?_v)%Ak?;fpaM~-y#t$#u zwcl*n`q1>!bZ5^2Hk<8>`ZoL29x#uOr+7@WULP476E$yn_x_*vHt(}! zz|PyZ!|CZXHf>>YgjZ6Mpwrtc+f6PLnL+_wFgtnAZZvA_#_XJIol{p*SC=Z~IWFJy zGpH@R77G{t>fIO4zPdccR6l5VhXX$P$sc7|z7(CVdiOh2c@Ca}4@3g<-+y1(vc;OT zf<3ZWEXc-s`L=DVr%!XMsw`hlLF5pgmj&7}t*qDzT4npg>mfg~u#jRfmcIE?TIF>H z0$`#N^0f$y$;-`6a5$?!`I^#GO6HI=>6!Xu3^AE1OPZajKr|Zl-tIG}p?xM3Ju?&Z zWD{s6uZ&%0a2uj(bBIU1HHS*NIx68x2hAb>+lj7E{#XBMzt88h1#SDv_jz+jGjmg?o6j7Re1sniHB zL0?DSW^2-k&CCSvbl~wx=s)hOQBq>9A*Snw+ZWYS@>~ zPG5IgAPfZIaGq!w>} z<9Ysc2iGbLFDy7m=U`}WS{#F!nYvqF+?J8Uai9{>sp&m?UbbXlG*6$Q?&WTP#yTaj!(OB2m&S7#~WWp})E~#4zHSmB(;qvnGI$B`pX-;uP1&Tu>yA7Lr^pXidb89{|Ux{7vg7)R}jiaOF!b1P(XkJ$r=oyVegScF&jSXy5o|let zI-NnE4<#a})K-MYYTvX~AMm8KRwx>T2!!C`Vv5Cb+HA%A5+eq|kjbBkKf8jA08dIU z<}EMJBp^t@6KrmJd=X<`y>|s7k!EGXfs6zwIe1onem;%E@dP}p@>L856Ql(3+L?^Py+saGcQIo(JV!nK<{h=WAjHYE~LgnQ@to-n9?z`n><((~C)3{v9o~=Nd_z<7R=cC*xNFLs@Yd;E) zk1Z?|iA0w_`dyv4F5vh7&i1<#Ehpij4Fp0^FzlB|?)F_BcZ@&VdIUU9J! zKp;S&P}ab2ejW^A zzj%jIP=HviP*c_`fw_9F-mz`0$G{Bf^%y1-Xv^f>sJN<12`LpCSu7Pld+RUO zf~fTq$$C+Ik9bdO*&fOL(-{>NhJ}UJl5Nui=Tpffp3e{1Z1eXo-Gk>*MVy4o)!N;w zrMYDPd1l{BKQ-ZzuuO(PkVCIuUbs)KsybM5(3J^!XJ)WMVQGG8kc10|LYlGR>b9-g zl|?j*^_ciEVr{|P${af<$LloGN=sd%qlLY_W~EXWHk%d~(K@Zx1s+q?iq;cR2m%30 zq0>!L>3UxuY*xnguymQJVJbmDd2#k)Z1q-ZG=3<3}Y|DKsW^VDPi zkmdA{bkQ^9{o}T2$#0klXI$T|AW$ObxoAz$6*p3m4*IqewV8`JH zPRi%QP+J(z%%ZP`?S)cn#RU#bhgYS3pwqH z6~zLb| z>4yAVn0|InDcFXi#5h)zLK(e&i_qtE|rW$cFp z9#5oFl^SJd&pwOOBKzd{N^o7nH5Sv074jJ@hr{J^0p;>?dD=Dkef7O3x{pi^Uz?r1 z-P*lNrCm#I7?x)Hn_fApo|^K-<3;SEnY9_fS5YKP;&O%c_1~+$52#d0rLtlB?szJ0 z{^y9kI3W}YVf0pXibhNZV=LuB%`D`rB8RE<3+n`~3Eg-g$39HH|0~ z{&;+oxNFI=WHzXw0ZTAFVVjwOB-#xQ1Z8Aoa5%=hcVh@*j`$kIjpfZfigV{U&9zd! z6vyS(l-5j~`4)h!3zbAX9&t;HDQL=dD_07f6>Q$(UD0gI>8pXqwz&gz{T z10ST)a9|4KvUToryCxJ9D36C+R~KDda}ZNV3JF9a|f;81MuTGCYS#)IBJ`MG03ifvFD|+nKlfQfK@OdZ3 zX$@Ol!C*JPTNl(7fu=M3;hV*1@c`XD(5qt!|%hAJs6l4f|7~jUo z2#%ZSQZ9Q^DY)qUoz22#`RJX9(@C$+1H04P@-(Nq%;Ye&K73$lVmL84x8tY(OUw~l zh_Ov2n_}2lcD7JAGF05y=$c;jPzb{3+g&Ep_|=d9)pPmk+-Ir#esvY{K2j4YY*7%ED(AK1Pm4%zCVHG=VWDNfoyeZ z;IAo81~`Ny5qCHYTqp|AKqy33R?4c|f=n2&@adl{Uv{6xHPi%$hwGbmZ-h32W+g6eB$@>@-f5JzUuDY1fLr%VgU_BE43?g1C{mL@R@l1$|7ZJ ztNGI_eoQ1IH`f}lR&{opTsH5OKDBH{5p~N~Bydhn%3|5F@A0AYr(#56s(@#9nj;Pe zL?-9)`IfKm(CUgXdD%XzH4Z`dJohSETKtKG`Nb>vo_yEpsz5B(4G$wA?7BWqi}GBb>TP_;JG z-SJokH^UJQ@LQUkH)j=@!MAvCZ7qGY-`QWVYcrM0T|ah~S|eJRp4i;BRi|8h;GjEBV!2goruz-BB~*wYN407$!UVF6HQ$YS2`dO@)% z&$ij`+yNpE7DLI-4t+Zef~X@BmW8!Z1X)|2d9vdL5|iYsrW#IN;I!8Q>W%~3P9`yQ zI+M#xp;G3R6*&K`b~u}Cjsu&}6I%0aP8*=85uP&^|_CA&!6pNY~obp`02gXJ`BG-4nF5@(4VcLejBmyTj)Y zW(XH0BQ%i+E8r7za}l2pB$(q3$EP_4puZp@0~AQI@emFRlnS4fg(s7vU{yjoi1VOz zQGy&m-JlA=xj85;EjGT8-_fqy(D~Qb;iWoFDTps2pJ;FQ{Kv;)95#c&V9{9afIB!c zgD)0_=jT%pw6FU4Pk#3zd0$5qk58*AG{1S}kvHG;6cT*5=Y3~oCY?mExhh$@-YW25UuAF}FmyC9C*lhL{$4qt;0At`yfYLJa z@(y$yab=)rG#bcsR0c!#^>KVbJ~&!YR1r(Y0GyU|b|y)rFgl^tsv7EBoiGH`-mC@w zdX#bW(%L0(c3^zmcp)Tzh1T& z)NSuM5J^T@X)GILQyP^_26Mf?FH9oozq~-KEDEo!`5-7}Hmf9~T@OE=f>LHw4B)&_ zEKVnDiYnh_K9wOE<_~St=80U=U~C_+CKf_C3b!N>Z~M3C>$H_cR3sxnVBF2i&!Fs zO~GYyP4lzVf&w7nmf6`0nlpba`-hof9{=u}`Yk)w-Z|ypK^u?`fR%tC;m@HWHru_( z=%&^!CaX!gFyH4LN*D}mu^60i&w8&{(5s|{0PP|3a{Kr^raBMIH=&+ybvWd!(*sSsIPz*w}DcEG!<6OeGTuL~qFJn4JxT!<(yiS@B3{X~|ztQdw2$MMcXuuL+*& zoxSk=)}BY$Y&JEG>hL&0{sK|h83}@?b{#wfvTTTivkeVB*7J%Z<>)*25lturOJ&wo zVT$r}Z=bW~V%%XLAXI^X zN~MB<2Ej6e&4kl_QiRFM0#X1Z)}Yse_XfEe8JYCbC=QRKHLDdOK^oZ-WVf$)^n02f zSws2!h`%bgDwC3#UY@Vl>mwSCn}S`vbF02;Yc;nTQizULGBpigH->;`*cY zf4n>J5rV^+;@0wva#C>)hM()bJ)~zOgHow~M3UKF1A^?1g5Bo0*)5kh?CAAj&~xv6 znrPyR$>OE+-{JCeK_0jJ4I46<8~U+PVQVW`Qdwcm z!r7Bbt-Q3c(W22Hp%9ux0?wnletlQZVVQG1#b(<_M^|&L|1ACRhupciR_pY5=$V-d z*DsffTg)CyZc&l!#EI?A&vlWyevq7ko%@I&M@OSk$6I|{pLj+IIpe5!YeB1x28%?Z z+WOv=#W4(-TwYY}fT2UeLpP@`g7}YZ6T}P#XFLwk(Dj0P5R{5{cQm%`Q#sYCvu;gj zKDVYOhy>UA`pTPHi$o1ZOx*s}jm)-cF;<+cV3mm*CC9!%aam{*Icm4@MWXVS&04qC zsnI}yF{LI)(0R#l`Jwi`AtKi2wAI$Ow26DIkQIRA^10Kgf#}To)w`)QPL?fYRow( zOPMqd9A+nfSO4jMmb7$uVjiBLWP|Gi>A6}|O()S?#k~lGOh_j>%Q}@`4w`k6Y1MsE z-KII|Tusl;ijsPmigm55SVl&+wEU=(*ttva$arEQCCp0a^F#CVP6`YRIDx^~UG{n1 zJO+#5F?fHf`{EMz3Zz3g4|gtKz5x3UP*-J(qp9)TJ73UY0>Il4@Zw`*0ga|$)28XM zQKeH2rpf)?78XR93@FhYmqL#?n5W~{`t+^`t^IN z8?jo7$!2PuYeW37omo{(DqT&Vk$mgR|EnV8n}y$?53{ zEH-E~+9JNc<^OFoI_}WvQo}m<@VWQr-#bQVtpF3|4224tnx;;l=-&Sn9*5WZ9bo%< zYIo1druhPaQ>Dr(C}=8Zj^?wJ$G$}ga~O2S^ocLXHTlwop%e;bHJe2}J*ul$BPdkV z<6&^QU^0q*nvD!Q=&*7jD`TQ5!=>E3cc zed#_F^-X(Mu_B6DK$uvBV65dX{!es_aFAlO;CZ&@*Eot_2|i^yb@ z%F0E_&=b2}=Ck-o9)ltjoLfJao}P}c5r!0s@|`FIzU+qdu4EY2S5Id?^WB{86e zC`kbHmLKl?pNgtfI4<{&>(0K~{fFQ~cd}RC?mgZ&cQQ=H+ppe0)-~D9jUP;Yu%mRx zI@;gK>2zUS&e_?ngHO3>X^Z;Bgv|zj{NB|!R^N!Os0!LUkWAA07iXCbm43)CU?)|SF?Fy zvBT{yC@ONuWEZ~r(>HIWv%96cWjAYL(u*+1S}ry}MWO z-bqYd9zaYGR>u}@ps3U$k!Z5-7Rb;r4p7%V!tScwNkO{NXk_N)VG5Wb7*1!ir{|`1 zb{&RctfRDvoLqVOnyF50D~@3&qZMuy94TeSF~mZ<}NX&M~7jh6IQ z_A)b>HaHPOp)P;?tDp9~d)0N}9%@FtIE$cA{Kq$4Kl_g;3T4B24p+UPVIs?mvs*fP zKt<_fdR|54dMvUfZ_E73z=qXi2-}3a+ZETZQws|LbfH2a!E$xq+63|h^3`@rl)~%*05_Z zX&48bLc(FM!7#D(1NwhfbVa&CN=sAw)!iKjYYLikIk_*AUc9n;VpI37Y*BfTLTo;K zQ1->~L>@P+R3au5OnjpvZZcJh+Z8%#YDF4MXC%B{TOg1NqBj~HvD<;ziHjQg?p?r= z$pN4?E>|!f$J1yaYXdsJZo7V{<0!d0Z|LjK$$5F;jr$i>!xbzC}5W|P-2YwLDX z0*79`eKQyiJ7WP%5r4OMw?7l-$Kl|3qnA`svDAMJ(2Lh>0&|TO3gb2#xYq-f_^(f* zOOpFf?|g-q&f`^!wMZcK{StF)B|vl6ojdirAHF6L|aX7Vk zb$*n;w5D07QfMZ}QW+UwZS=A-zs0hxY?m_b2!1ml-n+vN#bZQwWNP)_6$Oe!FE0yD z&qQ(9!16Lgr#szlF;DErMs!!MeEXcl!S}C8CZcn5OCi%^m4^g50vPw3`sTXk^a7#T zY>t{tC@weQaBwOr0NyoJHbkgt&e2hb!B{j)R~JXhi|g04s}LpP9+G4>R{I4oy&+#5cYURWr(_Fe7fZQ4jsf|~th z`Y(r}nULKMrKisrW>@>Kz@(oPrO>IB>({^Pz9>o8_~dfviZMX(1Dq;JFA-1#D+@!I zygYGbC9j}BvMQ+%S6OuHncW=@vl*a#)ME|~OD)u-N2OX!SG_BEH?W1SzI=K|%kx9? zw^A5PG!YHOL$A|bzbgMOHRmQYm0%fIB}!@B&?QNv`~s0;pf9?zvK%tK@bIq%*@D;E zuU|$D*n%D}%d7w6!1kX!$0;itJbnzU99X!CZ7O0GDdxv1`T4DlZMw-ZIGU&F=sC3J zGF*7~*WWzZH=VJDYRpEA#=z2&6mhf(J3;~y@PDB|2qM2#A`#Uzk#o3yzyH(f&%zmD zwObBxh&feNKEK~HG2yAh4}9{^R5I=q5ZuT65pEig1iM0^6S)3Z`_Ujz8Je1Uy7}if zS8t;6_>zhWAwjqnwZ%OiP|?}{s^~pGK@OQi=U9m-BpTh;v_HM8 zLO*(+4T6E+Z@zIm*h)9s&B&6R(pI9~~Ru`deZ7iVAJ^^aTL z{bq+ z?YKQRbi<=otCTDIJAaf`!d9`H^MlcvmC8DYg&F0NL+WC=~ z$)Ip<1QT&UkpHeIjYG>5<`ZG!v$$t3+ONwL(^L+}J+|U1A~x}xq@InRSN&p^W<|bR zh>?P+|5^hKJ%lB0t~&eY*Eb(|(n%pAAl=8~;7I_#KrYxS*ow}?ScYaIS_Cb_fnnHSFn|~i#9(=1psjto zOeK4=<;i3o)wa0UAl@dM8i7jksoB|2mOOd$#^?X8sKIQIe|%yIc1UTm56X|tQRUzr z5MH|1Zs!VfwCk!t#jTe%y{0S-MsT>;>Z-7z0q#6=^tasKUZKyZ@7zT6dVn{*E&CP~ zvxwgxIWflFUB4_}#*6ZOZufTnjydbxOnk<7X@1MA&l{n5@S}m^$G0vVKi>B6L6uVG zLkGI5dqic8k_#tX^Yc+A6G+N~Kh374sTL$4D=seGr}21uYM(jv)tk?}@()eK21kGb8TqHR@e>u@kRC;^Ci-QRz>_%N1@RrlWp*V+R>~K#9@F=$?u_yqZdtd=awQn02LC0{+1V;}LVBjtL5514>FJPppqV)$+{q^yleY z$}heA%X3G^{aw__6CY7GZ5{`ew#3n&)BPz0B_}6Q%nAg9SS%I{cjWZ_EiWG#nH~Yb z6)wqx8NaHDV=&I^xAc@`T}`uoay-AI19b5G)5oORy9-fcTft^00}>aD9b`P%@xa$( zsnX0yJW^9pGd^`cWi&?4%Cdry~$_dHrH%$2J|!<-0LV?G)*wLB;Y+dsnv+e(?D- z91asnBtD=2m%P7RH(!s%UE02TX`@lm@M2 zGP#yhOP~<+$q=O150Io~Wo3_h{f<|Gnnj6~( zFP#A>g(>FCf4G(e^+m`$A_uK#l9PN zL*@+wItse9w4ni{ZSK~3{ol{SsYWj~Ki>;^fjud%UdpMfS+^RKa`^~Nx~*Zi)N2Gc zvPmRhrp+!#y|{i|EraBGsES7*5R%DcadGk3>C=#O4Pi4W6iPgiXwGlGKYypWtILy1 zjt&_ie9(p<1^Gpqb&d18fdfyzHa|Z&_t`gLeg**b!u&!Gn?n*6fyEpCabcYryRg0Q z%$>IYv2WY7D@lM_DmSZ)>a>iElAbO2++3f}ha;2!CH&VXmwr)N+oIFVz|czt$Xk=l z{gvQ_JoEFI{5&d+=ANE`^Kui!L>NK3>bkVb<&@Kzuvm81JdG>l==E~Iu^=TY`}%fQ zKCOT(Q3fqOGlS;w+AG=zmj*M~Z0Xoocl&N{J~61*^Qx-24DQeQ|1p-cK0SH6dFM_q zm+bv(pJQ&ppF=BWl`p6kz}>8X=ZDwN(Z-V)3^XUjR`5+G6M{mR+1X%TF&K<`dOD_3 zVK|(N#*15f4uGU(L?vMAFRG$7ROi*cO}idR39{DSK2`I`Ztd6zfzXmmo2Lr&J5oI}kOwzT?%RB(C1=Y!ys z?acVUzfFM#mK{G1sJ^DARV`hNo6QNMQMEYj#6Zn8&2Y}|nt6G7HoM6RMQnX{*-z}$ zZRlb&YHC>u^YZ{FLM0`am%n-NNjX0^xUrE|oDrd=86=XDx;oqV_`2UqWHNC)UO=HZ z{lwVmyKg_%{bPw*@^Qt-cZ2ucfIDVqy;D+m$nC`>fvo~Dd9&mXZ>+olDq7jlXuL3m zt>RzUxKNT?0xAl|BQQ6YE*69Nj>3L!Tbpxgs=TRP7e`#*4cVAz;PGTWzo~n7h)Q%D zjn1GCPXD>Mlv%29>Jgi*U|V-LTI4363ii-h1 zIgCbNjTBI38ZCuJgGJVKcbfx&!N6ceTieaSi=v8(HQZWRdYL2TY43T$%EaKAOb{u7 z&bZy~KvqD0>)NL6yN|+0FK?WP+wK3iqQ|O^O*7O$H|s0vE5z+!Qe){9tzJu^(IVWm z$hpy;=bi&IGd?#C=FLAmoZsFKyRueNg;}0JAVnZJhK3UP8PhXU`wza%67jVLZFP3F z2^E$rWe@&7g&@TA^uyxAQokaK!+{9~y|KMwyL5GOV}3rR*N3%QV=M-(uUi%ut82US z6Z!X+uBoSnx;F1;uo(KqIc9M&i^U=n$qsZ%@#mA_9U1O442I2);c(CP{$_G@;9l@P zFdQImiZkEJXGd&!^pA>vv=&|iBmP0dzXpi2vdLlX)Yv1teq6{XT=ePeGcz#l@7s)* zFLxe%5=7M)gYiJx%x39^oJ2_jx&)CPeEF)as0&7dT%pkP{pAB~ua4M9kj2GaJDx$2 zQ4};qe*ZS5rKz^(p^ZcgGMn+m#l)N(txd~g^3*{+2cVu+3rr(Hr-O+qEh=R}ER9{0 z6mb>(w>q}&1r>FMd=kAR>GKs-RLIt3ja7}#G(t2UN5*Ft$00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DD+@_PK~!i%Em?P5 z)92UC0zyJUAV3%iBkYX=0_^(>u+1Du+i}9zTr-yE3MIw?G zx-3Y1aGXRU1+Q4AP|CBH{6SpI(bChO7ZqPSP%EgaB8bI=-abk@+3)x!Dw&#BmPe=2 z22>z}06=n>NxnU!C%o{Q9AN4k896yQX<%UR<@0CR z$SC1s6`7|?m9yq=*^!ifm87G?GqY&lnM~g0NNyC$7zDbxWq9!7tePx+J-xQ_3PN=w ziEm1tT4^xc->>fMB%5>ha(~DXWlwjRJ|vqo=kcO=QHk&V*%bA&k&|t4eR1=%r{0G) zGWq7=_6wB+6`4*R7!jFTTaR>gvci4#n;bZoaa`WisA+1-a&lAF99yrP8YZyy$!wZu^x`pnikFdh{bVbX z#S-RxWJY;h4!--m{wCYUM}xsI)ibHC`Xuh@ArRC=t})%hf~;6+pe7P&R#vh0i|;hu z?r&-A{#2mNgwVEOIQ+kN#l2Gc!*9Yfj%S|@Wqhkd(aN?T@VU|7^pIGmlwu;C9?S2MhQ=DN-6 z)sk{~ytcOHXU~4tj|o>ZS<(JW#M*L(E;GV3B6BEHCX)`fwo=sZ`UzKq-|H8X9C23Xxecn@lECC=``UB}#v%X3+>FQf&PGY(e&jQ0V64 zQ~va6^x{1eG-+*H)il0W*F+ajlbcb*h=w#BA0MScG11aWsOuz{Fo|^%l0TQ_=se4D*2kLn1Bq`593t7s$T@OBYiApQ zKp+~{&nFUzgBclW4Gj{JykO-I-NbG)x_R>ZMAYQ)x z_lHFf=?pqv)@3jzrBdW?ZpLkDX;G_Hqs=X9VUN$Z-?lcjPEJjXzROgr)ri$+;o|xh zfxfaLCsxv+=W+iNjz!3u*F`Pu~~r9~4Tb1AxP`{?;y zx%t1xKG|FO-B@`ArElD4)0VQT!ev40`V@VI^@X-pwq)L6->&p@wS`6CqU9DIo-7($ zS5q$~^RYHtUrSG~Uo^mAGT)`$Rn#^vUG;NqXQ`$=N1Lv#r>93ytGhmYn5d{T@NjMG zXrJcfAxL|z8X6+dXjC&ZNV)q`3OjDL=?pK0HqDN0&(vd-KD?*u?j`6klxG>o&TuU2>|k zn@daBTy9fY+0^Hf0SbY}W7aA90~f{`v5lHLn`@dYOCDbq*VYk?jS0<71P+_5Uc+Iy zI0epGl=Z{uWAS&>I^GWU^%8Q*9G1s!b=#Mi^goNxP&vmy%bl;I%P{xxC~GQjYiv@D zOVo0yLNYcYXz0?JEGT@fY!;HJB)w@KBwJ2zZ?7B*W9W2^3Ke5xY6hi!xNW$olphh+ z*wn-}Fp#RHW?Ck%9{uXRWnFJuGe6Lur)Bo^^3N&`ho-NO2d30&^BF$=wn0fnNh-N) za75HM*f%vkE-5TDjhye{7b%fTh=SqB*=xvza1|99XJ!2F+b72>k4l;Z)?Qws7Zt9{ zBQ?pIC2t>4_?Cu7Mgv2GLDqqVkFI*pp5OZMJz;E&sG$+DVk6IGTBV>;m0Lw}q1VqV}pPRZkB^Lo;&qt~Z6R z)#717XP0;6`bJUXN%vEaRgb^aejyOm;{JXu;oy~(?^21WL(0M8s!yXOCB*Rw-S9A_ zTt1fhkz&Kwv9`A1T9+5+YG~7E&xm|;?zq?1%?>n&M!BFM?G3z$$z+n9PDIoW*EY2_ z_l@+m^|tki`X{Ta)iWFiTAEcHqj?)QZq?r|=8fO4zh6IEUyyNM(JnId_Z%G^8^2xb zIyYoHpDTar;LPOEt-lo>nRCjib!wGGjIw_s$@1IQ$ z^iMT66DB7$EzG4nWv(EnCjXgq;_<)DbYD9Dx`u&S#GQ6&h--t8C6@CW5FFK zPxjIKvdgkZyE`Ofqsp3QqMP;NnQNFvOsBA*N4vJAYU)d=#r!ClR7M$Aaxvo*Uub!!T z`y(u8_fGa&5v^L=S_x#bp^+hhLebUHms1tp!ftU^rc#$VR$fk-QqQ%S3)|@%=yPyz zVCph!3koG?vX?CWzOt$kT?{?GqpnVEX)#P3HgRyk=q4E(lVoSR&x!im>gmKhf8=jAUVsWiAIO`_(}&Q236tD3?>VOyKJSb*kl?(AIs=#CcOO4#0x zo^8x#8yc8amJ~?UYH?>LfyZNW3=5|UhlhvZIqhw2#GxTxP>?R$pkTv!n_aO{HuF_h zOb2HV3wx*e)8h?!#=~;a^S0-T&Mx-_F}-3jwN$ig*_r!Q_leU+HwyMWGC43;G&UOQ z9GaYQkF2Zf;N-+(^3pS3s^v1Gt}cy6lXQ2h6bi?gGck9xG&V(fFK8GQRKHA~w_=Bx zhS{}C+sV_X^LRXPV^lms(bV8uTGgC;4)ee-?{H9x$qs^R>?e-P1JG{2=%sk;{|~4FgqG%|ks_&Q2J0=uD=DhQ|2d zAYpLO-7j=#WXOoaK{GD@n5C}o3Z1q3=0DqsbXsuKqTYetzWjW7OS5cfhy?1p@Ib9m zl>5sd-OE+bAqLd}@U#iZ@tlL3N4*wmyh73fBX*ALcB z)Cd@X{uy36Ay!?<<+4a&0cp$1hT>L-Aa; zkVd81Ie52pH@CfiPhv8ON~On=<@RCzhQ?-Js!HSyjW{Zi>}<8%&HMuvY+-Fl5G+oBVD9VAUb<&r?E%T{ zETgSaePw0p_g#!Fp(FzNXUCr{H7(=L^Ho|}x_*9R#UxxeL~=7F+p5EUav>fYwB$3>+3V&m@GA4`bqssDw`~R z@PO&%WoBm9)Yz!#>+^|>vLIRHwB@L$6vCZvXv>ZNPI#NDP9@(8UU=AUQA4DCN2pns zpGA`m=UM8_@Fwc$t2g5bfnEJQ_RGT}qYn#QsV5(8QRp(%#Ie6Z?>2CH>=uOBa_tQC z4catY|J)R(^0%EGv(DJWq_zBWWMsT6*HuB0XRZ9*eq$ul$B}AgGN?B+q=5g+DCV>? zE1&lp4VsZmZ|&XM%ObUAz8hC4g9F1|=uVgZ+1%dV+Fe|%;o<_Cd6{`u*L)%}nRJHE z=f=;&gM(wa*~CRIB$A@rTJoXb9hvqzK8-KQOuE%lQ%>d^H;uIoHaEVtoN_G~Nq3U% zd#HTXmZu8j^pOTyo@A)%g;#gwZ#^=jpDOoo@P51H7&p=f1Bh5pVPs?Tz0uyY->uRN z^YZ2TCKV^OK78zUG-0jYS~G@O#Xxy=Nuef#ArlBZqZf5+b*o9L=Z6oF89E`W;yRlf zSIpo3q4I-ZKtM1t@d^qSwzjwj1kE&=`KlsCE?20Vn+Dt36goOuT3X8feulk0K`L{$ z_7;u^iIfa?^|Sh;bT17uCHF*VT6VHhCUx@hv8VHsvyxbb#!s8wjSP)`43VWgyTP=z zUF5!4e}Yv?Ezf?EIDPJdow|F@PMoDtsd;bSkUun&;$~d)yRo%w>x58f;p*zc^L?6j zL#?HyAyK=`_JiLK6%~=p%%}zi6Hh-9Otti9&06TZ&`@SLNEx`Dagk6jpbV)m*si%3 ztKU1`YrtlgyiQeTwGcxrG$yA)mv4Go^j4cn)gY2FM~LcbD1*afmD|AKvFUmzP71<} zGh1_~R7#aVFx1r4FxX*WWjWN+6i`b^OMcz5)Uvazbjv+ij6^p;tUNhUXlQM%&7ePP zdEQ!AgI;^SYg+&Jfj?Uv`Jwg)B8ey?5X7H9*ABFp+S`u}4hDrqw&xUaoNT0Yy1b_L zOoP*iE=@Xjn&``y4)W+!Zb4$3jqZga`@+e_L!qQF-_D7SWp-43zZj3aSNGC^=OYbBcuPiRP6mMv?jB39cWB*!e{@cHIsES&of0Bk~4nHY@xHMrGEG14l%!d_djkgI(CiO1=Ue${gZAq z;~i5Dqy0nVwKJXR3X*%yKtS%;28w%XjN!Q7bY|%McZ!d7c{!@8>Pp@o`}e{eXX5C1 zk7t@lXHuQ96eJ}j;dvJ?FST6GV(A?`c<|pA zi$QLNsi~n3(A5>cVRnMI7hM$xltKtgJLvO?>+FNmC|+k=xnXVG6RcsJMl9%HrCnEF*!aCm|L2gmqhwvPO*!L zkyKV*xNspfG_rh|lLE4NR~1@7+V@eskxN*^&+o4NYHPU%$}M z&qYNj6PL?HdKY#w~*ROFA8`zqeq1+&AX=!O$Sy_HsnoK71^76vGg>`S< zym|2adG+WhDuW+AJ-x71tG;Asr=+A@D5?K*_hzwp7z9|cV$r<0f$i-W)k?7@@@MJk ztys5iN+Nmu_{F?=a}bs;hXYS*YHHHe)y4W>^OUF}mM?yvk^=awtgJB1Wn^TyySd%C zc#(Kz zgONYjt5T_yN+o&60)OOcODDko@j`idIo_lX3x|h>Qd3irF37iH$*!oVz@Oa|Uf|3(F5Q2~ku zg-9TxGVk8KL!RW@XAZeJI8;?sAe$p6lj34$(djftN5^}2@8UM{Ieq&1Pd}~w@FCmA zhA)wfh5hnZ=J9CbWS9UL5d_Ut)2&~#wn>wEv^O~mx_KuKj7tn%=dygKO84%#<=7t5~ z8Q20AgkpAdba0G0gF0##YbUyvmRv4Joa8``#+^HN@aX&Z?`KTo^LSin5kn&Qhx$U4 zAt4??Kc1AeRBKbUeZD`Oape2NyHCQxf@aQ~iOHuyAc%^KYpAY98KKCmtdhe|-)Iiw z9M%q=OgCd+Ik*$YuCTB$0ERw*XJ8>0&YVHq6%`fh*RKcCZmzD^4<7_Q+S=L@5)zCJ z4YgUU?$*}y^mN4S2T{C1xN@01(8beGPY+L`GLSggQF{_+S#SXS!EeyeF*vxX zq5}Sfnk-$rw!OLO`jLZUBO?o!EUrp zdDS_89BgP1z?c5xaa~>A_FcPD-@L)m5zJY=VS_>{Eh;KP-9Y#MpslH?F)}iAb#(*S zC={5Pc;m)@}+vY*TlF4x53?ex1Ori(p@{hqUbbZMp1TlQDGrYm56Wk>eYzv+O=zl;6G79to7;7 zWl|}aJuxwXyJ$vVjnC3jEt6rjZxRw%Q5$mZT}FigJc0nlpFMkKYGx)L7LSaK;H}BY zNpNq~s#TyR62LP^siQ~Yxnb52Qyt?U@$}In)C6=I9UEKn%{Sx?Vbfkbcu-MZ4%7AY z^z`@l=W)3p0P>0c`ZIUluNS3FHSl0TW#!8kuT4#jci&G5^_#97AHQ?^HmZaoz)z7+ za&mI?>eW`Jrl>5UN0mV{aOU>4YlsZ`X6foa`0Xd$U9eyQ+!@9NnIc2~MT@{_)CX8d zrBYmh^Gr@m01?>6v**uUxSHF4+qzny>s8lTwk8NyBHk{}Z_VfU=nAli_ zLIK-`6@Xq?8X7W;>%S1tn#xL!|BCnV@FKejw6@xu9Y$QCJPW@f?}5l~1-hyjCv z`cNnoz&UT;Ja`dgD(vl5DipvB$@KU4uU)$q_K!5+V2BkLlkeY$LXaUAynOjGdTr>E zC0u=dh!af4z9CN2J=hjmcdlU(dwT~R9Xe`DqtRX_Jtp5jv3K6mr9_3on$L%YVPlA? zySqCrEe+YDhlehhFA<4=bU{G@^ao?Tc4%KlM*4}fXM6tr$^_RzA>ao@(H{^!N&!9a zcsK$3!K*Jkt5_W21tpZ1mO48-yM%;{4-EWAFswg3EG{f8gy9AU2Scd{*T=`_$KAWZ zF?2d03s|+Zs1O5e9i`6AEeQ<^M)$-OZEY&qUP}UkD&%r&d;5#$&qGykBw!EUfKq2I zT9llah!CMy&;WOzJb40w1_cFGeEE`;l*Z*6MMTU7ihvD0i??d$>wo?ZyBMn^*fGYh&$;)7RVvjRXf z-~y3wj5wgfsZ)Oh1qGt#%nA!}+w^@)b_OZ{s*|_PpNZN{-+rV#<%u3k7mvcT?CtGQ z3bdHE`ua~rMSutHhWb8!{1`~XG-hw!-2C}-{Mu#Do<03KW!T#K{O|{TV&KD-v%mrm zfFxiJ_=dEhxoI2simN_@Y~V~|V_rA^ZylPJPA;D{Qc+QhE=M}cltb&X6qg$+OnU=J~U`0xR7 z;{$-itPv6!xp&*P@USp6W`>2uqf3`CQsFMT38atB5Oi~MGcpIu(d~hsMNm*>N=i}D zCv-+!N1oufT&}fc%NjrnF5wjv4Ff4G6)7PBY`Q2e?%u6igM$N9s&-pjdvx?dzp$`h z_U!{5RBE;Rmc1W;{Sk44d#K^puh)G|v|ty#LLp{SI2X7PvVMK~=1T$$Hm0~ zMH^@54{zQu|D`D`{QCLx7%SWY10{olDAcdNo_BGvg-iDKN_>32em}P?KAy$prrfxJ z>ZPVud3)O-L(msv;^xg8fcM+<^sw-7SRclHWP<4bYkctd35f&-2&DkZ>gwi&3+L5V zRLW#h6xq(!_Tj1H2pTqn<`57RG%OaAcPtFRqy>zjiIx^&!mYcX@7x^d>oqkt#%T5Y z`Ex8sP%4K-B8(N<+S+h2yo{gRckckhq7^Hw%sC-HpANL)YHJekikpwm``2&&`t3w_ zR~MdNwQ2#BEtARFY#e}R!R3(5caPF&E?zv{u-D81TbnKFJdmjur-x_VzYiT^82y^7iK2*braro{!L>-4`!jKyZhy zTsePWzl+mXg8KRS!PMR6&V6wDbb!AQlP_n_?a=fuPZ2M_Kyc6Oo>Nm*~+ zK=GJFHhuq3Y=liYX-mRbp6en*Hg8%FJHO@AQ0u6HEaI( z;}4{iot=$Lu!VzzBRm?60HZ(^5z5$p>ePvC+YI#eaR@@CkiE5ogS5XNGR5owbp{+fx5b@TRbGmKFqr|u!Oku_ zfB%NkQUvt&?c3jve>eN+)w{nQfN~ritc`SZ@Z$Km1jUJrjMCRV5uMGhm7u4FgaU+gayLO%Y>8G9ONOFbh)vIK0A72+|Cz)Ix`r`>J4Ru{@-QRyF z&YbB1<3THgPKeKUMIjmlhomw8;P^9l?p%ZpQNm$xSiuMl8NiQG(+`=MaZ8t?zi!;R zwYad*$k5O_D5yFkV`y*?HN~#5|Ad4eBO*M$y_-U;$$NSGws?3L_5!d`Qj}%OmMu7; z!+he_tZA&ShWx;0U$QJXez=1!k(VQ5&G zpO4{QAgG@j7#JNHK`AgBXR4?r>*QbzxR_oFdkj(~wcSbz=vW!JTb z6Q4ioG8iZb&Jw5_#tjmg9CGN7tm8jmYQU2nLe1kx*1P!m%0;4_oE)4^mYu)%_Rx;( z?2qt?gpC^&G8wSP3Lpb23@gW5;4@Z3^G0LA)+bM%M7RhHWJ6Q{0*>6=(z1R3{twB? zWNY#Wyr0L@op=22s`Qln+^^eUQM3t=3M;O={-U!etLxuRi9ZnsObM$K2f8&V6c``k zMkhk5SbElxbEg-D(x_Bi2j20k7jSH>EAlX;XM>QCR`$K?7cahCy*k>&#MpV$0aAD6u;RMEnN!P%5|p6=4@N0rX&G3)#rW$I*GoPP8e!kL<_l%9U~% zK7Vubk(CySYij!2Za7V4Cs?}4wckg!b_O2=|#n}RF z2=zgOgA8W5+YJeY@Cx`NRD`{6UAcn080+C+fZ)oN2Z4c3bLK?AB=YXxK)BsKJ&1M1 ziWNWycX#gGgamNp#p^g2fcL-!Q0C^AMn%m==YioaUAYqd4&x@6PrSay53FKEE=&Do zubY!2i2n5HQ?!rX-icYWyf@r%&n}B96E%9IYLD9 zg7iU&X`Y@hpFaoESOhWv(IFvx2DB(CR0x)1I`H?OS>MnYyDaXH|NZaVZ@<-MFh1qy z1JOf=kAwyXK`j`N5U4_-5{pGJKrjdE1E#B2ucF%UHyrIzg#Tw0s&nSdnf~O&><{lj zah$La!Q#b>ZN?c29==T5Gp<4{{0oCIX}Z;XL{kO{_~{|W`RAb{h?kD~}Nf8JCT zydD*aE?&I&o}c%@q&u3Lu!Oyt88QaXppg3dI#UjZDHayw=0ZBq7RCy^xMJP9$uS8e2q$oK zbOe4b?(SwLCim{$!zcltzI67inn0jwgDGF-j)>u48SmarO-{ahS2V-d(}2x}j)4Wp zZ6Y7d|JOrNQpo1grAr5&WfFUu5e7UoAYcYVPtQbG7p8}exLk9kQbFFcC?tCQdTkPM z&!Tmwe%mJ!cH=nmIt7yt8wLt=fi!#x){EwcKhcjsWfT{S&I%6~)YO1@SPsXln>TNM z{kDTn$8epWU%+DN@+>S(O^g?Q_kCMgDQJK;j5PlG>%!4{w}~SoW@ZL+j-GpP>S)!! z2OYM7A%#K)>L?MM9o+*A(HQ8!i@1y3QDMjUt;1Dc0EAMhx_b4wZ@_f&{^b#vq|cnb zx_tRu3Weml`C##jN5exXdmGMW=uKz~&>{{c^Wx%6*lcubKm~q-h|ixrgJ3X0p~N^7 zL(K&R#m2@)4<0P@{tKRhMK?uVG+@bmw?S6 z2_|RwAfIoJV@F(E%$AMe{`*cO?T$Zp_AlfNl7M6AXsFW3U%$ab>AUA>%Ih~!h5j?F*q;)b|G$H|MF$#+_^JhN}wWi4=zC@P}lnFPb)6{W^ZSQt*dM6 zXjCn9SwxHqtX#Pgc8TN>SV~IizJ05(FQh^ufqkP0pt`#2>dn8%%Y1AhO2nO&mDSTD zUa}-crBb4SgLc-z!Dc#gef_Ut!RDM7EPs0AGB(3!SjyeIFUH43fj)NMJ$YB1{5U@^ z7yF4s!w)WBhUZ{cG)~kOJjTWwHmrhiH8pi_{$WpTdF7iouen?^Kfjr+IT_Fl3gwvfy}dj=-FI(2nDVA{rk^9)2#5;xWAcFkfJGzi zO}B5~Mj7oL9PrjO4-Xh62!lux5)$AaNCwmgyAa;odGm7f^QW7!zkW9gys;1lLs&R0 z3>e^{>gp=7cm#Ccv16n6&Lh%K?=S7&+1}cUyPNm#uP7<0s;OBP7YB0yFrYY;fD@yG zlZCB~P59x{RcXmj9zOWbI?z@N3Tiw&oLX9%NF=!#kKyF#00uTRG?kPTgU#@q%*-qt z3E=L)d)1B|d{@^$jvZ6T<$xTj!!sDdVID{W4d?5K8583*Yu2kfcgXvf&BkpEu0R4Q z!nwbG8>d$5>FJ|a!^;4z{`lbOKmI^(!ee1!VLBX6LuKWbJIS|yJ7Uh|LPASdt-`q( z&g;A9XC{^OXTlmogRlS8!BGo{!bVzK>kK%?7`#EJJx|hY=oCS1?dj9^cI`?)KSuId zStb7d-jH8hTpW|jy>#ptPRU`jXPX!sPfSgrv5MidY&K+#BEURKA=A`UIN?_cA!(2S z_uw{|H0%Nc3*Wzo_&^C%A3X)7#2$e2zb0y^qeCW<8a}*Pv~i=2lM{!znzt`yQ&Z2LJqr!>2Alu|5a3h;r12RD zio3c1B}Ui4Wy>_BQv0BwE2mDuuc2T7igt<722}+X`uh6+2f9XDT@Jp_Pyhe`07*qo IM6N<$f`?MTi2wiq diff --git a/dist/assets/_dist/Tiles/ground/grass_with_dirt_left.png b/dist/assets/_dist/Tiles/ground/grass_with_dirt_left.png deleted file mode 100644 index 62d5b57e903fee8a2cc39540e494a1b701abab6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10793 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 diff --git a/dist/assets/_dist/Tiles/ground/grass_with_dirt_middle.png b/dist/assets/_dist/Tiles/ground/grass_with_dirt_middle.png deleted file mode 100644 index 9acf3a8ff93e5873577cc2f649c4ce287c5c5440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10591 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%0A%Ij|)Ab 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 diff --git a/dist/assets/_dist/Tiles/ground/grass_with_dirt_right.png b/dist/assets/_dist/Tiles/ground/grass_with_dirt_right.png deleted file mode 100644 index 995cf93bd6c1443f5bd2031ed867ebd2a88b59a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10868 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

c-+YI65kZ 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 j`?(4Q0Tu*)!(#nk500001b5ch_0Itp) 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 X>Vk@!wg-O@00000NkvXXu0mjfur`Ru diff --git a/dist/assets/_dist/Tiles/ground/sand_grass_right.png b/dist/assets/_dist/Tiles/ground/sand_grass_right.png deleted file mode 100644 index 4946c3068fe46c88def7202a06e62b820669c9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11636 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 VgSl_KG|d12002ovPDHLkV1k9l3C#ci diff --git a/dist/assets/_dist/Tiles/ground/shallow_water.png b/dist/assets/_dist/Tiles/ground/shallow_water.png deleted file mode 100644 index 91c34925464cb076bbf75a4516f53d6b88de2776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11237 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 P00000NkvXXu0mjfYH{&Q diff --git a/dist/assets/_dist/Tiles/ground/shallow_water_sand_bottom.png b/dist/assets/_dist/Tiles/ground/shallow_water_sand_bottom.png deleted file mode 100644 index 9ef03e3cc4671ff759774bd4af3b3ef87919f65c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11133 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 P00000NkvXXu0mjfmFLNx diff --git a/dist/assets/_dist/Tiles/ground/shallow_water_sand_left.png b/dist/assets/_dist/Tiles/ground/shallow_water_sand_left.png deleted file mode 100644 index ab19ddaab4cb023bd365be647307e3952966a720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11481 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 LNkvXXu0mjf0Ng!j diff --git a/dist/assets/_dist/Tiles/ground/shallow_water_sand_top.png b/dist/assets/_dist/Tiles/ground/shallow_water_sand_top.png deleted file mode 100644 index 1005654a3d225c376d9521edba847b931e86ba38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11099 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

~m!N91=Ne26geg26GH#Z_W8dm_K50@c_!$;w+ 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 hTUrGBKcp`K_00001b5ch_0Itp) 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

    f8adcLn5;M_P9bh^oX5*#? z0Qq+PyCcQg)tA*BH?}l*vtZUSfTmQ~8>9=k_5}b9ey2~i`JH#|3+SV=x-8C%qtF3b z3jpWr}S$U zuwh#chXn&%`|qWUig90%7Vy=#zsd&SMNz5)Y=qGPz_d9Mv`frE*`0SD*#Pe!1XqF- zIRH;Swn#PrR!ejxh(bb8F$4si58yoU)N1k4E9+D%c$e73TkmX^RVR(k20`$hA!8PR zfAr?hWiaZPIetRyRsr8fnH-xcHv?ups1l@+7JzyHJs~1%0?h1r0K}-H^I^^h@IRVD zpyOuG10dG)y7Rm!isy5)=K)af3qa4%KcM1;(P15+UWY9H0EDRr1nB^c$pthpahSRd zn+yi7nxG~~3vlxX!!Dp+<*b|3pi2iJ80qS;Ne#M`U>F^M-?vqQs17hyh49(=Vu*4_ zS^x(5Qf-y27Wb8#4uW*%IoKoExW#M=-WLSRJPA3!p)d%E2A@ z&JY3%K2&f2Zcu~Z7E};H0Hpf?8on=p0L!<=0D_-sKR|;3IJ_^Afe`-#r{Mg%m}uyB P00000NkvXXu0mjfo6=`` diff --git a/dist/assets/_dist/Worlds/worlds.json b/dist/assets/_dist/Worlds/worlds.json deleted file mode 100644 index 2be956e..0000000 --- a/dist/assets/_dist/Worlds/worlds.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "worldId": 2, - "start": { - "x": 0, - "y": 0 - }, - "tiles": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] - - ] - }, - { - "worldId": 1, - "start": { - "x": 0, - "y": 0 - }, - "tiles": - [ - [ 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9 ], - [ 2, 3, 2, 6, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 5, 9, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 17, 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 20, 16, 16, 16, 16, 16, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 20, 16, 16, 16, 16, 16, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ], - [ 9 , 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9 ] - ] - - }, - { - "worldId": 0, - "start": { - "x": 0, - "y": 0 - }, - "tiles": [ - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0] - ] - } -] \ No newline at end of file diff --git a/dist/bundle.js b/dist/bundle.js deleted file mode 100644 index ae85728..0000000 --- a/dist/bundle.js +++ /dev/null @@ -1,3270 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 81: -/*!**************************************************************!*\ - !*** ./src/application/Graphics/Viewport/Viewport.Helper.ts ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ViewportHelper = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class ViewportHelper { - static GetSquareInBrowser() { - const h = this.GetBrowserHeight() - 5; - const w = this.GetBrowserWidth() - 5; - if (h < w) { - return new Vector2_model_1.Vector2(h, h); - } - else { - return new Vector2_model_1.Vector2(w, w); - } - } - static GetWindowInAspectRatio(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1) { - const aspectRatio = aspectRatioWidth / aspectRatioHeight; - const adjustedWindowHeight = this.GetBrowserHeight() * heightPercent; - const adjustedWindowWidth = this.GetBrowserWidth() * widthPercent; - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - /** - * Gets a window in a given aspect ratio. - * - * @static - * @param {number} [aspectRatioWidth=16] - * @param {number} [aspectRatioHeight=9] - * @param {number} [widthPercent=1] between 0 & 1. Should usually be the same as heightPercent - * @param {number} [heightPercent=1] between 0 & 1. Shoudl usually be the same as widthPercent - * @param {string} elementId An element to put this canvas into. Can be null (will use the full window) - * @returns {Vector2} - * @memberof ViewportHelper - * @returns {Vector2} - * @memberof ViewportHelper - */ - static GetWindowInAspectRatioForCanvas(aspectRatioWidth = 16, aspectRatioHeight = 9, widthPercent = 1, heightPercent = 1, canvasableElement = null) { - if (!canvasableElement) { - console.warn(`setup with no canvasable element. Will use the entire window`); - } - else { - console.warn(`setup with id of ${canvasableElement.id}`); - } - const aspectRatio = aspectRatioWidth / aspectRatioHeight; - if (heightPercent !== widthPercent) { - console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); - } - if (aspectRatioHeight > aspectRatioWidth) { - console.log(`starting in portrait mode (${aspectRatioWidth}:${aspectRatioHeight})`); - } - else { - console.info(`starting in landscape mode (${aspectRatioWidth}:${aspectRatioHeight})`); - } - const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * heightPercent; - const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * widthPercent; - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - static GetBrowserWidth(element = null) { - if (!element) { - return window.innerWidth; - } - else { - return element.clientWidth; - } - } - static GetBrowserHeight(element = null) { - if (!element) { - return window.innerHeight; - } - else { - return element.clientHeight; - } - } -} -exports.ViewportHelper = ViewportHelper; - - -/***/ }), - -/***/ 289: -/*!****************************************!*\ - !*** ./src/application/World/world.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.World = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); -class World { - constructor(area, spawn, tiles, id) { - this.area = new Vector2_model_1.Vector2(20, 20); - this.area = area; - this.spawn = spawn; - this.tiles = tiles; - this.id = id; - } - GetTiles() { - return this.tiles; - } - GetStartingPosition() { - return this.spawn; - } - GetId() { - return this.id; - } -} -exports.World = World; - - -/***/ }), - -/***/ 378: -/*!***************************************************************!*\ - !*** ./src/application/Graphics/Viewport/viewport.service.ts ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ViewportService = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class ViewportService { - constructor(aspectRatio = new Vector2_model_1.Vector2(16, 9), sizePercent = new Vector2_model_1.Vector2(1, 1)) { - this.listeningForBrowserChanges = false; - this.aspectRatio = aspectRatio; - this.aspectRatioCalculated = (this.aspectRatio.getValueX() / this.aspectRatio.getValueY()); - this.sizePercent = sizePercent; - this.setupListner(); - } - setupListner() { - console.log('setting up browser listner'); - this.listner = window.addEventListener('resize', () => { - this.listeningForBrowserChanges = true; - setTimeout(() => { - this.listeningForBrowserChanges = false; - }, 5000); - }); - } - /** - *Gets a window in a the game's aspect ratio - * - * @param {HTMLElement} [canvasableElement=null] - * @returns {Vector2} - * @memberof ViewportService - */ - GetWindowInAspectRatioForCanvas(canvasableElement = null) { - if (!canvasableElement) { - console.warn(`setup with no canvasable element. Will use the entire window`); - } - else { - console.warn(`setup with id of ${canvasableElement.id}`); - } - if (this.sizePercent.getValueX() !== this.sizePercent.getValueY()) { - console.warn('window height and width percentages to not match. This will result in an abnormal screen size'); - } - if (this.aspectRatio.getValueX() > this.aspectRatio.getValueY()) { - console.log(`starting in portrait mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); - } - else { - console.info(`starting in landscape mode (${this.aspectRatio.getValueX()}:${this.aspectRatio.getValueY()})`); - } - const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * this.sizePercent.getValueX(); - const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * this.sizePercent.getValueY(); - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - GetSquareInBrowser() { - const h = this.GetBrowserHeight() - 5; - const w = this.GetBrowserWidth() - 5; - if (h < w) { - return new Vector2_model_1.Vector2(h, h); - } - else { - return new Vector2_model_1.Vector2(w, w); - } - } - GetWindowInAspectRatio() { - const adjustedWindowHeight = this.GetBrowserHeight() * this.sizePercent.getValueX(); - const adjustedWindowWidth = this.GetBrowserWidth() * this.sizePercent.getValueY(); - const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated)); - const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated)); - return new Vector2_model_1.Vector2(displayWidth, displayHeight); - } - GetBrowserWidth(element = null) { - if (!element) { - return window.innerWidth; - } - else { - return element.clientWidth; - } - } - GetBrowserHeight(element = null) { - if (!element) { - return window.innerHeight; - } - else { - return element.clientHeight; - } - } - getBrowserSize() { - return this.browserSize; - } - setBrowserSize(browserSize) { - this.browserSize = browserSize; - } - getViewportSize() { - return this.viewportSize; - } - setViewportSize(viewportSize) { - this.viewportSize = viewportSize; - } -} -exports.ViewportService = ViewportService; - - -/***/ }), - -/***/ 652: -/*!**********************************************!*\ - !*** ./src/application/states/_BaseState.ts ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BaseState = void 0; -class BaseState { -} -exports.BaseState = BaseState; - - -/***/ }), - -/***/ 659: -/*!********************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TileType = void 0; -class TileType { - constructor(id, fallbackOutlineColour, textureId) { - this.textureId = textureId; - this.id = id; - this.fallbackOutlineColour = fallbackOutlineColour; - } - Tick() { - } - GetTextureId() { - return this.textureId; - } - GetId() { - return this.id; - } - GetFallbackColour() { - return this.fallbackOutlineColour; - } -} -exports.TileType = TileType; - - -/***/ }), - -/***/ 752: -/*!***********************************************!*\ - !*** ./src/application/Core/timer.service.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TimerService = void 0; -class TimerService { - constructor(targetFps = 60) { - this.fps = targetFps; - this.timePerTick = 1000 / this.fps; - this.delta = 0; - this.now = 0; - this.lastTime = performance.now(); - this.timer = 0; - this.ticks = 0; - this.lastTimeTook = 0; - } - CheckShouldRunLoop() { - this.now = performance.now(); - this.delta += (this.now - this.lastTime) / this.timePerTick; - this.timer += this.now - this.lastTime; - this.lastTimeTook = this.now - this.lastTime; - this.lastTime = this.now; - if (this.delta >= 1) { - return true; - } - console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`); - return false; - } - UpdateTicksAndRenderAfterLoop() { - this.delta--; - this.ticks++; - } - /** - * returns true if it's a good time to print to - * the console - * - * @returns {boolean} - * @memberof FpsService - */ - ShouldPrintDebugData() { - return this.timer > 1000; - } - /** - * prints debug data from this class - * to the console - * - * @memberof FpsService - */ - PrintCurrentFpsToConsole() { - return ` - ticks and frames: ${this.ticks.toFixed(2)} - lastDelta: ${this.delta.toFixed(2)} - timer: ${this.timer.toFixed(2)} - lastTime Took: ${this.lastTimeTook.toFixed(2)}`; - } - ResetTimers() { - if (this.timer > 1000) { - this.ticks = 0; - this.timer = 0; - } - } - GetLastUpdateTimeTook() { - return this.lastTimeTook / 1000; - } -} -exports.TimerService = TimerService; - - -/***/ }), - -/***/ 954: -/*!**************************************************!*\ - !*** ./src/application/Entities/_base-entity.ts ***! - \**************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Entity = void 0; -const random_guid_generator_1 = __webpack_require__(/*! ../Tools/random_generators/random_guid.generator */ 6953); -const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ 5537); -const drawable_1 = __webpack_require__(/*! ../Graphics/Draw/drawable */ 7267); -// export interface IEntity { -// position: Vector2; -// size: Vector2; -// name: string; -// id: string; -// } -class Entity extends drawable_1.Drawable { - // constructor(position: Vector2, size: Vector2, name: string, canvasId: string, texture: Texture2D, textureId: string) { - constructor(position, size, name, canvasId, textureId) { - super(position, size, canvasId, textureId); - this.id = random_guid_generator_1.GuidGenerator.NewGuid(); - this.name = name; - } - getName() { - return this.name; - } - getId() { - return this.name; - } - getPosition() { - return this.position; - } - setPosition(newPosition) { - this.position = newPosition; - return this.getPosition(); - } - setPositionX(newPositionX) { - this.position.x = newPositionX; - return this.getPosition(); - } - setPositionY(newPositionY) { - this.position.y = newPositionY; - return this.getPosition(); - } - getSize() { - return this.size; - } - setSize(newSize) { - this.size = newSize; - return this.getSize(); - } - // getAABB(): AABB { - // if (this.AABB === undefined) { - // this.UpdateAABB(); - // } - // return this.AABB; - // } - SetAABB(AABB) { - this.setAABB(AABB); - } - UpdateAABB() { - this.setAABB(new AABB_model_1.AABB(this.position, this.size)); - } -} -exports.Entity = Entity; - - -/***/ }), - -/***/ 961: -/*!*********************************************************!*\ - !*** ./src/application/Graphics/Tiles/drawable-tile.ts ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DrawableTile = void 0; -const drawable_1 = __webpack_require__(/*! ../Draw/drawable */ 7267); -class DrawableTile extends drawable_1.Drawable { - constructor(tileTypeId, position, size, fallbackOutlineColour, canvasId, textureId) { - super(position, size, canvasId, textureId); - this.tileTypeId = tileTypeId; - this.colour = fallbackOutlineColour; - } - getTileTypeId() { - return this.tileTypeId; - } - getPosition() { - return this.position; - } - getSize() { - return this.size; - } -} -exports.DrawableTile = DrawableTile; - - -/***/ }), - -/***/ 1226: -/*!**********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StarTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class StarTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#060948', textId); - } -} -exports.StarTileType = StarTileType; -StarTileType.texturePath = '/Tiles/space_tile2.png'; - - -/***/ }), - -/***/ 1759: -/*!***********************************************!*\ - !*** ./src/numerics/helpers/number.helper.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Between = Between; -exports.Lerp = Lerp; -function Between(x, min, max) { - return x >= min && x <= max; -} -function Lerp(start, end, amt) { - return (1 - amt) * start + amt * end; -} - - -/***/ }), - -/***/ 1854: -/*!**********************************************!*\ - !*** ./src/application/Input/input.model.ts ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Input = void 0; -class Input { - constructor(name, keyboardId, gamepadId, gamePadAxesId) { - this.pressed = false; - this.force = 0; - this.wasPressedPreviousCheck = false; - this.name = name; - this.keyboardId = keyboardId; - this.gamepadId = gamepadId; - this.gamePadAxesId = gamePadAxesId; - } -} -exports.Input = Input; - - -/***/ }), - -/***/ 1874: -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SpaceTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class SpaceTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#1C1C1B', textId); - } -} -exports.SpaceTileType = SpaceTileType; -SpaceTileType.texturePath = '/Tiles/space_tile.png'; - - -/***/ }), - -/***/ 2126: -/*!*********************************!*\ - !*** ./src/application/game.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Game = void 0; -const InputManager_1 = __webpack_require__(/*! ./Input/InputManager */ 5622); -const debug_service_1 = __webpack_require__(/*! ./_debug/debug.service */ 6417); -const debug_component_1 = __webpack_require__(/*! ./_debug/debug.component */ 5277); -const Vector2_model_1 = __webpack_require__(/*! ../numerics/models/Vector2.model */ 2239); -const GameState_1 = __webpack_require__(/*! ./states/GameState */ 7918); -const state_service_1 = __webpack_require__(/*! ./states/state.service */ 9809); -const MenuState_1 = __webpack_require__(/*! ./states/MenuState */ 2345); -const SettingsState_1 = __webpack_require__(/*! ./states/SettingsState */ 9623); -const player_1 = __webpack_require__(/*! ./Entities/Creatures/player */ 9188); -const graphics_service_1 = __webpack_require__(/*! ./Graphics/graphics.service */ 4288); -const baddy_1 = __webpack_require__(/*! ./Entities/Creatures/baddy */ 7709); -const random_string_generator_1 = __webpack_require__(/*! ./Tools/random_generators/random_string.generator */ 9473); -const random_number_generators_1 = __webpack_require__(/*! ./Tools/random_generators/random_number.generators */ 6012); -const world_service_1 = __webpack_require__(/*! ./World/world.service */ 9992); -const viewport_service_1 = __webpack_require__(/*! ./Graphics/Viewport/viewport.service */ 378); -const player_service_1 = __webpack_require__(/*! ./Entities/player.service */ 7594); -const entity_service_1 = __webpack_require__(/*! ./Entities/entity.service */ 9984); -const timer_service_1 = __webpack_require__(/*! ./Core/timer.service */ 752); -class Game { - constructor() { - this.running = false; - this.launchMessage = 'Start'; - this.performanceInfoDiv = document.getElementById('performance_div'); - this.performanceInfoDiv.innerHTML = `waiting for perf data`; - this.viewportService = new viewport_service_1.ViewportService(); - const loadedInDebugMode = this.checkDebugModeFromQueryString(); - this.graphicsService = new graphics_service_1.GraphicsService(); - this.stateService = new state_service_1.StateService(); - this.debugService = new debug_service_1.DebugService(loadedInDebugMode); - this.debugComponent = new debug_component_1.DebugComponent(this.debugService); - this.inputManager = new InputManager_1.InputManager(); - this.timerService = new timer_service_1.TimerService(60); - this.worldService = new world_service_1.WorldService(this.graphicsService.GetTileService()); - this.entityService = new entity_service_1.EntityService(); - this.playerService = new player_service_1.PlayerService(); - } - Run() { - console.log('Run called in game.ts'); - this.Init(); - this.running = true; - this.Loop(); - } - Init() { - console.log(this.launchMessage + ' will now be posted to the document '); - this.SetupStates(); - this.inputManager.InitInputManager(); - this.graphicsService.InitGraphicsService(); - this.worldService.Init(); - this.graphicsService.getGameCameraService().SetLevelAABB(this.worldService.GetWorldSize()); - this.registerEntities(); - // this.canvasManager.InitCanvasManager('main_div', this.gameEntities); - if (this.debugService.IsInDebugMode()) { - console.log('setting up with debug info'); - this.debugComponent.InitDebugComponent('main_div'); - } - return this.launchMessage; - } - SetupStates() { - this.gameState = new GameState_1.GameState(this.graphicsService); - this.menuState = new MenuState_1.MenuState(); - this.settingsState = new SettingsState_1.SettingsState(); - this.stateService.setState(this.gameState); - } - /** - * loops continuously whenever the browser is ready - * for a new frame - * - * @memberof Game - */ - Loop() { - requestAnimationFrame(() => { - if (this.running) { - if (this.timerService.CheckShouldRunLoop()) { - const lastDelta = this.timerService.GetLastUpdateTimeTook(); - this.Update(lastDelta); - this.Render(lastDelta); - this.timerService.UpdateTicksAndRenderAfterLoop(); - } - this.PrintDebugInfoToConsole(false, true); - this.timerService.ResetTimers(); - } - this.Loop(); - }); - } - /** - * prints debug info from various places in the - * application - * - * @private - * @memberof Game - */ - PrintDebugInfoToConsole(printToConsole = false, printToHtml = false) { - if (this.timerService.ShouldPrintDebugData()) { - // console.clear(); - let debugInformation = new Array(); - debugInformation.push('FPS Serv: ' + this.timerService.PrintCurrentFpsToConsole()); - debugInformation.push('Cam Serv: ' + this.graphicsService.getGameCameraService().GetDebugInfo()); - if (printToConsole) { - for (let line of debugInformation) { - if (line.length > 0) { - console.log('%c ' + line + ' ', 'background: #000; color:white; '); - } - } - } - if (printToHtml) { - this.performanceInfoDiv.innerHTML = `
    ${debugInformation.join('\n')}
    `; - } - // debugInformation = Array(0); - } - } - Update(lastDelta) { - if (this.stateService.GetState() !== null) { - this.inputManager.NewInputLoopCheck(); - this.stateService.GetState().Tick(); - this.entityService.TickAllEntities(lastDelta); - // for (let i = 0; i < this.gameEntities.length; i++) { - // this.gameEntities[i].Tick(); - // } - } - } - Render(lastDelta) { - if (this.stateService.GetState() !== null) { - this.graphicsService.GetTileService().Redner(); - this.entityService.RenderAllEntities(this.graphicsService); - this.stateService.GetState().Render(); - this.graphicsService.Render(); - } - } - checkDebugModeFromQueryString() { - const urlParams = new URLSearchParams(window.location.search); - const debugModeParam = urlParams.get('inDebugMode'); - return JSON.parse(debugModeParam); - } - registerEntities(baddyCount = 75) { - const ships = [ - 'metalic_01.png', - 'metalic_02.png', - 'metalic_03.png', - 'metalic_04.png', - 'metalic_05.png', - 'metalic_06.png', - 'orange_01.png', - 'orange_02.png', - 'orange_03.png', - 'orange_04.png', - 'orange_05.png', - 'orange_06.png' - ]; - const entitySize = new Vector2_model_1.Vector2(30, 30); - for (let i = 0; i < baddyCount; i++) { - const imageLoc = random_number_generators_1.RandomNumberGenerator.GetRandomNumber(0, 6); - console.log('image loc will be ' + imageLoc); - const entity = new baddy_1.Baddy( - // new Vector2(500, 300), - random_number_generators_1.RandomNumberGenerator.GetRandomVector2(0, this.viewportService.GetBrowserWidth(), 0, this.viewportService.GetBrowserHeight()), entitySize, 'baddy' + i.toString(), '/Ships/' + ships[imageLoc], this.graphicsService, random_string_generator_1.RandomStringGenerator.GetRandomHexColour(), this.playerService); - this.entityService.RegisterEntity(entity); - } - this.playerService.SetPlayer(new player_1.Player(new Vector2_model_1.Vector2(this.viewportService.GetBrowserWidth() / 2, this.viewportService.GetBrowserHeight() / 2), - // new Vector2(0, 0), - new Vector2_model_1.Vector2(50, 50), 'player', 'Ships/large_purple_01.png', this.inputManager, this.graphicsService)); - this.entityService.RegisterEntity(this.playerService.GetPlayer()); - // return entities; - } -} -exports.Game = Game; - - -/***/ }), - -/***/ 2185: -/*!**********************************************!*\ - !*** ./src/application/Input/input-state.ts ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.InputState = void 0; -const input_model_1 = __webpack_require__(/*! ./input.model */ 1854); -class InputState { - constructor() { - this.controllingWithPad = false; - console.log('inputState: constructing input state'); - this.detailsDiv = document.getElementById('details_div'); - this.registeredGamePads = new Array(); - this.gamePads = new Array(); - } - Init() { - console.log('inputState: init inputstate'); - this.setupInputs(); - this.SetupGamePadRegistrationWatch(); - this.SetupKeyboardInputWatch(); - this.SetGamePadMode(false); - } - SetGamePadMode(controllingWithPad) { - this.controllingWithPad = controllingWithPad; - if (controllingWithPad) { - this.detailsDiv.innerHTML = 'controlling with gamepad. Press >> k << to use keyboard mode'; - } - else { - this.detailsDiv.innerHTML = 'controlling with keyboard. Press >> select << to use gamepad mode'; - } - } - GetGamePadMode() { - return this.controllingWithPad; - } - /** - * // https://w3c.github.io/gamepad/#remapping - * - * @memberof InputState - */ - setupInputs() { - this.currentInputs = new Array(); - this.currentInputs.push(new input_model_1.Input('direction_left', 'a', 14, null), new input_model_1.Input('direction_right', 'd', 15, null), new input_model_1.Input('direction_up', 'w', 12, null), new input_model_1.Input('direction_down', 's', 13, null), new input_model_1.Input('axes_pad_left_horizontal', null, null, 0), new input_model_1.Input('axes_pad_left_vertical', null, null, 1), new input_model_1.Input('axes_pad_right_horizontal', null, null, 2), new input_model_1.Input('axes_pad_right_vertical', null, null, 3), new input_model_1.Input('trigger_one_left', 'q', 4, null), new input_model_1.Input('trigger_two_left', 'w', 6, null), new input_model_1.Input('trigger_one_right', 'e', 5, null), new input_model_1.Input('trigger_two_right', 's', 7, null), - // 'action_{val}' where {val} is the - // name of the button on an XBox360 controller - new input_model_1.Input('action_a', ' ', 0, null), new input_model_1.Input('action_y', 'z', 3, null), new input_model_1.Input('action_x', 'x', 2, null), new input_model_1.Input('action_b', 'c', 1, null)); - } - UpdateInputs() { - // console.log('inputstate: updating inputs. There are ' + this.registeredGamePads.length + ' pads connected') - this.UpdateGamePadInputs(); - } - ResetInputsBeforeGamePadInput() { - for (let input of this.currentInputs) { - input.wasPressedPreviousCheck = input.pressed; - input.pressed = false; - } - } - UpdateGamePadInputs() { - for (let i = 0; i < this.registeredGamePads.length; i++) { - const padToCheck = this.GetGamePad(i); - if (this.GetGamePadMode()) { - this.ResetInputsBeforeGamePadInput(); - for (let btnIndex = 0; btnIndex < padToCheck.buttons.length; btnIndex++) { - if (this.gamePadButtonPressed(padToCheck.buttons[btnIndex])) { - this.pushToCurrentInputsFromGamePad(btnIndex, padToCheck.buttons[btnIndex].value); - // console.log(`inputstate: btn ${btnIndex} is pressed`) - } - } - for (let axesIndex = 0; axesIndex < padToCheck.axes.length; axesIndex++) { - if (this.gamePadAxesPressed(padToCheck.axes[axesIndex])) { - this.pushToCurrentInputsFromGamePadAxes(axesIndex, padToCheck.axes[axesIndex]); - } - } - } - else { - if (this.gamePadButtonPressed(padToCheck.buttons[8])) { - console.warn('inputstate: in gamepad mode'); - this.SetGamePadMode(true); - } - } - } - } - IsInputPressed(inputDescription) { - for (let input of this.currentInputs) { - if (input.name === inputDescription) { - return input.pressed; - } - } - return false; - } - GetForceValue(inputDescription) { - for (let input of this.currentInputs) { - if (input.name === inputDescription) { - return input.force; - } - } - return 0; - } - /** - * checks if this key is in the SYSTEM_KEYS array - * (includes keys like F1 - F12) - * - * @private - * @param {string} key - * @returns - * @memberof InputState - */ - isSystemKey(key) { - if (InputState.SYSTEM_KEYS.includes(key)) { - return true; - } - return false; - } - SetupKeyboardInputWatch() { - window.addEventListener('keydown', event => { - if (!this.isSystemKey(event.key)) { - event.preventDefault(); - this.pushToCurrentInputsFromKeyboard(event.key); - } - }); - window.addEventListener('keyup', event => { - if (!this.isSystemKey(event.key)) { - event.preventDefault(); - this.popFromCurrentInputsFromKeyboard(event.key); - if (event.key === 'k') { - console.warn(`inputstate: controlling by keyboard`); - this.SetGamePadMode(false); - } - } - }); - } - pushToCurrentInputsFromKeyboard(key) { - if (this.GetGamePadMode() === false) { - for (let thisInput of this.currentInputs) { - if (thisInput.keyboardId === key) { - thisInput.pressed = true; - thisInput.force = 1; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) - return; - } - } - } - } - popFromCurrentInputsFromKeyboard(key) { - if (this.GetGamePadMode() === false) { - for (let input of this.currentInputs) { - if (input.keyboardId === key) { - input.pressed = false; - // console.log(`inputstate marked ${input.name} as pressed`) - return; - } - } - } - } - pushToCurrentInputsFromGamePad(btnId, pushForce) { - for (let thisInput of this.currentInputs) { - if (thisInput.gamepadId === btnId) { - thisInput.pressed = true; - thisInput.force = pushForce; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) - return; - } - } - } - pushToCurrentInputsFromGamePadAxes(axesIndex, pushForce) { - for (let thisInput of this.currentInputs) { - if (thisInput.gamePadAxesId === axesIndex) { - thisInput.pressed = true; - thisInput.force = pushForce; - // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`) - return; - } - } - } - popFromCurrentInputsFromGamePad(btnId) { - for (let input of this.currentInputs) { - if (input.gamepadId === btnId) { - input.pressed = false; - // console.log(`inputstate marked ${input.name} as not`) - return; - } - } - } - /* GamePad code */ - /** - * watches for the game pad registration events - * - * @memberof InputState - */ - SetupGamePadRegistrationWatch() { - console.log('inputstate setting up registrations'); - window.addEventListener('gamepadconnected', (e) => { - console.log('inputstate got gamepad'); - this.RegisterGamePad(e.gamepad); - }); - window.addEventListener('gamepaddisconnected', (e) => { - console.error('inputstate gamepad was disconnected'); - this.DeRegisterGamePad(e.gamepad); - }); - } - RegisterGamePad(gamePad) { - console.warn("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); - this.registeredGamePads[gamePad.index] = gamePad; - this.detailsDiv.innerHTML = 'Gamepad has been connected'; - } - DeRegisterGamePad(gamePad) { - console.error("inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.", gamePad.index, gamePad.id, gamePad.buttons.length, gamePad.axes.length); - this.GetGamePads(); - this.detailsDiv.innerHTML = 'inputstate: Gamepad has been disconnected'; - } - GetGamePads() { - this.gamePads = navigator.getGamepads(); - } - GetGamePad(index) { - return navigator.getGamepads()[index]; - } - gamePadAxesPressed(axes) { - return (axes > InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY || axes < -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY); - } - gamePadButtonPressed(btn) { - // console.log(typeof(btn)); - if (typeof (btn) === 'object') { - // firefox - // console.log('gamepad: ff') - if (btn.pressed) { - // console.log('inputstate: button is pressed') - } - return btn.value; - } - else { - // console.log('inputstate: gamepad: chrome') - return btn === 1.0; - } - } -} -exports.InputState = InputState; -InputState.SYSTEM_KEYS = [ - 'F1', - 'F2', - 'F3', - 'F4', - 'F5', - 'F6', - 'F7', - 'F8', - 'F9', - 'F10', - 'F11', - 'F12', -]; -InputState.DEFAULT_MAX_INPUTS = 4; -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY = 0.1; - - -/***/ }), - -/***/ 2228: -/*!********************************************************!*\ - !*** ./src/application/Entities/Creatures/creature.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Creature = void 0; -const _base_entity_1 = __webpack_require__(/*! ../_base-entity */ 954); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -const creature_default_settings_1 = __webpack_require__(/*! ./creature.default.settings */ 2360); -const vector2_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/vector2.helper */ 2655); -const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ 1759); -class Creature extends _base_entity_1.Entity { - // protected canvasId: string; - // protected texture: Texture2D; - constructor(position, size, name, texturePath, graphicsService) { - super(position, size, name, '1', 'no_text_yet'); - this.turnSpeed = 1; - this.angleAdjust = -90; - console.error('passing incorrect texture ID and canvasId, and canvas to super'); - this.graphicsService = graphicsService; - this.health = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_HEALTH; - this.speed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED; - this.velocity = new Vector2_model_1.Vector2(0, 0); - this.maxSpeed = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX; - this.acceleration = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION; - this.deceleration = vector2_helper_1.Vector2Helpers.DivideByScale(creature_default_settings_1.CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION, 1); - this.friction = creature_default_settings_1.CreatureDefaultSettings.DEFAULT_FRICTION; - this.setCanvasId(this.graphicsService.RegisterDrawableEntity()); - if (texturePath !== undefined && texturePath !== null && texturePath.length) { - const textureId = this.graphicsService.GetTextureService().RegisterNewTexture(texturePath); - this.SetTextureId(textureId); - } - else { - console.error(new Error(`creature [${name}] did not have a texture`)); - } - } - Move(lastDelta) { - this.CapMovementSpeed(); - this.CapRotation(); - this.UpdatePosition(lastDelta); - this.ReduceSpeed(); - this.UpdateAABB(); - } - ReduceSpeed() { - this.velocity.y *= this.friction.y; - this.velocity.x *= this.friction.x; - // if (this.velocity.y > 0) { - // this.velocity.y -= this.friction.y; - // if (this.velocity.y < 0) { - // this.velocity.y = 0; - // } - // } else if (this.velocity.y < 0) { - // this.velocity.y += this.friction.y; - // if (this.velocity.y > 0) { - // this.velocity.y = 0; - // } - // } - // if (this.velocity.x > 0) { - // this.velocity.x -= this.friction.x; - // if (this.velocity.x < 0) { - // this.velocity.x = 0; - // } - // } else if (this.velocity.x < 0) { - // this.velocity.x += this.friction.x; - // if (this.velocity.x > 0) { - // this.velocity.x = 0; - // } - // } - } - /** - * updates the creature's position - * - * @private - * @memberof Creature - */ - UpdatePosition(lastDelta) { - // this.position.x += (this.velocity.x * (lastDelta) * 50); - // this.position.y += (this.velocity.y * (lastDelta) * 50); - this.position.x = (0, number_helper_1.Lerp)(this.position.x, this.position.x + (this.velocity.x * (lastDelta) * 50), .8); - this.position.y = (0, number_helper_1.Lerp)(this.position.y, this.position.y + (this.velocity.y * (lastDelta) * 50), .8); - } - /** - * caps the creature's movement speed at - * this.maxSpeed - * - * @private - * @memberof Creature - */ - CapMovementSpeed() { - if (this.velocity.x > this.maxSpeed.x) { - this.velocity.x = this.maxSpeed.x; - } - else if (this.velocity.x < -this.maxSpeed.x) { - this.velocity.x = -this.maxSpeed.x; - } - if (this.velocity.y > this.maxSpeed.y) { - this.velocity.y = this.maxSpeed.y; - } - else if (this.velocity.y < -this.maxSpeed.y) { - this.velocity.y = -this.maxSpeed.y; - } - if (this.velocity.x < 0.1 && this.velocity.x > -0.1) { - this.velocity.x = 0; - } - if (this.velocity.y < 0.1 && this.velocity.y > -0.1) { - this.velocity.y = 0; - } - } - CapRotation() { - // if (this.rotationDegrees < 0) { - // this.rotationDegrees = 360 - (-this.rotationDegrees); - // } - // if (this.rotationDegrees < 0) { - // this.rotationDegrees = 359; - // } if (this.rotationDegrees > 360) { - // this.rotationDegrees = 0; - // } - } - getHealth() { - return this.health; - } - setHealth(health) { - this.health = health; - } - getSpeed() { - return this.speed; - } - setSpeed(speed) { - this.speed = speed; - } - getMove() { - return this.velocity; - } - setMove(move) { - this.velocity = move; - } -} -exports.Creature = Creature; - - -/***/ }), - -/***/ 2239: -/*!**********************************************!*\ - !*** ./src/numerics/models/Vector2.model.ts ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Vector2 = void 0; -class Vector2 { - constructor(x, y) { - this.x = x; - this.y = y; - } - concat(decimalPlaces = -1) { - if (decimalPlaces > -1) { - return `x:[${this.x.toFixed(decimalPlaces)}], y:[${this.y.toFixed(decimalPlaces)}]`; - } - return `x:[${this.x}], y:[${this.y}]`; - } - getValueX() { - return this.x; - } - getValueY() { - return this.y; - } - setValueX(x) { - this.x = x; - } - setValueY(y) { - this.y = y; - } - setValues(x, y) { - this.x = x; - this.y = y; - } -} -exports.Vector2 = Vector2; - - -/***/ }), - -/***/ 2345: -/*!*********************************************!*\ - !*** ./src/application/states/MenuState.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MenuState = void 0; -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); -class MenuState extends _BaseState_1.BaseState { - constructor() { - super(); - console.log(`constructing MenuState`); - } - Tick() { - console.error("Method not implemented."); - } - Render() { - console.error("Method not implemented."); - } -} -exports.MenuState = MenuState; - - -/***/ }), - -/***/ 2360: -/*!*************************************************************************!*\ - !*** ./src/application/Entities/Creatures/creature.default.settings.ts ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CreatureDefaultSettings = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class CreatureDefaultSettings { -} -exports.CreatureDefaultSettings = CreatureDefaultSettings; -CreatureDefaultSettings.DEFAULT_HEALTH = 100; -CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED = new Vector2_model_1.Vector2(3.0, 3.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX = new Vector2_model_1.Vector2(11.0, 11.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION = new Vector2_model_1.Vector2(3.0, 3.0); -CreatureDefaultSettings.DEFAULT_MOVEMENT_VELOCITY = new Vector2_model_1.Vector2(3, 3); -CreatureDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(20, 20); -CreatureDefaultSettings.DEFAULT_FRICTION = new Vector2_model_1.Vector2(0.95, 0.95); - - -/***/ }), - -/***/ 2451: -/*!****************************************************************!*\ - !*** ./src/application/Graphics/Camera/game-camera.service.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GameCameraService = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ 81); -const intersection_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/intersection.helper */ 6695); -const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ 5537); -class GameCameraService { - /** - *Creates an instance of GameCameraService. - - applyWorldBounding tells the camera if it should continue - moving right or left if it reaches the edge of the level - * @param {number} xOffset - * @param {number} yOffset - * @param {boolean} applyWorldBounding - * @memberof GameCameraService - */ - constructor(xOffset, yOffset, applyWorldBounding) { - this.offset = new Vector2_model_1.Vector2(xOffset, yOffset); - this.applyWorldBounding = applyWorldBounding; - this.displayableSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio(); - this.UpdatePositionAndSize(); - } - SetLevelAABB(levelAABB) { - this.levelAABB = levelAABB; - } - GetDebugInfo() { - return [` - offset: ${this.offset.concat(2)} - size: ${this.displayableSize.concat(2)}`]; - } - /** - * checks if two objects intersect - * - * @param {Vector2} position - * @param {Vector2} size - * @returns {boolean} - * @memberof GameCameraService - */ - IsObectOnScreen(position, size) { - const objectAABB = new AABB_model_1.AABB(position, size); - return this.IsObjectOnScreenAABB(objectAABB); - } - IsObjectOnScreenAABB(AABB) { - if (intersection_helper_1.IntersectionHelper.AabbVsAabb(this.cameraAABB, AABB)) { - return true; - } - else { - return false; - } - } - MoveCamera(xAmount, yAmount) { - console.error('don\'t use MoveCamera'); - this.offset.x += xAmount; - this.offset.y += yAmount; - } - /** - * sets the camera to points at (looks at) a specific entity - * - * @param {Vector2} entityPosition - * @param {Vector2} entitySize - * @memberof GameCameraService - */ - LookAt(entityPosition, entitySize) { - const vieportWidth = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueX(); - const vieportHeight = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatio().getValueY(); - const centerX = entityPosition.getValueX() - (vieportWidth / 2) + (entitySize.getValueX() / 2); - const centerY = entityPosition.getValueY() - (vieportHeight / 2) + (entitySize.getValueY() / 2); - this.SetOffset(new Vector2_model_1.Vector2(centerX, centerY)); - } - SetOffset(positionVector) { - this.offset = positionVector; - if (this.applyWorldBounding) { - if (this.offset.getValueX() < this.levelAABB.GetLeft()) { - this.offset.setValueX(this.levelAABB.GetLeft()); - } - if (this.offset.getValueX() > this.levelAABB.GetRight()) { - this.offset.setValueX(this.levelAABB.GetRight()); - } - if (this.offset.getValueY() < this.levelAABB.GetTop()) { - this.offset.setValueY(this.levelAABB.GetTop()); - } - if (this.offset.getValueY() > this.levelAABB.GetBottom()) { - this.offset.setValueY(this.levelAABB.GetBottom()); - } - } - this.UpdatePositionAndSize(); - } - UpdatePositionAndSize() { - this.cameraAABB = new AABB_model_1.AABB(this.offset, this.displayableSize); - } - GetOffsetX() { - return this.offset.getValueX(); - } - GetOffsetY() { - return this.offset.getValueY(); - } - GetOffsetVector() { - return this.offset; - } -} -exports.GameCameraService = GameCameraService; - - -/***/ }), - -/***/ 2655: -/*!************************************************!*\ - !*** ./src/numerics/helpers/vector2.helper.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Vector2Helpers = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../models/Vector2.model */ 2239); -class Vector2Helpers { - /* - * adds two Vector2 together and returns a new Vector2 - * containing the results - */ - static Add(left, right) { - const vecX = left.getValueX() + right.getValueX(); - const vecY = left.getValueY() + right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); - } - /** - * compares two Vector 2s for equality - * If the vectors are identica, this returns true otherwise returns false - * - * @static - * @param {Vector2} left - * @param {Vector2} right - * @returns {boolean} - * @memberof Vector2Helpers - */ - static CompareEquality(left, right) { - return !(left.getValueX() !== right.getValueX() || left.getValueY() !== right.getValueY()); - } - /* - * divides the first vector by the second - * this is not scalar division - */ - static Divide(left, right) { - const vecX = left.getValueX() / right.getValueX(); - const vecY = left.getValueY() / right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); - } - /* - * divides a given source vector2 by a scale factor - */ - static DivideByScale(source, scaleFactor) { - const factor = 1 / scaleFactor; - const vecX = source.getValueX() * factor; - const vecY = source.getValueY() * factor; - return new Vector2_model_1.Vector2(vecX, vecY); - } - /* - * gets the dot product of two vectors, - * returns as a number (float?) - */ - static Dot(left, right) { - const vecX = left.getValueX() * right.getValueX(); - const vecY = left.getValueY() * right.getValueY(); - return vecX + vecY; - } - static Subtract(left, right) { - const vecX = left.getValueX() - right.getValueX(); - const vecY = left.getValueY() - right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); - } - static NegativeOf(source) { - const vecX = -source.getValueX(); - const vecY = -source.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); - } - static Multiply(left, right) { - const vecX = left.getValueX() * right.getValueX(); - const vecY = left.getValueY() * right.getValueY(); - return new Vector2_model_1.Vector2(vecX, vecY); - } - static MultiplyByScale(source, scaleFactor) { - const vecX = source.getValueX() * scaleFactor; - const vecY = source.getValueY() * scaleFactor; - return new Vector2_model_1.Vector2(vecX, vecY); - } -} -exports.Vector2Helpers = Vector2Helpers; - - -/***/ }), - -/***/ 3137: -/*!**********************************************************!*\ - !*** ./src/application/_debug/debuggable-items.model.ts ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DebugKvp = exports.DebuggableItems = void 0; -class DebuggableItems { - constructor() { - this.debugItems = new Array(); - } -} -exports.DebuggableItems = DebuggableItems; -class DebugKvp { - constructor(key, value) { - this.Key = key; - this.Value = value; - } -} -exports.DebugKvp = DebugKvp; - - -/***/ }), - -/***/ 3309: -/*!**************************************************************!*\ - !*** ./src/application/Graphics/Textures/texture.service.ts ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TextureService = void 0; -const Texture2d_1 = __webpack_require__(/*! ./Texture2d */ 6622); -class TextureService { - constructor() { - console.log('constructing texture service'); - this.textures = new Array(); - } - GetTexture(textureId) { - for (let i = 0; i < this.textures.length; i++) { - if (textureId === this.textures[i].GetId()) { - return this.textures[i]; - } - } - } - /** - * registers a new texture in the service. If the texture already - * exists, throws an error and returns the existing one - * - * @param {string} texturePath - * @returns {string} - * @memberof TextureService - */ - RegisterNewTexture(texturePath) { - for (let i = 0; i < this.textures.length; i++) { - const thisTextPath = this.textures[i].GetPath(); - if (thisTextPath === texturePath) { - console.error('attempted to create a texture a second time'); - return this.textures[i].GetId(); - } - } - const newTexture = new Texture2d_1.Texture2D(texturePath); - this.textures.push(newTexture); - console.warn(`texture stack is now [${this.textures.length}] long`); - return newTexture.GetId(); - } -} -exports.TextureService = TextureService; - - -/***/ }), - -/***/ 3536: -/*!********************************************************!*\ - !*** ./src/application/Graphics/Images/ImageHelper.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ImageHelper = void 0; -class ImageHelper { - static NewImage(path) { - const image = new Image(128, 128); - image.src = this.assetBasePath + path; - image.onerror = ((event) => this.onError(event)); - return image; - } - static onError(error) { - console.log('error loading image', error); - return; - } -} -exports.ImageHelper = ImageHelper; -ImageHelper.assetBasePath = './assets/_dist/'; - - -/***/ }), - -/***/ 3754: -/*!*********************************************!*\ - !*** ./src/assets/_dist/Worlds/worlds.json ***! - \*********************************************/ -/***/ ((module) => { - -module.exports = /*#__PURE__*/JSON.parse('[{"worldId":2,"start":{"x":0,"y":0},"tiles":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]},{"worldId":1,"start":{"x":0,"y":0},"tiles":[[9,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9],[2,3,2,6,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,5,9,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,12,12,12,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,17,17,17,17,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,2,2,2,2,2,2,2,2,2,9],[20,16,16,16,16,16,2,2,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,2,2,2,2,9],[16,16,16,16,16,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9],[9,14,14,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9]]},{"worldId":0,"start":{"x":0,"y":0},"tiles":[[0,0,0,0],[0,0,0,0],[0,0,0,0]]}]'); - -/***/ }), - -/***/ 4288: -/*!******************************************************!*\ - !*** ./src/application/Graphics/graphics.service.ts ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraphicsService = void 0; -const graphics_html_service_1 = __webpack_require__(/*! ./Html/graphics.html.service */ 7415); -const graphics_canvas_service_1 = __webpack_require__(/*! ./Canvas/graphics.canvas.service */ 9855); -const tile_service_1 = __webpack_require__(/*! ./Tiles/tile.service */ 6247); -const game_camera_service_1 = __webpack_require__(/*! ./Camera/game-camera.service */ 2451); -const drawing_service_1 = __webpack_require__(/*! ./Draw/drawing.service */ 6726); -const texture_service_1 = __webpack_require__(/*! ./Textures/texture.service */ 3309); -class GraphicsService { - constructor() { - console.log('starting graphics service'); - this.htmlService = new graphics_html_service_1.HtmlService(); - this.canvasService = new graphics_canvas_service_1.CanvasService(this.htmlService); - this.tileService = new tile_service_1.TileService(this.canvasService, this); - this.textureService = new texture_service_1.TextureService(); - const applyCameraWorldBounding = false; - this.gameCameraService = new game_camera_service_1.GameCameraService(0, 0, applyCameraWorldBounding); - this.drawingService = new drawing_service_1.DrawingService(this.gameCameraService, this.canvasService, this.textureService); - } - InitGraphicsService() { - this.htmlService.Init(); - this.canvasService.Init(); - this.tileService.Init(); - } - GetTextureService() { - return this.textureService; - } - GetTileService() { - return this.tileService; - } - getGameCameraService() { - return this.gameCameraService; - } - getDrawingService() { - return this.drawingService; - } - RegisterDrawableEntity(id = null) { - return this.canvasService.RegisterNewCanvas(id); - } - GetCanvas(id) { - return this.canvasService.GetCanvas(id); - } - Render() { - // console.log('rendering in graphics service'); - this.canvasService.mainCanvasCtx.clearRect(0, 0, this.canvasService.mainCanvas.width, this.canvasService.mainCanvas.height); - for (let i = 0; i < this.canvasService.drawableAreas.length; i++) { - this.canvasService.mainCanvasCtx.drawImage(this.canvasService.drawableAreas[i].canvas, 0, 0); - } - } -} -exports.GraphicsService = GraphicsService; - - -/***/ }), - -/***/ 4312: -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DirtTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class DirtTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#916D49', textId); - } -} -exports.DirtTileType = DirtTileType; -DirtTileType.texturePath = '/Tiles/ground/dirt.png'; - - -/***/ }), - -/***/ 4554: -/*!**************************************************!*\ - !*** ./src/application/World/world.jsonfiles.ts ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WorldJsonFileLoader = void 0; -const json = __importStar(__webpack_require__(/*! ../../assets/_dist/Worlds/worlds.json */ 3754)); -const world_1 = __webpack_require__(/*! ./world */ 289); -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); -/** - * this is in a different file because adding .json files - * causes VSCode to only want to load .js imports, and not - * .ts imports - * - * @export - * @class WorldJsonFileLoader - */ -class WorldJsonFileLoader { - constructor() { - } - static GetWorlds() { - const worldArr = new Array(); - for (let i = 0; i < this.worldCount; i++) { - const world = json[i]; - worldArr.push(new world_1.World(new Vector2_model_1.Vector2(world.tiles.length, world.tiles[0].length), new Vector2_model_1.Vector2(world.start.x, world.start.y), world.tiles, world.worldId)); - } - return worldArr; - } -} -exports.WorldJsonFileLoader = WorldJsonFileLoader; -WorldJsonFileLoader.worldCount = 2; - - -/***/ }), - -/***/ 4881: -/*!********************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts ***! - \********************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ShallowWaterTileTypeSandLeft = exports.ShallowWaterTileTypeSandBottom = exports.ShallowWaterTileTypeSandRight = exports.ShallowWaterTileTypeSandTop = exports.ShallowWaterTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class ShallowWaterTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -exports.ShallowWaterTileType = ShallowWaterTileType; -ShallowWaterTileType.texturePath = '/Tiles/ground/shallow_water.png'; -class ShallowWaterTileTypeSandTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -exports.ShallowWaterTileTypeSandTop = ShallowWaterTileTypeSandTop; -ShallowWaterTileTypeSandTop.texturePath = '/Tiles/ground/shallow_water_sand_top.png'; -class ShallowWaterTileTypeSandRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -exports.ShallowWaterTileTypeSandRight = ShallowWaterTileTypeSandRight; -ShallowWaterTileTypeSandRight.texturePath = '/Tiles/ground/shallow_water_sand_right.png'; -class ShallowWaterTileTypeSandBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -exports.ShallowWaterTileTypeSandBottom = ShallowWaterTileTypeSandBottom; -ShallowWaterTileTypeSandBottom.texturePath = '/Tiles/ground/shallow_water_sand_bottom.png'; -class ShallowWaterTileTypeSandLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#4380E4', textId); - } -} -exports.ShallowWaterTileTypeSandLeft = ShallowWaterTileTypeSandLeft; -ShallowWaterTileTypeSandLeft.texturePath = '/Tiles/ground/shallow_water_sand_left.png'; - - -/***/ }), - -/***/ 5277: -/*!***************************************************!*\ - !*** ./src/application/_debug/debug.component.ts ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DebugComponent = void 0; -class DebugComponent { - constructor(debugService) { - this.debugService = debugService; - this._debugService = debugService; - } - InitDebugComponent(mainDivId) { - this.createDebugDiv(mainDivId); - this.tick(); - } - createDebugDiv(parentElementId, id = 'el_debug_info') { - if (this.debugService.IsInDebugMode()) { - const mainDiv = document.getElementById(parentElementId); - this.debugInfoElement = document.createElement('div'); - this.debugInfoElement.id = id; - mainDiv.appendChild(this.debugInfoElement); - for (let i = 0; i < 10; i++) { - this.debugService.PushOrUpdateInDebugArray('Debug Info' + i, 'debug value'); - } - // this.debugService.PopFromDebugArray('Debug Info') - return this.debugInfoElement; - } - } - tick() { - // setTimeout(() => { - // this.ticks++; - // }); - requestAnimationFrame(() => { - // console.log('updating debugger') - this.Update(); - this.tick(); - }); - } - Update() { - // console.log(this.debugService.GetDebugInfo(), null, 2) - let DebugsAsString = ''; - const debugInfoArray = this.debugService.GetDebugInfo(); - for (let i = 0; i < debugInfoArray.length; i++) { - // DebugsAsString += this.GetTemplateForKvp(debugInfoArray[i]); - } - this.debugInfoElement.innerHTML = DebugsAsString; - } - GetTemplateForKvp(item) { - throw new Error('not implemented'); - // removed by dead control flow -{} - } -} -exports.DebugComponent = DebugComponent; - - -/***/ }), - -/***/ 5537: -/*!*******************************************!*\ - !*** ./src/numerics/models/AABB.model.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AABB = void 0; -const Vector2_model_1 = __webpack_require__(/*! ./Vector2.model */ 2239); -class AABB { - constructor(position, size) { - this.min = new Vector2_model_1.Vector2(position.getValueX(), position.getValueY()); - this.max = new Vector2_model_1.Vector2(position.getValueX() + size.getValueX(), position.getValueY() + size.getValueY()); - } - GetCenter() { - const x = ((this.max.x - this.min.x) / 2) + this.min.x; - const y = ((this.max.y - this.min.y) / 2) + this.min.y; - return new Vector2_model_1.Vector2(x, y); - } - GetTop() { - return this.min.getValueY(); - } - GetBottom() { - return this.max.getValueY(); - } - GetLeft() { - return this.min.getValueX(); - } - GetRight() { - return this.max.getValueX(); - } - IsAbove(target) { - if (this.GetBottom() < target.GetTop()) { - return true; - } - return false; - } - IsBelow(target) { - if (this.GetTop() > target.GetBottom()) { - return true; - } - return false; - } - IsRight(target) { - if (this.GetRight() < target.GetLeft()) { - return true; - } - return false; - } - IsLeft(target) { - if (this.GetLeft() > target.GetRight()) { - return true; - } - return false; - } -} -exports.AABB = AABB; - - -/***/ }), - -/***/ 5622: -/*!***********************************************!*\ - !*** ./src/application/Input/InputManager.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.InputManager = void 0; -const input_state_1 = __webpack_require__(/*! ./input-state */ 2185); -class InputManager { - constructor() { - this.gamePads = Array(); - this.inputState = new input_state_1.InputState(); - this.currentInputs = new Array(); - this.gamePads = new Array(); - } - /** - * sets up the input manager - * - * @memberof InputManager - */ - InitInputManager() { - this.inputState.Init(); - // return; - } - /** - * checks for new inputs. Should be called in a loop - * - * @memberof InputManager - */ - NewInputLoopCheck() { - this.inputState.UpdateInputs(); - // throw new Error("Method not implemented."); - } - // private RegisterGamePad(pad: Gamepad) { - // console.warn('gamepad registered'); - // console.warn("Gamepad: connected at index %d: %s. %d buttons, %d axes.", - // pad.index, pad.id, - // pad.buttons.length, pad.axes.length); - // this.gamePads = navigator.getGamepads(); - // // this.gamePads.push(pad); // = navigator.getGamepads ? navigator.getGamepads() : (navigator.getGamepads ? navigator.getGamepads : []); - // for (let i = 0; i < this.gamePads.length; i++) { - // const thisGp = this.gamePads[i]; - // if (thisGp) { - // this.detailsDiv.innerHTML = "Gamepad connected at index " + thisGp.index + ": " + thisGp.id + - // ". It has " + thisGp.buttons.length + " buttons and " + thisGp.axes.length + " axes."; - // } - // } - // } - // private DeRegisterGamePad(pad: Gamepad) { - // console.warn('deregistering gamepad'); - // delete this.gamePads[pad.index]; - // this.ReportToHtml("gamepad DC"); - // } - /** - * public method to check if a key is pressed or not - * - * @param {string} key - * @returns - * @memberof InputManager - */ - IsKeyPressed(inputDescription) { - return this.inputState.IsInputPressed(inputDescription); - } - /** - * gets the force value for a given input. If it's in - * keyboard mode, then it just returns 0 or 1 - * - * If it's in keyboard mode, then it returns a value of -1.0 to +1.0 - * - * @param {string} inputDescription - * @returns {number} - * @memberof InputManager - */ - GetForceValue(inputDescription) { - return this.inputState.GetForceValue(inputDescription); - } -} -exports.InputManager = InputManager; -InputManager.validInputs = ['w', 'a', 's', 'd', ' ']; - - -/***/ }), - -/***/ 6012: -/*!*****************************************************************************!*\ - !*** ./src/application/Tools/random_generators/random_number.generators.ts ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RandomNumberGenerator = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class RandomNumberGenerator { - /** - * Generates a random number - * - * @static - * @param {number} min - * @param {number} max - * @returns {number} - * @memberof RandomNumberGenerator - */ - static GetRandomNumber(min, max) { - return Math.floor(Math.random() * (max - min + 1) + min); - } - /** - * generates a random Vector 2 - * - * @static - * @param {number} minX - * @param {number} maxX - * @param {number} minY - * @param {number} maxY - * @returns {Vector2} - * @memberof RandomNumberGenerator - */ - static GetRandomVector2(minX, maxX, minY, maxY) { - return new Vector2_model_1.Vector2(this.GetRandomNumber(minX, maxX), this.GetRandomNumber(minY, maxY)); - } -} -exports.RandomNumberGenerator = RandomNumberGenerator; - - -/***/ }), - -/***/ 6247: -/*!********************************************************!*\ - !*** ./src/application/Graphics/Tiles/tile.service.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TileService = void 0; -const space_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/space.tiletype */ 1874); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -const tile_default_settings_1 = __webpack_require__(/*! ./tile.default.settings */ 6538); -const drawable_tile_1 = __webpack_require__(/*! ./drawable-tile */ 961); -const grass_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/grass.tiletype */ 8241); -const star_tiletype_1 = __webpack_require__(/*! ./TileTypes/SpaceTileTypes/star.tiletype */ 1226); -const dirt_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/dirt.tiletype */ 4312); -const sand_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/sand.tiletype */ 7769); -const shallow_water_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/shallow-water.tiletype */ 4881); -const stone_tiletype_1 = __webpack_require__(/*! ./TileTypes/GroundTileTypes/stone.tiletype */ 6716); -class TileService { - constructor(canvasService, graphicsService) { - this.tileSize = tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE; - this.tileTypes = new Array(256); - this.tiles = new Array(); - this.graphicsService = graphicsService; - this.canvasService = canvasService; - } - Init() { - this.tileCanvasId = this.canvasService.RegisterNewCanvas(); - this.spaceTileType = new space_tiletype_1.SpaceTileType(0, this.graphicsService.GetTextureService().RegisterNewTexture(space_tiletype_1.SpaceTileType.texturePath)); - this.starTileType = new star_tiletype_1.StarTileType(1, this.graphicsService.GetTextureService().RegisterNewTexture(star_tiletype_1.StarTileType.texturePath)); - this.grassTileType = new grass_tiletype_1.GrassTileType(2, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileType.texturePath)); - this.grassTileTypeDirt = new grass_tiletype_1.GrassTileTypeDirt(3, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirt.texturePath)); - this.grassTileTypeDirtTop = new grass_tiletype_1.GrassTileTypeDirtTop(4, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtTop.texturePath)); - this.grassTileTypeDirtRight = new grass_tiletype_1.GrassTileTypeDirtRight(5, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtRight.texturePath)); - this.grassTileTypeBottom = new grass_tiletype_1.GrassTileTypeDirtBottom(6, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtBottom.texturePath)); - this.grassTileTypeLeft = new grass_tiletype_1.GrassTileTypeDirtLeft(7, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtLeft.texturePath)); - this.grassTileTypeMiddle = new grass_tiletype_1.GrassTileTypeDirtMiddle(8, this.graphicsService.GetTextureService().RegisterNewTexture(grass_tiletype_1.GrassTileTypeDirtMiddle.texturePath)); - this.dirtTileType = new dirt_tiletype_1.DirtTileType(9, this.graphicsService.GetTextureService().RegisterNewTexture(dirt_tiletype_1.DirtTileType.texturePath)); - this.stoneTileType = new stone_tiletype_1.StoneTileType(10, this.graphicsService.GetTextureService().RegisterNewTexture(stone_tiletype_1.StoneTileType.texturePath)); - this.sandTileType = new sand_tiletype_1.SandTileType(11, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileType.texturePath)); - this.sandTileTypeDirtTop = new sand_tiletype_1.SandTileTypeGrassTop(12, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassTop.texturePath)); - this.sandTileTypeDirtRight = new sand_tiletype_1.SandTileTypeGrassRight(13, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassRight.texturePath)); - this.sandTileTypeBottom = new sand_tiletype_1.SandTileTypeGrassBottom(14, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassBottom.texturePath)); - this.sandTileTypeLeft = new sand_tiletype_1.SandTileTypeGrassLeft(15, this.graphicsService.GetTextureService().RegisterNewTexture(sand_tiletype_1.SandTileTypeGrassLeft.texturePath)); - this.shallowWaterTileType = new shallow_water_tiletype_1.ShallowWaterTileType(16, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileType.texturePath)); - this.shallowWaterTileTypeDirtTop = new shallow_water_tiletype_1.ShallowWaterTileTypeSandTop(17, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandTop.texturePath)); - this.shallowWaterTileTypeDirtRight = new shallow_water_tiletype_1.ShallowWaterTileTypeSandRight(18, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandRight.texturePath)); - this.shallowWaterTileTypeBottom = new shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom(19, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandBottom.texturePath)); - this.shallowWaterTileTypeLeft = new shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft(20, this.graphicsService.GetTextureService().RegisterNewTexture(shallow_water_tiletype_1.ShallowWaterTileTypeSandLeft.texturePath)); - this.setupTileTypes(); - // this.setupTiles(); - } - setupTileTypes() { - this.tileTypes[this.spaceTileType.GetId()] = this.spaceTileType; - this.tileTypes[this.starTileType.GetId()] = this.starTileType; - this.tileTypes[this.grassTileType.GetId()] = this.grassTileType; - this.tileTypes[this.grassTileTypeDirt.GetId()] = this.grassTileTypeDirt; - this.tileTypes[this.grassTileTypeDirtTop.GetId()] = this.grassTileTypeDirtTop; - this.tileTypes[this.grassTileTypeDirtRight.GetId()] = this.grassTileTypeDirtRight; - this.tileTypes[this.grassTileTypeBottom.GetId()] = this.grassTileTypeBottom; - this.tileTypes[this.grassTileTypeLeft.GetId()] = this.grassTileTypeLeft; - this.tileTypes[this.grassTileTypeMiddle.GetId()] = this.grassTileTypeMiddle; - this.tileTypes[this.dirtTileType.GetId()] = this.dirtTileType; - this.tileTypes[this.stoneTileType.GetId()] = this.stoneTileType; - this.tileTypes[this.sandTileType.GetId()] = this.sandTileType; - this.tileTypes[this.sandTileTypeDirtTop.GetId()] = this.sandTileTypeDirtTop; - this.tileTypes[this.sandTileTypeDirtRight.GetId()] = this.sandTileTypeDirtRight; - this.tileTypes[this.sandTileTypeBottom.GetId()] = this.sandTileTypeBottom; - this.tileTypes[this.sandTileTypeLeft.GetId()] = this.sandTileTypeLeft; - this.tileTypes[this.shallowWaterTileType.GetId()] = this.shallowWaterTileType; - this.tileTypes[this.shallowWaterTileTypeDirtTop.GetId()] = this.shallowWaterTileTypeDirtTop; - this.tileTypes[this.shallowWaterTileTypeDirtRight.GetId()] = this.shallowWaterTileTypeDirtRight; - this.tileTypes[this.shallowWaterTileTypeBottom.GetId()] = this.shallowWaterTileTypeBottom; - this.tileTypes[this.shallowWaterTileTypeLeft.GetId()] = this.shallowWaterTileTypeLeft; - } - /** - * returns a Vector 2 containing a size - * - * @param {number[][]} tiles - * @returns {Vector2} - * @memberof TileService - */ - setupTilesFromArray(tiles) { - const size = new Vector2_model_1.Vector2(0, 0); - // const canvId = `${this.graphicsService.RegisterDrawableEntity('texts')}`; - for (let x = 0; x < tiles.length; x++) { - for (let y = 0; y < tiles[x].length; y++) { - this.tiles.push(new drawable_tile_1.DrawableTile(tiles[x][y], new Vector2_model_1.Vector2(y * this.GetTileSize().getValueX(), x * this.GetTileSize().getValueY()), tile_default_settings_1.TileDefaultSettings.DEFAULT_SIZE, this.tileTypes[tiles[x][y]].GetFallbackColour(), this.tileCanvasId, this.tileTypes[tiles[x][y]].GetTextureId())); - } - } - return size; - } - PreClearCanvas() { - const canv = this.graphicsService.GetCanvas(this.tileCanvasId); - canv.ClearCanvas(); - } - Redner() { - this.PreClearCanvas(); - for (let i = 0; i < this.tiles.length; i++) { - this.graphicsService.getDrawingService().Draw(this.tiles[i], true); - } - } - GetTileSize() { - return this.tileSize; - } -} -exports.TileService = TileService; - - -/***/ }), - -/***/ 6417: -/*!*************************************************!*\ - !*** ./src/application/_debug/debug.service.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DebugService = void 0; -const debuggable_items_model_1 = __webpack_require__(/*! ./debuggable-items.model */ 3137); -class DebugService { - constructor(inDebugMode = false) { - console.warn(`starting debug service. inDebugMode [${inDebugMode}]`); - this.inDebugMode = inDebugMode; - this.DebugInfo = new debuggable_items_model_1.DebuggableItems(); - } - IsInDebugMode() { - return this.inDebugMode; - } - GetDebugInfo() { - return this.DebugInfo.debugItems; - } - PushOrUpdateInDebugArray(key, value) { - console.log(`adding item ${key} to debug array`); - if (!this.checkForExisting(key)) { - this.DebugInfo.debugItems.push(new debuggable_items_model_1.DebugKvp(key, value)); - return; - } - else { - if (this.PopFromDebugArray(key)) { - this.PushOrUpdateInDebugArray(key, value); - console.info(`successfully updated [${key}] in debug KVP`); - return; - } - } - console.error(`attempted to push or update [${key}], but the item didn't exist in the KVP`); - } - PopFromDebugArray(key) { - console.log(`removing item ${key} to debug array`); - for (let i = 0; i < this.DebugInfo.debugItems.length; i++) { - if (this.DebugInfo.debugItems[i].Key === key) { - this.DebugInfo.debugItems.splice(i, 1); - return; - } - } - console.error(`attempted to remove [${key} from debug KVP, but it couldn't be found]`); - return false; - } - checkForExisting(key) { - return false; - } -} -exports.DebugService = DebugService; - - -/***/ }), - -/***/ 6538: -/*!*****************************************************************!*\ - !*** ./src/application/Graphics/Tiles/tile.default.settings.ts ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TileDefaultSettings = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class TileDefaultSettings { -} -exports.TileDefaultSettings = TileDefaultSettings; -TileDefaultSettings.DEFAULT_SIZE = new Vector2_model_1.Vector2(64, 64); - - -/***/ }), - -/***/ 6622: -/*!********************************************************!*\ - !*** ./src/application/Graphics/Textures/Texture2d.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Texture2D = void 0; -const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ 6953); -const ImageHelper_1 = __webpack_require__(/*! ../Images/ImageHelper */ 3536); -class Texture2D { - constructor(path) { - this.path = path; - this.url = path; - this.id = random_guid_generator_1.GuidGenerator.NewGuid(); - this.image = ImageHelper_1.ImageHelper.NewImage(this.url); - this.image.onload = (() => { - this.imageCanRender = true; - }); - this.image.onerror = (() => { - this.imageCanRender = false; - console.error('text2d: image could not render'); - }); - } - GetPath() { - return this.path; - } - /** - * GetId - */ - GetId() { - return this.id; - } - /** - * GetUrl - */ - GetImage() { - return this.image; - } - /** - * returns imageCanRender. If the image is successfully loaded, - * this returns true. Otherwise returns false - * - * @returns - * @memberof Texture2D - */ - GetCanRender() { - return this.imageCanRender; - } -} -exports.Texture2D = Texture2D; - - -/***/ }), - -/***/ 6695: -/*!*****************************************************!*\ - !*** ./src/numerics/helpers/intersection.helper.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.IntersectionHelper = void 0; -class IntersectionHelper { - // checks if two AABBs intersect (rectangle only) - static AabbVsAabb(left, right) { - if ((left.max.getValueX() < right.min.getValueX()) || (left.min.getValueX() > right.max.getValueX())) { - return false; - } - if ((left.max.getValueY() < right.min.getValueY()) || (left.min.getValueY() > right.max.getValueY())) { - return false; - } - return true; - } -} -exports.IntersectionHelper = IntersectionHelper; - - -/***/ }), - -/***/ 6716: -/*!************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts ***! - \************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StoneTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class StoneTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#52504F', textId); - } -} -exports.StoneTileType = StoneTileType; -StoneTileType.texturePath = '/Tiles/ground/stone.png'; - - -/***/ }), - -/***/ 6726: -/*!**********************************************************!*\ - !*** ./src/application/Graphics/Draw/drawing.service.ts ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DrawingService = void 0; -class DrawingService { - constructor(cameraService, canvasService, textureService) { - this.allowTextureDrawing = true; - this.drawAsStroke = true; - this.textureService = textureService; - this.canvasService = canvasService; - this.cameraService = cameraService; - console.log('constructing drawing service'); - } - Draw(drawable, skipCanvasClear = false) { - const deg = drawable.GetRotation(); - if (this.cameraService.IsObjectOnScreenAABB(drawable.getAABB())) { - const canv = this.canvasService.GetCanvas(drawable.getCanvasId()); - var rad = deg * (Math.PI / 180); - if (!skipCanvasClear) { - canv.ClearCanvas(); - } - canv.ctx.save(); - // canv.ctx.scale(0.5, 0.5); - const translateX = drawable.GetSizeX() + (drawable.GetPositionX() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetX()); // + (drawable.GetSizeX() / 2));// + this.cameraService.GetOffsetY(); - const translateY = drawable.GetSizeX() + (drawable.GetPositionY() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetY()); // + (drawable.GetSizeY() / 2));// + this.cameraService.GetOffsetY(); - canv.ctx.translate(translateX, translateY); - canv.ctx.rotate(rad); - const drawLocationX = -drawable.GetSizeX() / 2; // / 2;// ; - const drawLocationY = -drawable.GetSizeY() / 2; // / 2;// - this.cameraService.GetOffsetY(); - const drawSizeX = drawable.GetSizeX(); - const drawSizeY = drawable.GetSizeY(); - const texture = this.textureService.GetTexture(drawable.GetTextureId()); - if (this.allowTextureDrawing && texture && texture.GetCanRender()) { - this.DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - else if (false) // removed by dead control flow -{} - else { - // if (drawable.GetTextureId()) { - // console.log(` - // text: ${texture.GetId()} - // rend: ${texture.GetCanRender()}`); - // } - this.DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - // detranslates the canvas - canv.ctx.translate(-(translateX), -(translateY)); - canv.ctx.restore(); - } - } - // private rotate(ctx) { - // //Convert degrees to radian - // var rad = deg * Math.PI / 180; - // //Set the origin to the center of the image - // ctx.translate(x + width / 2, y + height / 2); - // //Rotate the canvas around the origin - // ctx.rotate(rad); - // //draw the image - // ctx.drawImage(img, width / 2 * (-1), height / 2 * (-1), width, height); - // //reset the canvas - // ctx.rotate(rad * (-1)); - // ctx.translate((x + width / 2) * (-1), (y + height / 2) * (-1)); - // } - DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { - canv.ctx.strokeStyle = '#fff'; - canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); - canv.ctx.drawImage(texture.GetImage(), drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY) { - if (this.drawAsStroke) { - canv.ctx.strokeStyle = drawable.GetColour(); - canv.ctx.strokeRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - else { - canv.ctx.fillStyle = drawable.GetColour(); - canv.ctx.fillRect(drawLocationX, drawLocationY, drawSizeX, drawSizeY); - } - } -} -exports.DrawingService = DrawingService; - - -/***/ }), - -/***/ 6953: -/*!**************************************************************************!*\ - !*** ./src/application/Tools/random_generators/random_guid.generator.ts ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GuidGenerator = void 0; -class GuidGenerator { - /** - * returns a new guid - * - * https://stackoverflow.com/a/2117523 - * - * @export - * @returns a guid - */ - static NewGuid() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - } -} -exports.GuidGenerator = GuidGenerator; - - -/***/ }), - -/***/ 7267: -/*!***************************************************!*\ - !*** ./src/application/Graphics/Draw/drawable.ts ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Drawable = void 0; -const AABB_model_1 = __webpack_require__(/*! ../../../numerics/models/AABB.model */ 5537); -class Drawable { - constructor(position, size, canvasId, textureId) { - console.log(`drawable constructor`); - this.position = position; - this.size = size; - this.AABB = new AABB_model_1.AABB(this.position, this.size); - this.canvasId = canvasId; - this.rotationDegrees = 0; - this.textureId = textureId; - } - getCanvasId() { - return this.canvasId; - } - setCanvasId(canvasId) { - this.canvasId = canvasId; - } - GetTextureId() { - return this.textureId; - } - SetTextureId(textureId) { - this.textureId = textureId; - } - getAABB() { - if (this.AABB === undefined) { - this.UpdateAABB(); - } - return this.AABB; - } - setAABB(AABB) { - this.AABB = AABB; - } - UpdateAABB() { - this.setAABB(new AABB_model_1.AABB(this.position, this.size)); - } - GetPositionX() { - return this.position.x; - } - GetPositionY() { - return this.position.y; - } - GetSizeX() { - return this.size.x; - } - GetSizeY() { - return this.size.y; - } - GetColour() { - if (this.colour) { - return this.colour; - } - else { - return '#f00'; - } - } - GetRotation() { - return this.rotationDegrees; - } - AddToRotation(val) { - this.rotationDegrees += val; - if (this.rotationDegrees > 359) { - this.rotationDegrees = 0; - } - else if (this.rotationDegrees < 0) { - this.rotationDegrees = 359; - } - } -} -exports.Drawable = Drawable; - - -/***/ }), - -/***/ 7415: -/*!****************************************************************!*\ - !*** ./src/application/Graphics/Html/graphics.html.service.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HtmlService = void 0; -class HtmlService { - constructor() { - console.log('creating Html Helper Service in Graphics'); - } - Init() { - this.createMainDiv('main_div'); - } - GetMainDiv() { - return this.mainDiv; - } - createMainDiv(id = 'main_div') { - this.mainDiv = document.createElement('div'); - this.mainDiv.id = id; - document.body.appendChild(this.mainDiv); - return this.mainDiv.id; - } - createCanvas(id, attatchTo, width, height, classList = null) { - const canvas = document.createElement('canvas'); - canvas.id = id; - canvas.width = width; - canvas.height = height; - if (classList != null) { - for (let i = 0; i < classList.length; i++) { - canvas.classList.add(classList[i]); - } - } - document.getElementById(attatchTo).appendChild(canvas); - return canvas; - } -} -exports.HtmlService = HtmlService; - - -/***/ }), - -/***/ 7467: -/*!*********************************************************************!*\ - !*** ./src/application/Graphics/Models/graphics.drawable-canvas.ts ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DrawableCanvas = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -class DrawableCanvas extends Vector2_model_1.Vector2 { - constructor(canvas, id, width, height) { - super(width, height); - this.id = id; - this.canvas = canvas; - this.ctx = this.canvas.getContext('2d'); - } - GetWidth() { - return this.getValueX(); - } - GetHeight() { - return this.getValueY(); - } - ClearCanvas() { - this.ctx.clearRect(0, 0, this.getValueX(), this.getValueY()); - } - PaintImmediately() { - this.ctx.drawImage(this.canvas, 0, 0); - } -} -exports.DrawableCanvas = DrawableCanvas; - - -/***/ }), - -/***/ 7594: -/*!****************************************************!*\ - !*** ./src/application/Entities/player.service.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.PlayerService = void 0; -class PlayerService { - constructor() { - } - SetPlayer(player) { - if (this.player !== undefined) { - console.error(`playerService.SetPlayer would overwrite the existing player`); - } - else { - console.warn('setting player'); - this.player = player; - } - } - GetPlayer() { - return this.player; - } -} -exports.PlayerService = PlayerService; - - -/***/ }), - -/***/ 7709: -/*!*****************************************************!*\ - !*** ./src/application/Entities/Creatures/baddy.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Baddy = void 0; -const creature_1 = __webpack_require__(/*! ./creature */ 2228); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ 8249); -const number_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/number.helper */ 1759); -class Baddy extends creature_1.Creature { - constructor(position, size, name, texturePath, graphicsService, colour, playerService) { - super(position, size, name, texturePath, graphicsService); - this.playerService = playerService; - this.colour = colour; - this.maxSpeed = new Vector2_model_1.Vector2(10, 10); - this.acceleration = new Vector2_model_1.Vector2(.55, .6); - // const friction = 0.85; // RandomNumberGenerator.GetRandomNumber(100, 200) / 1000; - // this.friction = new Vector2(friction, - // friction); - this.direction = new Vector2_model_1.Vector2(0, 0); - // this.velocity = RandomNumberGenerator.GetRandomVector2(-10, 10, -10, 10); - this.rotationDegrees = 0; // RandomNumberGenerator.GetRandomNumber(0, 359); - this.turnSpeed = .0515; - this.thrust = 1; - } - Tick(lastDelta) { - this.UpdateAABB(); - const playerAABB = this.playerService.GetPlayer().getAABB(); - this.MoveToPlayer(playerAABB); - this.Move(lastDelta); - } - Render() { - // super.Draw(this.colour); - } - collideWithObject(entity) { - console.log('colliding with object'); - } - turnToPlayer(playerAABB) { - let dx = playerAABB.GetCenter().getValueX() - this.getAABB().GetCenter().getValueX(); - let dy = playerAABB.GetCenter().getValueY() - this.getAABB().GetCenter().getValueY(); - const len = Math.sqrt(dx * dy + dy * dy); - dx /= len ? len : 0.1; - dy /= len ? len : 0.1; - let dirX = Math.cos((0, degrees_helper_1.Radians)(this.rotationDegrees)); - let dirY = Math.sin((0, degrees_helper_1.Radians)(this.rotationDegrees)); - dirX += (dx - dirX) * 1; - dirY += (dy - dirY) * 1; - const rotateTo = Math.atan2(dirY, dirX); - // this.rotationDegrees = Degrees(rotateTo) + (90); - this.rotationDegrees = (0, number_helper_1.Lerp)(this.rotationDegrees, (0, degrees_helper_1.Degrees)(rotateTo) + (-this.angleAdjust), .5); - } - MoveToPlayer(playerAABB) { - this.turnToPlayer(playerAABB); - const rotationAsRadians = (0, degrees_helper_1.Radians)(this.rotationDegrees - this.angleAdjust); - const rotSin = Math.sin(rotationAsRadians); - const rotCos = Math.cos(rotationAsRadians); - this.velocity.x -= (rotCos * this.thrust); - this.velocity.y -= (rotSin * this.thrust); - // const rotationAsRadians = this.rotationDegrees / Math.PI * 180; - // const rotCos = Math.sin(rotationAsRadians); - // const rotSin = Math.cos(rotationAsRadians); - // this.velocity.x = (rotSin * thrust); - // this.velocity.y = (rotCos * thrust); - // console.log(`baddy: - // rotation: ${this.rotationDegrees} - // CosRotation: ${rotCos} - // SinRotation: ${rotSin} - // velocity: ${this.velocity.concat()}`); - // if (IntersectionHelper.AabbVsAabb( - // this.getAABB(), playerAABB) === false) { - // if (this.getAABB().IsAbove(playerAABB)) { - // this.setDirectionDown(); - // this.velocity.y += this.acceleration.y; - // // console.log('entity is above player') - // } else if (this.getAABB().IsBelow(playerAABB)) { - // this.setDirectionUp(); - // // console.log('entity is above player') - // this.velocity.y -= this.acceleration.y; // console.log('entity is below player') - // } - // if (this.getAABB().IsRight(playerAABB)) { - // this.setDirectionLeft(); - // // console.log('entity is right of the player'); - // this.velocity.x += this.acceleration.x; - // } else if (this.getAABB().IsLeft(playerAABB)) { - // this.setDirectionRigth(); - // // console.log('entity is left of the player') - // this.velocity.x -= this.acceleration.x; - // } - // } - // this.velocity.x -= (this.getDirectionHorizontal() * this.acceleration.x) / 4; - // this.velocity.y += (this.getDirectionVertical() * this.acceleration.y) / 4; - } - setDirectionRigth() { - this.direction.setValueX(1); - } - setDirectionLeft() { - this.direction.setValueX(-1); - } - setDirectionUp() { - this.direction.setValueY(-1); - } - setDirectionDown() { - this.direction.setValueY(1); - } - getDirectionHorizontal() { - return this.direction.getValueX(); - } - getDirectionVertical() { - return this.direction.getValueY(); - } -} -exports.Baddy = Baddy; - - -/***/ }), - -/***/ 7769: -/*!***********************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SandTileTypeGrassLeft = exports.SandTileTypeGrassBottom = exports.SandTileTypeGrassRight = exports.SandTileTypeGrassTop = exports.SandTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class SandTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); - } -} -exports.SandTileType = SandTileType; -SandTileType.texturePath = '/Tiles/ground/sand.png'; -class SandTileTypeGrassTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); - } -} -exports.SandTileTypeGrassTop = SandTileTypeGrassTop; -SandTileTypeGrassTop.texturePath = '/Tiles/ground/sand_grass_top.png'; -class SandTileTypeGrassRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); - } -} -exports.SandTileTypeGrassRight = SandTileTypeGrassRight; -SandTileTypeGrassRight.texturePath = '/Tiles/ground/sand_grass_right.png'; -class SandTileTypeGrassBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); - } -} -exports.SandTileTypeGrassBottom = SandTileTypeGrassBottom; -SandTileTypeGrassBottom.texturePath = '/Tiles/ground/sand_grass_bottom.png'; -class SandTileTypeGrassLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#C1C128', textId); - } -} -exports.SandTileTypeGrassLeft = SandTileTypeGrassLeft; -SandTileTypeGrassLeft.texturePath = '/Tiles/ground/sand_grass_left.png'; - - -/***/ }), - -/***/ 7918: -/*!*********************************************!*\ - !*** ./src/application/states/GameState.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GameState = void 0; -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); -class GameState extends _BaseState_1.BaseState { - constructor(graphicsService) { - super(); - this.graphicsService = graphicsService; - console.log('constructing GameState'); - } - Tick() { - // console.error("Method not implemented."); - // this.graphicsService.getGameCameraService().MoveCamera(1, 0); - } - Render() { - // console.error("Method not implemented."); - } -} -exports.GameState = GameState; - - -/***/ }), - -/***/ 8241: -/*!************************************************************************************!*\ - !*** ./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts ***! - \************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GrassTileTypeDirtMiddle = exports.GrassTileTypeDirtLeft = exports.GrassTileTypeDirtBottom = exports.GrassTileTypeDirtRight = exports.GrassTileTypeDirtTop = exports.GrassTileTypeDirt = exports.GrassTileType = void 0; -const _base_tiletype_1 = __webpack_require__(/*! ../_base-tiletype */ 659); -class GrassTileType extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileType = GrassTileType; -GrassTileType.texturePath = '/Tiles/ground/grass.png'; -class GrassTileTypeDirt extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#87CC6F', textId); - } -} -exports.GrassTileTypeDirt = GrassTileTypeDirt; -GrassTileTypeDirt.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; -class GrassTileTypeDirtTop extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileTypeDirtTop = GrassTileTypeDirtTop; -GrassTileTypeDirtTop.texturePath = '/Tiles/ground/grass_with_dirt_top.png'; -class GrassTileTypeDirtRight extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileTypeDirtRight = GrassTileTypeDirtRight; -GrassTileTypeDirtRight.texturePath = '/Tiles/ground/grass_with_dirt_right.png'; -class GrassTileTypeDirtBottom extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileTypeDirtBottom = GrassTileTypeDirtBottom; -GrassTileTypeDirtBottom.texturePath = '/Tiles/ground/grass_with_dirt_bottom.png'; -class GrassTileTypeDirtLeft extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileTypeDirtLeft = GrassTileTypeDirtLeft; -GrassTileTypeDirtLeft.texturePath = '/Tiles/ground/grass_with_dirt_left.png'; -class GrassTileTypeDirtMiddle extends _base_tiletype_1.TileType { - constructor(id, textId) { - super(id, '#438337', textId); - } -} -exports.GrassTileTypeDirtMiddle = GrassTileTypeDirtMiddle; -GrassTileTypeDirtMiddle.texturePath = '/Tiles/ground/grass_with_dirt_middle.png'; - - -/***/ }), - -/***/ 8249: -/*!************************************************!*\ - !*** ./src/numerics/helpers/degrees.helper.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DegreesHelper = void 0; -exports.Radians = Radians; -exports.Degrees = Degrees; -exports.FartherRight = FartherRight; -class DegreesHelper { -} -exports.DegreesHelper = DegreesHelper; -/** - * converts degrees into radians - * - * @export - * @param {number} degrees - * @returns - */ -function Radians(degrees) { - return degrees * Math.PI / 180; -} -/** - * converts radians into degrees - * - * @export - * @param {number} radians - * @returns - */ -function Degrees(radians) { - return radians * 180 / Math.PI; -} -function FartherRight(fromDegrees, toDegrees) { - return true; -} - - -/***/ }), - -/***/ 9188: -/*!******************************************************!*\ - !*** ./src/application/Entities/Creatures/player.ts ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Player = void 0; -const creature_1 = __webpack_require__(/*! ./creature */ 2228); -const Vector2_model_1 = __webpack_require__(/*! ../../../numerics/models/Vector2.model */ 2239); -const degrees_helper_1 = __webpack_require__(/*! ../../../numerics/helpers/degrees.helper */ 8249); -class Player extends creature_1.Creature { - constructor(position, size, name, texturePath, inputManager, graphicsService) { - super(position, size, name, texturePath, graphicsService); - this.rotationSpeed = 5; - this.strafeThrust = 1.5; - this.startingFriction = this.friction; - this.inputManager = inputManager; - this.health = 100; - this.detailsDiv = document.getElementById('details_div'); - this.colour = '#fff'; - this.thrust = 1; - } - Tick(lastDelta) { - this.GetInput(); - this.Move(lastDelta); - this.graphicsService.getGameCameraService().LookAt(this.position, this.size); - } - GetInput() { - // this.setMove(new Vector2(0, 0)); - this.UpdatePlayerSpeedFromInput(); - this.UpdatePlayerRotationFromInput(); - this.UpdatePlayerStrafeFromInput(); - // if (this.inputManager.IsKeyPressed('direction_left')) { - // this.AddToRotation(-(this.rotationSpeed * this.inputManager.GetForceValue('direction_left'))); - // // this.AddToRotation(-this.rotationSpeed); - // // this.velocity.x -= this.acceleration.x; - // } - // if (this.inputManager.IsKeyPressed('direction_right')) { - // this.AddToRotation(this.rotationSpeed * this.inputManager.GetForceValue('direction_right')); - // // this.velocity.x += this.acceleration.x; - // } - if (this.inputManager.IsKeyPressed('')) - if (this.inputManager.IsKeyPressed('action_a')) { - console.log('space pressed'); - } - // console.log(`this.movement.x = ${this.movement.x}`) - } - UpdatePlayerRotationFromInput() { - if (this.inputManager.IsKeyPressed('axes_pad_left_horizontal')) { - this.AddToRotation(this.rotationSpeed * - this.inputManager.GetForceValue('axes_pad_left_horizontal')); - } - else { - if (this.inputManager.IsKeyPressed('direction_right')) { - this.AddToRotation(this.rotationSpeed * - this.inputManager.GetForceValue('direction_right')); - } - if (this.inputManager.IsKeyPressed('direction_left')) { - this.AddToRotation(-(this.rotationSpeed * - this.inputManager.GetForceValue('direction_left'))); - } - } - } - UpdatePlayerSpeedFromInput() { - const rotationAsRadians = (0, degrees_helper_1.Radians)(this.rotationDegrees - this.angleAdjust); - const rotSin = Math.sin(rotationAsRadians); - const rotCos = Math.cos(rotationAsRadians); - if (this.inputManager.IsKeyPressed('trigger_two_right') || - this.inputManager.IsKeyPressed('direction_up')) { - const triggerTwoRightForce = Math.max(this.inputManager.GetForceValue('direction_up'), (this.inputManager.GetForceValue('trigger_two_right'))); - this.velocity.x -= (rotCos * (this.thrust * triggerTwoRightForce)); - this.velocity.y -= (rotSin * (this.thrust * triggerTwoRightForce)); - } - if (this.inputManager.IsKeyPressed('trigger_two_left') || - this.inputManager.IsKeyPressed('direction_down')) { - const triggerTwoLeftForce = Math.max(this.inputManager.GetForceValue('trigger_two_left'), (this.inputManager.GetForceValue('direction_down'))); - // this.velocity.x += (rotCos * (this.thrust * triggerTwoLeftForce)); - // this.velocity.y += (rotSin * (this.thrust * triggerTwoLeftForce)); - this.friction.x = 0.85; - this.friction.y = 0.85; - } - else { - this.friction = new Vector2_model_1.Vector2(this.startingFriction.getValueX(), this.startingFriction.getValueY()); - } - if (this.inputManager.IsKeyPressed('trigger_one_right')) { - const triggerOneRightForce = this.inputManager.GetForceValue('trigger_one_right'); - this.velocity.x += (rotSin * triggerOneRightForce) * this.strafeThrust; - this.velocity.y -= (rotCos * triggerOneRightForce) * this.strafeThrust; - } - if (this.inputManager.IsKeyPressed('trigger_one_left')) { - const triggerOneLeftForce = this.inputManager.GetForceValue('trigger_one_right'); - this.velocity.x -= rotSin * triggerOneLeftForce; - this.velocity.y += rotCos * triggerOneLeftForce; - } - this.detailsDiv.innerHTML = ` - player:
    - ve: ${this.velocity.concat(3)}
    - ro: ${this.rotationDegrees.toFixed(3)}DEG
    - ro: ${rotationAsRadians.toFixed(3)}RAD
    - th: ${this.thrust.toFixed(3)}
    - rS: ${rotSin.toFixed(3)}
    - rC: ${rotCos.toFixed(3)}
    - - `; - } - UpdatePlayerStrafeFromInput() { - // if (this.inputManager.IsKeyPressed('trigger_one_right')) { - // this.velocity.x -= (this.inputManager.GetForceValue('trigger_one_right') * this.acceleration.y) ; - // } - // if (this.inputManager.IsKeyPressed('trigger_one_left')) { - // this.velocity.x += (this.inputManager.GetForceValue('trigger_one_left') * this.acceleration.y) ; - // } - } -} -exports.Player = Player; - - -/***/ }), - -/***/ 9473: -/*!****************************************************************************!*\ - !*** ./src/application/Tools/random_generators/random_string.generator.ts ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RandomStringGenerator = void 0; -class RandomStringGenerator { - static GetRandomHexColour() { - return '#' + (Math.random() * 0xFFFFFF << 0).toString(16); - } -} -exports.RandomStringGenerator = RandomStringGenerator; - - -/***/ }), - -/***/ 9623: -/*!*************************************************!*\ - !*** ./src/application/states/SettingsState.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SettingsState = void 0; -const _BaseState_1 = __webpack_require__(/*! ./_BaseState */ 652); -class SettingsState extends _BaseState_1.BaseState { - constructor() { - super(); - console.log(`constructing SettingsState`); - } - Tick() { - console.error("Method not implemented."); - } - Render() { - console.error("Method not implemented."); - } -} -exports.SettingsState = SettingsState; - - -/***/ }), - -/***/ 9809: -/*!*************************************************!*\ - !*** ./src/application/states/state.service.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StateService = void 0; -class StateService { - constructor() { - this.currentState = null; - } - setState(state) { - this.currentState = state; - } - GetState() { - return this.currentState; - } -} -exports.StateService = StateService; - - -/***/ }), - -/***/ 9855: -/*!********************************************************************!*\ - !*** ./src/application/Graphics/Canvas/graphics.canvas.service.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CanvasService = void 0; -const graphics_drawable_canvas_1 = __webpack_require__(/*! ../Models/graphics.drawable-canvas */ 7467); -const Viewport_Helper_1 = __webpack_require__(/*! ../Viewport/Viewport.Helper */ 81); -const random_guid_generator_1 = __webpack_require__(/*! ../../Tools/random_generators/random_guid.generator */ 6953); -class CanvasService { - constructor(htmlService) { - console.log('creating a canvas service'); - this.htmlService = htmlService; - } - Init() { - const viewportSize = Viewport_Helper_1.ViewportHelper.GetWindowInAspectRatioForCanvas(); - this.viewportHeight = viewportSize.y; - this.viewportWidth = viewportSize.x; - this.mainCanvas = this.htmlService.createCanvas('main_canvas', this.htmlService.GetMainDiv().id, this.viewportWidth, this.viewportHeight, ['parent']); - this.mainCanvasCtx = this.mainCanvas.getContext('2d'); - this.drawableAreas = new Array(); - } - RegisterNewCanvas(id = null) { - console.log(`registering a new canvas with id ${id}`); - if (id === null) { - id = random_guid_generator_1.GuidGenerator.NewGuid(); - } - const canvas = this.htmlService.createCanvas(id, this.mainCanvas.id, this.viewportWidth, this.viewportHeight); - this.drawableAreas.push(new graphics_drawable_canvas_1.DrawableCanvas(canvas, id, this.viewportWidth, this.viewportHeight)); - return id; - } - GetMainCanvas() { - return this.mainCanvas; - } - GetCanvas(id) { - for (let i = 0; i < this.drawableAreas.length; i++) { - if (this.drawableAreas[i].id === id) { - return this.drawableAreas[i]; - } - } - console.error(`failed to get a canvas of id ${id}`); - } -} -exports.CanvasService = CanvasService; - - -/***/ }), - -/***/ 9984: -/*!****************************************************!*\ - !*** ./src/application/Entities/entity.service.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EntityService = void 0; -class EntityService { - constructor( - // drawingService: DrawingService - ) { - this.gameEntities = new Array(); - } - TickAllEntities(lastDelta) { - for (let i = 0; i < this.gameEntities.length; i++) { - this.gameEntities[i].Tick(lastDelta); - } - } - RenderAllEntities(graphicsService) { - for (let i = 0; i < this.gameEntities.length; i++) { - graphicsService.getDrawingService().Draw(this.gameEntities[i]); - } - } - RegisterEntity(entity) { - console.log('registering an entity'); - this.gameEntities.push(entity); - } -} -exports.EntityService = EntityService; - - -/***/ }), - -/***/ 9992: -/*!************************************************!*\ - !*** ./src/application/World/world.service.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WorldService = void 0; -const Vector2_model_1 = __webpack_require__(/*! ../../numerics/models/Vector2.model */ 2239); -const world_jsonfiles_1 = __webpack_require__(/*! ./world.jsonfiles */ 4554); -const AABB_model_1 = __webpack_require__(/*! ../../numerics/models/AABB.model */ 5537); -const vector2_helper_1 = __webpack_require__(/*! ../../numerics/helpers/vector2.helper */ 2655); -class WorldService { - constructor(tileService) { - this.currentWorldId = 0; - this.worlds = new Array(); - this.tileService = tileService; - } - Init() { - this.worlds = world_jsonfiles_1.WorldJsonFileLoader.GetWorlds(); - console.log(`this.worlds = ${JSON.stringify(this.worlds)} length is ${this.worlds.length}`); - console.info('setting current world to index 0'); - this.SetWorld(2); - } - SetWorld(index) { - this.DeRegisterWorld(); - this.tileService.setupTilesFromArray(this.GetWorld(index).GetTiles()); - } - GetWorldSize() { - const tileSize = this.tileService.GetTileSize(); - this.size = vector2_helper_1.Vector2Helpers.MultiplyByScale(tileSize, 2); - console.log(`this.size: ${this.size}`); - const worldPosition = new Vector2_model_1.Vector2(0, 0); - return new AABB_model_1.AABB(worldPosition, this.size); - } - DeRegisterWorld() { - console.error(" DeRegisterWorld: Method not implemented."); - } - GetStartingPosition(worldIndex) { - return this.worlds[worldIndex].GetStartingPosition(); - } - GetWorld(index) { - if (index > this.worlds.length) { - throw new Error(`index [${index}] out of range of world array (length: ${this.worlds.length})`); - } - return this.worlds[0]; - } -} -exports.WorldService = WorldService; - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. -(() => { -var exports = __webpack_exports__; -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.App = void 0; -const game_1 = __webpack_require__(/*! ./application/game */ 2126); -class App { - start() { - const game = new game_1.Game(); - game.Run(); - } -} -exports.App = App; -const application = new App(); -application.start(); - -})(); - -/******/ })() -; -//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/dist/bundle.js.map b/dist/bundle.js.map deleted file mode 100644 index ba6026c..0000000 --- a/dist/bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://march/./src/application/Graphics/Viewport/Viewport.Helper.ts","webpack://march/./src/application/World/world.ts","webpack://march/./src/application/Graphics/Viewport/viewport.service.ts","webpack://march/./src/application/states/_BaseState.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/_base-tiletype.ts","webpack://march/./src/application/Core/timer.service.ts","webpack://march/./src/application/Entities/_base-entity.ts","webpack://march/./src/application/Graphics/Tiles/drawable-tile.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/star.tiletype.ts","webpack://march/./src/numerics/helpers/number.helper.ts","webpack://march/./src/application/Input/input.model.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/SpaceTileTypes/space.tiletype.ts","webpack://march/./src/application/game.ts","webpack://march/./src/application/Input/input-state.ts","webpack://march/./src/application/Entities/Creatures/creature.ts","webpack://march/./src/numerics/models/Vector2.model.ts","webpack://march/./src/application/states/MenuState.ts","webpack://march/./src/application/Entities/Creatures/creature.default.settings.ts","webpack://march/./src/application/Graphics/Camera/game-camera.service.ts","webpack://march/./src/numerics/helpers/vector2.helper.ts","webpack://march/./src/application/_debug/debuggable-items.model.ts","webpack://march/./src/application/Graphics/Textures/texture.service.ts","webpack://march/./src/application/Graphics/Images/ImageHelper.ts","webpack://march/./src/application/Graphics/graphics.service.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/dirt.tiletype.ts","webpack://march/./src/application/World/world.jsonfiles.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/shallow-water.tiletype.ts","webpack://march/./src/application/_debug/debug.component.ts","webpack://march/./src/numerics/models/AABB.model.ts","webpack://march/./src/application/Input/InputManager.ts","webpack://march/./src/application/Tools/random_generators/random_number.generators.ts","webpack://march/./src/application/Graphics/Tiles/tile.service.ts","webpack://march/./src/application/_debug/debug.service.ts","webpack://march/./src/application/Graphics/Tiles/tile.default.settings.ts","webpack://march/./src/application/Graphics/Textures/Texture2d.ts","webpack://march/./src/numerics/helpers/intersection.helper.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/stone.tiletype.ts","webpack://march/./src/application/Graphics/Draw/drawing.service.ts","webpack://march/./src/application/Tools/random_generators/random_guid.generator.ts","webpack://march/./src/application/Graphics/Draw/drawable.ts","webpack://march/./src/application/Graphics/Html/graphics.html.service.ts","webpack://march/./src/application/Graphics/Models/graphics.drawable-canvas.ts","webpack://march/./src/application/Entities/player.service.ts","webpack://march/./src/application/Entities/Creatures/baddy.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/sand.tiletype.ts","webpack://march/./src/application/states/GameState.ts","webpack://march/./src/application/Graphics/Tiles/TileTypes/GroundTileTypes/grass.tiletype.ts","webpack://march/./src/numerics/helpers/degrees.helper.ts","webpack://march/./src/application/Entities/Creatures/player.ts","webpack://march/./src/application/Tools/random_generators/random_string.generator.ts","webpack://march/./src/application/states/SettingsState.ts","webpack://march/./src/application/states/state.service.ts","webpack://march/./src/application/Graphics/Canvas/graphics.canvas.service.ts","webpack://march/./src/application/Entities/entity.service.ts","webpack://march/./src/application/World/world.service.ts","webpack://march/webpack/bootstrap","webpack://march/./src/index.ts"],"sourcesContent":["import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class ViewportHelper {\n\n public static GetSquareInBrowser(): Vector2 {\n const h = this.GetBrowserHeight() - 5;\n const w = this.GetBrowserWidth() - 5;\n if (h < w) {\n return new Vector2(h, h);\n } else {\n return new Vector2(w, w);\n }\n }\n\n public static GetWindowInAspectRatio(aspectRatioWidth: number = 16, aspectRatioHeight: number = 9,\n widthPercent: number = 1, heightPercent: number = 1) {\n const aspectRatio = aspectRatioWidth / aspectRatioHeight;\n\n const adjustedWindowHeight = this.GetBrowserHeight() * heightPercent;\n const adjustedWindowWidth = this.GetBrowserWidth() * widthPercent;\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio));\n \n return new Vector2(displayWidth, displayHeight);\n }\n\n /**\n * Gets a window in a given aspect ratio. \n *\n * @static\n * @param {number} [aspectRatioWidth=16]\n * @param {number} [aspectRatioHeight=9]\n * @param {number} [widthPercent=1] between 0 & 1. Should usually be the same as heightPercent\n * @param {number} [heightPercent=1] between 0 & 1. Shoudl usually be the same as widthPercent\n * @param {string} elementId An element to put this canvas into. Can be null (will use the full window)\n * @returns {Vector2}\n * @memberof ViewportHelper\n * @returns {Vector2}\n * @memberof ViewportHelper\n */\n public static GetWindowInAspectRatioForCanvas(aspectRatioWidth: number = 16, aspectRatioHeight: number = 9,\n widthPercent: number = 1, heightPercent: number = 1, canvasableElement: HTMLElement = null): Vector2 {\n\n if (!canvasableElement) {\n console.warn(`setup with no canvasable element. Will use the entire window`);\n } else {\n console.warn(`setup with id of ${canvasableElement.id}`);\n }\n const aspectRatio = aspectRatioWidth / aspectRatioHeight;\n\n if (heightPercent !== widthPercent) {\n console.warn('window height and width percentages to not match. This will result in an abnormal screen size')\n }\n if (aspectRatioHeight > aspectRatioWidth) {\n console.log(`starting in portrait mode (${aspectRatioWidth}:${aspectRatioHeight})`);\n } else {\n console.info(`starting in landscape mode (${aspectRatioWidth}:${aspectRatioHeight})`);\n }\n\n const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * heightPercent;\n const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * widthPercent;\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * aspectRatio));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / aspectRatio));\n\n return new Vector2(displayWidth, displayHeight);\n }\n\n private static GetBrowserWidth(element: HTMLElement = null) {\n if (!element) {\n return window.innerWidth;\n } else {\n return element.clientWidth;\n\n }\n }\n private static GetBrowserHeight(element: HTMLElement = null) {\n if (!element) {\n return window.innerHeight;\n } else {\n return element.clientHeight;\n }\n }\n}","import { Vector2 } from \"../../numerics/models/Vector2.model\";\nexport class World {\n // private game: Game;\n \n private id: number;\n private area: Vector2 = new Vector2(20, 20);\n private spawn: Vector2;\n private tiles: number[][];\n constructor(area: Vector2, spawn: Vector2, \n tiles: number[][], id: number) {\n this.area = area;\n this.spawn = spawn; \n this.tiles = tiles;\n this.id = id;\n }\n public GetTiles (): number[][] {\n return this.tiles;\n }\n public GetStartingPosition() {\n return this.spawn; \n }\n public GetId() {\n return this.id;\n }\n \n \n} ","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class ViewportService {\n\n private browserSize: Vector2;\n private viewportSize: Vector2;\n\n private aspectRatio: Vector2;\n private aspectRatioCalculated: number;\n private sizePercent: Vector2;\n\n private listner: any;\n\n private listeningForBrowserChanges: boolean = false;\n constructor(\n aspectRatio: Vector2 = new Vector2(16, 9),\n sizePercent: Vector2 = new Vector2(1, 1)) {\n this.aspectRatio = aspectRatio;\n this.aspectRatioCalculated = (this.aspectRatio.getValueX() / this.aspectRatio.getValueY());\n this.sizePercent = sizePercent;\n this.setupListner();\n }\n\n setupListner() {\n console.log('setting up browser listner')\n this.listner = window.addEventListener('resize', () => {\n this.listeningForBrowserChanges = true;\n setTimeout(() => {\n\n this.listeningForBrowserChanges = false;\n }, 5000);\n });\n }\n\n\n /**\n *Gets a window in a the game's aspect ratio\n *\n * @param {HTMLElement} [canvasableElement=null]\n * @returns {Vector2}\n * @memberof ViewportService\n */\n public GetWindowInAspectRatioForCanvas(canvasableElement: HTMLElement = null): Vector2 {\n\n if (!canvasableElement) {\n console.warn(`setup with no canvasable element. Will use the entire window`);\n } else {\n console.warn(`setup with id of ${canvasableElement.id}`);\n }\n \n\n if (this.sizePercent.getValueX() !== this.sizePercent.getValueY()) {\n console.warn('window height and width percentages to not match. This will result in an abnormal screen size')\n }\n if (this.aspectRatio.getValueX() > this.aspectRatio.getValueY()) {\n console.log(`starting in portrait mode (${this.aspectRatio.getValueX() }:${this.aspectRatio.getValueY()})`);\n } else {\n console.info(`starting in landscape mode (${this.aspectRatio.getValueX() }:${this.aspectRatio.getValueY()})`);\n }\n\n const adjustedWindowHeight = this.GetBrowserHeight(canvasableElement) * this.sizePercent.getValueX();\n const adjustedWindowWidth = this.GetBrowserWidth(canvasableElement) * this.sizePercent.getValueY();\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated));\n\n return new Vector2(displayWidth, displayHeight);\n } \n\n public GetSquareInBrowser(): Vector2 {\n const h = this.GetBrowserHeight() - 5;\n const w = this.GetBrowserWidth() - 5;\n if (h < w) {\n return new Vector2(h, h);\n } else {\n return new Vector2(w, w);\n }\n }\n\n public GetWindowInAspectRatio() {\n \n const adjustedWindowHeight = this.GetBrowserHeight() * this.sizePercent.getValueX();\n const adjustedWindowWidth = this.GetBrowserWidth() * this.sizePercent.getValueY();\n\n const displayWidth = Math.min(adjustedWindowWidth, (adjustedWindowHeight * this.aspectRatioCalculated));\n const displayHeight = Math.min(adjustedWindowHeight, (adjustedWindowWidth / this.aspectRatioCalculated));\n\n return new Vector2(displayWidth, displayHeight);\n }\n\n\n public GetBrowserWidth(element: HTMLElement = null) {\n if (!element) {\n return window.innerWidth;\n } else {\n return element.clientWidth;\n\n }\n }\n public GetBrowserHeight(element: HTMLElement = null) {\n if (!element) {\n return window.innerHeight;\n } else {\n return element.clientHeight;\n }\n }\n\n public getBrowserSize(): Vector2 {\n return this.browserSize;\n }\n\n private setBrowserSize(browserSize: Vector2): void {\n this.browserSize = browserSize;\n }\n\n public getViewportSize(): Vector2 {\n return this.viewportSize;\n }\n\n private setViewportSize(viewportSize: Vector2): void {\n this.viewportSize = viewportSize;\n }\n\n\n}","export abstract class BaseState {\n\n public abstract Tick(): void;\n public abstract Render(): void;\n} ","export class TileType {\n\n protected readonly id: number;\n private readonly textureId: string;\n protected readonly fallbackOutlineColour: string;\n\n constructor(id: number, fallbackOutlineColour: string,\n textureId: string) {\n this.textureId = textureId;\n this.id = id;\n this.fallbackOutlineColour = fallbackOutlineColour;\n }\n\n public Tick(): void {\n\n }\n\n public GetTextureId(): string {\n return this.textureId;\n }\n\n public GetId(): number {\n return this.id;\n }\n\n public GetFallbackColour() {\n return this.fallbackOutlineColour;\n }\n}\n","export class TimerService {\n private now: number;\n private delta: number;\n private timer: number;\n private lastTime: number;\n private ticks: number;\n private lastTimeTook: number;\n\n private timePerTick: number;\n private fps: number;\n constructor(targetFps: number = 60) {\n this.fps = targetFps;\n this.timePerTick = 1000 / this.fps;\n this.delta = 0;\n this.now = 0;\n this.lastTime = performance.now();\n this.timer = 0;\n this.ticks = 0;\n this.lastTimeTook = 0;\n }\n\n public CheckShouldRunLoop(): boolean {\n this.now = performance.now();\n this.delta += (this.now - this.lastTime) / this.timePerTick;\n this.timer += this.now - this.lastTime;\n this.lastTimeTook = this.now - this.lastTime;\n this.lastTime = this.now;\n\n if (this.delta >= 1) {\n return true;\n }\n console.warn(`RUNNING SLOWLY. did not render. Delta [${this.delta}]`)\n return false;\n }\n\n public UpdateTicksAndRenderAfterLoop() {\n this.delta--;\n this.ticks++;\n }\n\n /**\n * returns true if it's a good time to print to \n * the console\n *\n * @returns {boolean}\n * @memberof FpsService\n */\n public ShouldPrintDebugData(): boolean {\n return this.timer > 1000;\n }\n\n /**\n * prints debug data from this class\n * to the console\n *\n * @memberof FpsService\n */\n public PrintCurrentFpsToConsole() {\n return `\n ticks and frames: ${this.ticks.toFixed(2)}\n lastDelta: ${this.delta.toFixed(2)}\n timer: ${this.timer.toFixed(2)}\n lastTime Took: ${this.lastTimeTook.toFixed(2)}`;\n }\n\n public ResetTimers() {\n if (this.timer > 1000) {\n this.ticks = 0;\n this.timer = 0;\n }\n }\n\n public GetLastUpdateTimeTook() {\n return this.lastTimeTook / 1000;\n }\n}","import { Vector2 } from \"../../numerics/models/Vector2.model\";\nimport { GuidGenerator } from \"../Tools/random_generators/random_guid.generator\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\nimport { Drawable } from \"../Graphics/Draw/drawable\";\nimport { DrawableCanvas } from \"../Graphics/Models/graphics.drawable-canvas\";\nimport { Texture2D } from \"../Graphics/Textures/Texture2d\";\n\n// export interface IEntity {\n// position: Vector2;\n// size: Vector2;\n// name: string;\n// id: string;\n// }\n\nexport abstract class Entity extends Drawable {\n protected position: Vector2;\n protected size: Vector2;\n protected name: string;\n protected id: string;\n\n\n // constructor(position: Vector2, size: Vector2, name: string, canvasId: string, texture: Texture2D, textureId: string) {\n constructor(position: Vector2, size: Vector2, name: string, canvasId: string, textureId: string) {\n super(position, size, canvasId, textureId);\n this.id = GuidGenerator.NewGuid();\n this.name = name;\n }\n\n public abstract Tick(lastDelta: number): void;\n\n\n getName(): string {\n return this.name;\n }\n\n getId(): string {\n return this.name;\n }\n\n getPosition(): Vector2 {\n return this.position;\n }\n setPosition(newPosition: Vector2): Vector2 {\n this.position = newPosition;\n return this.getPosition();\n }\n setPositionX(newPositionX: number): Vector2 {\n this.position.x = newPositionX;\n return this.getPosition();\n }\n setPositionY(newPositionY: number): Vector2 {\n this.position.y = newPositionY;\n return this.getPosition();\n }\n\n\n getSize(): Vector2 {\n return this.size;\n }\n setSize(newSize: Vector2): Vector2 {\n this.size = newSize;\n return this.getSize();\n }\n\n // getAABB(): AABB {\n // if (this.AABB === undefined) {\n // this.UpdateAABB();\n // }\n // return this.AABB;\n // }\n\n protected SetAABB(AABB: AABB): void {\n this.setAABB(AABB);\n }\n protected UpdateAABB(): void {\n this.setAABB(new AABB(this.position, this.size));\n }\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { Drawable } from \"../Draw/drawable\";\n\nexport class DrawableTile extends Drawable {\n private readonly tileTypeId: number;\n\n constructor(tileTypeId: number, position: Vector2, size: Vector2, fallbackOutlineColour: string, canvasId: string,\n textureId: string) {\n super(position, size, canvasId, textureId);\n this.tileTypeId = tileTypeId;\n this.colour = fallbackOutlineColour;\n }\n\n public getTileTypeId(): number {\n return this.tileTypeId;\n }\n\n public getPosition(): Vector2 {\n return this.position;\n }\n\n public getSize(): Vector2 {\n return this.size;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class StarTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/space_tile2.png';\n constructor(id: number, textId: string) {\n super(id, '#060948', textId);\n }\n}","export function Between(x: number, min: number, max: number): boolean {\n return x >= min && x <= max;\n}\n\n\nexport function Lerp(start: number, end: number, amt: number): number {\n return (1-amt) * start + amt * end;\n}","export class Input {\n constructor(\n name: string, \n keyboardId: string, \n gamepadId: number, \n gamePadAxesId: number) {\n this.name = name;\n this.keyboardId = keyboardId;\n this.gamepadId = gamepadId;\n this.gamePadAxesId = gamePadAxesId;\n }\n name: string;\n keyboardId: string;\n gamepadId: number;\n gamePadAxesId: number;\n pressed: boolean = false;\n\n force: number = 0;\n\n wasPressedPreviousCheck: boolean = false;\n}\n","import { TileType } from \"../_base-tiletype\";\n\nexport class SpaceTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/space_tile.png';\n constructor(id: number, textId: string) {\n super(id, '#1C1C1B', textId);\n }\n}\n","import { InputManager } from \"./Input/InputManager\";\nimport { IDebugService, DebugService } from './_debug/debug.service';\nimport { DebugComponent } from \"./_debug/debug.component\";\nimport { Entity } from \"./Entities/_base-entity\";\nimport { Creature } from \"./Entities/Creatures/creature\";\nimport { Vector2 } from \"../numerics/models/Vector2.model\";\nimport { BaseState } from \"./states/_BaseState\";\nimport { GameState } from \"./states/GameState\";\nimport { StateService } from \"./states/state.service\";\nimport { MenuState } from \"./states/MenuState\";\nimport { SettingsState } from \"./states/SettingsState\";\nimport { Player } from \"./Entities/Creatures/player\";\nimport { GraphicsService } from \"./Graphics/graphics.service\";\nimport { Baddy } from \"./Entities/Creatures/baddy\";\nimport { RandomStringGenerator } from \"./Tools/random_generators/random_string.generator\";\nimport { RandomNumberGenerator } from \"./Tools/random_generators/random_number.generators\";\nimport { WorldService } from \"./World/world.service\";\nimport { GameCameraService } from \"./Graphics/Camera/game-camera.service\";\nimport { ViewportService } from \"./Graphics/Viewport/viewport.service\";\nimport { PlayerService } from \"./Entities/player.service\";\nimport { EntityService } from \"./Entities/entity.service\";\nimport { DrawingService } from \"./Graphics/Draw/drawing.service\";\nimport { TimerService } from \"./Core/timer.service\";\n\nexport class Game {\n private viewportService: ViewportService;\n private graphicsService: GraphicsService;\n private playerService: PlayerService;\n private inputManager: InputManager;\n private debugService: IDebugService;\n private stateService: StateService;\n private worldService: WorldService;\n private debugComponent: DebugComponent;\n private timerService: TimerService;\n private entityService: EntityService;\n private running: boolean = false;\n private readonly launchMessage: string = 'Start';\n\n private gameState: GameState;\n private menuState: MenuState;\n private settingsState: SettingsState;\n\n gameEntities: Entity[];\n private performanceInfoDiv: HTMLElement;\n\n\n constructor() {\n this.performanceInfoDiv = document.getElementById('performance_div');\n this.performanceInfoDiv.innerHTML = `waiting for perf data`;\n\n this.viewportService = new ViewportService();\n const loadedInDebugMode = this.checkDebugModeFromQueryString();\n this.graphicsService = new GraphicsService();\n this.stateService = new StateService();\n this.debugService = new DebugService(loadedInDebugMode);\n this.debugComponent = new DebugComponent(this.debugService);\n this.inputManager = new InputManager();\n this.timerService = new TimerService(60);\n this.worldService = new WorldService(this.graphicsService.GetTileService());\n this.entityService = new EntityService();\n this.playerService = new PlayerService();\n }\n\n Run() {\n console.log('Run called in game.ts');\n this.Init();\n this.running = true;\n this.Loop();\n }\n\n Init(): string {\n console.log(this.launchMessage + ' will now be posted to the document ');\n this.SetupStates();\n this.inputManager.InitInputManager();\n this.graphicsService.InitGraphicsService();\n this.worldService.Init();\n this.graphicsService.getGameCameraService().SetLevelAABB(this.worldService.GetWorldSize());\n\n this.registerEntities();\n // this.canvasManager.InitCanvasManager('main_div', this.gameEntities);\n if (this.debugService.IsInDebugMode()) {\n console.log('setting up with debug info');\n this.debugComponent.InitDebugComponent('main_div');\n }\n return this.launchMessage;\n }\n\n private SetupStates() {\n this.gameState = new GameState(this.graphicsService);\n this.menuState = new MenuState();\n this.settingsState = new SettingsState();\n\n this.stateService.setState(this.gameState);\n }\n\n\n /**\n * loops continuously whenever the browser is ready\n * for a new frame\n *\n * @memberof Game\n */\n Loop() {\n requestAnimationFrame(() => {\n if (this.running) {\n if (this.timerService.CheckShouldRunLoop()) {\n const lastDelta = this.timerService.GetLastUpdateTimeTook();\n this.Update(lastDelta);\n this.Render(lastDelta);\n this.timerService.UpdateTicksAndRenderAfterLoop();\n }\n\n this.PrintDebugInfoToConsole(false, true);\n this.timerService.ResetTimers();\n }\n this.Loop();\n });\n }\n\n /**\n * prints debug info from various places in the \n * application\n *\n * @private\n * @memberof Game\n */\n private PrintDebugInfoToConsole(printToConsole: boolean = false, printToHtml: boolean = false) {\n if (this.timerService.ShouldPrintDebugData()) {\n // console.clear();\n let debugInformation: string[] = new Array();\n debugInformation.push('FPS Serv: ' + this.timerService.PrintCurrentFpsToConsole());\n debugInformation.push('Cam Serv: ' + this.graphicsService.getGameCameraService().GetDebugInfo());\n if (printToConsole) {\n for (let line of debugInformation) {\n if (line.length > 0) {\n console.log('%c ' + line + ' ', 'background: #000; color:white; ');\n }\n }\n }\n if (printToHtml) {\n this.performanceInfoDiv.innerHTML = `
    ${debugInformation.join('\\n')}
    `;\n }\n\n // debugInformation = Array(0);\n }\n }\n\n Update(lastDelta: number) {\n if (this.stateService.GetState() !== null) {\n this.inputManager.NewInputLoopCheck();\n\n this.stateService.GetState().Tick();\n\n this.entityService.TickAllEntities(lastDelta);\n // for (let i = 0; i < this.gameEntities.length; i++) {\n // this.gameEntities[i].Tick();\n // }\n\n\n }\n }\n\n Render(lastDelta: number) {\n if (this.stateService.GetState() !== null) {\n this.graphicsService.GetTileService().Redner();\n\n this.entityService.RenderAllEntities(this.graphicsService);\n this.stateService.GetState().Render();\n this.graphicsService.Render();\n }\n }\n\n checkDebugModeFromQueryString(): boolean {\n const urlParams = new URLSearchParams(window.location.search);\n const debugModeParam = urlParams.get('inDebugMode');\n\n return JSON.parse(debugModeParam);\n }\n\n registerEntities(baddyCount: number = 75): void {\n\n\n\n\n const ships = [\n 'metalic_01.png',\n 'metalic_02.png',\n 'metalic_03.png',\n 'metalic_04.png',\n 'metalic_05.png',\n 'metalic_06.png',\n 'orange_01.png',\n 'orange_02.png',\n 'orange_03.png',\n 'orange_04.png',\n 'orange_05.png',\n 'orange_06.png'\n ];\n const entitySize: Vector2 = new Vector2(30, 30);\n for (let i = 0; i < baddyCount; i++) {\n const imageLoc = RandomNumberGenerator.GetRandomNumber(0, 6);\n console.log('image loc will be ' + imageLoc);\n const entity = new Baddy(\n // new Vector2(500, 300),\n RandomNumberGenerator.GetRandomVector2(\n 0, this.viewportService.GetBrowserWidth(),\n 0, this.viewportService.GetBrowserHeight()),\n entitySize,\n 'baddy' + i.toString(),\n '/Ships/' + ships[imageLoc],\n this.graphicsService,\n RandomStringGenerator.GetRandomHexColour(),\n this.playerService\n );\n\n this.entityService.RegisterEntity(entity);\n }\n\n this.playerService.SetPlayer(new Player(\n new Vector2(\n this.viewportService.GetBrowserWidth() / 2,\n this.viewportService.GetBrowserHeight() / 2),\n // new Vector2(0, 0),\n new Vector2(50, 50),\n 'player',\n 'Ships/large_purple_01.png',\n this.inputManager,\n this.graphicsService));\n\n\n this.entityService.RegisterEntity(this.playerService.GetPlayer());\n\n // return entities;\n }\n}","import { Input } from \"./input.model\";\n\nexport class InputState {\n\n private static SYSTEM_KEYS: string[] = [\n 'F1',\n 'F2',\n 'F3',\n 'F4',\n 'F5',\n 'F6',\n 'F7',\n 'F8',\n 'F9',\n 'F10',\n 'F11',\n 'F12',\n ];\n private static DEFAULT_MAX_INPUTS: number = 4;\n private static DEFAULT_MIN_JOYSTICK_SENSITIVITY: number = 0.1;\n private detailsDiv: HTMLElement;\n\n private registeredGamePads: Gamepad[];\n private gamePads: Gamepad[];\n private currentInputs: Array;\n\n private controllingWithPad = false;\n constructor() {\n console.log('inputState: constructing input state');\n this.detailsDiv = document.getElementById('details_div');\n this.registeredGamePads = new Array();\n this.gamePads = new Array();\n }\n\n Init() {\n console.log('inputState: init inputstate');\n this.setupInputs();\n this.SetupGamePadRegistrationWatch();\n this.SetupKeyboardInputWatch();\n this.SetGamePadMode(false);\n }\n\n private SetGamePadMode(controllingWithPad: boolean): void {\n this.controllingWithPad = controllingWithPad;\n if (controllingWithPad) {\n this.detailsDiv.innerHTML = 'controlling with gamepad. Press >> k << to use keyboard mode';\n } else {\n this.detailsDiv.innerHTML = 'controlling with keyboard. Press >> select << to use gamepad mode';\n }\n }\n private GetGamePadMode() {\n return this.controllingWithPad;\n }\n\n\n /**\n * // https://w3c.github.io/gamepad/#remapping\n *\n * @memberof InputState\n */\n setupInputs() {\n this.currentInputs = new Array();\n this.currentInputs.push(\n new Input('direction_left', 'a', 14, null),\n new Input('direction_right', 'd', 15, null),\n new Input('direction_up', 'w', 12, null),\n new Input('direction_down', 's', 13, null),\n\n new Input('axes_pad_left_horizontal', null, null, 0),\n new Input('axes_pad_left_vertical', null, null, 1),\n new Input('axes_pad_right_horizontal', null, null, 2),\n new Input('axes_pad_right_vertical', null, null, 3),\n\n new Input('trigger_one_left', 'q', 4, null),\n new Input('trigger_two_left', 'w', 6, null),\n new Input('trigger_one_right', 'e', 5, null),\n new Input('trigger_two_right', 's', 7, null),\n\n // 'action_{val}' where {val} is the \n // name of the button on an XBox360 controller\n new Input('action_a', ' ', 0, null),\n new Input('action_y', 'z', 3, null),\n new Input('action_x', 'x', 2, null),\n new Input('action_b', 'c', 1, null),\n );\n }\n\n\n public UpdateInputs() {\n // console.log('inputstate: updating inputs. There are ' + this.registeredGamePads.length + ' pads connected')\n\n this.UpdateGamePadInputs();\n }\n\n private ResetInputsBeforeGamePadInput() {\n for (let input of this.currentInputs) {\n input.wasPressedPreviousCheck = input.pressed;\n input.pressed = false;\n }\n }\n private UpdateGamePadInputs() {\n for (let i = 0; i < this.registeredGamePads.length; i++) {\n const padToCheck = this.GetGamePad(i);\n if (this.GetGamePadMode()) {\n this.ResetInputsBeforeGamePadInput();\n for (let btnIndex = 0; btnIndex < padToCheck.buttons.length; btnIndex++) {\n if (this.gamePadButtonPressed(padToCheck.buttons[btnIndex])) {\n this.pushToCurrentInputsFromGamePad(btnIndex, padToCheck.buttons[btnIndex].value);\n // console.log(`inputstate: btn ${btnIndex} is pressed`)\n }\n }\n for (let axesIndex = 0; axesIndex < padToCheck.axes.length; axesIndex++) {\n if (this.gamePadAxesPressed(padToCheck.axes[axesIndex])) {\n this.pushToCurrentInputsFromGamePadAxes(axesIndex, padToCheck.axes[axesIndex])\n }\n }\n } else {\n if (this.gamePadButtonPressed(padToCheck.buttons[8])) {\n console.warn('inputstate: in gamepad mode');\n this.SetGamePadMode(true);\n }\n }\n }\n }\n\n\n IsInputPressed(inputDescription: string): boolean {\n for (let input of this.currentInputs) {\n if (input.name === inputDescription) {\n return input.pressed;\n }\n }\n return false;\n }\n GetForceValue(inputDescription: string): number {\n for (let input of this.currentInputs) {\n if (input.name === inputDescription) {\n return input.force;\n }\n }\n return 0;\n }\n\n /**\n * checks if this key is in the SYSTEM_KEYS array\n * (includes keys like F1 - F12)\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof InputState\n */\n private isSystemKey(key: string) {\n if (InputState.SYSTEM_KEYS.includes(key)) {\n return true;\n }\n return false;\n }\n\n private SetupKeyboardInputWatch() {\n window.addEventListener('keydown', event => {\n if (!this.isSystemKey(event.key)) {\n event.preventDefault();\n this.pushToCurrentInputsFromKeyboard(event.key);\n }\n });\n\n window.addEventListener('keyup', event => {\n if (!this.isSystemKey(event.key)) {\n\n event.preventDefault();\n this.popFromCurrentInputsFromKeyboard(event.key);\n if (event.key === 'k') {\n console.warn(`inputstate: controlling by keyboard`)\n this.SetGamePadMode(false);\n }\n }\n });\n }\n pushToCurrentInputsFromKeyboard(key: string) {\n if (this.GetGamePadMode() === false) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.keyboardId === key) {\n thisInput.pressed = true;\n thisInput.force = 1;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n }\n popFromCurrentInputsFromKeyboard(key: string) {\n if (this.GetGamePadMode() === false) {\n\n for (let input of this.currentInputs) {\n if (input.keyboardId === key) {\n input.pressed = false;\n // console.log(`inputstate marked ${input.name} as pressed`)\n return;\n }\n }\n }\n }\n\n pushToCurrentInputsFromGamePad(btnId: number, pushForce: number) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.gamepadId === btnId) {\n thisInput.pressed = true;\n thisInput.force = pushForce;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n pushToCurrentInputsFromGamePadAxes(axesIndex: number, pushForce: number) {\n for (let thisInput of this.currentInputs) {\n if (thisInput.gamePadAxesId === axesIndex) {\n thisInput.pressed = true;\n thisInput.force = pushForce;\n // console.log(`inputstate marked ${thisInput.name} as pressed with force ${thisInput.force}`)\n return;\n }\n }\n }\n popFromCurrentInputsFromGamePad(btnId: number) {\n for (let input of this.currentInputs) {\n if (input.gamepadId === btnId) {\n input.pressed = false;\n // console.log(`inputstate marked ${input.name} as not`)\n return;\n }\n }\n }\n\n\n /* GamePad code */\n\n /**\n * watches for the game pad registration events\n *\n * @memberof InputState\n */\n SetupGamePadRegistrationWatch() {\n console.log('inputstate setting up registrations')\n\n window.addEventListener('gamepadconnected', (e: GamepadEvent) => {\n console.log('inputstate got gamepad')\n this.RegisterGamePad(e.gamepad);\n });\n window.addEventListener('gamepaddisconnected', (e: GamepadEvent) => {\n console.error('inputstate gamepad was disconnected');\n this.DeRegisterGamePad(e.gamepad);\n });\n }\n\n\n private RegisterGamePad(gamePad: Gamepad) {\n console.warn(\"inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n gamePad.index, gamePad.id,\n gamePad.buttons.length, gamePad.axes.length);\n this.registeredGamePads[gamePad.index] = gamePad;\n this.detailsDiv.innerHTML = 'Gamepad has been connected';\n\n\n }\n private DeRegisterGamePad(gamePad: Gamepad) {\n console.error(\"inputstate: Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n gamePad.index, gamePad.id,\n gamePad.buttons.length, gamePad.axes.length);\n this.GetGamePads();\n this.detailsDiv.innerHTML = 'inputstate: Gamepad has been disconnected';\n }\n\n private GetGamePads() {\n this.gamePads = navigator.getGamepads();\n }\n private GetGamePad(index: number) {\n return navigator.getGamepads()[index];\n }\n\n private gamePadAxesPressed(axes: number) {\n return (axes > InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY || axes < -InputState.DEFAULT_MIN_JOYSTICK_SENSITIVITY);\n }\n\n private gamePadButtonPressed(btn: GamepadButton) {\n // console.log(typeof(btn));\n if (typeof (btn) === 'object') {\n // firefox\n // console.log('gamepad: ff')\n if (btn.pressed) {\n // console.log('inputstate: button is pressed')\n }\n return btn.value;\n } else {\n // console.log('inputstate: gamepad: chrome')\n return btn === 1.0;\n }\n }\n}","import { Entity } from \"../_base-entity\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { CreatureDefaultSettings } from \"./creature.default.settings\";\nimport { Texture2D } from \"../../Graphics/Textures/Texture2d\";\nimport { DrawableCanvas } from \"../../Graphics/Models/graphics.drawable-canvas\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Vector2Helpers } from \"../../../numerics/helpers/vector2.helper\";\nimport { Lerp } from \"../../../numerics/helpers/number.helper\";\n\n\n\nexport abstract class Creature extends Entity {\n graphicsService: GraphicsService;\n\n protected health: number;\n protected speed: Vector2;\n protected maxSpeed: Vector2;\n protected velocity: Vector2;\n protected acceleration: Vector2;\n protected deceleration: Vector2;\n protected friction: Vector2;\n protected thrust: number;\n\n protected turnSpeed: number = 1;\n protected readonly angleAdjust: number = -90;\n\n\n // protected canvasId: string;\n\n // protected texture: Texture2D;\n\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string,\n graphicsService: GraphicsService) {\n super(position, size, name, '1', 'no_text_yet');\n console.error('passing incorrect texture ID and canvasId, and canvas to super');\n\n this.graphicsService = graphicsService;\n\n this.health = CreatureDefaultSettings.DEFAULT_HEALTH;\n this.speed = CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED;\n this.velocity = new Vector2(0, 0);\n this.maxSpeed = CreatureDefaultSettings.DEFAULT_MOVEMENT_SPEED_MAX;\n this.acceleration = CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION;\n this.deceleration = Vector2Helpers.DivideByScale(CreatureDefaultSettings.DEFAULT_MOVEMENT_ACCELERATION, 1);\n this.friction = CreatureDefaultSettings.DEFAULT_FRICTION;\n this.setCanvasId(this.graphicsService.RegisterDrawableEntity());\n\n\n if (texturePath !== undefined && texturePath !== null && texturePath.length) {\n const textureId = this.graphicsService.GetTextureService().RegisterNewTexture(texturePath);\n this.SetTextureId(textureId);\n } else {\n console.error(new Error(`creature [${name}] did not have a texture`));\n }\n\n }\n\n public Move(lastDelta: number): void {\n this.CapMovementSpeed();\n this.CapRotation();\n this.UpdatePosition(lastDelta);\n this.ReduceSpeed();\n this.UpdateAABB();\n }\n\n private ReduceSpeed() {\n\n this.velocity.y *= this.friction.y;\n this.velocity.x *= this.friction.x;\n\n // if (this.velocity.y > 0) {\n // this.velocity.y -= this.friction.y;\n // if (this.velocity.y < 0) {\n // this.velocity.y = 0;\n // }\n // } else if (this.velocity.y < 0) {\n // this.velocity.y += this.friction.y;\n // if (this.velocity.y > 0) {\n // this.velocity.y = 0;\n // }\n // }\n\n // if (this.velocity.x > 0) {\n // this.velocity.x -= this.friction.x;\n // if (this.velocity.x < 0) {\n // this.velocity.x = 0;\n // }\n // } else if (this.velocity.x < 0) {\n // this.velocity.x += this.friction.x;\n // if (this.velocity.x > 0) {\n // this.velocity.x = 0;\n // }\n // }\n }\n\n /**\n * updates the creature's position\n *\n * @private\n * @memberof Creature\n */\n private UpdatePosition(lastDelta: number) {\n // this.position.x += (this.velocity.x * (lastDelta) * 50);\n // this.position.y += (this.velocity.y * (lastDelta) * 50);\n\n this.position.x = Lerp(this.position.x, this.position.x + (this.velocity.x * (lastDelta) * 50), .8);\n this.position.y = Lerp(this.position.y, this.position.y + (this.velocity.y * (lastDelta) * 50), .8);\n }\n\n /**\n * caps the creature's movement speed at\n * this.maxSpeed\n *\n * @private\n * @memberof Creature\n */\n private CapMovementSpeed() {\n if (this.velocity.x > this.maxSpeed.x) {\n this.velocity.x = this.maxSpeed.x;\n } else if (this.velocity.x < -this.maxSpeed.x) {\n this.velocity.x = -this.maxSpeed.x;\n }\n if (this.velocity.y > this.maxSpeed.y) {\n this.velocity.y = this.maxSpeed.y;\n } else if (this.velocity.y < -this.maxSpeed.y) {\n this.velocity.y = -this.maxSpeed.y;\n }\n\n if (this.velocity.x < 0.1 && this.velocity.x > -0.1) {\n this.velocity.x = 0;\n }\n if (this.velocity.y < 0.1 && this.velocity.y > -0.1) {\n this.velocity.y = 0;\n }\n }\n\n private CapRotation() {\n // if (this.rotationDegrees < 0) {\n // this.rotationDegrees = 360 - (-this.rotationDegrees);\n // }\n // if (this.rotationDegrees < 0) {\n // this.rotationDegrees = 359;\n // } if (this.rotationDegrees > 360) {\n // this.rotationDegrees = 0;\n // }\n }\n\n public getHealth(): number {\n return this.health;\n }\n\n public setHealth(health: number): void {\n this.health = health;\n }\n\n public getSpeed(): Vector2 {\n return this.speed;\n }\n\n public setSpeed(speed: Vector2): void {\n this.speed = speed;\n }\n\n public getMove(): Vector2 {\n return this.velocity;\n }\n\n public setMove(move: Vector2): void {\n this.velocity = move;\n }\n\n}","export class Vector2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n concat(decimalPlaces: number = -1) {\n if (decimalPlaces > -1) {\n return `x:[${this.x.toFixed(decimalPlaces)}], y:[${this.y.toFixed(decimalPlaces)}]`;\n }\n return `x:[${this.x}], y:[${this.y}]`;\n }\n\n getValueX() {\n return this.x;\n }\n getValueY() {\n return this.y;\n }\n\n setValueX(x: number) {\n this.x = x;\n }\n setValueY(y: number) {\n this.y = y;\n }\n setValues(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n}","import { BaseState } from \"./_BaseState\";\n\n\nexport class MenuState extends BaseState {\n constructor() {\n super();\n console.log(`constructing MenuState`);\n }\n\n public Tick(): void {\n console.error(\"Method not implemented.\");\n\n }\n\n public Render(): void {\n console.error(\"Method not implemented.\");\n\n }\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class CreatureDefaultSettings {\n public static readonly DEFAULT_HEALTH: number = 100;\n public static readonly DEFAULT_MOVEMENT_SPEED: Vector2 = new Vector2(3.0, 3.0);\n public static readonly DEFAULT_MOVEMENT_SPEED_MAX: Vector2 = new Vector2(11.0, 11.0);\n public static readonly DEFAULT_MOVEMENT_ACCELERATION: Vector2 = new Vector2(3.0, 3.0);\n public static readonly DEFAULT_MOVEMENT_VELOCITY: Vector2 = new Vector2(3, 3);\n public static readonly DEFAULT_SIZE: Vector2 = new Vector2(20, 20);\n public static readonly DEFAULT_FRICTION: Vector2 = new Vector2(0.95, 0.95);\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { Entity } from \"../../Entities/_base-entity\";\nimport { ViewportHelper } from \"../Viewport/Viewport.Helper\";\nimport { Vector2Helpers } from \"../../../numerics/helpers/vector2.helper\";\nimport { IntersectionHelper } from \"../../../numerics/helpers/intersection.helper\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\n\nexport class GameCameraService {\n private offset: Vector2;\n private displayableSize: Vector2;\n private applyWorldBounding: boolean;\n\n private cameraAABB: AABB;\n private levelAABB: AABB;\n\n /**\n *Creates an instance of GameCameraService.\n\n applyWorldBounding tells the camera if it should continue\n moving right or left if it reaches the edge of the level\n * @param {number} xOffset\n * @param {number} yOffset\n * @param {boolean} applyWorldBounding\n * @memberof GameCameraService\n */\n constructor(xOffset: number, yOffset: number, applyWorldBounding: boolean) {\n this.offset = new Vector2(xOffset, yOffset);\n this.applyWorldBounding = applyWorldBounding;\n\n this.displayableSize = ViewportHelper.GetWindowInAspectRatio();\n this.UpdatePositionAndSize();\n }\n\n public SetLevelAABB(levelAABB: AABB) {\n this.levelAABB = levelAABB;\n }\n\n public GetDebugInfo(): string[] {\n return [`\n offset: ${this.offset.concat(2)} \n size: ${this.displayableSize.concat(2)}`];\n }\n\n /**\n * checks if two objects intersect\n *\n * @param {Vector2} position\n * @param {Vector2} size\n * @returns {boolean}\n * @memberof GameCameraService\n */\n public IsObectOnScreen(position: Vector2, size: Vector2): boolean {\n const objectAABB: AABB = new AABB(position, size);\n return this.IsObjectOnScreenAABB(objectAABB);\n }\n\n public IsObjectOnScreenAABB(AABB: AABB) {\n if (IntersectionHelper.AabbVsAabb(this.cameraAABB, AABB)) {\n return true;\n } else {\n return false;\n }\n }\n\n public MoveCamera(xAmount: number, yAmount: number): void {\n console.error('don\\'t use MoveCamera');\n this.offset.x += xAmount;\n this.offset.y += yAmount;\n }\n\n\n /**\n * sets the camera to points at (looks at) a specific entity \n *\n * @param {Vector2} entityPosition\n * @param {Vector2} entitySize\n * @memberof GameCameraService\n */\n public LookAt(entityPosition: Vector2, entitySize: Vector2): void {\n\n const vieportWidth = ViewportHelper.GetWindowInAspectRatio().getValueX();\n const vieportHeight = ViewportHelper.GetWindowInAspectRatio().getValueY();\n\n const centerX = entityPosition.getValueX() - (vieportWidth / 2) + (entitySize.getValueX() / 2);\n const centerY = entityPosition.getValueY() - (vieportHeight / 2) + (entitySize.getValueY() / 2);\n\n this.SetOffset(new Vector2(\n centerX,\n centerY\n ));\n }\n private SetOffset(positionVector: Vector2) {\n this.offset = positionVector;\n if (this.applyWorldBounding) {\n if (this.offset.getValueX() < this.levelAABB.GetLeft()) {\n this.offset.setValueX(this.levelAABB.GetLeft());\n }\n\n if (this.offset.getValueX() > this.levelAABB.GetRight()) {\n this.offset.setValueX(this.levelAABB.GetRight());\n }\n\n\n if (this.offset.getValueY() < this.levelAABB.GetTop()) {\n this.offset.setValueY(this.levelAABB.GetTop());\n }\n if (this.offset.getValueY() > this.levelAABB.GetBottom()) {\n this.offset.setValueY(this.levelAABB.GetBottom());\n }\n }\n this.UpdatePositionAndSize();\n }\n UpdatePositionAndSize() {\n this.cameraAABB = new AABB(this.offset, this.displayableSize);\n }\n\n public GetOffsetX(): number {\n return this.offset.getValueX();\n }\n public GetOffsetY(): number {\n return this.offset.getValueY();\n }\n public GetOffsetVector(): Vector2 {\n return this.offset;\n }\n}","import { Vector2 } from \"../models/Vector2.model\";\n\nexport class Vector2Helpers {\n /*\n * adds two Vector2 together and returns a new Vector2\n * containing the results\n */\n public static Add(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() + right.getValueX();\n const vecY = left.getValueY() + right.getValueY();\n\n return new Vector2(vecX, vecY);\n }\n\n /**\n * compares two Vector 2s for equality\n * If the vectors are identica, this returns true otherwise returns false\n *\n * @static\n * @param {Vector2} left\n * @param {Vector2} right\n * @returns {boolean}\n * @memberof Vector2Helpers\n */\n public static CompareEquality(left: Vector2, right: Vector2): boolean {\n return !(left.getValueX() !== right.getValueX() || left.getValueY() !== right.getValueY());\n }\n\n /*\n * divides the first vector by the second\n * this is not scalar division\n */\n public static Divide(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() / right.getValueX();\n const vecY = left.getValueY() / right.getValueY();\n return new Vector2(vecX, vecY);\n }\n\n /*\n * divides a given source vector2 by a scale factor\n */\n public static DivideByScale(source: Vector2, scaleFactor: number): Vector2 {\n const factor: number = 1 / scaleFactor;\n\n const vecX = source.getValueX() * factor;\n const vecY = source.getValueY() * factor;\n return new Vector2(vecX, vecY);\n }\n\n /*\n * gets the dot product of two vectors,\n * returns as a number (float?)\n */\n public static Dot(left: Vector2, right: Vector2): number {\n\n const vecX = left.getValueX() * right.getValueX();\n const vecY = left.getValueY() * right.getValueY();\n\n return vecX + vecY;\n }\n\n public static Subtract(left: Vector2, right: Vector2): Vector2 {\n const vecX = left.getValueX() - right.getValueX();\n const vecY = left.getValueY() - right.getValueY();\n\n return new Vector2(vecX, vecY);\n }\n\n public static NegativeOf(source: Vector2) {\n const vecX = -source.getValueX();\n const vecY = -source.getValueY();\n return new Vector2(vecX, vecY);\n }\n\n public static Multiply(left: Vector2, right: Vector2) {\n const vecX = left.getValueX() * right.getValueX();\n const vecY = left.getValueY() * right.getValueY();\n return new Vector2(vecX, vecY);\n }\n public static MultiplyByScale(source: Vector2, scaleFactor: number) {\n const vecX = source.getValueX() * scaleFactor;\n const vecY = source.getValueY() * scaleFactor;\n return new Vector2(vecX, vecY);\n }\n}","export class DebuggableItems {\n debugItems: Array;\n constructor() {\n this.debugItems = new Array();\n }\n}\nexport class DebugKvp {\n Key: string;\n Value: any;\n constructor(key: string, value: any) {\n this.Key = key;\n this.Value = value;\n }\n}","import { Texture2D } from \"./Texture2d\";\n\nexport class TextureService {\n textures: Array;\n\n constructor() {\n console.log('constructing texture service');\n this.textures = new Array();\n }\n\n public GetTexture(textureId: string): Texture2D {\n for (let i = 0; i < this.textures.length; i++) {\n if (textureId === this.textures[i].GetId()) {\n return this.textures[i];\n }\n }\n }\n\n\n /**\n * registers a new texture in the service. If the texture already\n * exists, throws an error and returns the existing one\n *\n * @param {string} texturePath\n * @returns {string}\n * @memberof TextureService\n */\n public RegisterNewTexture(texturePath: string): string {\n for (let i = 0; i < this.textures.length; i++) {\n const thisTextPath = this.textures[i].GetPath()\n if (thisTextPath === texturePath) {\n console.error('attempted to create a texture a second time')\n return this.textures[i].GetId();\n }\n }\n const newTexture = new Texture2D(texturePath);\n this.textures.push(newTexture);\n console.warn(`texture stack is now [${this.textures.length}] long`)\n return newTexture.GetId();\n }\n}","export class ImageHelper{\n private static readonly assetBasePath: string = './assets/_dist/';\n static NewImage(path: string): HTMLImageElement {\n const image = new Image(128, 128);\n image.src = this.assetBasePath + path;\n image.onerror = ((event) => this.onError(event));\n return image;\n }\n\n private static onError(error: string | Event) {\n console.log('error loading image', error);\n return;\n } \n}","import { HtmlService } from \"./Html/graphics.html.service\";\nimport { CanvasService } from \"./Canvas/graphics.canvas.service\";\nimport { TileService } from \"./Tiles/tile.service\";\nimport { GameCameraService } from \"./Camera/game-camera.service\";\nimport { DrawingService } from \"./Draw/drawing.service\";\nimport { TextureService } from \"./Textures/texture.service\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\nimport { Vector2 } from \"../../numerics/models/Vector2.model\";\n\nexport class GraphicsService {\n \n private htmlService: HtmlService;\n private canvasService: CanvasService;\n private tileService: TileService;\n private gameCameraService: GameCameraService;\n private drawingService: DrawingService;\n private textureService: TextureService;\n\n constructor() {\n console.log('starting graphics service');\n this.htmlService = new HtmlService();\n this.canvasService = new CanvasService(this.htmlService);\n this.tileService = new TileService(this.canvasService, this);\n this.textureService = new TextureService();\n const applyCameraWorldBounding = false;\n this.gameCameraService = new GameCameraService(0, 0, applyCameraWorldBounding);\n this.drawingService = new DrawingService(this.gameCameraService, this.canvasService, this.textureService);\n }\n\n\n\n InitGraphicsService() {\n this.htmlService.Init();\n this.canvasService.Init();\n this.tileService.Init();\n\n }\n\n public GetTextureService(): TextureService {\n return this.textureService;\n }\n\n GetTileService(): TileService {\n return this.tileService;\n }\n public getGameCameraService(): GameCameraService {\n return this.gameCameraService;\n }\n getDrawingService(): DrawingService {\n return this.drawingService;\n }\n\n RegisterDrawableEntity(id: string = null): string {\n return this.canvasService.RegisterNewCanvas(id);\n }\n\n GetCanvas(id: string) {\n return this.canvasService.GetCanvas(id);\n }\n\n Render() {\n // console.log('rendering in graphics service');\n this.canvasService.mainCanvasCtx.clearRect(0, 0,\n this.canvasService.mainCanvas.width, this.canvasService.mainCanvas.height);\n\n for (let i = 0; i < this.canvasService.drawableAreas.length; i++) {\n this.canvasService.mainCanvasCtx.drawImage(\n this.canvasService.drawableAreas[i].canvas, 0, 0);\n }\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class DirtTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/dirt.png';\n constructor(id: number, textId: string) {\n super(id, '#916D49', textId);\n }\n}","import * as json from '../../assets/_dist/Worlds/worlds.json';\nimport { World } from './world';\nimport { Vector2 } from '../../numerics/models/Vector2.model';\n\n/**\n * this is in a different file because adding .json files\n * causes VSCode to only want to load .js imports, and not\n * .ts imports\n *\n * @export\n * @class WorldJsonFileLoader\n */\nexport class WorldJsonFileLoader {\n private static worldCount: number = 2;\n constructor() {\n\n }\n public static GetWorlds(): World[] {\n const worldArr = new Array();\n for (let i = 0; i < this.worldCount; i++) {\n\n const world = json[i];\n worldArr.push(new World(\n new Vector2(\n world.tiles.length,\n world.tiles[0].length),\n new Vector2(\n world.start.x,\n world.start.y),\n world.tiles,\n world.worldId\n ));\n }\n return worldArr;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class ShallowWaterTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_top.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_right.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}\n\nexport class ShallowWaterTileTypeSandLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/shallow_water_sand_left.png';\n constructor(id: number, textId: string) {\n super(id, '#4380E4', textId);\n }\n}","import { IDebugService } from \"./debug.service\";\nimport { DebugKvp } from \"./debuggable-items.model\";\n\nexport class DebugComponent {\n private _debugService: IDebugService;\n private debugInfoElement: HTMLElement;\n\n constructor(private debugService: IDebugService) {\n this._debugService = debugService;\n\n\n }\n\n InitDebugComponent(mainDivId: string) {\n this.createDebugDiv(mainDivId);\n this.tick();\n }\n private createDebugDiv(parentElementId: string, id: string = 'el_debug_info'): HTMLElement {\n if (this.debugService.IsInDebugMode()) {\n const mainDiv = document.getElementById(parentElementId);\n this.debugInfoElement = document.createElement('div');\n this.debugInfoElement.id = id;\n mainDiv.appendChild(this.debugInfoElement);\n for (let i = 0; i < 10; i++) {\n this.debugService.PushOrUpdateInDebugArray('Debug Info' + i, 'debug value')\n }\n // this.debugService.PopFromDebugArray('Debug Info')\n\n return this.debugInfoElement;\n }\n }\n\n tick() {\n // setTimeout(() => {\n // this.ticks++;\n // });\n requestAnimationFrame(() => {\n // console.log('updating debugger')\n this.Update();\n this.tick();\n })\n }\n Update() {\n // console.log(this.debugService.GetDebugInfo(), null, 2)\n let DebugsAsString = '';\n const debugInfoArray = this.debugService.GetDebugInfo();\n for (let i = 0; i < debugInfoArray.length; i++) {\n // DebugsAsString += this.GetTemplateForKvp(debugInfoArray[i]);\n }\n this.debugInfoElement.innerHTML = DebugsAsString;\n }\n\n GetTemplateForKvp(item: DebugKvp) {\n throw new Error('not implemented')\n return `\n
    \n
    \n                ${item.Key}\n            
    \n
    \n                ${JSON.stringify(item.Value)}\n            
    \n
    `\n }\n}","import { Vector2 } from \"./Vector2.model\";\n\nexport class AABB {\n min: Vector2;\n max: Vector2;\n\n constructor(position: Vector2, size: Vector2) {\n this.min = new Vector2(\n position.getValueX(),\n position.getValueY());\n this.max = new Vector2(\n position.getValueX() + size.getValueX(),\n position.getValueY() + size.getValueY()\n );\n }\n public GetCenter(): Vector2 {\n const x = ((this.max.x - this.min.x) / 2) + this.min.x;\n const y = ((this.max.y - this.min.y) / 2) + this.min.y;\n\n return new Vector2(\n x, y\n );\n }\n public GetTop(): number {\n return this.min.getValueY();\n } \n public GetBottom(): number {\n return this.max.getValueY();\n }\n public GetLeft(): number {\n return this.min.getValueX();\n }\n public GetRight(): number {\n return this.max.getValueX();\n }\n\n public IsAbove(target: AABB): boolean {\n if (this.GetBottom() < target.GetTop()) {\n return true;\n }\n return false; \n }\n\n public IsBelow(target: AABB): boolean {\n if (this.GetTop() > target.GetBottom()) {\n return true;\n }\n return false;\n }\n\n public IsRight(target: AABB): boolean {\n if (this.GetRight() < target.GetLeft()) {\n return true;\n }\n return false;\n }\n\n public IsLeft(target: AABB): boolean {\n if (this.GetLeft() > target.GetRight()) {\n return true;\n }\n return false;\n }\n\n}","import { InputState } from \"./input-state\";\nimport { Vector2 } from \"../../numerics/models/Vector2.model\";\n\n\n\nexport class InputManager {\n\n private inputState: InputState;\n\n currentInputs: Array;\n private static readonly validInputs: Array = ['w', 'a', 's', 'd', ' '];\n\n\n private gamePads: Array = Array();\n\n constructor() {\n this.inputState = new InputState();\n\n\n this.currentInputs = new Array();\n this.gamePads = new Array();\n }\n\n /**\n * sets up the input manager\n *\n * @memberof InputManager\n */\n InitInputManager() {\n this.inputState.Init();\n // return;\n\n }\n\n /**\n * checks for new inputs. Should be called in a loop\n *\n * @memberof InputManager\n */\n NewInputLoopCheck() {\n this.inputState.UpdateInputs();\n // throw new Error(\"Method not implemented.\");\n }\n\n // private RegisterGamePad(pad: Gamepad) {\n // console.warn('gamepad registered');\n // console.warn(\"Gamepad: connected at index %d: %s. %d buttons, %d axes.\",\n // pad.index, pad.id,\n // pad.buttons.length, pad.axes.length);\n // this.gamePads = navigator.getGamepads();\n // // this.gamePads.push(pad); // = navigator.getGamepads ? navigator.getGamepads() : (navigator.getGamepads ? navigator.getGamepads : []);\n\n // for (let i = 0; i < this.gamePads.length; i++) {\n // const thisGp = this.gamePads[i];\n // if (thisGp) {\n // this.detailsDiv.innerHTML = \"Gamepad connected at index \" + thisGp.index + \": \" + thisGp.id +\n // \". It has \" + thisGp.buttons.length + \" buttons and \" + thisGp.axes.length + \" axes.\";\n\n // }\n // }\n // }\n // private DeRegisterGamePad(pad: Gamepad) {\n // console.warn('deregistering gamepad');\n // delete this.gamePads[pad.index];\n // this.ReportToHtml(\"gamepad DC\");\n // }\n\n\n\n\n /**\n * public method to check if a key is pressed or not\n *\n * @param {string} key\n * @returns\n * @memberof InputManager\n */\n IsKeyPressed(inputDescription: string): boolean {\n return this.inputState.IsInputPressed(inputDescription);\n }\n\n /**\n * gets the force value for a given input. If it's in \n * keyboard mode, then it just returns 0 or 1\n * \n * If it's in keyboard mode, then it returns a value of -1.0 to +1.0\n *\n * @param {string} inputDescription\n * @returns {number}\n * @memberof InputManager\n */\n GetForceValue(inputDescription: string): number {\n return this.inputState.GetForceValue(inputDescription);\n }\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class RandomNumberGenerator {\n\n\n /**\n * Generates a random number\n *\n * @static\n * @param {number} min\n * @param {number} max\n * @returns {number}\n * @memberof RandomNumberGenerator\n */\n public static GetRandomNumber(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * generates a random Vector 2\n *\n * @static\n * @param {number} minX\n * @param {number} maxX\n * @param {number} minY\n * @param {number} maxY\n * @returns {Vector2}\n * @memberof RandomNumberGenerator\n */\n public static GetRandomVector2(\n minX: number, maxX: number, \n minY: number, maxY: number): Vector2 {\n return new Vector2(this.GetRandomNumber(minX, maxX),\n this.GetRandomNumber(minY, maxY));\n }\n}","import { TileType } from \"./TileTypes/_base-tiletype\";\nimport { CanvasService } from \"../Canvas/graphics.canvas.service\";\nimport { SpaceTileType } from \"./TileTypes/SpaceTileTypes/space.tiletype\";\nimport { GraphicsService } from \"../graphics.service\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { TileDefaultSettings } from \"./tile.default.settings\";\nimport { DrawableTile } from \"./drawable-tile\";\nimport { GrassTileType, GrassTileTypeDirt, GrassTileTypeDirtTop, GrassTileTypeDirtRight, GrassTileTypeDirtLeft, GrassTileTypeDirtBottom, GrassTileTypeDirtMiddle } from \"./TileTypes/GroundTileTypes/grass.tiletype\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { StarTileType } from \"./TileTypes/SpaceTileTypes/star.tiletype\";\nimport { DirtTileType } from \"./TileTypes/GroundTileTypes/dirt.tiletype\";\nimport { SandTileTypeGrassTop, SandTileType, SandTileTypeGrassRight, SandTileTypeGrassBottom, SandTileTypeGrassLeft } from \"./TileTypes/GroundTileTypes/sand.tiletype\";\nimport { ShallowWaterTileType, ShallowWaterTileTypeSandTop, ShallowWaterTileTypeSandRight, ShallowWaterTileTypeSandBottom, ShallowWaterTileTypeSandLeft } from \"./TileTypes/GroundTileTypes/shallow-water.tiletype\";\nimport { StoneTileType } from \"./TileTypes/GroundTileTypes/stone.tiletype\";\nimport { Texture2D } from \"../Textures/Texture2d\";\n\nexport class TileService {\n\n private tileSize: Vector2 = TileDefaultSettings.DEFAULT_SIZE;\n\n public tileTypes: TileType[] = new Array(256);\n private spaceTileType: TileType;\n private starTileType: TileType;\n\n private grassTileType: TileType;\n private grassTileTypeDirt: GrassTileTypeDirt;\n private grassTileTypeDirtTop: GrassTileTypeDirtTop;\n private grassTileTypeDirtRight: GrassTileTypeDirtRight;\n private grassTileTypeBottom: GrassTileTypeDirtBottom;\n private grassTileTypeLeft: GrassTileTypeDirtLeft;\n private grassTileTypeMiddle: GrassTileTypeDirtMiddle;\n\n private dirtTileType: DirtTileType;\n private stoneTileType: StoneTileType;\n\n private sandTileType: SandTileType;\n private sandTileTypeDirtTop: SandTileTypeGrassTop;\n private sandTileTypeDirtRight: SandTileTypeGrassRight;\n private sandTileTypeBottom: SandTileTypeGrassBottom;\n private sandTileTypeLeft: SandTileTypeGrassLeft;\n\n private shallowWaterTileType: ShallowWaterTileType;\n private shallowWaterTileTypeDirtTop: ShallowWaterTileTypeSandTop;\n private shallowWaterTileTypeDirtRight: ShallowWaterTileTypeSandRight;\n private shallowWaterTileTypeBottom: ShallowWaterTileTypeSandBottom;\n private shallowWaterTileTypeLeft: ShallowWaterTileTypeSandLeft;\n\n\n\n private tiles: Array = new Array();\n\n private canvasService: CanvasService;\n private graphicsService: GraphicsService;\n\n private tileCanvasId: string;\n\n constructor(canvasService: CanvasService,\n graphicsService: GraphicsService) {\n this.graphicsService = graphicsService;\n this.canvasService = canvasService;\n }\n\n Init() {\n this.tileCanvasId = this.canvasService.RegisterNewCanvas();\n this.spaceTileType = new SpaceTileType(0, this.graphicsService.GetTextureService().RegisterNewTexture(SpaceTileType.texturePath));\n this.starTileType = new StarTileType(1, this.graphicsService.GetTextureService().RegisterNewTexture(StarTileType.texturePath));\n this.grassTileType = new GrassTileType(2, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileType.texturePath));\n\n this.grassTileTypeDirt = new GrassTileTypeDirt(3, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirt.texturePath));\n this.grassTileTypeDirtTop = new GrassTileTypeDirtTop(4, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtTop.texturePath));\n this.grassTileTypeDirtRight = new GrassTileTypeDirtRight(5, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtRight.texturePath));\n this.grassTileTypeBottom = new GrassTileTypeDirtBottom(6, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtBottom.texturePath));\n this.grassTileTypeLeft = new GrassTileTypeDirtLeft(7, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtLeft.texturePath));\n this.grassTileTypeMiddle = new GrassTileTypeDirtMiddle(8, this.graphicsService.GetTextureService().RegisterNewTexture(GrassTileTypeDirtMiddle.texturePath));\n\n this.dirtTileType = new DirtTileType(9, this.graphicsService.GetTextureService().RegisterNewTexture(DirtTileType.texturePath));\n\n this.stoneTileType = new StoneTileType(10, this.graphicsService.GetTextureService().RegisterNewTexture(StoneTileType.texturePath));\n\n this.sandTileType = new SandTileType(11, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileType.texturePath));\n this.sandTileTypeDirtTop = new SandTileTypeGrassTop(12, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassTop.texturePath));\n this.sandTileTypeDirtRight = new SandTileTypeGrassRight(13, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassRight.texturePath));\n this.sandTileTypeBottom = new SandTileTypeGrassBottom(14, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassBottom.texturePath));\n this.sandTileTypeLeft = new SandTileTypeGrassLeft(15, this.graphicsService.GetTextureService().RegisterNewTexture(SandTileTypeGrassLeft.texturePath));\n\n this.shallowWaterTileType = new ShallowWaterTileType(16, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileType.texturePath));\n this.shallowWaterTileTypeDirtTop = new ShallowWaterTileTypeSandTop(17, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandTop.texturePath));\n this.shallowWaterTileTypeDirtRight = new ShallowWaterTileTypeSandRight(18, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandRight.texturePath));\n this.shallowWaterTileTypeBottom = new ShallowWaterTileTypeSandBottom(19, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandBottom.texturePath));\n this.shallowWaterTileTypeLeft = new ShallowWaterTileTypeSandLeft(20, this.graphicsService.GetTextureService().RegisterNewTexture(ShallowWaterTileTypeSandLeft.texturePath));\n\n this.setupTileTypes();\n // this.setupTiles();\n }\n\n setupTileTypes() {\n this.tileTypes[this.spaceTileType.GetId()] = this.spaceTileType;\n this.tileTypes[this.starTileType.GetId()] = this.starTileType;\n this.tileTypes[this.grassTileType.GetId()] = this.grassTileType;\n this.tileTypes[this.grassTileTypeDirt.GetId()] = this.grassTileTypeDirt;\n\n this.tileTypes[this.grassTileTypeDirtTop.GetId()] = this.grassTileTypeDirtTop;\n this.tileTypes[this.grassTileTypeDirtRight.GetId()] = this.grassTileTypeDirtRight;\n this.tileTypes[this.grassTileTypeBottom.GetId()] = this.grassTileTypeBottom;\n this.tileTypes[this.grassTileTypeLeft.GetId()] = this.grassTileTypeLeft;\n this.tileTypes[this.grassTileTypeMiddle.GetId()] = this.grassTileTypeMiddle;\n\n this.tileTypes[this.dirtTileType.GetId()] = this.dirtTileType;\n\n this.tileTypes[this.stoneTileType.GetId()] = this.stoneTileType;\n\n this.tileTypes[this.sandTileType.GetId()] = this.sandTileType;\n this.tileTypes[this.sandTileTypeDirtTop.GetId()] = this.sandTileTypeDirtTop;\n this.tileTypes[this.sandTileTypeDirtRight.GetId()] = this.sandTileTypeDirtRight;\n this.tileTypes[this.sandTileTypeBottom.GetId()] = this.sandTileTypeBottom;\n this.tileTypes[this.sandTileTypeLeft.GetId()] = this.sandTileTypeLeft;\n\n this.tileTypes[this.shallowWaterTileType.GetId()] = this.shallowWaterTileType;\n this.tileTypes[this.shallowWaterTileTypeDirtTop.GetId()] = this.shallowWaterTileTypeDirtTop;\n this.tileTypes[this.shallowWaterTileTypeDirtRight.GetId()] = this.shallowWaterTileTypeDirtRight;\n this.tileTypes[this.shallowWaterTileTypeBottom.GetId()] = this.shallowWaterTileTypeBottom;\n this.tileTypes[this.shallowWaterTileTypeLeft.GetId()] = this.shallowWaterTileTypeLeft;\n\n\n }\n\n\n /**\n * returns a Vector 2 containing a size\n *\n * @param {number[][]} tiles\n * @returns {Vector2}\n * @memberof TileService\n */\n public setupTilesFromArray(tiles: number[][]): Vector2 {\n const size: Vector2 = new Vector2(0, 0);\n // const canvId = `${this.graphicsService.RegisterDrawableEntity('texts')}`;\n for (let x = 0; x < tiles.length; x++) {\n for (let y = 0; y < tiles[x].length; y++) {\n this.tiles.push(new DrawableTile(tiles[x][y],\n new Vector2(\n y * this.GetTileSize().getValueX(),\n x * this.GetTileSize().getValueY()),\n TileDefaultSettings.DEFAULT_SIZE,\n this.tileTypes[tiles[x][y]].GetFallbackColour(),\n this.tileCanvasId,\n this.tileTypes[tiles[x][y]].GetTextureId()));\n }\n }\n return size;\n }\n\n\n private PreClearCanvas() {\n const canv = this.graphicsService.GetCanvas(this.tileCanvasId);\n canv.ClearCanvas();\n }\n Redner() {\n this.PreClearCanvas();\n for (let i = 0; i < this.tiles.length; i++) {\n this.graphicsService.getDrawingService().Draw(\n this.tiles[i],\n true);\n }\n }\n\n\n public GetTileSize() {\n return this.tileSize;\n }\n}\n\n","import { DebuggableItems, DebugKvp } from \"./debuggable-items.model\";\n\nexport interface IDebugService {\n IsInDebugMode(): boolean;\n PushOrUpdateInDebugArray(key: string, value: any): void;\n PopFromDebugArray(key: string): boolean;\n GetDebugInfo(): Array;\n}\n\nexport class DebugService implements IDebugService {\n private inDebugMode: boolean;\n private DebugInfo: DebuggableItems;\n\n constructor(inDebugMode: boolean = false) {\n console.warn(`starting debug service. inDebugMode [${inDebugMode}]`);\n this.inDebugMode = inDebugMode;\n this.DebugInfo = new DebuggableItems();\n }\n\n public IsInDebugMode(): boolean {\n return this.inDebugMode;\n }\n\n public GetDebugInfo() {\n return this.DebugInfo.debugItems;\n }\n public PushOrUpdateInDebugArray(key: string, value: any): void {\n console.log(`adding item ${key} to debug array`);\n if (!this.checkForExisting(key)) {\n this.DebugInfo.debugItems.push(new DebugKvp(key, value));\n return;\n } else {\n if (this.PopFromDebugArray(key)) {\n this.PushOrUpdateInDebugArray(key, value);\n console.info(`successfully updated [${key}] in debug KVP`);\n return;\n }\n }\n console.error(`attempted to push or update [${key}], but the item didn't exist in the KVP`)\n }\n public PopFromDebugArray(key: string): boolean {\n console.log(`removing item ${key} to debug array`);\n for (let i = 0; i < this.DebugInfo.debugItems.length; i++) {\n if (this.DebugInfo.debugItems[i].Key === key) {\n this.DebugInfo.debugItems.splice(i, 1);\n return;\n }\n }\n console.error(`attempted to remove [${key} from debug KVP, but it couldn't be found]`);\n return false;\n }\n\n private checkForExisting(key: string): boolean {\n return false;\n }\n\n\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class TileDefaultSettings {\n public static readonly DEFAULT_SIZE: Vector2 = new Vector2(64, 64);\n}","import { GuidGenerator } from \"../../Tools/random_generators/random_guid.generator\";\nimport { ImageHelper } from \"../Images/ImageHelper\";\n\nexport class Texture2D {\n private id: string;\n private url: string;\n private image: HTMLImageElement;\n private imageCanRender: boolean;\n private path: string;\n\n constructor(path: string) {\n this.path = path;\n this.url = path;\n this.id = GuidGenerator.NewGuid();\n this.image = ImageHelper.NewImage(this.url);\n this.image.onload = (() => {\n this.imageCanRender = true;\n })\n this.image.onerror = (() => {\n this.imageCanRender = false;\n console.error('text2d: image could not render')\n })\n\n }\n\n public GetPath() {\n return this.path;\n }\n\n /**\n * GetId\n */\n public GetId() {\n return this.id;\n }\n\n /**\n * GetUrl\n */\n public GetImage() {\n return this.image;\n }\n\n /**\n * returns imageCanRender. If the image is successfully loaded, \n * this returns true. Otherwise returns false\n *\n * @returns\n * @memberof Texture2D\n */\n public GetCanRender() {\n return this.imageCanRender;\n }\n}","import { AABB } from \"../models/AABB.model\";\n\nexport class IntersectionHelper {\n // checks if two AABBs intersect (rectangle only)\n public static AabbVsAabb(left: AABB, right: AABB) {\n if ((left.max.getValueX() < right.min.getValueX()) || (left.min.getValueX() > right.max.getValueX())) {\n return false;\n }\n if ((left.max.getValueY() < right.min.getValueY()) || (left.min.getValueY() > right.max.getValueY())) {\n return false;\n }\n\n return true;\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class StoneTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/stone.png';\n constructor(id: number, textId: string) {\n super(id, '#52504F', textId);\n }\n}","import { GraphicsService } from \"../graphics.service\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Texture2D } from \"../Textures/Texture2d\";\nimport { Drawable } from \"./drawable\";\nimport { CanvasService } from \"../Canvas/graphics.canvas.service\";\nimport { GameCameraService } from \"../Camera/game-camera.service\";\nimport { DrawableTile } from \"../Tiles/drawable-tile\";\nimport { TextureService } from \"../Textures/texture.service\";\n\nexport class DrawingService {\n private cameraService: GameCameraService;\n private canvasService: CanvasService;\n private textureService: TextureService;\n private allowTextureDrawing: boolean = true;\n private drawAsStroke = true;\n\n constructor(\n cameraService: GameCameraService,\n canvasService: CanvasService,\n textureService: TextureService) {\n this.textureService = textureService;\n this.canvasService = canvasService;\n this.cameraService = cameraService;\n console.log('constructing drawing service');\n }\n\n public Draw(drawable: Drawable, skipCanvasClear: boolean = false) {\n const deg: number = drawable.GetRotation();\n if (this.cameraService.IsObjectOnScreenAABB(drawable.getAABB())) {\n\n const canv = this.canvasService.GetCanvas(drawable.getCanvasId());\n\n var rad = deg * (Math.PI / 180);\n\n if (!skipCanvasClear) {\n canv.ClearCanvas();\n }\n\n canv.ctx.save();\n // canv.ctx.scale(0.5, 0.5);\n const translateX = drawable.GetSizeX() + (drawable.GetPositionX() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetX());// + (drawable.GetSizeX() / 2));// + this.cameraService.GetOffsetY();\n const translateY = drawable.GetSizeX() + (drawable.GetPositionY() - (drawable.GetSizeX() / 2) - this.cameraService.GetOffsetY());// + (drawable.GetSizeY() / 2));// + this.cameraService.GetOffsetY();\n canv.ctx.translate(\n translateX,\n translateY);\n\n canv.ctx.rotate(rad);\n\n const drawLocationX = -drawable.GetSizeX() / 2;// / 2;// ;\n const drawLocationY = -drawable.GetSizeY() / 2;// / 2;// - this.cameraService.GetOffsetY();\n const drawSizeX = drawable.GetSizeX();\n const drawSizeY = drawable.GetSizeY();\n\n const texture = this.textureService.GetTexture(drawable.GetTextureId());\n\n\n if (this.allowTextureDrawing && texture && texture.GetCanRender()) {\n this.DrawAsTexture(texture, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY);\n } else if (false) {\n //TODO remove or change this\n } else {\n // if (drawable.GetTextureId()) {\n // console.log(`\n // text: ${texture.GetId()}\n // rend: ${texture.GetCanRender()}`);\n // }\n this.DrawAsRect(drawable, canv, drawLocationX, drawLocationY, drawSizeX, drawSizeY);\n }\n\n // detranslates the canvas\n canv.ctx.translate(-(translateX), -(translateY));\n canv.ctx.restore();\n }\n }\n\n // private rotate(ctx) {\n // //Convert degrees to radian \n // var rad = deg * Math.PI / 180;\n\n // //Set the origin to the center of the image\n // ctx.translate(x + width / 2, y + height / 2);\n\n // //Rotate the canvas around the origin\n // ctx.rotate(rad);\n\n // //draw the image \n // ctx.drawImage(img, width / 2 * (-1), height / 2 * (-1), width, height);\n\n // //reset the canvas \n // ctx.rotate(rad * (-1));\n // ctx.translate((x + width / 2) * (-1), (y + height / 2) * (-1));\n\n // }\n\n DrawAsTexture(texture: Texture2D, canv: DrawableCanvas,\n drawLocationX: number, drawLocationY: number, drawSizeX: number, drawSizeY: number) {\n\n canv.ctx.strokeStyle = '#fff';\n canv.ctx.strokeRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n\n\n\n canv.ctx.drawImage(texture.GetImage(),\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY);\n\n\n }\n\n private DrawAsRect(drawable: Drawable, canv: DrawableCanvas,\n drawLocationX: number, drawLocationY: number, drawSizeX: number, drawSizeY: number) {\n\n if (this.drawAsStroke) {\n canv.ctx.strokeStyle = drawable.GetColour();\n canv.ctx.strokeRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n } else {\n canv.ctx.fillStyle = drawable.GetColour();\n canv.ctx.fillRect(\n drawLocationX,\n drawLocationY,\n drawSizeX,\n drawSizeY\n );\n }\n }\n}\n\n","\nexport class GuidGenerator {\n /**\n * returns a new guid\n * \n * https://stackoverflow.com/a/2117523\n *\n * @export\n * @returns a guid\n */\n static NewGuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n\n }\n}","import { AABB } from \"../../../numerics/models/AABB.model\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport abstract class Drawable {\n private canvasId: string;\n private AABB: AABB;\n protected colour: string;\n protected textureId: string;\n\n protected position: Vector2;\n protected size: Vector2;\n protected rotationDegrees: number;\n\n constructor(position: Vector2, size: Vector2, canvasId: string, textureId: string) {\n console.log(`drawable constructor`);\n this.position = position;\n this.size = size;\n this.AABB = new AABB(this.position, this.size);\n this.canvasId = canvasId;\n this.rotationDegrees = 0;\n this.textureId = textureId;\n }\n\n public getCanvasId(): string {\n return this.canvasId;\n }\n\n protected setCanvasId(canvasId: string): void {\n this.canvasId = canvasId;\n }\n\n public GetTextureId(): string {\n return this.textureId;\n }\n public SetTextureId(textureId: string): void {\n this.textureId = textureId;\n }\n\n public getAABB(): AABB {\n if (this.AABB === undefined) {\n this.UpdateAABB();\n }\n return this.AABB;\n }\n\n protected setAABB(AABB: AABB): void {\n this.AABB = AABB;\n }\n\n protected UpdateAABB(): void {\n this.setAABB(new AABB(this.position, this.size));\n }\n\n public GetPositionX() {\n return this.position.x;\n }\n public GetPositionY() {\n return this.position.y;\n }\n public GetSizeX() {\n return this.size.x;\n }\n public GetSizeY() {\n return this.size.y;\n }\n\n public GetColour() {\n if (this.colour) {\n return this.colour;\n } else {\n return '#f00';\n }\n }\n\n public GetRotation() {\n return this.rotationDegrees;\n }\n public AddToRotation(val: number) {\n this.rotationDegrees += val;\n if (this.rotationDegrees > 359) {\n this.rotationDegrees = 0;\n } else if (this.rotationDegrees < 0) {\n this.rotationDegrees = 359;\n }\n }\n}\n","export class HtmlService {\n private mainDiv: HTMLDivElement;\n\n constructor() {\n console.log('creating Html Helper Service in Graphics');\n }\n\n Init() {\n this.createMainDiv('main_div');\n }\n\n\n GetMainDiv() {\n return this.mainDiv;\n }\n\n private createMainDiv(id: string = 'main_div'): string {\n this.mainDiv = document.createElement('div');\n this.mainDiv.id = id;\n document.body.appendChild(this.mainDiv);\n return this.mainDiv.id;\n }\n\n public createCanvas(id: string, attatchTo: string, width: number, height: number, classList: string[] = null): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.id = id;\n canvas.width = width;\n canvas.height = height;\n if (classList != null) {\n for (let i = 0; i < classList.length; i++) {\n canvas.classList.add(classList[i]);\n }\n }\n document.getElementById(attatchTo).appendChild(canvas);\n return canvas;\n }\n}","import { Vector2 } from \"../../../numerics/models/Vector2.model\";\n\nexport class DrawableCanvas extends Vector2 {\n public canvas: HTMLCanvasElement;\n public ctx: CanvasRenderingContext2D;\n public id: string;\n constructor(canvas: HTMLCanvasElement, id: string,\n width: number, height: number) {\n super(width, height);\n this.id = id;\n this.canvas = canvas;\n this.ctx = this.canvas.getContext('2d');\n }\n\n protected GetWidth() {\n return this.getValueX();\n }\n protected GetHeight() {\n return this.getValueY();\n }\n\n public ClearCanvas() {\n this.ctx.clearRect(0, 0, this.getValueX(), this.getValueY());\n\n }\n\n public PaintImmediately() {\n this.ctx.drawImage(this.canvas, 0, 0);\n }\n\n}","import { Player } from \"./Creatures/player\";\nimport { AABB } from \"../../numerics/models/AABB.model\";\n\nexport class PlayerService {\n private player: Player;\n constructor() {\n\n }\n\n public SetPlayer(player: Player) {\n if (this.player !== undefined) {\n console.error(`playerService.SetPlayer would overwrite the existing player`);\n } else {\n console.warn('setting player');\n this.player = player;\n }\n\n }\n public GetPlayer() {\n return this.player;\n } \n\n \n}","import { Creature } from \"./creature\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { PlayerService } from \"../player.service\";\nimport { AABB } from \"../../../numerics/models/AABB.model\";\nimport { IntersectionHelper } from \"../../../numerics/helpers/intersection.helper\";\nimport { RandomNumberGenerator } from \"../../Tools/random_generators/random_number.generators\";\nimport { Radians, Degrees, FartherRight } from \"../../../numerics/helpers/degrees.helper\";\nimport { Between, Lerp } from \"../../../numerics/helpers/number.helper\";\nimport { Entity } from \"../_base-entity\";\n\nexport class Baddy extends Creature {\n private playerService: PlayerService;\n private direction: Vector2;\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string,\n graphicsService: GraphicsService, colour: string,\n playerService: PlayerService) {\n super(position, size, name, texturePath, graphicsService);\n this.playerService = playerService;\n this.colour = colour;\n this.maxSpeed = new Vector2(10, 10);\n this.acceleration = new Vector2(.55, .6);\n\n // const friction = 0.85; // RandomNumberGenerator.GetRandomNumber(100, 200) / 1000;\n // this.friction = new Vector2(friction,\n // friction);\n\n this.direction = new Vector2(0, 0);\n\n\n // this.velocity = RandomNumberGenerator.GetRandomVector2(-10, 10, -10, 10);\n this.rotationDegrees = 0;// RandomNumberGenerator.GetRandomNumber(0, 359);\n this.turnSpeed = .0515;\n this.thrust = 1;\n\n }\n\n public Tick(lastDelta: number): void {\n this.UpdateAABB();\n\n const playerAABB = this.playerService.GetPlayer().getAABB();\n this.MoveToPlayer(playerAABB);\n\n this.Move(lastDelta);\n }\n public Render(): void {\n // super.Draw(this.colour);\n }\n\n collideWithObject(entity: Entity) {\n console.log('colliding with object')\n }\n\n private turnToPlayer(playerAABB: AABB) {\n let dx = playerAABB.GetCenter().getValueX() - this.getAABB().GetCenter().getValueX();\n let dy = playerAABB.GetCenter().getValueY() - this.getAABB().GetCenter().getValueY();\n const len = Math.sqrt(dx * dy + dy * dy);\n dx /= len ? len : 0.1;\n dy /= len ? len : 0.1;\n\n let dirX = Math.cos(Radians(this.rotationDegrees));\n let dirY = Math.sin(Radians(this.rotationDegrees));\n\n dirX += (dx - dirX) * 1;\n dirY += (dy - dirY) * 1;\n\n const rotateTo = Math.atan2(dirY, dirX);\n\n // this.rotationDegrees = Degrees(rotateTo) + (90);\n this.rotationDegrees = Lerp(this.rotationDegrees, Degrees(rotateTo) + (-this.angleAdjust), .5);\n }\n\n private MoveToPlayer(playerAABB: AABB) {\n this.turnToPlayer(playerAABB);\n const rotationAsRadians = Radians(this.rotationDegrees - this.angleAdjust);\n const rotSin = Math.sin(rotationAsRadians);\n const rotCos = Math.cos(rotationAsRadians);\n\n this.velocity.x -= (rotCos * this.thrust);\n this.velocity.y -= (rotSin * this.thrust);\n\n\n // const rotationAsRadians = this.rotationDegrees / Math.PI * 180;\n // const rotCos = Math.sin(rotationAsRadians);\n // const rotSin = Math.cos(rotationAsRadians);\n\n // this.velocity.x = (rotSin * thrust);\n // this.velocity.y = (rotCos * thrust);\n\n // console.log(`baddy: \n // rotation: ${this.rotationDegrees}\n // CosRotation: ${rotCos}\n // SinRotation: ${rotSin}\n // velocity: ${this.velocity.concat()}`);\n\n\n\n // if (IntersectionHelper.AabbVsAabb(\n // this.getAABB(), playerAABB) === false) {\n // if (this.getAABB().IsAbove(playerAABB)) {\n // this.setDirectionDown();\n // this.velocity.y += this.acceleration.y;\n // // console.log('entity is above player')\n // } else if (this.getAABB().IsBelow(playerAABB)) {\n // this.setDirectionUp();\n // // console.log('entity is above player')\n // this.velocity.y -= this.acceleration.y; // console.log('entity is below player')\n // }\n\n // if (this.getAABB().IsRight(playerAABB)) {\n // this.setDirectionLeft();\n // // console.log('entity is right of the player');\n // this.velocity.x += this.acceleration.x;\n // } else if (this.getAABB().IsLeft(playerAABB)) {\n // this.setDirectionRigth();\n // // console.log('entity is left of the player')\n // this.velocity.x -= this.acceleration.x;\n // }\n // }\n\n // this.velocity.x -= (this.getDirectionHorizontal() * this.acceleration.x) / 4;\n // this.velocity.y += (this.getDirectionVertical() * this.acceleration.y) / 4;\n }\n\n private setDirectionRigth(): void {\n this.direction.setValueX(1);\n }\n private setDirectionLeft(): void {\n this.direction.setValueX(-1);\n }\n private setDirectionUp(): void {\n this.direction.setValueY(-1);\n }\n private setDirectionDown(): void {\n this.direction.setValueY(1);\n }\n\n private getDirectionHorizontal(): number {\n return this.direction.getValueX();\n }\n private getDirectionVertical(): number {\n return this.direction.getValueY();\n }\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class SandTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_top.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_right.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}\n\nexport class SandTileTypeGrassLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/sand_grass_left.png';\n constructor(id: number, textId: string) {\n super(id, '#C1C128', textId);\n }\n}","import { BaseState } from \"./_BaseState\";\nimport { GameCameraService } from \"../Graphics/Camera/game-camera.service\";\nimport { GraphicsService } from \"../Graphics/graphics.service\";\n\nexport class GameState extends BaseState {\n\n constructor(private graphicsService: GraphicsService) {\n super();\n console.log('constructing GameState')\n }\n\n public Tick(): void {\n // console.error(\"Method not implemented.\");\n // this.graphicsService.getGameCameraService().MoveCamera(1, 0);\n\n }\n\n public Render(): void {\n // console.error(\"Method not implemented.\");\n }\n\n\n}","import { TileType } from \"../_base-tiletype\";\n\nexport class GrassTileType extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirt extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_middle.png';\n constructor(id: number, textId: string) {\n super(id, '#87CC6F', textId);\n }\n}\n\nexport class GrassTileTypeDirtTop extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_top.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtRight extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_right.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtBottom extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_bottom.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtLeft extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_left.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\nexport class GrassTileTypeDirtMiddle extends TileType {\n public static readonly texturePath: string = '/Tiles/ground/grass_with_dirt_middle.png';\n constructor(id: number, textId: string) {\n super(id, '#438337', textId);\n }\n}\n\n","export class DegreesHelper {\n\n}\n\n\n/**\n * converts degrees into radians\n *\n * @export\n * @param {number} degrees\n * @returns\n */\nexport function Radians(degrees: number) {\n return degrees * Math.PI / 180;\n}\n\n\n/**\n * converts radians into degrees\n *\n * @export\n * @param {number} radians\n * @returns\n */\nexport function Degrees(radians: number) {\n return radians * 180 / Math.PI;\n}\n\nexport function FartherRight(fromDegrees: number, toDegrees: number) {\n\n return true;\n}","import { Creature } from \"./creature\";\nimport { Vector2 } from \"../../../numerics/models/Vector2.model\";\nimport { InputManager } from \"../../Input/InputManager\";\nimport { GraphicsService } from \"../../Graphics/graphics.service\";\nimport { RandomStringGenerator } from \"../../Tools/random_generators/random_string.generator\";\nimport { Texture2D } from \"../../Graphics/Textures/Texture2d\";\nimport { DrawableCanvas } from \"../../Graphics/Models/graphics.drawable-canvas\";\nimport { Radians } from \"../../../numerics/helpers/degrees.helper\";\n\nexport class Player extends Creature {\n inputManager: InputManager;\n\n private detailsDiv: HTMLElement;\n private rotationSpeed: number = 5;\n\n private strafeThrust = 1.5;\n private readonly startingFriction: Vector2;\n\n constructor(position: Vector2, size: Vector2, name: string,\n texturePath: string, inputManager: InputManager, graphicsService: GraphicsService) {\n super(position, size, name, texturePath, graphicsService);\n this.startingFriction = this.friction;\n this.inputManager = inputManager;\n this.health = 100;\n this.detailsDiv = document.getElementById('details_div');\n this.colour = '#fff';\n this.thrust = 1;\n\n\n\n }\n\n public Tick(lastDelta: number): void {\n this.GetInput();\n this.Move(lastDelta);\n this.graphicsService.getGameCameraService().LookAt(this.position, this.size);\n }\n\n\n private GetInput(): void {\n // this.setMove(new Vector2(0, 0));\n\n this.UpdatePlayerSpeedFromInput();\n this.UpdatePlayerRotationFromInput();\n this.UpdatePlayerStrafeFromInput();\n\n // if (this.inputManager.IsKeyPressed('direction_left')) {\n // this.AddToRotation(-(this.rotationSpeed * this.inputManager.GetForceValue('direction_left')));\n\n // // this.AddToRotation(-this.rotationSpeed);\n // // this.velocity.x -= this.acceleration.x;\n // }\n // if (this.inputManager.IsKeyPressed('direction_right')) {\n // this.AddToRotation(this.rotationSpeed * this.inputManager.GetForceValue('direction_right'));\n // // this.velocity.x += this.acceleration.x;\n // }\n if (this.inputManager.IsKeyPressed(''))\n\n if (this.inputManager.IsKeyPressed('action_a')) {\n console.log('space pressed')\n }\n // console.log(`this.movement.x = ${this.movement.x}`)\n }\n\n private UpdatePlayerRotationFromInput() {\n if (this.inputManager.IsKeyPressed('axes_pad_left_horizontal')) {\n this.AddToRotation(this.rotationSpeed *\n this.inputManager.GetForceValue('axes_pad_left_horizontal'));\n } else {\n if (this.inputManager.IsKeyPressed('direction_right')) {\n this.AddToRotation(this.rotationSpeed *\n this.inputManager.GetForceValue('direction_right'));\n }\n if (this.inputManager.IsKeyPressed('direction_left')) {\n this.AddToRotation(-(this.rotationSpeed *\n this.inputManager.GetForceValue('direction_left')));\n }\n }\n }\n\n private UpdatePlayerSpeedFromInput() {\n const rotationAsRadians = Radians(this.rotationDegrees - this.angleAdjust);\n const rotSin = Math.sin(rotationAsRadians);\n const rotCos = Math.cos(rotationAsRadians);\n\n\n if (this.inputManager.IsKeyPressed('trigger_two_right') ||\n this.inputManager.IsKeyPressed('direction_up')) {\n const triggerTwoRightForce =\n Math.max(this.inputManager.GetForceValue('direction_up'),\n (this.inputManager.GetForceValue('trigger_two_right')));\n this.velocity.x -= (rotCos * (this.thrust * triggerTwoRightForce));\n this.velocity.y -= (rotSin * (this.thrust * triggerTwoRightForce));\n }\n if (this.inputManager.IsKeyPressed('trigger_two_left') ||\n this.inputManager.IsKeyPressed('direction_down')) {\n const triggerTwoLeftForce = Math.max(this.inputManager.GetForceValue('trigger_two_left'),\n (this.inputManager.GetForceValue('direction_down')));\n // this.velocity.x += (rotCos * (this.thrust * triggerTwoLeftForce));\n // this.velocity.y += (rotSin * (this.thrust * triggerTwoLeftForce));\n this.friction.x = 0.85;\n this.friction.y = 0.85;\n } else {\n this.friction = new Vector2(this.startingFriction.getValueX(), this.startingFriction.getValueY());\n }\n\n\n\n if (this.inputManager.IsKeyPressed('trigger_one_right')) {\n const triggerOneRightForce = this.inputManager.GetForceValue('trigger_one_right');\n this.velocity.x += (rotSin * triggerOneRightForce) * this.strafeThrust;\n this.velocity.y -= (rotCos * triggerOneRightForce) * this.strafeThrust;\n }\n if (this.inputManager.IsKeyPressed('trigger_one_left')) {\n const triggerOneLeftForce = this.inputManager.GetForceValue('trigger_one_right');\n this.velocity.x -= rotSin * triggerOneLeftForce;\n this.velocity.y += rotCos * triggerOneLeftForce;\n }\n\n\n\n\n\n this.detailsDiv.innerHTML = `\n player:
    \n ve: ${this.velocity.concat(3)}
    \n ro: ${this.rotationDegrees.toFixed(3)}DEG
    \n ro: ${rotationAsRadians.toFixed(3)}RAD
    \n th: ${this.thrust.toFixed(3)}
    \n rS: ${rotSin.toFixed(3)}
    \n rC: ${rotCos.toFixed(3)}
    \n\n `;\n }\n\n protected UpdatePlayerStrafeFromInput() {\n // if (this.inputManager.IsKeyPressed('trigger_one_right')) {\n // this.velocity.x -= (this.inputManager.GetForceValue('trigger_one_right') * this.acceleration.y) ;\n // }\n // if (this.inputManager.IsKeyPressed('trigger_one_left')) {\n // this.velocity.x += (this.inputManager.GetForceValue('trigger_one_left') * this.acceleration.y) ;\n // }\n }\n}\n","export class RandomStringGenerator {\n\n\n public static GetRandomHexColour(): string {\n return '#' + (Math.random() * 0xFFFFFF << 0).toString(16);\n }\n}","import { BaseState } from \"./_BaseState\";\n\nexport class SettingsState extends BaseState {\n constructor() {\n super();\n console.log(`constructing SettingsState`);\n }\n\n public Tick(): void {\n console.error(\"Method not implemented.\");\n }\n\n public Render(): void {\n console.error(\"Method not implemented.\");\n }\n}\n","import { BaseState } from \"./_BaseState\";\n\nexport class StateService {\n private currentState: BaseState = null;\n\n\n public setState(state: BaseState): void {\n this.currentState = state;\n }\n public GetState(): BaseState {\n return this.currentState;\n }\n}","import { HtmlService } from \"../Html/graphics.html.service\";\nimport { DrawableCanvas } from \"../Models/graphics.drawable-canvas\";\nimport { ViewportHelper } from \"../Viewport/Viewport.Helper\";\nimport { GuidGenerator } from \"../../Tools/random_generators/random_guid.generator\";\n\nexport class CanvasService {\n private htmlService: HtmlService;\n\n public mainCanvas: HTMLCanvasElement;\n public mainCanvasCtx: CanvasRenderingContext2D;\n public drawableAreas: Array;\n\n viewportWidth: number;\n viewportHeight: number;\n\n constructor(htmlService: HtmlService) {\n console.log('creating a canvas service');\n this.htmlService = htmlService;\n }\n\n Init() {\n const viewportSize = ViewportHelper.GetWindowInAspectRatioForCanvas();\n this.viewportHeight = viewportSize.y;\n this.viewportWidth = viewportSize.x;\n\n this.mainCanvas = this.htmlService.createCanvas('main_canvas', \n this.htmlService.GetMainDiv().id,\n this.viewportWidth,\n this.viewportHeight,\n ['parent']);\n this.mainCanvasCtx = this.mainCanvas.getContext('2d');\n this.drawableAreas = new Array();\n }\n\n RegisterNewCanvas(id: string = null): string {\n console.log(`registering a new canvas with id ${id}`);\n if (id === null) {\n id = GuidGenerator.NewGuid();\n }\n const canvas = this.htmlService.createCanvas(id, this.mainCanvas.id, \n this.viewportWidth, this.viewportHeight);\n this.drawableAreas.push(new DrawableCanvas(canvas, id, this.viewportWidth, this.viewportHeight));\n return id;\n }\n\n GetMainCanvas() {\n return this.mainCanvas;\n }\n\n GetCanvas(id: string) {\n for (let i = 0; i < this.drawableAreas.length; i++) {\n if (this.drawableAreas[i].id === id) {\n return this.drawableAreas[i];\n }\n }\n console.error(`failed to get a canvas of id ${id}`);\n }\n}\n\n","import { Entity } from \"./_base-entity\";\nimport { DrawingService } from \"../Graphics/Draw/drawing.service\";\nimport { GraphicsService } from \"../Graphics/graphics.service\";\n\nexport class EntityService {\n private gameEntities: Entity[];\n\n constructor(\n // drawingService: DrawingService\n ) {\n this.gameEntities = new Array();\n }\n\n\n public TickAllEntities(lastDelta: number) {\n for (let i = 0; i < this.gameEntities.length; i++) {\n this.gameEntities[i].Tick(lastDelta);\n }\n }\n\n public RenderAllEntities(graphicsService: GraphicsService) {\n for (let i = 0; i < this.gameEntities.length; i++) {\n graphicsService.getDrawingService().Draw(this.gameEntities[i]);\n }\n }\n\n public RegisterEntity(entity: Entity) {\n console.log('registering an entity')\n this.gameEntities.push(entity);\n }\n}","import { Vector2 } from '../../numerics/models/Vector2.model';\nimport { World } from './world';\nimport { WorldJsonFileLoader } from './world.jsonfiles';\nimport { TileService } from '../Graphics/Tiles/tile.service';\nimport { AABB } from '../../numerics/models/AABB.model';\nimport { Vector2Helpers } from '../../numerics/helpers/vector2.helper';\n\nexport class WorldService {\n\n private currentWorldId: number = 0;\n private worlds: World[] = new Array();\n private tileService: TileService;\n private size: Vector2;\n\n\n constructor(tileService: TileService) {\n this.tileService = tileService;\n \n }\n\n Init() {\n this.worlds = WorldJsonFileLoader.GetWorlds();\n console.log(`this.worlds = ${JSON.stringify(this.worlds)} length is ${this.worlds.length}`);\n\n console.info('setting current world to index 0');\n this.SetWorld(2);\n }\n\n public SetWorld(index: number) {\n this.DeRegisterWorld();\n this.tileService.setupTilesFromArray(this.GetWorld(index).GetTiles());\n }\n\n public GetWorldSize(): AABB {\n const tileSize = this.tileService.GetTileSize();\n this.size = Vector2Helpers.MultiplyByScale(tileSize, 2);\n console.log(`this.size: ${this.size}`);\n const worldPosition = new Vector2(0, 0);\n\n return new AABB(\n worldPosition,\n this.size\n );\n }\n\n\n DeRegisterWorld() {\n console.error(\" DeRegisterWorld: Method not implemented.\");\n }\n\n\n public GetStartingPosition(worldIndex: number) {\n return this.worlds[worldIndex].GetStartingPosition();\n }\n\n\n public GetWorld(index: number) {\n if (index > this.worlds.length) {\n throw new Error(`index [${index}] out of range of world array (length: ${this.worlds.length})`);\n }\n return this.worlds[0];\n }\n\n}\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { Game } from './application/game';\n\nexport class App {\n start() {\n const game = new Game(); \n game.Run();\n }\n}\n\nconst application = new App();\napplication.start();"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/css/style.css b/dist/css/style.css deleted file mode 100644 index bb78b3d..0000000 --- a/dist/css/style.css +++ /dev/null @@ -1,121 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - box-sizing: border-box; -} - -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} - -body { - line-height: 1; -} - -ol, ul { - list-style: none; -} - -blockquote, q { - quotes: none; -} - -blockquote:before, blockquote:after, -q:before, q:after { - content: ""; - content: none; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -#el_canvasable { - height: 100%; - width: 100%; -} - -div.in_debug_mode #el_canvasable { - height: 100%; - width: 100%; -} -div.in_debug_mode #el_debug_info { - position: absolute; - right: 0; - height: 100%; - width: 30%; - color: #c0c0c0; - background-color: rgba(45, 45, 45, 0.5); -} - -body { - background: #ff0000; -} - -body, html { - height: 100%; - width: 100%; -} - -body { - background: #2F4F4F; -} - -#main_div { - width: 100%; - height: 100%; - display: flex; - align-items: center; -} - -canvas { - background: transparent; - display: block; - margin: 0 auto; - box-sizing: border-box; -} -canvas.parent { - background: black; -} - -.notice-holder { - padding: 20px; - width: auto; - clear: both; - background: rgba(0, 0, 0, 0.7); - color: white; - position: absolute; - left: 0; - top: 0; -} -.notice-holder #details_div, .notice-holder #performance_div { - position: relative; - width: auto; - border: 1px dashed pink; - padding: 1rem; -} - -/*# sourceMappingURL=style.css.map */ diff --git a/dist/css/style.css.map b/dist/css/style.css.map deleted file mode 100644 index a59ec6a..0000000 --- a/dist/css/style.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../src/scss/reset.scss","../../src/scss/debug-mode.scss","../../src/scss/_settings.scss","../../src/scss/_main.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAaC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;AACA;AAAA;EAEC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;;;AAED;EACC;EACA;;;AC/CD;EACE;EACA;;;AAGA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA,OCXS;EDYT;;;AETJ;EACI,YDPK;;;ACcT;EACC;EACA;;;AAED;EACC,YDjBe;;;ACmBhB;EACC;EACA;EACA;EACD;;;AAEA;EACC;EACG;EACH;EAEA;;AACA;EACC;;;AAGF;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;EACA","file":"style.css"} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index 147ea9b..8cea3b1 100644 --- a/dist/index.html +++ b/dist/index.html @@ -6,6 +6,8 @@ + + @@ -16,6 +18,5 @@ - \ No newline at end of file diff --git a/package.json b/package.json index 11117ad..94b6b9a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "html-loader": "^4.2.0", "lodash": "^4.17.21", "mocha": "^10.3.0", - "sass": "^1.72.0", + "sass": "^1.89.0", "sass-loader": "^14.1.1", "style-loader": "^3.3.4", "ts-loader": "^9.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a75cb49..3ed1671 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: specifier: ^10.3.0 version: 10.8.2 sass: - specifier: ^1.72.0 + specifier: ^1.89.0 version: 1.89.0 sass-loader: specifier: ^14.1.1 diff --git a/readme.md b/readme.md index a8f9fce..53d2352 100644 --- a/readme.md +++ b/readme.md @@ -2,12 +2,30 @@ * Master: [![Build status](https://ci.appveyor.com/api/projects/status/vtw90xu6vtf95l2k/branch/master?svg=true)](https://ci.appveyor.com/project/Liam/march/branch/master) +## To run -# To run: -in terminal run +```bash +pnpm vite +``` -`cd ./src` -`npm run start` + +## To install + +```bash +pnpm install +``` + +## To build +```bash +pnpm vite build +``` + +## To test the `dist` from localhost + +```bash +cd dist +python -m http.server 5022 +``` ## To view in a browser: https://liamlaverty.github.io/March/dist/ diff --git a/src/index.ts b/src/index.ts index a76566a..526fbef 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import './scss/_main.scss'; import { Game } from './application/game'; export class App { diff --git a/vite.config.ts b/vite.config.ts index 9ff21ac..64ea8b0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from 'vite' import path from 'path' export default defineConfig({ + base: './', root: 'src', build: { outDir: '../dist',