From c4821cba05accf1d72f3354830a44e35c8f82374 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 23:16:56 +0000 Subject: [PATCH] Fix the browser-side memory leaks of the live map Watching a populated map made the browser tab grow steadily, because the three.js resources of the map objects were never released. - Attackable, Attacks and World got a dispose() which releases the materials, textures and geometries they own and stops their tweens. World.dispose() traverses its objects and World.removeObject() disposes the removed one, instead of just detaching it from the scene graph. Without that, the renderer keeps an entry (including the compiled program and the GL texture handle) for each of them forever. - The canvas, texture and material of a NameLabel are created lazily when the label is shown for the first time. Previously every object allocated a 512x64 canvas, although the label is only shown on hover. - MapApp.dispose() now also disposes the object picker, releases the WebGL context and removes the canvas from its container. The stats element is removed by the map launcher which created it. - The per-object debug messages are gated behind a debug flag: the console keeps live references to everything which is logged to it. - If the page is left before the MapApp module is loaded, the creation of the map is cancelled. Otherwise it started a rendering loop which never stopped and kept a WebGL context alive for the lifetime of the tab. It also fixes some smaller defects in the same code: - The walk animation played all steps, instead of just the last one: chain() replaces the chained tweens instead of appending to them, so each step tween is now chained to its predecessor. - rotateTo stores the direction in the object data again. - The terrain shader parameters are created per world. As a shared singleton, each map load overwrote the texture of the previously loaded map and the resize of one map changed the pixel size of all of them. - MapApp.animate passes the timestamp of the new frame to TWEEN. - The queue of the attack particles compacts its storage, so that its backing array doesn't grow indefinitely. - The renderer canvas is only appended once to the map container. Fixes #918 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WDGCcNgQgRxvxGaTjyQNHM --- src/Web/Map/Scripts/livemap/Attack.ts | 8 + src/Web/Map/Scripts/livemap/Attackable.ts | 104 +++-- src/Web/Map/Scripts/livemap/Debug.ts | 33 ++ src/Web/Map/Scripts/livemap/GameObject.ts | 6 + src/Web/Map/Scripts/livemap/MapApp.ts | 27 +- src/Web/Map/Scripts/livemap/NameLabel.ts | 94 +++- src/Web/Map/Scripts/livemap/Queue.ts | 55 ++- src/Web/Map/Scripts/livemap/TerrainShader.ts | 75 ++-- src/Web/Map/Scripts/livemap/World.ts | 73 ++- .../Map/wwwroot/js/MUnique.OpenMU.Web.Map.js | 425 ++++++++++++------ .../wwwroot/js/MUnique.OpenMU.Web.Map.js.map | 2 +- src/Web/Map/wwwroot/js/map-launcher.js | 33 +- 12 files changed, 677 insertions(+), 258 deletions(-) create mode 100644 src/Web/Map/Scripts/livemap/Debug.ts diff --git a/src/Web/Map/Scripts/livemap/Attack.ts b/src/Web/Map/Scripts/livemap/Attack.ts index f96d1d36de..1aede98141 100644 --- a/src/Web/Map/Scripts/livemap/Attack.ts +++ b/src/Web/Map/Scripts/livemap/Attack.ts @@ -44,6 +44,14 @@ export class Attacks extends THREE.Points { public update(): void { } + /** + * Releases the geometry and material of the attack particles. + */ + public dispose(): void { + this.geometry.dispose(); + this.material.dispose(); + } + public addAttack(attacker: GameObject, target: GameObject): void { if (this.freeAttackIndexes.peek() === null) { return; diff --git a/src/Web/Map/Scripts/livemap/Attackable.ts b/src/Web/Map/Scripts/livemap/Attackable.ts index 9e94cbf897..09714be30d 100644 --- a/src/Web/Map/Scripts/livemap/Attackable.ts +++ b/src/Web/Map/Scripts/livemap/Attackable.ts @@ -12,12 +12,19 @@ export class Attackable extends THREE.Mesh implements public material: THREE.Material; public readonly nameLabel: NameLabel; - private moveTween: TWEEN.Tween; + /* + * All tweens of the current movement - the tween of the first step and the + * step tweens which are chained to it. They are all kept, because stopping + * the first tween doesn't stop the chained ones anymore as soon as it finished. + */ + private moveTweens: TWEEN.Tween[] = []; + private rotateTween: TWEEN.Tween | null = null; + private scaleTween: TWEEN.Tween | null = null; + private fadeTween: TWEEN.Tween | null = null; constructor(data: TData, geometry: THREE.Geometry, material: THREE.Material) { super(geometry, material); this.data = data; - this.moveTween = null; this.nameLabel = new NameLabel(); this.nameLabel.position.z = NAME_LABEL_Z_POSITION; this.add(this.nameLabel); @@ -31,14 +38,26 @@ export class Attackable extends THREE.Mesh implements this.nameLabel.hide(); } + /** + * Stops all running animations and releases the resources of this object. + * The geometry is not disposed, because it's shared between all objects of the same type. + */ + public dispose(): void { + this.stopTweens(); + this.remove(this.nameLabel); + this.nameLabel.dispose(); + this.material.dispose(); + } + public gotKilled(): void { // we fade the color out const fadeOutDurationMs = 1000; const startingOpacity = 1; const fadedOutOpacity = 0.1; - + + this.fadeTween?.stop(); const state = { opacity: startingOpacity }; - const tween = new TWEEN.Tween(state) + this.fadeTween = new TWEEN.Tween(state) .to({ opacity: fadedOutOpacity }, fadeOutDurationMs) .onUpdate(() => this.material.opacity = state.opacity) .easing(TWEEN.Easing.Circular.Out) @@ -49,8 +68,12 @@ export class Attackable extends THREE.Mesh implements const scaleUpDurationMs = 500; this.data = newData; this.material.opacity = 1.0; + + this.fadeTween?.stop(); + this.fadeTween = null; + this.scaleTween?.stop(); const state = { scale: 0 }; - const tween = new TWEEN.Tween(state) + this.scaleTween = new TWEEN.Tween(state) .to({ scale: 1 }, scaleUpDurationMs) .onUpdate(() => this.scale.setScalar(state.scale)) .easing(TWEEN.Easing.Back.Out) @@ -61,38 +84,41 @@ export class Attackable extends THREE.Mesh implements public moveTo(newX: number, newY: number, moveType: any, walkDelay: number, steps: Step[]): void { const state = { x: this.data.x, y: this.data.y }; - this.data = this.data = Object.assign({}, this.data, { x: newX, y: newY }); + this.data = Object.assign({}, this.data, { x: newX, y: newY }); - if (this.moveTween !== null) { - this.moveTween.stop(); - } - - this.moveTween = new TWEEN.Tween(state) - .onUpdate(() => this.setObjectPositionOnMap(state.x, state.y)); + this.stopMoveTweens(); - if (moveType === "Instant" || moveType === 1) { + const isWalking = moveType !== "Instant" && moveType !== 1 + && steps !== undefined && steps !== null && steps.length > 0; + if (!isWalking) { const moveDurationMs = 300; - this.moveTween = this.moveTween.easing(TWEEN.Easing.Elastic.Out) - .to({ x: newX, y: newY }, moveDurationMs); - } else { - for (const i in steps) { - if (steps.hasOwnProperty(i)) { - const step = steps[i]; - const stepTween = new TWEEN.Tween(state) - .to({ x: step.x, y: step.y }, walkDelay) - .onStart(() => this.rotateTo(step.direction)) - .onUpdate(() => this.setObjectPositionOnMap(state.x, state.y)); - this.moveTween.chain(stepTween); - } - } + const moveTween = new TWEEN.Tween(state) + .to({ x: newX, y: newY }, moveDurationMs) + .onUpdate(() => this.setObjectPositionOnMap(state.x, state.y)) + .easing(TWEEN.Easing.Elastic.Out); + this.moveTweens.push(moveTween); + moveTween.start(); + return; + } + + // Each step tween is chained to its predecessor, so that the steps are walked one after another. + let previousTween: TWEEN.Tween | null = null; + for (const step of steps) { + const stepTween = new TWEEN.Tween(state) + .to({ x: step.x, y: step.y }, walkDelay) + .onStart(() => this.rotateTo(step.direction)) + .onUpdate(() => this.setObjectPositionOnMap(state.x, state.y)); + previousTween?.chain(stepTween); + previousTween = stepTween; + this.moveTweens.push(stepTween); } - this.moveTween.start(); + this.moveTweens[0].start(); } public rotateTo(rotation: Direction): void { if (this.data !== undefined) { - this.data = Object.assign({}, this.data, rotation); + this.data = Object.assign({}, this.data, { direction: rotation }); } const degreesOfOneTurn = 360; @@ -100,14 +126,34 @@ export class Attackable extends THREE.Mesh implements const targetAngle = THREE.Math.degToRad((rotation * degreesOfOneTurn) / numberOfDirectionValues); const rotateDurationMs = 200; + this.rotateTween?.stop(); const state = { z: this.rotation.z }; - new TWEEN.Tween(state) + this.rotateTween = new TWEEN.Tween(state) .to({ z: targetAngle }, rotateDurationMs) .onUpdate(() => this.rotation.z = state.z) .easing(TWEEN.Easing.Quadratic.Out) .start(); } + private stopTweens(): void { + this.stopMoveTweens(); + + this.rotateTween?.stop(); + this.rotateTween = null; + this.scaleTween?.stop(); + this.scaleTween = null; + this.fadeTween?.stop(); + this.fadeTween = null; + } + + private stopMoveTweens(): void { + for (const moveTween of this.moveTweens) { + moveTween.stop(); + } + + this.moveTweens = []; + } + private setRotation(value: Direction): void { const degreesOfOneTurn = 360; const numberOfDirectionValues = 8; diff --git a/src/Web/Map/Scripts/livemap/Debug.ts b/src/Web/Map/Scripts/livemap/Debug.ts new file mode 100644 index 0000000000..e83e7e1d89 --- /dev/null +++ b/src/Web/Map/Scripts/livemap/Debug.ts @@ -0,0 +1,33 @@ +/* + * Debug logging for the live map. + * + * The per-object messages are disabled by default: the browser console keeps + * live references to everything which is logged to it, so a message for every + * added, updated and removed object would pin each object which ever appeared + * on the map for the lifetime of the console buffer. + * + * To enable them, set 'liveMapDebugLogging' to true on the window object, + * e.g. by entering 'liveMapDebugLogging = true' in the browser console. + */ + +interface DebugWindow extends Window { + liveMapDebugLogging?: boolean; +} + +/** + * Gets a value indicating whether the verbose debug logging is enabled. + */ +export function isDebugLoggingEnabled(): boolean { + return (window as DebugWindow).liveMapDebugLogging === true; +} + +/** + * Writes a debug message to the console, if the debug logging is enabled. + * @param message - The message. + * @param parameters - The additional parameters which are logged with the message. + */ +export function logDebug(message: string, ...parameters: any[]): void { + if (isDebugLoggingEnabled()) { + console.debug(message, ...parameters); + } +} diff --git a/src/Web/Map/Scripts/livemap/GameObject.ts b/src/Web/Map/Scripts/livemap/GameObject.ts index 4fa77da703..5139436eb4 100644 --- a/src/Web/Map/Scripts/livemap/GameObject.ts +++ b/src/Web/Map/Scripts/livemap/GameObject.ts @@ -7,4 +7,10 @@ export interface GameObject extends THREE.Object3D { moveTo(newX: number, newY: number, moveType: any, walkDelay: number, steps: Step[]): void; rotateTo(rotation: Direction): void; gotKilled(): void; + + /** + * Stops all running animations and releases the resources (materials, textures) + * which are exclusively used by this object. + */ + dispose(): void; } diff --git a/src/Web/Map/Scripts/livemap/MapApp.ts b/src/Web/Map/Scripts/livemap/MapApp.ts index e174301383..916a311e0b 100644 --- a/src/Web/Map/Scripts/livemap/MapApp.ts +++ b/src/Web/Map/Scripts/livemap/MapApp.ts @@ -18,6 +18,7 @@ export class MapApp { private lastHighlightedId: number | null = null; private isDisposing: boolean = false; private isDisposed: boolean = false; + private animationFrameId: number | null = null; private resizeEventListener: () => void; private readonly onPickObjectHandler: (data: ObjectData) => void; @@ -62,7 +63,6 @@ export class MapApp { } }, (data) => this.onObjectHovered(data)); - this.container.appendChild(this.renderer.domElement); this.animate(); //starts the rendering loop } @@ -102,15 +102,31 @@ export class MapApp { this.isDisposing = true; window.removeEventListener("resize", this.resizeEventListener); - const webGlRenderer = this.renderer as THREE.WebGLRenderer; - if (webGlRenderer != null) { - webGlRenderer.dispose(); + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; } + this.picker.dispose(); + this.scene.remove(this.world); this.world.dispose(); this.world = null; + const canvas = this.renderer.domElement; + const webGlRenderer = this.renderer as THREE.WebGLRenderer; + if (webGlRenderer != null) { + webGlRenderer.dispose(); + + // Releases the WebGL context. Browsers only allow a limited number of them, + // so we don't want to keep it until it's garbage collected. + webGlRenderer.forceContextLoss(); + } + + if (canvas.parentNode !== null) { + canvas.parentNode.removeChild(canvas); + } + this.renderer = null; this.isDisposing = false; this.isDisposed = true; @@ -122,7 +138,8 @@ export class MapApp { return; } - requestAnimationFrame(() => this.animate(time)); // request the next frame to be rendered + // request the next frame to be rendered, with the timestamp of that frame + this.animationFrameId = requestAnimationFrame((frameTime) => this.animate(frameTime)); this.stats?.update(); // updates the stats (fps and frametimes) TWEEN.update(time); // updates all existing Tweens this.world.update(); // update world and it's objects diff --git a/src/Web/Map/Scripts/livemap/NameLabel.ts b/src/Web/Map/Scripts/livemap/NameLabel.ts index 95f15a5db0..9ae51ddf73 100644 --- a/src/Web/Map/Scripts/livemap/NameLabel.ts +++ b/src/Web/Map/Scripts/livemap/NameLabel.ts @@ -1,6 +1,5 @@ import * as THREE from "three"; -const CANVAS_WIDTH = 512; const CANVAS_HEIGHT = 64; const LABEL_SCALE_X = 40; const LABEL_SCALE_Y = 6; @@ -8,29 +7,23 @@ const LABEL_SCALE_Z = 1; const CLEAR_X = 0; const CLEAR_Y = 0; const SCALE_MULTIPLIER = 8; +const EMPTY_CANVAS_SIZE = 0; export class NameLabel extends THREE.Sprite { - private readonly canvas: HTMLCanvasElement; - private readonly context: CanvasRenderingContext2D; - private readonly texture: THREE.CanvasTexture; - private isVisible: boolean = false; + /* + * A shared material for labels which were never shown. It's never rendered + * (the label is invisible until 'show' is called) and therefore never + * allocates any resources in the renderer. + */ + private static readonly hiddenMaterial: THREE.SpriteMaterial = new THREE.SpriteMaterial(); + + private canvas: HTMLCanvasElement | null = null; + private context: CanvasRenderingContext2D | null = null; + private texture: THREE.CanvasTexture | null = null; + private labelMaterial: THREE.SpriteMaterial | null = null; constructor() { - const canvas = document.createElement("canvas"); - canvas.width = CANVAS_WIDTH; - canvas.height = CANVAS_HEIGHT; - const context = canvas.getContext("2d"); - if (!context) { - throw new Error("Failed to get 2D context"); - } - const texture = new THREE.CanvasTexture(canvas); - const material = new THREE.SpriteMaterial({ map: texture, transparent: true }); - - super(material); - - this.canvas = canvas; - this.context = context; - this.texture = texture; + super(NameLabel.hiddenMaterial); this.scale.set(LABEL_SCALE_X, LABEL_SCALE_Y, LABEL_SCALE_Z); this.visible = false; @@ -41,19 +34,74 @@ export class NameLabel extends THREE.Sprite { } public show(name: string): void { + this.createCanvasIfRequired(); this.renderLabel(name); this.visible = true; - this.isVisible = true; } public hide(): void { this.visible = false; - this.isVisible = false; + } + + /** + * Releases the canvas, texture and material of this label. + * They are created again when the label is shown the next time. + */ + public dispose(): void { + this.visible = false; + this.material = NameLabel.hiddenMaterial; + + if (this.labelMaterial !== null) { + this.labelMaterial.dispose(); + this.labelMaterial = null; + } + + if (this.texture !== null) { + this.texture.dispose(); + this.texture = null; + } + + if (this.canvas !== null) { + // Releases the backing store of the canvas, which is by far the biggest part of a label. + this.canvas.width = EMPTY_CANVAS_SIZE; + this.canvas.height = EMPTY_CANVAS_SIZE; + this.canvas = null; + } + + this.context = null; + } + + /* + * Creates the canvas, texture and material of this label, if that didn't happen yet. + * They are created lazily, because most objects on the map are never hovered + * and a canvas costs a few hundred kilobytes each. + */ + private createCanvasIfRequired(): void { + if (this.canvas !== null) { + return; + } + + const canvas = document.createElement("canvas"); + canvas.height = CANVAS_HEIGHT; + const context = canvas.getContext("2d"); + if (!context) { + throw new Error("Failed to get 2D context"); + } + + this.canvas = canvas; + this.context = context; + this.texture = new THREE.CanvasTexture(canvas); + this.labelMaterial = new THREE.SpriteMaterial({ map: this.texture, transparent: true }); + this.material = this.labelMaterial; } private renderLabel(name: string): void { const ctx = this.context; const canvas = this.canvas; + const texture = this.texture; + if (ctx === null || canvas === null || texture === null) { + return; + } ctx.font = "bold 28px Consolas, monospace"; const textWidth = ctx.measureText(name).width; @@ -95,7 +143,7 @@ export class NameLabel extends THREE.Sprite { ctx.fillText(name, canvas.width / 2, canvas.height / 2); - this.texture.needsUpdate = true; + texture.needsUpdate = true; } private nextPowerOfTwo(value: number): number { diff --git a/src/Web/Map/Scripts/livemap/Queue.ts b/src/Web/Map/Scripts/livemap/Queue.ts index 2bc696edf2..7501afa7c7 100644 --- a/src/Web/Map/Scripts/livemap/Queue.ts +++ b/src/Web/Map/Scripts/livemap/Queue.ts @@ -1,43 +1,54 @@ -export class Queue { - private _oldestIndex: number; - private _newestIndex: number; - private _storage: T[]; +const INITIAL_HEAD_INDEX = 0; + +export class Queue { + private storage: T[]; + private headIndex: number; constructor() { - this._oldestIndex = 1; - this._newestIndex = 1; - this._storage = []; + this.storage = []; + this.headIndex = INITIAL_HEAD_INDEX; } public size(): number { - return this._newestIndex - this._oldestIndex; + return this.storage.length - this.headIndex; } public enqueue(data: T): void { - this._storage[this._newestIndex] = data; - this._newestIndex++; + this.storage.push(data); } public dequeue(): T { - const oldestIndex = this._oldestIndex; - const newestIndex = this._newestIndex; + if (this.size() === 0) { + return null; + } - if (oldestIndex !== newestIndex) { - const deletedData = this._storage[oldestIndex]; - delete this._storage[oldestIndex]; - this._oldestIndex++; + const data = this.storage[this.headIndex]; + this.headIndex++; - return deletedData; - } + this.compactIfRequired(); - return null; + return data; } public peek(): T { - if (this._oldestIndex !== this._newestIndex) { - return this._storage[this._oldestIndex]; + if (this.size() === 0) { + return null; } - return null; + return this.storage[this.headIndex]; + } + + /* + * Removes the already dequeued entries from the front of the storage, as soon as + * they take up half of it. Without that, the storage would grow indefinitely and + * degrade into a slow dictionary-like array. Because it just happens when half of + * the entries are dequeued, the costs are amortized constant per dequeued entry. + */ + private compactIfRequired(): void { + const compactionThresholdDivisor = 2; + if (this.headIndex >= this.storage.length / compactionThresholdDivisor) { + this.storage = this.storage.slice(this.headIndex); + this.headIndex = INITIAL_HEAD_INDEX; + } } } diff --git a/src/Web/Map/Scripts/livemap/TerrainShader.ts b/src/Web/Map/Scripts/livemap/TerrainShader.ts index 71d408072b..e65b8f61f5 100644 --- a/src/Web/Map/Scripts/livemap/TerrainShader.ts +++ b/src/Web/Map/Scripts/livemap/TerrainShader.ts @@ -1,40 +1,49 @@ import * as THREE from "three"; +const fragmentShader = [ + "uniform sampler2D tColor;", + "uniform float tPixelSize;", + "varying vec2 vUv;", + "void main() {", + "vec4 texel = texture2D( tColor, vUv );", + "float multi = 0.1;", + "for(float x = -1.0; x <= 1.0; x++) {", + "for (float y = -1.0; y <= 1.0; y++) {", + "if (x == 0.0 && y == 0.0) continue;", + "vec4 neighborcolor = texture2D(tColor, vUv + vec2(x/256.0, y/256.0) * tPixelSize);", + "if (neighborcolor != texel) { multi = 1.0; }", + "}", + "}", + "gl_FragColor = texel * multi;", + "}" +].join("\n"); + +const vertexShader = [ + "varying vec2 vUv;", + "void main() {", + "vUv = vec2(uv.x, uv.y);", + "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);", + "}" +].join("\n"); + /* - * A shader for the terrain of the map. It highlights the edges - * (detected by color changes in nearby pixels) of the map texture. + * Creates the parameters for a shader for the terrain of the map. It highlights + * the edges (detected by color changes in nearby pixels) of the map texture. + * + * Each map needs its own parameters, because the uniforms hold the texture and + * the pixel size of exactly one map. */ -export const terrainShader: THREE.ShaderMaterialParameters = { - fragmentShader: [ - "uniform sampler2D tColor;", - "uniform float tPixelSize;", - "varying vec2 vUv;", - "void main() {", - "vec4 texel = texture2D( tColor, vUv );", - "float multi = 0.1;", - "for(float x = -1.0; x <= 1.0; x++) {", - "for (float y = -1.0; y <= 1.0; y++) {", - "if (x == 0.0 && y == 0.0) continue;", - "vec4 neighborcolor = texture2D(tColor, vUv + vec2(x/256.0, y/256.0) * tPixelSize);", - "if (neighborcolor != texel) { multi = 1.0; }", - "}", - "}", - "gl_FragColor = texel * multi;", - "}" - ].join("\n"), +export function createTerrainShader(): THREE.ShaderMaterialParameters { + return { + fragmentShader, - side: THREE.DoubleSide, + side: THREE.DoubleSide, - uniforms: { - tColor: { type: "t", value: 0 }, - tPixelSize: { type: "f", value: 0.3 }, - }, + uniforms: { + tColor: { type: "t", value: 0 }, + tPixelSize: { type: "f", value: 0.3 }, + }, - vertexShader: [ - "varying vec2 vUv;", - "void main() {", - "vUv = vec2(uv.x, uv.y);", - "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);", - "}" - ].join("\n"), -}; + vertexShader, + }; +} diff --git a/src/Web/Map/Scripts/livemap/World.ts b/src/Web/Map/Scripts/livemap/World.ts index 3891aaf831..246d359b52 100644 --- a/src/Web/Map/Scripts/livemap/World.ts +++ b/src/Web/Map/Scripts/livemap/World.ts @@ -1,11 +1,12 @@ import * as THREE from "three"; import { Attacks } from "./Attack"; -import { terrainShader } from "./TerrainShader"; +import { createTerrainShader } from "./TerrainShader"; import { Player } from "./Player"; import { Attackable, attackableAlphaMapTexture } from "./Attackable"; import { GameObject } from "./GameObject"; import { NonPlayerCharacter as NPC } from "./NonPlayerCharacter"; +import { logDebug } from "./Debug"; import { NpcData, PlayerData, ObjectData, Step } from "./Types"; @@ -18,7 +19,11 @@ export class World extends THREE.Object3D { [id: number]: GameObject, }; private attacks: Attacks; + private terrainMesh: THREE.Mesh; + private terrainMaterial: THREE.ShaderMaterial; + private terrainTexture: THREE.Texture | null = null; private lastLabelObjectId: number | null = null; + private isDisposed: boolean = false; /** * Constructs a new World object. Automatically initializes and updates @@ -37,15 +42,22 @@ export class World extends THREE.Object3D { const segments = 1; - const planeMesh = new THREE.Mesh( + this.terrainMaterial = new THREE.ShaderMaterial(createTerrainShader()); + this.terrainMesh = new THREE.Mesh( new THREE.PlaneGeometry(World.sideLength, World.sideLength, segments, segments), - new THREE.ShaderMaterial(terrainShader)); - this.add(planeMesh); + this.terrainMaterial); + this.add(this.terrainMesh); const textureLoader = new THREE.TextureLoader(); textureLoader.load("terrain/" + serverId + "/" + mapId, (texture: THREE.Texture) => { + if (this.isDisposed) { + texture.dispose(); + return; + } + texture.magFilter = THREE.NearestFilter; - terrainShader.uniforms.tColor.value = texture; + this.terrainTexture = texture; + this.terrainMaterial.uniforms.tColor.value = texture; }); } @@ -77,10 +89,10 @@ export class World extends THREE.Object3D { await new Promise((resolve) => setTimeout(resolve, waitTimeMs)); } - console.debug("Adding npc", npcData); + logDebug("Adding npc", npcData); this.addNpc(npcData); } else { - console.debug("Updating npc", npcData); + logDebug("Updating npc", npcData); obj.respawn(npcData); } } @@ -97,10 +109,10 @@ export class World extends THREE.Object3D { await new Promise((resolve) => setTimeout(resolve, waitTimeMs)); } - console.debug("Adding player", playerData); + logDebug("Adding player", playerData); this.addPlayer(playerData); } else { - console.debug("Updating player", playerData, obj.data); + logDebug("Updating player", playerData, obj.data); obj.respawn(playerData); } } @@ -188,7 +200,31 @@ export class World extends THREE.Object3D { * Cleans up all objects and releases resources. */ public dispose(): void { - delete this.objects; + if (this.isDisposed) { + return; + } + + this.isDisposed = true; + this.lastLabelObjectId = null; + + for (const id in this.objects) { + if (this.objects.hasOwnProperty(id)) { + const object = this.objects[id]; + this.remove(object); + object.dispose(); + } + } + + this.objects = {}; + + this.remove(this.attacks); + this.attacks.dispose(); + + this.remove(this.terrainMesh); + this.terrainMesh.geometry.dispose(); + this.terrainMaterial.dispose(); + this.terrainTexture?.dispose(); + this.terrainTexture = null; } /** @@ -260,7 +296,7 @@ export class World extends THREE.Object3D { * @param newSize - The new render size in pixels. */ public onSizeChanged(newSize: number): void { - terrainShader.uniforms.tPixelSize.value = World.sideLength / newSize; + this.terrainMaterial.uniforms.tPixelSize.value = World.sideLength / newSize; } /** @@ -268,6 +304,10 @@ export class World extends THREE.Object3D { * @param data - The NPC data. */ public addNpc(data: NpcData): void { + if (this.isDisposed) { + return; + } + const npc = new NPC(data); this.addObjectMesh(npc); npc.respawn(data); @@ -278,6 +318,10 @@ export class World extends THREE.Object3D { * @param data - The player data. */ public addPlayer(data: PlayerData): void { + if (this.isDisposed) { + return; + } + const player = new Player(data); this.addObjectMesh(player); player.respawn(data); @@ -293,9 +337,14 @@ export class World extends THREE.Object3D { return; } - console.debug("Removing object", mesh.data); + logDebug("Removing object", mesh.data); this.remove(mesh as THREE.Object3D); delete this.objects[objectId]; + if (this.lastLabelObjectId === objectId) { + this.lastLabelObjectId = null; + } + + mesh.dispose(); } /** diff --git a/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js b/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js index 9c430430c7..a45e9cfc79 100644 --- a/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js +++ b/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js @@ -1,3 +1,4 @@ +"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || @@ -13,6 +14,15 @@ var __extends = (this && this.__extends) || (function () { d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { @@ -62,40 +72,44 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; System.register("Queue", [], function (exports_1, context_1) { "use strict"; - var Queue; + var INITIAL_HEAD_INDEX, Queue; var __moduleName = context_1 && context_1.id; return { setters: [], execute: function () { + INITIAL_HEAD_INDEX = 0; Queue = (function () { function Queue() { - this._oldestIndex = 1; - this._newestIndex = 1; - this._storage = []; + this.storage = []; + this.headIndex = INITIAL_HEAD_INDEX; } Queue.prototype.size = function () { - return this._newestIndex - this._oldestIndex; + return this.storage.length - this.headIndex; }; Queue.prototype.enqueue = function (data) { - this._storage[this._newestIndex] = data; - this._newestIndex++; + this.storage.push(data); }; Queue.prototype.dequeue = function () { - var oldestIndex = this._oldestIndex; - var newestIndex = this._newestIndex; - if (oldestIndex !== newestIndex) { - var deletedData = this._storage[oldestIndex]; - delete this._storage[oldestIndex]; - this._oldestIndex++; - return deletedData; + if (this.size() === 0) { + return null; } - return null; + var data = this.storage[this.headIndex]; + this.headIndex++; + this.compactIfRequired(); + return data; }; Queue.prototype.peek = function () { - if (this._oldestIndex !== this._newestIndex) { - return this._storage[this._oldestIndex]; + if (this.size() === 0) { + return null; + } + return this.storage[this.headIndex]; + }; + Queue.prototype.compactIfRequired = function () { + var compactionThresholdDivisor = 2; + if (this.headIndex >= this.storage.length / compactionThresholdDivisor) { + this.storage = this.storage.slice(this.headIndex); + this.headIndex = INITIAL_HEAD_INDEX; } - return null; }; return Queue; }()); @@ -182,6 +196,10 @@ System.register("Attack", ["three", "tween", "Queue"], function (exports_4, cont } Attacks.prototype.update = function () { }; + Attacks.prototype.dispose = function () { + this.geometry.dispose(); + this.material.dispose(); + }; Attacks.prototype.addAttack = function (attacker, target) { var _this = this; if (this.freeAttackIndexes.peek() === null) { @@ -225,7 +243,7 @@ System.register("Attack", ["three", "tween", "Queue"], function (exports_4, cont }); System.register("NameLabel", ["three"], function (exports_5, context_5) { "use strict"; - var THREE, CANVAS_WIDTH, CANVAS_HEIGHT, LABEL_SCALE_X, LABEL_SCALE_Y, LABEL_SCALE_Z, CLEAR_X, CLEAR_Y, SCALE_MULTIPLIER, NameLabel; + var THREE, CANVAS_HEIGHT, LABEL_SCALE_X, LABEL_SCALE_Y, LABEL_SCALE_Z, CLEAR_X, CLEAR_Y, SCALE_MULTIPLIER, EMPTY_CANVAS_SIZE, NameLabel; var __moduleName = context_5 && context_5.id; return { setters: [ @@ -234,7 +252,6 @@ System.register("NameLabel", ["three"], function (exports_5, context_5) { } ], execute: function () { - CANVAS_WIDTH = 512; CANVAS_HEIGHT = 64; LABEL_SCALE_X = 40; LABEL_SCALE_Y = 6; @@ -242,24 +259,15 @@ System.register("NameLabel", ["three"], function (exports_5, context_5) { CLEAR_X = 0; CLEAR_Y = 0; SCALE_MULTIPLIER = 8; + EMPTY_CANVAS_SIZE = 0; NameLabel = (function (_super) { __extends(NameLabel, _super); function NameLabel() { - var _this = this; - var canvas = document.createElement("canvas"); - canvas.width = CANVAS_WIDTH; - canvas.height = CANVAS_HEIGHT; - var context = canvas.getContext("2d"); - if (!context) { - throw new Error("Failed to get 2D context"); - } - var texture = new THREE.CanvasTexture(canvas); - var material = new THREE.SpriteMaterial({ map: texture, transparent: true }); - _this = _super.call(this, material) || this; - _this.isVisible = false; - _this.canvas = canvas; - _this.context = context; - _this.texture = texture; + var _this = _super.call(this, NameLabel.hiddenMaterial) || this; + _this.canvas = null; + _this.context = null; + _this.texture = null; + _this.labelMaterial = null; _this.scale.set(LABEL_SCALE_X, LABEL_SCALE_Y, LABEL_SCALE_Z); _this.visible = false; return _this; @@ -267,17 +275,54 @@ System.register("NameLabel", ["three"], function (exports_5, context_5) { NameLabel.prototype.raycast = function () { }; NameLabel.prototype.show = function (name) { + this.createCanvasIfRequired(); this.renderLabel(name); this.visible = true; - this.isVisible = true; }; NameLabel.prototype.hide = function () { this.visible = false; - this.isVisible = false; + }; + NameLabel.prototype.dispose = function () { + this.visible = false; + this.material = NameLabel.hiddenMaterial; + if (this.labelMaterial !== null) { + this.labelMaterial.dispose(); + this.labelMaterial = null; + } + if (this.texture !== null) { + this.texture.dispose(); + this.texture = null; + } + if (this.canvas !== null) { + this.canvas.width = EMPTY_CANVAS_SIZE; + this.canvas.height = EMPTY_CANVAS_SIZE; + this.canvas = null; + } + this.context = null; + }; + NameLabel.prototype.createCanvasIfRequired = function () { + if (this.canvas !== null) { + return; + } + var canvas = document.createElement("canvas"); + canvas.height = CANVAS_HEIGHT; + var context = canvas.getContext("2d"); + if (!context) { + throw new Error("Failed to get 2D context"); + } + this.canvas = canvas; + this.context = context; + this.texture = new THREE.CanvasTexture(canvas); + this.labelMaterial = new THREE.SpriteMaterial({ map: this.texture, transparent: true }); + this.material = this.labelMaterial; }; NameLabel.prototype.renderLabel = function (name) { var ctx = this.context; var canvas = this.canvas; + var texture = this.texture; + if (ctx === null || canvas === null || texture === null) { + return; + } ctx.font = "bold 28px Consolas, monospace"; var textWidth = ctx.measureText(name).width; var padding = 12; @@ -308,11 +353,12 @@ System.register("NameLabel", ["three"], function (exports_5, context_5) { ctx.textAlign = "center"; ctx.textBaseline = "middle"; ctx.fillText(name, canvas.width / 2, canvas.height / 2); - this.texture.needsUpdate = true; + texture.needsUpdate = true; }; NameLabel.prototype.nextPowerOfTwo = function (value) { return Math.pow(2, Math.ceil(Math.log2(value))); }; + NameLabel.hiddenMaterial = new THREE.SpriteMaterial(); return NameLabel; }(THREE.Sprite)); exports_5("NameLabel", NameLabel); @@ -342,8 +388,11 @@ System.register("Attackable", ["three", "tween", "NameLabel"], function (exports __extends(Attackable, _super); function Attackable(data, geometry, material) { var _this = _super.call(this, geometry, material) || this; + _this.moveTweens = []; + _this.rotateTween = null; + _this.scaleTween = null; + _this.fadeTween = null; _this.data = data; - _this.moveTween = null; _this.nameLabel = new NameLabel_1.NameLabel(); _this.nameLabel.position.z = NAME_LABEL_Z_POSITION; _this.add(_this.nameLabel); @@ -355,13 +404,21 @@ System.register("Attackable", ["three", "tween", "NameLabel"], function (exports Attackable.prototype.hideLabel = function () { this.nameLabel.hide(); }; + Attackable.prototype.dispose = function () { + this.stopTweens(); + this.remove(this.nameLabel); + this.nameLabel.dispose(); + this.material.dispose(); + }; Attackable.prototype.gotKilled = function () { var _this = this; + var _a; var fadeOutDurationMs = 1000; var startingOpacity = 1; var fadedOutOpacity = 0.1; + (_a = this.fadeTween) === null || _a === void 0 ? void 0 : _a.stop(); var state = { opacity: startingOpacity }; - var tween = new tween_2.default.Tween(state) + this.fadeTween = new tween_2.default.Tween(state) .to({ opacity: fadedOutOpacity }, fadeOutDurationMs) .onUpdate(function () { return _this.material.opacity = state.opacity; }) .easing(tween_2.default.Easing.Circular.Out) @@ -369,11 +426,15 @@ System.register("Attackable", ["three", "tween", "NameLabel"], function (exports }; Attackable.prototype.respawn = function (newData) { var _this = this; + var _a, _b; var scaleUpDurationMs = 500; this.data = newData; this.material.opacity = 1.0; + (_a = this.fadeTween) === null || _a === void 0 ? void 0 : _a.stop(); + this.fadeTween = null; + (_b = this.scaleTween) === null || _b === void 0 ? void 0 : _b.stop(); var state = { scale: 0 }; - var tween = new tween_2.default.Tween(state) + this.scaleTween = new tween_2.default.Tween(state) .to({ scale: 1 }, scaleUpDurationMs) .onUpdate(function () { return _this.scale.setScalar(state.scale); }) .easing(tween_2.default.Easing.Back.Out) @@ -384,51 +445,72 @@ System.register("Attackable", ["three", "tween", "NameLabel"], function (exports Attackable.prototype.moveTo = function (newX, newY, moveType, walkDelay, steps) { var _this = this; var state = { x: this.data.x, y: this.data.y }; - this.data = this.data = Object.assign({}, this.data, { x: newX, y: newY }); - if (this.moveTween !== null) { - this.moveTween.stop(); - } - this.moveTween = new tween_2.default.Tween(state) - .onUpdate(function () { return _this.setObjectPositionOnMap(state.x, state.y); }); - if (moveType === "Instant" || moveType === 1) { + this.data = Object.assign({}, this.data, { x: newX, y: newY }); + this.stopMoveTweens(); + var isWalking = moveType !== "Instant" && moveType !== 1 + && steps !== undefined && steps !== null && steps.length > 0; + if (!isWalking) { var moveDurationMs = 300; - this.moveTween = this.moveTween.easing(tween_2.default.Easing.Elastic.Out) - .to({ x: newX, y: newY }, moveDurationMs); + var moveTween = new tween_2.default.Tween(state) + .to({ x: newX, y: newY }, moveDurationMs) + .onUpdate(function () { return _this.setObjectPositionOnMap(state.x, state.y); }) + .easing(tween_2.default.Easing.Elastic.Out); + this.moveTweens.push(moveTween); + moveTween.start(); + return; } - else { - var _loop_1 = function (i) { - if (steps.hasOwnProperty(i)) { - var step_1 = steps[i]; - var stepTween = new tween_2.default.Tween(state) - .to({ x: step_1.x, y: step_1.y }, walkDelay) - .onStart(function () { return _this.rotateTo(step_1.direction); }) - .onUpdate(function () { return _this.setObjectPositionOnMap(state.x, state.y); }); - this_1.moveTween.chain(stepTween); - } - }; - var this_1 = this; - for (var i in steps) { - _loop_1(i); - } + var previousTween = null; + var _loop_1 = function (step) { + var stepTween = new tween_2.default.Tween(state) + .to({ x: step.x, y: step.y }, walkDelay) + .onStart(function () { return _this.rotateTo(step.direction); }) + .onUpdate(function () { return _this.setObjectPositionOnMap(state.x, state.y); }); + previousTween === null || previousTween === void 0 ? void 0 : previousTween.chain(stepTween); + previousTween = stepTween; + this_1.moveTweens.push(stepTween); + }; + var this_1 = this; + for (var _i = 0, steps_1 = steps; _i < steps_1.length; _i++) { + var step = steps_1[_i]; + _loop_1(step); } - this.moveTween.start(); + this.moveTweens[0].start(); }; Attackable.prototype.rotateTo = function (rotation) { var _this = this; + var _a; if (this.data !== undefined) { - this.data = Object.assign({}, this.data, rotation); + this.data = Object.assign({}, this.data, { direction: rotation }); } var degreesOfOneTurn = 360; var numberOfDirectionValues = 8; var targetAngle = THREE.Math.degToRad((rotation * degreesOfOneTurn) / numberOfDirectionValues); var rotateDurationMs = 200; + (_a = this.rotateTween) === null || _a === void 0 ? void 0 : _a.stop(); var state = { z: this.rotation.z }; - new tween_2.default.Tween(state) + this.rotateTween = new tween_2.default.Tween(state) .to({ z: targetAngle }, rotateDurationMs) .onUpdate(function () { return _this.rotation.z = state.z; }) .easing(tween_2.default.Easing.Quadratic.Out) .start(); }; + Attackable.prototype.stopTweens = function () { + var _a, _b, _c; + this.stopMoveTweens(); + (_a = this.rotateTween) === null || _a === void 0 ? void 0 : _a.stop(); + this.rotateTween = null; + (_b = this.scaleTween) === null || _b === void 0 ? void 0 : _b.stop(); + this.scaleTween = null; + (_c = this.fadeTween) === null || _c === void 0 ? void 0 : _c.stop(); + this.fadeTween = null; + }; + Attackable.prototype.stopMoveTweens = function () { + for (var _i = 0, _a = this.moveTweens; _i < _a.length; _i++) { + var moveTween = _a[_i]; + moveTween.stop(); + } + this.moveTweens = []; + }; Attackable.prototype.setRotation = function (value) { var degreesOfOneTurn = 360; var numberOfDirectionValues = 8; @@ -448,10 +530,45 @@ System.register("Attackable", ["three", "tween", "NameLabel"], function (exports } }; }); -System.register("TerrainShader", ["three"], function (exports_7, context_7) { +System.register("Debug", [], function (exports_7, context_7) { "use strict"; - var THREE, terrainShader; var __moduleName = context_7 && context_7.id; + function isDebugLoggingEnabled() { + return window.liveMapDebugLogging === true; + } + exports_7("isDebugLoggingEnabled", isDebugLoggingEnabled); + function logDebug(message) { + var parameters = []; + for (var _i = 1; _i < arguments.length; _i++) { + parameters[_i - 1] = arguments[_i]; + } + if (isDebugLoggingEnabled()) { + console.debug.apply(console, __spreadArray([message], parameters, false)); + } + } + exports_7("logDebug", logDebug); + return { + setters: [], + execute: function () { + } + }; +}); +System.register("TerrainShader", ["three"], function (exports_8, context_8) { + "use strict"; + var THREE, fragmentShader, vertexShader; + var __moduleName = context_8 && context_8.id; + function createTerrainShader() { + return { + fragmentShader: fragmentShader, + side: THREE.DoubleSide, + uniforms: { + tColor: { type: "t", value: 0 }, + tPixelSize: { type: "f", value: 0.3 }, + }, + vertexShader: vertexShader, + }; + } + exports_8("createTerrainShader", createTerrainShader); return { setters: [ function (THREE_4) { @@ -459,44 +576,37 @@ System.register("TerrainShader", ["three"], function (exports_7, context_7) { } ], execute: function () { - exports_7("terrainShader", terrainShader = { - fragmentShader: [ - "uniform sampler2D tColor;", - "uniform float tPixelSize;", - "varying vec2 vUv;", - "void main() {", - "vec4 texel = texture2D( tColor, vUv );", - "float multi = 0.1;", - "for(float x = -1.0; x <= 1.0; x++) {", - "for (float y = -1.0; y <= 1.0; y++) {", - "if (x == 0.0 && y == 0.0) continue;", - "vec4 neighborcolor = texture2D(tColor, vUv + vec2(x/256.0, y/256.0) * tPixelSize);", - "if (neighborcolor != texel) { multi = 1.0; }", - "}", - "}", - "gl_FragColor = texel * multi;", - "}" - ].join("\n"), - side: THREE.DoubleSide, - uniforms: { - tColor: { type: "t", value: 0 }, - tPixelSize: { type: "f", value: 0.3 }, - }, - vertexShader: [ - "varying vec2 vUv;", - "void main() {", - "vUv = vec2(uv.x, uv.y);", - "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);", - "}" - ].join("\n"), - }); + fragmentShader = [ + "uniform sampler2D tColor;", + "uniform float tPixelSize;", + "varying vec2 vUv;", + "void main() {", + "vec4 texel = texture2D( tColor, vUv );", + "float multi = 0.1;", + "for(float x = -1.0; x <= 1.0; x++) {", + "for (float y = -1.0; y <= 1.0; y++) {", + "if (x == 0.0 && y == 0.0) continue;", + "vec4 neighborcolor = texture2D(tColor, vUv + vec2(x/256.0, y/256.0) * tPixelSize);", + "if (neighborcolor != texel) { multi = 1.0; }", + "}", + "}", + "gl_FragColor = texel * multi;", + "}" + ].join("\n"); + vertexShader = [ + "varying vec2 vUv;", + "void main() {", + "vUv = vec2(uv.x, uv.y);", + "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);", + "}" + ].join("\n"); } }; }); -System.register("Player", ["three", "Attackable"], function (exports_8, context_8) { +System.register("Player", ["three", "Attackable"], function (exports_9, context_9) { "use strict"; var THREE, Attackable_1, Player; - var __moduleName = context_8 && context_8.id; + var __moduleName = context_9 && context_9.id; return { setters: [ function (THREE_5) { @@ -536,15 +646,15 @@ System.register("Player", ["three", "Attackable"], function (exports_8, context_ Player.defaultGeometry = new THREE.BoxGeometry(Player.size, Player.size, Player.size); return Player; }(Attackable_1.Attackable)); - exports_8("Player", Player); + exports_9("Player", Player); ; } }; }); -System.register("NonPlayerCharacter", ["three", "Attackable"], function (exports_9, context_9) { +System.register("NonPlayerCharacter", ["three", "Attackable"], function (exports_10, context_10) { "use strict"; var THREE, Attackable_2, NpcObjectKind, NpcColors, NonPlayerCharacter; - var __moduleName = context_9 && context_9.id; + var __moduleName = context_10 && context_10.id; return { setters: [ function (THREE_6) { @@ -591,15 +701,15 @@ System.register("NonPlayerCharacter", ["three", "Attackable"], function (exports NonPlayerCharacter.defaultGeometry = new THREE.BoxGeometry(NonPlayerCharacter.size, NonPlayerCharacter.size, NonPlayerCharacter.size); return NonPlayerCharacter; }(Attackable_2.Attackable)); - exports_9("NonPlayerCharacter", NonPlayerCharacter); + exports_10("NonPlayerCharacter", NonPlayerCharacter); ; } }; }); -System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attackable", "NonPlayerCharacter"], function (exports_10, context_10) { +System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attackable", "NonPlayerCharacter", "Debug"], function (exports_11, context_11) { "use strict"; - var THREE, Attack_1, TerrainShader_1, Player_1, Attackable_3, NonPlayerCharacter_1, World; - var __moduleName = context_10 && context_10.id; + var THREE, Attack_1, TerrainShader_1, Player_1, Attackable_3, NonPlayerCharacter_1, Debug_1, World; + var __moduleName = context_11 && context_11.id; return { setters: [ function (THREE_7) { @@ -619,6 +729,9 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka }, function (NonPlayerCharacter_1_1) { NonPlayerCharacter_1 = NonPlayerCharacter_1_1; + }, + function (Debug_1_1) { + Debug_1 = Debug_1_1; } ], execute: function () { @@ -626,19 +739,27 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka __extends(World, _super); function World(serverId, mapId) { var _this = _super.call(this) || this; + _this.terrainTexture = null; _this.lastLabelObjectId = null; + _this.isDisposed = false; _this.objects = {}; var attacksZ = 100; _this.attacks = new Attack_1.Attacks(); _this.attacks.position.z = attacksZ; _this.add(_this.attacks); var segments = 1; - var planeMesh = new THREE.Mesh(new THREE.PlaneGeometry(World.sideLength, World.sideLength, segments, segments), new THREE.ShaderMaterial(TerrainShader_1.terrainShader)); - _this.add(planeMesh); + _this.terrainMaterial = new THREE.ShaderMaterial(TerrainShader_1.createTerrainShader()); + _this.terrainMesh = new THREE.Mesh(new THREE.PlaneGeometry(World.sideLength, World.sideLength, segments, segments), _this.terrainMaterial); + _this.add(_this.terrainMesh); var textureLoader = new THREE.TextureLoader(); textureLoader.load("terrain/" + serverId + "/" + mapId, function (texture) { + if (_this.isDisposed) { + texture.dispose(); + return; + } texture.magFilter = THREE.NearestFilter; - TerrainShader_1.terrainShader.uniforms.tColor.value = texture; + _this.terrainTexture = texture; + _this.terrainMaterial.uniforms.tColor.value = texture; }); return _this; } @@ -671,11 +792,11 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka _a.sent(); return [3, 1]; case 3: - console.debug("Adding npc", npcData); + Debug_1.logDebug("Adding npc", npcData); this.addNpc(npcData); return [3, 5]; case 4: - console.debug("Updating npc", npcData); + Debug_1.logDebug("Updating npc", npcData); obj.respawn(npcData); _a.label = 5; case 5: return [2]; @@ -700,11 +821,11 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka _a.sent(); return [3, 1]; case 3: - console.debug("Adding player", playerData); + Debug_1.logDebug("Adding player", playerData); this.addPlayer(playerData); return [3, 5]; case 4: - console.debug("Updating player", playerData, obj.data); + Debug_1.logDebug("Updating player", playerData, obj.data); obj.respawn(playerData); _a.label = 5; case 5: return [2]; @@ -749,7 +870,27 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka } }; World.prototype.dispose = function () { - delete this.objects; + var _a; + if (this.isDisposed) { + return; + } + this.isDisposed = true; + this.lastLabelObjectId = null; + for (var id in this.objects) { + if (this.objects.hasOwnProperty(id)) { + var object = this.objects[id]; + this.remove(object); + object.dispose(); + } + } + this.objects = {}; + this.remove(this.attacks); + this.attacks.dispose(); + this.remove(this.terrainMesh); + this.terrainMesh.geometry.dispose(); + this.terrainMaterial.dispose(); + (_a = this.terrainTexture) === null || _a === void 0 ? void 0 : _a.dispose(); + this.terrainTexture = null; }; World.prototype.highlightPlayerByName = function (playerName) { for (var id in this.objects) { @@ -791,14 +932,20 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka } }; World.prototype.onSizeChanged = function (newSize) { - TerrainShader_1.terrainShader.uniforms.tPixelSize.value = World.sideLength / newSize; + this.terrainMaterial.uniforms.tPixelSize.value = World.sideLength / newSize; }; World.prototype.addNpc = function (data) { + if (this.isDisposed) { + return; + } var npc = new NonPlayerCharacter_1.NonPlayerCharacter(data); this.addObjectMesh(npc); npc.respawn(data); }; World.prototype.addPlayer = function (data) { + if (this.isDisposed) { + return; + } var player = new Player_1.Player(data); this.addObjectMesh(player); player.respawn(data); @@ -808,9 +955,13 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka if (mesh === undefined || mesh === null) { return; } - console.debug("Removing object", mesh.data); + Debug_1.logDebug("Removing object", mesh.data); this.remove(mesh); delete this.objects[objectId]; + if (this.lastLabelObjectId === objectId) { + this.lastLabelObjectId = null; + } + mesh.dispose(); }; World.prototype.getObjectById = function (objectId) { return this.objects[objectId]; @@ -823,14 +974,14 @@ System.register("World", ["three", "Attack", "TerrainShader", "Player", "Attacka World.rotationAnimationId = 122; return World; }(THREE.Object3D)); - exports_10("World", World); + exports_11("World", World); } }; }); -System.register("WorldObjectPicker", ["three"], function (exports_11, context_11) { +System.register("WorldObjectPicker", ["three"], function (exports_12, context_12) { "use strict"; var THREE, isGameObject, WorldObjectPicker; - var __moduleName = context_11 && context_11.id; + var __moduleName = context_12 && context_12.id; return { setters: [ function (THREE_8) { @@ -909,14 +1060,14 @@ System.register("WorldObjectPicker", ["three"], function (exports_11, context_11 WorldObjectPicker.hoverThresholdSquared = 16; return WorldObjectPicker; }()); - exports_11("WorldObjectPicker", WorldObjectPicker); + exports_12("WorldObjectPicker", WorldObjectPicker); } }; }); -System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], function (exports_12, context_12) { +System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], function (exports_13, context_13) { "use strict"; var THREE, tween_3, WorldObjectPicker_1, World_1, MapApp; - var __moduleName = context_12 && context_12.id; + var __moduleName = context_13 && context_13.id; return { setters: [ function (THREE_9) { @@ -939,6 +1090,7 @@ System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], func this.lastHighlightedId = null; this.isDisposing = false; this.isDisposed = false; + this.animationFrameId = null; this.stats = stats; this.container = mapContainer; this.onPickObjectHandler = onPickObjectHandler; @@ -967,7 +1119,6 @@ System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], func hideInfo(); } }, function (data) { return _this.onObjectHovered(data); }); - this.container.appendChild(this.renderer.domElement); this.animate(); } MapApp.prototype.highlightByName = function (playerName) { @@ -994,13 +1145,23 @@ System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], func } this.isDisposing = true; window.removeEventListener("resize", this.resizeEventListener); - var webGlRenderer = this.renderer; - if (webGlRenderer != null) { - webGlRenderer.dispose(); + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; } + this.picker.dispose(); this.scene.remove(this.world); this.world.dispose(); this.world = null; + var canvas = this.renderer.domElement; + var webGlRenderer = this.renderer; + if (webGlRenderer != null) { + webGlRenderer.dispose(); + webGlRenderer.forceContextLoss(); + } + if (canvas.parentNode !== null) { + canvas.parentNode.removeChild(canvas); + } this.renderer = null; this.isDisposing = false; this.isDisposed = true; @@ -1011,7 +1172,7 @@ System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], func if (this.isDisposing || this.isDisposed) { return; } - requestAnimationFrame(function () { return _this.animate(time); }); + this.animationFrameId = requestAnimationFrame(function (frameTime) { return _this.animate(frameTime); }); (_a = this.stats) === null || _a === void 0 ? void 0 : _a.update(); tween_3.default.update(time); this.world.update(); @@ -1052,7 +1213,7 @@ System.register("MapApp", ["three", "tween", "WorldObjectPicker", "World"], func }; return MapApp; }()); - exports_12("MapApp", MapApp); + exports_13("MapApp", MapApp); } }; }); diff --git a/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js.map b/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js.map index b673d52fe9..1857a5b70a 100644 --- a/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js.map +++ b/src/Web/Map/wwwroot/js/MUnique.OpenMU.Web.Map.js.map @@ -1 +1 @@ -{"version":3,"file":"MUnique.OpenMU.Web.Map.js","sourceRoot":"","sources":["../../Scripts/livemap/Queue.ts","../../Scripts/livemap/Types.ts","../../Scripts/livemap/GameObject.ts","../../Scripts/livemap/Attack.ts","../../Scripts/livemap/NameLabel.ts","../../Scripts/livemap/Attackable.ts","../../Scripts/livemap/TerrainShader.ts","../../Scripts/livemap/Player.ts","../../Scripts/livemap/NonPlayerCharacter.ts","../../Scripts/livemap/World.ts","../../Scripts/livemap/WorldObjectPicker.ts","../../Scripts/livemap/MapApp.ts","../../Scripts/livemap/Stats.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA;gBAKI;oBACI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;oBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;oBACtB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACvB,CAAC;gBAEM,oBAAI,GAAX;oBACI,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;gBACjD,CAAC;gBAEM,uBAAO,GAAd,UAAe,IAAO;oBAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;oBACxC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxB,CAAC;gBAEM,uBAAO,GAAd;oBACI,IAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;oBACtC,IAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;oBAEtC,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;wBAC9B,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAClC,IAAI,CAAC,YAAY,EAAE,CAAC;wBAEpB,OAAO,WAAW,CAAC;oBACvB,CAAC;oBAED,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAEM,oBAAI,GAAX;oBACI,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;wBAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC5C,CAAC;oBAED,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACL,YAAC;YAAD,CAAC,AA1CD,IA0CC;;QACD,CAAC;;;;;;;;;;YCnCD,WAAY,SAAS;gBACjB,mDAAa,CAAA;gBACb,yCAAQ,CAAA;gBACR,mDAAa,CAAA;gBACb,2CAAS,CAAA;gBACT,mDAAa,CAAA;gBACb,yCAAQ,CAAA;gBACR,mDAAa,CAAA;gBACb,2CAAS,CAAA;gBACT,mDAAa,CAAA;YACjB,CAAC,EAVW,SAAS,4BAAT,SAAS,SAUpB;QA8BD,CAAC;;;;;;;;;QCtCD,CAAC;;;;;;;;;;;;;;;;;;;;;gBCL4B,2BAAY;gBAQrC;oBAAA,iBA4BC;oBA3BG,IAAM,cAAc,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC;wBAC5C,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,KAAK;wBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;qBACnC,CAAC,CAAC;oBACH,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;oBAClC,IAAM,MAAM,GAAkB,EAAE,CAAC;oBACjC,IAAM,qBAAqB,GAAG,KAAK,CAAC;oBACpC,IAAM,sBAAsB,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACpD,IAAM,KAAK,GAAG,IAAI,aAAK,EAAU,CAAC;oBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7C,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAEzE,IAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAChC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACnB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC;oBAED,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC;oBACvC,sBAAsB,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC/C,sBAAsB,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAEjD,QAAA,MAAK,YAAC,sBAAsB,EAAE,cAAc,CAAC,SAAC;oBAC9C,KAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC;oBACzD,KAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;oBAC/B,KAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC;;gBAC3C,CAAC;gBAEM,wBAAM,GAAb;gBACA,CAAC;gBAEM,2BAAS,GAAhB,UAAiB,QAAoB,EAAE,MAAkB;oBAAzD,iBAuCC;oBAtCG,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;wBACzC,OAAO;oBACX,CAAC;oBAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;2BACtC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBAC/C,OAAO;oBACX,CAAC;oBAED,IAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;oBAClD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBACpB,OAAO;oBACX,CAAC;oBAGD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAEtC,IAAM,QAAQ,GAAG,CAAC,CAAC;oBACnB,IAAM,UAAU,GAAG,CAAC,QAAQ,CAAC;oBAE7B,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAChE,IAAM,KAAK,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC7C,IAAM,KAAK,GAAG,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;yBAC/B,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC;yBAC1E,QAAQ,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;wBACxC,KAAI,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAC5C,CAAC,CAAC;yBACD,UAAU,CAAC;wBACR,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC;wBACvB,KAAI,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBACxC,KAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC7C,CAAC,CAAC;yBACD,KAAK,EAAE,CAAC;oBAEb,IAAI,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC5C,CAAC;gBA/EuB,+BAAuB,GAAW,GAAG,CAAC;gBAgFlE,cAAC;aAAA,AAjFD,CAA6B,KAAK,CAAC,MAAM;;QAkFzC,CAAC;;;;;;;;;;;;;;YCrFK,YAAY,GAAG,GAAG,CAAC;YACnB,aAAa,GAAG,EAAE,CAAC;YACnB,aAAa,GAAG,EAAE,CAAC;YACnB,aAAa,GAAG,CAAC,CAAC;YAClB,aAAa,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,CAAC,CAAC;YACZ,OAAO,GAAG,CAAC,CAAC;YACZ,gBAAgB,GAAG,CAAC,CAAC;YAE3B;gBAA+B,6BAAY;gBAMvC;oBAAA,iBAmBC;oBAlBG,IAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;oBAC5B,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC;oBAC9B,IAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAChD,CAAC;oBACD,IAAM,OAAO,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE/E,QAAA,MAAK,YAAC,QAAQ,CAAC,SAAC;oBAbZ,eAAS,GAAY,KAAK,CAAC;oBAe/B,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;oBACrB,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;oBACvB,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;oBAEvB,KAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;oBAC5D,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;gBACzB,CAAC;gBAEM,2BAAO,GAAd;gBAEA,CAAC;gBAEM,wBAAI,GAAX,UAAY,IAAY;oBACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBAEM,wBAAI,GAAX;oBACI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBAC3B,CAAC;gBAEO,+BAAW,GAAnB,UAAoB,IAAY;oBAC5B,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;oBACzB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;oBAE3B,GAAG,CAAC,IAAI,GAAG,+BAA+B,CAAC;oBAC3C,IAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;oBAE9C,IAAM,OAAO,GAAG,EAAE,CAAC;oBACnB,IAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;oBAC3C,IAAM,WAAW,GAAG,EAAE,CAAC;oBAEvB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;oBAC7D,MAAM,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,CAAC,CAAC;oBAG1C,GAAG,CAAC,IAAI,GAAG,+BAA+B,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;oBAEnG,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAE7D,IAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;oBAC1C,IAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC5C,IAAM,MAAM,GAAG,CAAC,CAAC;oBAEjB,GAAG,CAAC,SAAS,GAAG,qBAAqB,CAAC;oBACtC,GAAG,CAAC,SAAS,EAAE,CAAC;oBAChB,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;oBACvC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;oBACpE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC;oBACrD,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;oBAChG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;oBACxC,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC;oBACtE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;oBAC1B,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC1C,GAAG,CAAC,SAAS,EAAE,CAAC;oBAChB,GAAG,CAAC,IAAI,EAAE,CAAC;oBAEX,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC1B,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;oBACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;oBAE5B,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAExD,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBACpC,CAAC;gBAEO,kCAAc,GAAtB,UAAuB,KAAa;oBAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACL,gBAAC;YAAD,CAAC,AA5FD,CAA+B,KAAK,CAAC,MAAM,GA4F1C;;QACD,CAAC;;;;;;;;;;;;;;;;;;;;YClGK,qBAAqB,GAAG,GAAG,CAAC;YAC5B,UAAU,GAAG,CAAC,CAAC;YAErB;gBAA0D,8BAAU;gBAOhE,oBAAY,IAAW,EAAE,QAAwB,EAAE,QAAwB;oBACvE,YAAA,MAAK,YAAC,QAAQ,EAAE,QAAQ,CAAC,SAAC;oBAC1B,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;oBACjB,KAAI,CAAC,SAAS,GAAG,IAAI,CAAC;oBACtB,KAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;oBACjC,KAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,qBAAqB,CAAC;oBAClD,KAAI,CAAC,GAAG,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC;;gBAC7B,CAAC;gBAEM,8BAAS,GAAhB;oBACI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAEM,8BAAS,GAAhB;oBACI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC1B,CAAC;gBAEM,8BAAS,GAAhB;oBAAA,iBAYC;oBAVG,IAAM,iBAAiB,GAAG,IAAI,CAAC;oBAC/B,IAAM,eAAe,GAAG,CAAC,CAAC;oBAC1B,IAAM,eAAe,GAAG,GAAG,CAAC;oBAE5B,IAAM,KAAK,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;oBAC3C,IAAM,KAAK,GAAG,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;yBAC/B,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,iBAAiB,CAAC;yBACnD,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAArC,CAAqC,CAAC;yBACrD,MAAM,CAAC,eAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;yBACjC,KAAK,EAAE,CAAC;gBACjB,CAAC;gBAEM,4BAAO,GAAd,UAAe,OAAc;oBAA7B,iBAYC;oBAXG,IAAM,iBAAiB,GAAG,GAAG,CAAC;oBAC9B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC;oBAC5B,IAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBAC3B,IAAM,KAAK,GAAG,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;yBAC/B,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC;yBACnC,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAjC,CAAiC,CAAC;yBACjD,MAAM,CAAC,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;yBAC7B,KAAK,EAAE,CAAC;oBACb,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBAEM,2BAAM,GAAb,UAAc,IAAY,EAAE,IAAY,EAAE,QAAa,EAAE,SAAiB,EAAE,KAAa;oBAAzF,iBA6BC;oBA5BG,IAAM,KAAK,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE3E,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;wBAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;oBAC1B,CAAC;oBAED,IAAI,CAAC,SAAS,GAAG,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;yBAClC,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAA7C,CAA6C,CAAC,CAAC;oBAEnE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;wBAC3C,IAAM,cAAc,GAAG,GAAG,CAAC;wBAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;6BAC3D,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;oBAClD,CAAC;yBAAM,CAAC;gDACO,CAAC;4BACR,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gCAC1B,IAAM,MAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gCACtB,IAAM,SAAS,GAAG,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;qCACnC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAI,CAAC,CAAC,EAAE,CAAC,EAAE,MAAI,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;qCACvC,OAAO,CAAC,cAAM,OAAA,KAAI,CAAC,QAAQ,CAAC,MAAI,CAAC,SAAS,CAAC,EAA7B,CAA6B,CAAC;qCAC5C,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAA7C,CAA6C,CAAC,CAAC;gCACnE,OAAK,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;4BACpC,CAAC;;;wBARL,KAAK,IAAM,CAAC,IAAI,KAAK;oCAAV,CAAC;yBASX;oBACL,CAAC;oBAED,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;gBAEM,6BAAQ,GAAf,UAAgB,QAAmB;oBAAnC,iBAgBC;oBAfG,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC1B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACvD,CAAC;oBAED,IAAM,gBAAgB,GAAG,GAAG,CAAC;oBAC7B,IAAM,uBAAuB,GAAG,CAAC,CAAC;oBAClC,IAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,gBAAgB,CAAC,GAAG,uBAAuB,CAAC,CAAC;oBACjG,IAAM,gBAAgB,GAAG,GAAG,CAAC;oBAE7B,IAAM,KAAK,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBACrC,IAAI,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC;yBACjB,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,gBAAgB,CAAC;yBACxC,QAAQ,CAAC,cAAM,OAAA,KAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAzB,CAAyB,CAAC;yBACzC,MAAM,CAAC,eAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;yBAClC,KAAK,EAAE,CAAC;gBACjB,CAAC;gBAEO,gCAAW,GAAnB,UAAoB,KAAgB;oBAChC,IAAM,gBAAgB,GAAG,GAAG,CAAC;oBAC7B,IAAM,uBAAuB,GAAG,CAAC,CAAC;oBAClC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG,gBAAgB,CAAC,GAAG,uBAAuB,CAAC,CAAC;gBAChG,CAAC;gBAEO,2CAAsB,GAA9B,UAA+B,IAAY,EAAE,IAAY;oBACrD,IAAM,MAAM,GAAG,GAAG,CAAC;oBAEnB,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;oBAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;gBACpC,CAAC;gBACL,iBAAC;YAAD,CAAC,AAjHD,CAA0D,KAAK,CAAC,IAAI,GAiHnE;;YAGD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,6DAA6D,EAAE,UAAC,CAAgB;gBAC3G,uCAAA,yBAAyB,GAAG,CAAC,EAAC;YAClC,CAAC,CAAC,CAAC;QAEH,CAAC;;;;;;;;;;;;;;YC3HD,2BAAa,aAAa,GAAmC;gBACzD,cAAc,EAAE;oBACZ,2BAA2B;oBAC3B,2BAA2B;oBAC3B,mBAAmB;oBACnB,eAAe;oBACf,wCAAwC;oBACxC,oBAAoB;oBACpB,sCAAsC;oBACtC,uCAAuC;oBACvC,qCAAqC;oBACrC,oFAAoF;oBACpF,8CAA8C;oBAC9C,GAAG;oBACH,GAAG;oBACH,+BAA+B;oBAC/B,GAAG;iBACN,CAAC,IAAI,CAAC,IAAI,CAAC;gBAEZ,IAAI,EAAE,KAAK,CAAC,UAAU;gBAEtB,QAAQ,EAAE;oBACN,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;oBAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;iBACxC;gBAED,YAAY,EAAE;oBACV,mBAAmB;oBACnB,eAAe;oBACf,yBAAyB;oBACzB,yEAAyE;oBACzE,GAAG;iBACN,CAAC,IAAI,CAAC,IAAI,CAAC;aACf,EAAC;QACF,CAAC;;;;;;;;;;;;;;;;;;gBCpC2B,0BAAsB;gBAK9C,gBAAY,IAAgB;oBACxB,YAAA,MAAK,YACD,IAAI,EACJ,MAAM,CAAC,eAAe,EACtB,IAAI,KAAK,CAAC,iBAAiB,CAAC;wBACxB,QAAQ,EAAE,sCAAyB;wBACnC,KAAK,EAAE,MAAM,CAAC,YAAY;wBAC1B,WAAW,EAAE,IAAI;qBACpB,CAAC,CACL,SAAC;oBACF,KAAI,CAAC,WAAW,GAAG,CAAC,CAAC;;gBACzB,CAAC;gBAEM,uBAAM,GAAb;oBACI,IAAM,gBAAgB,GAAG,GAAG,CAAC;oBAC7B,IAAM,WAAW,GAAG,GAAG,CAAC;oBAExB,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;wBAC1B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;wBACtC,IAAI,CAAC,QAAoC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBACrF,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBACjC,IAAI,CAAC,QAAoC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACjF,CAAC;gBACL,CAAC;gBA5BuB,WAAI,GAAW,CAAC,CAAC;gBACjB,mBAAY,GAAW,QAAQ,CAAC;gBAChC,uBAAgB,GAAW,QAAQ,CAAC;gBAC7C,sBAAe,GAAmB,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBA0BlH,aAAC;aAAA,AA9BD,CAA4B,uBAAU;;YA8BrC,CAAC;QACF,CAAC;;;;;;;;;;;;;;;;;YC5BD,WAAK,aAAa;gBACd,uDAAW,CAAA;gBACX,6DAAc,CAAA;gBACd,mDAAS,CAAA;gBACT,iDAAQ,CAAA;gBACR,iDAAQ,CAAA;gBACR,qDAAU,CAAA;gBACV,6DAAc,CAAA;gBACd,iEAAgB,CAAA;YACpB,CAAC,EATI,aAAa,KAAb,aAAa,QASjB;YAED,WAAW,SAAS;gBAChB,sDAAkB,CAAA;gBAClB,qDAAkB,CAAA;gBAClB,sDAAkB,CAAA;YACtB,CAAC,EAJU,SAAS,KAAT,SAAS,QAInB;;gBAEuC,sCAAmB;gBAmBvD,4BAAY,IAAa;oBACrB,IAAM,KAAK,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC3E,OAAA,MAAK,YACD,IAAI,EACJ,kBAAkB,CAAC,eAAe,EAClC,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,OAAA,EAAE,QAAQ,EAAE,sCAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CACjG,SAAC;gBACN,CAAC;gBAnBc,wCAAqB,GAApC,UAAqC,IAAmB;oBACpD,QAAQ,IAAI,EAAE,CAAC;wBACX,KAAK,aAAa,CAAC,OAAO;4BACtB,gBAAyB;wBAC7B,KAAK,aAAa,CAAC,UAAU,CAAC;wBAC9B,KAAK,aAAa,CAAC,KAAK;4BACpB,eAAyB;wBAC7B;4BACI,gBAAyB;oBACjC,CAAC;gBACL,CAAC;gBAhBuB,uBAAI,GAAW,CAAC,CAAC;gBAC1B,kCAAe,GAAmB,IAAI,KAAK,CAAC,WAAW,CAClE,kBAAkB,CAAC,IAAI,EACvB,kBAAkB,CAAC,IAAI,EACvB,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAsBjC,yBAAC;aAAA,AA3BD,CAAwC,uBAAU;;YA2BjD,CAAC;QACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBCzC0B,yBAAc;gBAiBrC,eAAY,QAAgB,EAAE,KAAa;oBACvC,YAAA,MAAK,WAAE,SAAC;oBATJ,uBAAiB,GAAkB,IAAI,CAAC;oBAU5C,KAAI,CAAC,OAAO,GAAG,EAAE,CAAC;oBAElB,IAAM,QAAQ,GAAG,GAAG,CAAC;oBACrB,KAAI,CAAC,OAAO,GAAG,IAAI,gBAAO,EAAE,CAAC;oBAC7B,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;oBACnC,KAAI,CAAC,GAAG,CAAC,KAAI,CAAC,OAAO,CAAC,CAAC;oBAEvB,IAAM,QAAQ,GAAG,CAAC,CAAC;oBAEnB,IAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAC5B,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/E,IAAI,KAAK,CAAC,cAAc,CAAC,6BAAa,CAAC,CAAC,CAAC;oBAC7C,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAEpB,IAAM,aAAa,GAAG,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;oBAChD,aAAa,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,GAAG,GAAG,GAAG,KAAK,EAAE,UAAC,OAAsB;wBAC3E,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC;wBACxC,6BAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;oBAClD,CAAC,CAAC,CAAC;;gBACP,CAAC;gBAKM,sBAAM,GAAb;oBACI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACtB,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC7B,KAAK,IAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACtB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC5B,IAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;4BAC1B,IAAI,MAAM,YAAY,eAAM,EAAE,CAAC;gCAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;4BACpB,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;gBAMY,8BAAc,GAA3B,UAA4B,OAAgB;;;;;;oCAClC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;yCACvC,CAAA,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAA,EAAjC,cAAiC;oCAC3B,eAAa,EAAE,CAAC;;;yCACf,CAAA,sCAAyB,KAAK,SAAS,CAAA;oCAC1C,WAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,YAAU,CAAC,EAA/B,CAA+B,CAAC,EAAA;;oCAA/D,SAA+D,CAAC;;;oCAGpE,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oCACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;;oCAErB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;oCACvC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;;;;;;iBAE5B;gBAMY,iCAAiB,GAA9B,UAA+B,UAAsB;;;;;;oCAC3C,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;yCAC1C,CAAA,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAA,EAAjC,cAAiC;oCAC3B,eAAa,EAAE,CAAC;;;yCACf,CAAA,sCAAyB,KAAK,SAAS,CAAA;oCAC1C,WAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,YAAU,CAAC,EAA/B,CAA+B,CAAC,EAAA;;oCAA/D,SAA+D,CAAC;;;oCAGpE,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oCAC3C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;;;oCAE3B,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oCACvD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;;;;;;iBAE/B;gBAOM,0BAAU,GAAjB,UAAkB,cAAsB,EAAE,cAAsB;oBAC5D,IAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;oBACxD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,EAAE,CAAC;gBAC9B,CAAC;gBAWM,2BAAW,GAAlB,UAAmB,EAAU,EAAE,IAAY,EAAE,IAAY,EAAE,QAAa,EAAE,SAAiB,EAAE,KAAa;oBACtG,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;oBACnC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBACxD,CAAC;gBAQM,iCAAiB,GAAxB,UAAyB,QAAgB,EAAE,QAAgB,EAAE,KAAa;oBACtE,IAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC/C,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC5C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAE9C,CAAC;gBAUM,qCAAqB,GAA5B,UAA6B,QAAgB,EAAE,KAAa,EAAE,CAAS,EAAE,CAAS,EAAE,QAAgB;oBAChG,IAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC/C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;wBAChD,IAAM,kBAAkB,GAAG,IAAI,CAAC;wBAChC,SAAS,CAAC,QAAQ,CAAC,QAAQ,GAAG,kBAAkB,CAAC,CAAC;oBAEtD,CAAC;gBACL,CAAC;gBASM,4BAAY,GAAnB,UAAoB,WAAmB,EAAE,SAAiB,EAAE,QAAgB,EAAE,SAAiB;oBAC3F,IAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;oBAClD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;wBAChD,IAAI,SAAS,KAAK,KAAK,CAAC,mBAAmB,EAAE,CAAC;4BAC1C,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBAClC,CAAC;6BAAM,CAAC;4BACJ,IAAM,kBAAkB,GAAG,IAAI,CAAC;4BAChC,SAAS,CAAC,QAAQ,CAAC,SAAS,GAAG,kBAAkB,CAAC,CAAC;wBACvD,CAAC;oBACL,CAAC;oBAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBACpB,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;wBAC5C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBAE9C,CAAC;gBACL,CAAC;gBAKM,uBAAO,GAAd;oBACI,OAAO,IAAI,CAAC,OAAO,CAAC;gBACxB,CAAC;gBAOM,qCAAqB,GAA5B,UAA6B,UAAkB;oBAC3C,KAAK,IAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;4BAClC,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BAC7B,IAAI,GAAG,YAAY,eAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAc,UAAU,MAAG,CAAC,EAAE,CAAC;gCAC/E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gCAC9B,OAAO,IAAI,CAAC;4BAChB,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAMM,2BAAW,GAAlB,UAAmB,QAAgB;oBAC/B,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAW,CAAC;oBACtD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,yBAAS,MAAM,CAAC,IAAI,KAAE,aAAa,EAAE,IAAI,GAAE,CAAC;oBAC3D,CAAC;gBACL,CAAC;gBAMM,4BAAY,GAAnB,UAAoB,QAAgB;oBAChC,IAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAW,CAAC;oBACtD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,yBAAS,MAAM,CAAC,IAAI,KAAE,aAAa,EAAE,KAAK,GAAE,CAAC;oBAC5D,CAAC;gBACL,CAAC;gBAMM,yBAAS,GAAhB,UAAiB,QAAgB;oBAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAA2B,CAAC;oBACnE,IAAI,GAAG,EAAE,CAAC;wBACN,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;oBACtC,CAAC;gBACL,CAAC;gBAKM,6BAAa,GAApB;oBACI,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;wBAClC,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAA2B,CAAC;wBACjF,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,SAAS,EAAE,CAAC;wBACjB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAClC,CAAC;gBACL,CAAC;gBAMM,6BAAa,GAApB,UAAqB,OAAe;oBAChC,6BAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;gBACzE,CAAC;gBAMM,sBAAM,GAAb,UAAc,IAAa;oBACvB,IAAM,GAAG,GAAG,IAAI,uCAAG,CAAC,IAAI,CAAC,CAAC;oBAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBACxB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBAMM,yBAAS,GAAhB,UAAiB,IAAgB;oBAC7B,IAAM,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,CAAC;oBAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;gBAMM,4BAAY,GAAnB,UAAoB,QAAgB;oBAChC,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACpC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBACtC,OAAO;oBACX,CAAC;oBAED,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,CAAC,MAAM,CAAC,IAAsB,CAAC,CAAC;oBACpC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;gBAOM,6BAAa,GAApB,UAAqB,QAAgB;oBACjC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;gBAEO,6BAAa,GAArB,UAAsB,IAAgB;oBAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBACtC,CAAC;gBA5SuB,gBAAU,GAAW,GAAG,AAAd,CAAe;gBACzB,yBAAmB,GAAW,GAAG,AAAd,CAAe;gBA4S9D,YAAC;aAAA,AA9SD,CAA2B,KAAK,CAAC,QAAQ;;QA+SzC,CAAC;;;;;;;;;;;;;;YCrTK,YAAY,GAAG,UAAC,GAAmB;gBACrC,OAAC,GAAkB,CAAC,IAAI,KAAK,SAAS;YAAtC,CAAsC,CAAC;;gBAkBvC,2BACqB,WAAwB,EACxB,SAAgB,EAChB,MAAoB,EACrC,cAAiD,EACjD,eAAmD;oBAJlC,gBAAW,GAAX,WAAW,CAAa;oBACxB,cAAS,GAAT,SAAS,CAAO;oBAChB,WAAM,GAAN,MAAM,CAAc;oBAhBxB,cAAS,GAAoB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACnD,UAAK,GAAkB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAKpD,0BAAqB,GAAY,KAAK,CAAC;oBACvC,eAAU,GAAW,CAAC,CAAC;oBACvB,eAAU,GAAW,CAAC,CAAC;oBAY3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;oBACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;oBAEvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAEnD,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC/D,WAAW,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;gBAC3E,CAAC;gBAEM,mCAAO,GAAd;oBACI,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAChE,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5E,CAAC;gBAEO,mCAAO,GAAf,UAAgB,CAAa;oBACzB,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;oBAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBAEO,uCAAW,GAAnB,UAAoB,CAAa;oBAAjC,iBAyBC;oBAxBG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;wBACxB,OAAO;oBACX,CAAC;oBAED,IAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;oBACvC,IAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;oBACvC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;wBAC9D,OAAO;oBACX,CAAC;oBAED,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBAC9B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;wBAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;wBAC5B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;wBAE5B,IAAM,SAAO,GAAW,CAAC,CAAC,OAAO,CAAC;wBAClC,IAAM,SAAO,GAAW,CAAC,CAAC,OAAO,CAAC;wBAClC,IAAM,iBAAe,GAAG,IAAI,CAAC,eAAe,CAAC;wBAE7C,qBAAqB,CAAC;4BAClB,KAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;4BACnC,iBAAe,CAAC,KAAI,CAAC,MAAM,CAAC,SAAO,EAAE,SAAO,CAAC,CAAC,CAAC;wBACnD,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBAEO,kCAAM,GAAd,UAAe,OAAe,EAAE,OAAe;oBAC3C,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAClE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAEtD,IAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAClF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5E,CAAC;gBAEO,6CAAiB,GAAzB,UAA0B,YAAgC;oBACtD,IAAI,GAAG,GAA0B,YAAY,CAAC,MAAM,CAAC;oBACrD,OAAO,GAAG,EAAE,CAAC;wBACT,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;4BACjD,OAAO,GAAG,CAAC,IAAI,CAAC;wBACpB,CAAC;wBACD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;oBACrB,CAAC;oBACD,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAvFuB,uCAAqB,GAAW,EAAE,AAAb,CAAc;gBAwF/D,wBAAC;aAAA,AAzFD;;QA0FA,CAAC;;;;;;;;;;;;;;;;;;;;;;;YCzFD;gBAcI,gBACI,KAAY,EACZ,QAAgB,EAChB,KAAa,EACb,YAAyB,EACzB,mBAA+C;oBALnD,iBA4CC;oBAlDO,sBAAiB,GAAkB,IAAI,CAAC;oBACxC,gBAAW,GAAY,KAAK,CAAC;oBAC7B,eAAU,GAAY,KAAK,CAAC;oBAUhC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;oBACnB,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;oBAC9B,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;oBAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBAElC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC9D,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACrD,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,IAAI,CAAC,mBAAmB,GAAG,cAAM,OAAA,KAAI,CAAC,cAAc,EAAE,EAArB,CAAqB,CAAC;oBACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;oBAEnE,IAAM,QAAQ,GAAG;wBACb,IAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;wBACtD,IAAI,IAAI,EAAE,CAAC;4BACP,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;wBAChC,CAAC;oBACL,CAAC,CAAC;oBAEF,IAAI,CAAC,MAAM,GAAG,IAAI,qCAAiB,CAC/B,IAAI,CAAC,QAAQ,CAAC,UAAU,EACxB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,UAAC,IAAI;wBACD,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAC1B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;4BAChB,mBAAmB,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC;6BAAM,CAAC;4BACJ,QAAQ,EAAE,CAAC;wBACf,CAAC;oBACL,CAAC,EACD,UAAC,IAAI,IAAK,OAAA,KAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAA1B,CAA0B,CAAC,CAAC;oBAC1C,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBAErD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC;gBAEM,gCAAe,GAAtB,UAAuB,UAAkB;oBACrC,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;gBACxD,CAAC;gBAOM,6BAAY,GAAnB,UAAoB,QAAgB;;oBAChC,IAAM,IAAI,GAAG,MAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,0CAAE,IAA8B,CAAC;oBAChF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;wBAGrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAC1B,IAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;wBACtD,IAAI,IAAI,EAAE,CAAC;4BACP,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;wBAChC,CAAC;wBAED,OAAO,KAAK,CAAC;oBACjB,CAAC;oBAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBAC1B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAEM,wBAAO,GAAd;oBACI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACtC,OAAO;oBACX,CAAC;oBAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAC/D,IAAM,aAAa,GAAG,IAAI,CAAC,QAA+B,CAAC;oBAC3D,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;wBACxB,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;oBAElB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC3B,CAAC;gBAGO,wBAAO,GAAf,UAAgB,IAAa;oBAA7B,iBAUC;;oBATG,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACtC,OAAO;oBACX,CAAC;oBAED,qBAAqB,CAAC,cAAM,OAAA,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAlB,CAAkB,CAAC,CAAC;oBAChD,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,EAAE,CAAC;oBACrB,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClD,CAAC;gBAKO,6BAAY,GAApB;oBACI,IAAM,QAAQ,GAAG,GAAG,CAAC;oBACrB,IAAM,IAAI,GAAG,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC;oBAE9B,IAAM,MAAM,GAAG,IAAI,KAAK,CAAC,kBAAkB,CACvC,QAAQ,GAAG,CAAC,CAAC,EACb,QAAQ,GAAG,CAAC,EACZ,QAAQ,GAAG,CAAC,EACZ,QAAQ,GAAG,CAAC,CAAC,EACb,IAAI,EACJ,GAAG,CAAC,CAAC;oBACT,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;oBACzB,OAAO,MAAM,CAAC;gBAClB,CAAC;gBAKO,+BAAc,GAAtB;oBACI,IAAM,MAAM,GAAG,EAAE,CAAC;oBAClB,IAAM,cAAc,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC;oBAC9E,IAAM,eAAe,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC;oBAC/E,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;oBAC1D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACtC,CAAC;gBAEO,+BAAc,GAAtB,UAAuB,IAAuB;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;wBAClC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;wBAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAClC,CAAC;oBAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAChC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC;oBACrC,CAAC;gBACL,CAAC;gBAEO,gCAAe,GAAvB,UAAwB,IAAuB;oBAC3C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClC,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;oBAC/B,CAAC;gBACL,CAAC;gBACL,aAAC;YAAD,CAAC,AA3KD,IA2KC;;QACD,CAAC"} \ No newline at end of file +{"version":3,"file":"MUnique.OpenMU.Web.Map.js","sourceRoot":"","sources":["../../Scripts/livemap/Stats.ts","../../Scripts/livemap/Queue.ts","../../Scripts/livemap/Types.ts","../../Scripts/livemap/GameObject.ts","../../Scripts/livemap/Attack.ts","../../Scripts/livemap/NameLabel.ts","../../Scripts/livemap/Attackable.ts","../../Scripts/livemap/Debug.ts","../../Scripts/livemap/TerrainShader.ts","../../Scripts/livemap/Player.ts","../../Scripts/livemap/NonPlayerCharacter.ts","../../Scripts/livemap/World.ts","../../Scripts/livemap/WorldObjectPicker.ts","../../Scripts/livemap/MapApp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/Web/Map/wwwroot/js/map-launcher.js b/src/Web/Map/wwwroot/js/map-launcher.js index 4fe51fbeb2..a06c7320a7 100644 --- a/src/Web/Map/wwwroot/js/map-launcher.js +++ b/src/Web/Map/wwwroot/js/map-launcher.js @@ -2,6 +2,11 @@ window.mapApps = {}; +// Keeps track of the created maps, so that their loading can be cancelled when +// the page is left before the MapApp module resolved, and so that the stats +// element can be removed again when the map is disposed. +window.mapAppRegistrations = {}; + function CreateMap(serverId, mapId, containerId, appId) { console.debug("Creating map; serverId: ", serverId, ", mapId: ", mapId, ", containerId: ", containerId, ", appId: ", appId); @@ -12,9 +17,19 @@ function CreateMap(serverId, mapId, containerId, appId) { document.getElementById(containerId).after(stats.domElement); } + const registration = { isCancelled: false, stats: stats }; + window.mapAppRegistrations[appId] = registration; + System.import("MapApp") .then((module) => { - console.log('MapApp module resolved'); + console.debug('MapApp module resolved'); + if (registration.isCancelled) { + // The map was disposed before the module was loaded. Creating the + // MapApp now would start a rendering loop which never stops. + console.debug('MapApp creation was cancelled'); + return; + } + window.mapApps[serverId] = window.mapApps[serverId] || {}; window.mapApps[serverId][mapId] = new module.MapApp(stats, serverId, mapId, document.getElementById(containerId), (data) => { const info = document.getElementById("selected_info"); @@ -42,6 +57,15 @@ function CreateMap(serverId, mapId, containerId, appId) { function DisposeMap(identifier) { console.debug("Disposing map; containerId: ", identifier); + const registration = window.mapAppRegistrations[identifier]; + if (registration) { + // If the MapApp module didn't resolve yet, this prevents the creation of a + // MapApp which would never be disposed. + registration.isCancelled = true; + delete window.mapAppRegistrations[identifier]; + RemoveStatsElement(registration.stats); + } + let map = window[identifier]; if (map) { map.dispose(); @@ -58,6 +82,13 @@ function DisposeMap(identifier) { } } +function RemoveStatsElement(stats) { + const element = stats && stats.domElement; + if (element && element.parentNode) { + element.parentNode.removeChild(element); + } +} + function HighlightFollowedPlayer(serverId, mapId, playerName) { var app = window.mapApps && window.mapApps[serverId] && window.mapApps[serverId][mapId]; if (app && app.highlightByName) {