@stowkit/three-loader 0.1.32 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stowkit-three-loader.js","sources":["../src/AssetCache.ts","../src/MeshParser.ts","../src/StowKitPack.ts","../src/StowKitLoader.ts"],"sourcesContent":["/**\r\n * Persistent asset cache using IndexedDB\r\n * Caches decoded Draco geometries and transcoded Basis textures\r\n * Invalidates when source .stow file changes\r\n */\r\n\r\ninterface CachedGeometry {\r\n positions: Float32Array;\r\n normals?: Float32Array;\r\n uvs?: Float32Array;\r\n indices: Uint32Array;\r\n version: string;\r\n}\r\n\r\ninterface CachedTexture {\r\n data: Uint8Array;\r\n width: number;\r\n height: number;\r\n format: number;\r\n internalFormat: number;\r\n compressed: boolean;\r\n version: string;\r\n}\r\n\r\nexport class AssetMemoryCache {\r\n private static db: IDBDatabase | null = null;\r\n private static initPromise: Promise<void> | null = null;\r\n private static DB_NAME = 'StowKitAssetCache';\r\n private static DB_VERSION = 1;\r\n private static GEOMETRY_STORE = 'geometries';\r\n private static TEXTURE_STORE = 'textures';\r\n\r\n private static async init(): Promise<void> {\r\n if (this.db) return;\r\n if (this.initPromise) return this.initPromise;\r\n\r\n this.initPromise = new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.DB_NAME, this.DB_VERSION);\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve();\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n \r\n if (!db.objectStoreNames.contains(this.GEOMETRY_STORE)) {\r\n db.createObjectStore(this.GEOMETRY_STORE);\r\n }\r\n \r\n if (!db.objectStoreNames.contains(this.TEXTURE_STORE)) {\r\n db.createObjectStore(this.TEXTURE_STORE);\r\n }\r\n };\r\n });\r\n\r\n return this.initPromise;\r\n }\r\n\r\n static async getGeometry(key: string, version: string): Promise<CachedGeometry | null> {\r\n try {\r\n await this.init();\r\n if (!this.db) return null;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE], 'readonly');\r\n const store = transaction.objectStore(this.GEOMETRY_STORE);\r\n const request = store.get(key);\r\n\r\n request.onsuccess = () => {\r\n const cached = request.result as CachedGeometry | undefined;\r\n if (cached && cached.version === version) {\r\n resolve(cached);\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n\r\n request.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n static async setGeometry(key: string, version: string, geometry: {\r\n positions: Float32Array;\r\n normals?: Float32Array;\r\n uvs?: Float32Array;\r\n indices: Uint32Array;\r\n }): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n const cached: CachedGeometry = { ...geometry, version };\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE], 'readwrite');\r\n const store = transaction.objectStore(this.GEOMETRY_STORE);\r\n store.put(cached, key);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail if IndexedDB unavailable\r\n }\r\n }\r\n\r\n static async getTexture(key: string, version: string): Promise<CachedTexture | null> {\r\n try {\r\n await this.init();\r\n if (!this.db) return null;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.TEXTURE_STORE], 'readonly');\r\n const store = transaction.objectStore(this.TEXTURE_STORE);\r\n const request = store.get(key);\r\n\r\n request.onsuccess = () => {\r\n const cached = request.result as CachedTexture | undefined;\r\n if (cached && cached.version === version) {\r\n resolve(cached);\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n\r\n request.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n static async setTexture(key: string, version: string, textureData: {\r\n data: Uint8Array;\r\n width: number;\r\n height: number;\r\n format: number;\r\n internalFormat: number;\r\n compressed: boolean;\r\n }): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n const cached: CachedTexture = { ...textureData, version };\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.TEXTURE_STORE], 'readwrite');\r\n const store = transaction.objectStore(this.TEXTURE_STORE);\r\n store.put(cached, key);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail if IndexedDB unavailable\r\n }\r\n }\r\n\r\n static async clear(): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE, this.TEXTURE_STORE], 'readwrite');\r\n transaction.objectStore(this.GEOMETRY_STORE).clear();\r\n transaction.objectStore(this.TEXTURE_STORE).clear();\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail\r\n }\r\n }\r\n\r\n /**\r\n * Generate a version hash for cache invalidation\r\n * Based on file size only\r\n */\r\n static generateVersion(fileSize: number): string {\r\n return `${fileSize}`;\r\n }\r\n}\r\n\r\n","import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { PerfLogger } from '@stowkit/reader';\nimport { AssetMemoryCache } from './AssetCache';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n // NEW FORMAT: Skip past tag header\n // Format: [4-byte tag_csv_length][CSV string][MeshMetadata struct]\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const metadataOffset = 4 + tagCsvLength;\n \n if (metadataOffset >= data.length) {\n throw new Error('Invalid metadata: tag header exceeds bounds');\n }\n \n const actualMetadata = data.slice(metadataOffset);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: metaView.getUint32(0, true),\n materialCount: metaView.getUint32(4, true),\n nodeCount: metaView.getUint32(8, true),\n stringId: this.readString(actualMetadata.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // NEW FORMAT: Account for tag header at front\n const view = new DataView(metadataBlob.buffer, metadataBlob.byteOffset, metadataBlob.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n const metadata = this.parseMeshMetadata(metadataBlob); // This already handles tag header\n \n // Check if the metadata blob contains all the mesh info (shifted by tag header)\n // Total expected size = tagHeaderSize + 140 (MeshMetadata) + geometries + materials + nodes\n const expectedMetadataSize = tagHeaderSize + 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n \n // If metadata has everything, read from metadataBlob (accounting for tag header)\n // Otherwise, read from dataBlob (no tag header there)\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n // Offset: skip tag header + MeshMetadata struct if reading from metadata blob\n let offset = hasExtendedMetadata ? (tagHeaderSize + 140) : 0;\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n }\n offset += totalMeshRefs * 4;\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n // Apply properties\n for (const prop of matData.properties) {\n const fieldName = prop.fieldName.toLowerCase();\n if (fieldName === 'tint' || fieldName.includes('color')) {\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n } else if (fieldName === 'alphatest') {\n if (prop.value[0] > 0) {\n mat.alphaTest = 0.5;\n mat.transparent = true;\n }\n }\n }\n \n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader, cacheKey?: string, version?: string): Promise<THREE.BufferGeometry> {\n // Try loading from IndexedDB cache first\n if (cacheKey && version) {\n const cached = await AssetMemoryCache.getGeometry(cacheKey, version);\n if (cached) {\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(cached.positions, 3));\n if (cached.normals) {\n geometry.setAttribute('normal', new THREE.BufferAttribute(cached.normals, 3));\n }\n if (cached.uvs) {\n geometry.setAttribute('uv', new THREE.BufferAttribute(cached.uvs, 2));\n }\n geometry.setIndex(new THREE.BufferAttribute(cached.indices, 1));\n return geometry;\n }\n }\n\n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Cache the decoded geometry\n if (cacheKey && version) {\n const posAttr = geometry.getAttribute('position');\n const normAttr = geometry.getAttribute('normal');\n const uvAttr = geometry.getAttribute('uv');\n const indexAttr = geometry.index;\n \n if (posAttr && 'array' in posAttr && indexAttr && 'array' in indexAttr) {\n AssetMemoryCache.setGeometry(cacheKey, version, {\n positions: posAttr.array as Float32Array,\n normals: (normAttr && 'array' in normAttr) ? normAttr.array as Float32Array : undefined,\n uvs: (uvAttr && 'array' in uvAttr) ? uvAttr.array as Float32Array : undefined,\n indices: indexAttr.array as Uint32Array\n }).catch(() => {\n // Silent fail - caching is optional\n });\n }\n }\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader, cacheKeyPrefix?: string, version?: string): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n \n // Pre-load ALL geometries in parallel for maximum speed\n const geometryPromises = geometries.map((geoInfo, index) => \n this.createGeometry(geoInfo, dataBlob, dracoLoader, \n cacheKeyPrefix ? `${cacheKeyPrefix}_geo${index}` : undefined, \n version)\n );\n const loadedGeometries = await Promise.all(geometryPromises);\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n const geometry = loadedGeometries[meshIndex];\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n }\n }\n \n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n nodeObjects[node.parentIndex].add(obj);\n } else {\n root.add(obj);\n }\n }\n \n // If no nodes, create meshes from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n const geometry = loadedGeometries[index];\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n }\n }\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { StowKitReader, PerfLogger } from '@stowkit/reader';\nimport { MeshParser } from './MeshParser';\nimport { AssetMemoryCache } from './AssetCache';\n\n/**\n * Represents an opened StowKit pack with methods to load assets by name\n */\nexport class StowKitPack {\n public reader: StowKitReader;\n private ktx2Loader: KTX2Loader;\n private dracoLoader: DRACOLoader;\n private textureCache: Map<string, Promise<THREE.CompressedTexture>> = new Map();\n private packVersion: string;\n private packUrl: string;\n\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader, packUrl: string = '', packVersion: string = '') {\n this.reader = reader;\n this.ktx2Loader = ktx2Loader;\n this.dracoLoader = dracoLoader;\n this.packUrl = packUrl;\n this.packVersion = packVersion || Date.now().toString();\n }\n\n /**\n * Load a skinned mesh by its string ID\n */\n async loadSkinnedMesh(stringId: string): Promise<THREE.Group> {\n const assetIndex = this.reader.findAssetByPath(stringId);\n if (assetIndex < 0) {\n throw new Error(`Skinned mesh not found: ${stringId}`);\n }\n\n const data = this.reader.readAssetData(assetIndex);\n const metadata = this.reader.readAssetMetadata(assetIndex);\n\n if (!data) throw new Error(`Failed to read skinned mesh data: ${stringId}`);\n if (!metadata) throw new Error(`No metadata for skinned mesh: ${stringId}`);\n\n return await this.parseSkinnedMesh(metadata, data);\n }\n\n /**\n * Parse skinned mesh from binary data\n */\n private async parseSkinnedMesh(metadata: Uint8Array, data: Uint8Array): Promise<THREE.Group> {\n // NEW FORMAT: Skip past tag header\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n // Skip to actual metadata\n const actualMetadata = metadata.slice(tagHeaderSize);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n const decoder = new TextDecoder();\n\n // SkinnedMeshMetadata: 4 uint32s (16 bytes) THEN string_id[128] = 144 bytes total\n const meshGeometryCount = metaView.getUint32(0, true);\n const materialCount = metaView.getUint32(4, true);\n const nodeCount = metaView.getUint32(8, true);\n const boneCount = metaView.getUint32(12, true);\n \n const stringIdBytes = actualMetadata.slice(16, 144);\n const stringIdNullIndex = stringIdBytes.indexOf(0);\n const stringId = decoder\n .decode(stringIdBytes.slice(0, stringIdNullIndex >= 0 ? stringIdNullIndex : 128))\n .trim();\n\n\n let offset = 144;\n\n // Parse all geometry infos\n const geometryInfos: Array<{\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n vertexBufferOffset: number;\n vertexBufferSize: number;\n indexBufferOffset: number;\n indexBufferSize: number;\n weightsOffset: number;\n weightsSize: number;\n materialIndex: number;\n }> = [];\n\n // SkinnedMeshGeometryInfo: 4 uint32s + 6 uint64s + 2 uint32s = 16 + 48 + 8 = 72 bytes\n // Layout: vertex_count, index_count, has_normals, has_uvs (16 bytes)\n // vertex_buffer_offset, vertex_buffer_size, index_buffer_offset, index_buffer_size, weights_offset, weights_size (48 bytes)\n // material_index, _padding (8 bytes)\n for (let g = 0; g < meshGeometryCount; g++) {\n if (offset + 72 > actualMetadata.length) {\n throw new Error(`Metadata too small for geometry ${g}`);\n }\n\n geometryInfos.push({\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n vertexBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n vertexBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n indexBufferOffset: Number(metaView.getBigUint64(offset + 32, true)),\n indexBufferSize: Number(metaView.getBigUint64(offset + 40, true)),\n weightsOffset: Number(metaView.getBigUint64(offset + 48, true)),\n weightsSize: Number(metaView.getBigUint64(offset + 56, true)),\n materialIndex: metaView.getUint32(offset + 64, true)\n // _padding at offset + 68 (ignored)\n });\n\n offset += 72;\n }\n\n\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Sort geometry infos by vertex buffer offset to ensure sequential parsing\n const sortedGeometryInfos = geometryInfos.slice().sort((a, b) => a.vertexBufferOffset - b.vertexBufferOffset);\n\n // Parse materials from metadata (immediately after geometries)\n let metadataOffset = 144 + meshGeometryCount * 72;\n\n const materialData: Array<{\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: Array<{\n fieldName: string;\n value: [number, number, number, number];\n textureId: string;\n }>;\n }> = [];\n\n // Parse MaterialData headers\n for (let i = 0; i < materialCount; i++) {\n if (metadataOffset + 196 > actualMetadata.length) {\n console.warn('Skinned mesh metadata truncated while reading material headers');\n break;\n }\n\n const nameBytes = actualMetadata.slice(metadataOffset, metadataOffset + 64);\n const schemaIdBytes = actualMetadata.slice(metadataOffset + 64, metadataOffset + 192);\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\n const propertyCount = metaView.getUint32(metadataOffset + 192, true);\n\n materialData.push({ name, schemaId, propertyCount, properties: [] });\n metadataOffset += 196;\n }\n\n // Skip Node array and node_mesh_indices (not needed for rendering)\n // Node struct: transform[16 floats] + name[64 bytes] + mesh_index[4 bytes] + parent_index[4 bytes] = 116 bytes\n const NODE_STRIDE = 116;\n metadataOffset += nodeCount * NODE_STRIDE;\n metadataOffset += nodeCount * 4;\n\n // Parse material properties\n const PROPERTY_STRIDE = 144;\n\n for (let i = 0; i < materialCount; i++) {\n const mat = materialData[i];\n \n for (let p = 0; p < mat.propertyCount; p++) {\n try {\n if (metadataOffset + PROPERTY_STRIDE > actualMetadata.length) {\n break;\n }\n\n const fieldNameBytes = actualMetadata.slice(metadataOffset, metadataOffset + 64);\n const fieldName = decoder\n .decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64))\n .trim();\n\n const value: [number, number, number, number] = [\n metaView.getFloat32(metadataOffset + 64, true),\n metaView.getFloat32(metadataOffset + 68, true),\n metaView.getFloat32(metadataOffset + 72, true),\n metaView.getFloat32(metadataOffset + 76, true)\n ];\n\n const textureIdBytes = actualMetadata.slice(metadataOffset + 80, metadataOffset + 144);\n const textureIdNullIndex = textureIdBytes.indexOf(0);\n const textureId = (textureIdNullIndex >= 0 \n ? decoder.decode(textureIdBytes.slice(0, textureIdNullIndex))\n : decoder.decode(textureIdBytes))\n .trim();\n\n mat.properties.push({ fieldName, value, textureId });\n metadataOffset += PROPERTY_STRIDE;\n } catch (err) {\n throw err;\n }\n }\n }\n\n // Parse bones\n const BONE_STRIDE = 64 + 4 + 16 * 4;\n const bones: THREE.Bone[] = [];\n const parentIndices: number[] = [];\n const boneMatrices: THREE.Matrix4[] = [];\n const boneOriginalNames: string[] = [];\n const bindPoses: THREE.Matrix4[] = [];\n\n for (let i = 0; i < boneCount; i++) {\n if (metadataOffset + BONE_STRIDE > actualMetadata.length) {\n throw new Error(`Skinned mesh metadata truncated while reading bone ${i}`);\n }\n\n const nameBytes = new Uint8Array(actualMetadata.buffer, actualMetadata.byteOffset + metadataOffset, 64);\n const nullIndex = nameBytes.indexOf(0);\n const rawName = decoder.decode(nameBytes.subarray(0, nullIndex >= 0 ? nullIndex : 64)).trim();\n const parentIndex = metaView.getInt32(metadataOffset + 64, true);\n\n const offsetMatrix = new THREE.Matrix4();\n const matrixElements = new Float32Array(16);\n for (let j = 0; j < 16; j++) {\n matrixElements[j] = metaView.getFloat32(metadataOffset + 68 + j * 4, true);\n }\n offsetMatrix.fromArray(matrixElements);\n\n const sanitizedName = this.sanitizeTrackName(rawName);\n const bone = new THREE.Bone();\n bone.name = sanitizedName;\n bone.userData.originalName = rawName;\n\n bones.push(bone);\n parentIndices.push(parentIndex);\n boneMatrices.push(offsetMatrix);\n boneOriginalNames.push(rawName);\n bindPoses.push(offsetMatrix.clone().invert());\n\n metadataOffset += BONE_STRIDE;\n }\n \n // Build bone hierarchy\n for (let i = 0; i < bones.length; i++) {\n const parentIndex = parentIndices[i];\n if (parentIndex >= 0 && parentIndex < bones.length && parentIndex !== i) {\n bones[parentIndex].add(bones[i]);\n }\n }\n \n // Set bones to bind pose for correct static display\n for (let i = 0; i < bones.length; i++) {\n const bone = bones[i];\n const bindPose = bindPoses[i];\n const parentIndex = parentIndices[i];\n \n if (parentIndex < 0) {\n const pos = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n bindPose.decompose(pos, quat, scale);\n \n bone.position.copy(pos);\n bone.quaternion.copy(quat);\n bone.scale.set(1, 1, 1);\n } else {\n const parentBindPose = bindPoses[parentIndex];\n const parentInv = new THREE.Matrix4().copy(parentBindPose).invert();\n const localMatrix = new THREE.Matrix4().multiplyMatrices(parentInv, bindPose);\n \n const pos = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n localMatrix.decompose(pos, quat, scale);\n \n bone.position.copy(pos);\n bone.quaternion.copy(quat);\n bone.scale.set(1, 1, 1);\n }\n \n bone.updateMatrix();\n }\n\n // Create Three.js materials with properties (same as static meshes)\n const materials: THREE.Material[] = [];\n for (let i = 0; i < materialCount; i++) {\n const mat = materialData[i];\n const material = new THREE.MeshStandardMaterial({\n side: THREE.DoubleSide,\n name: mat.name || `Material_${i}`,\n color: new THREE.Color(0.8, 0.8, 0.8) // Default gray\n });\n\n // Apply non-texture properties\n for (const prop of mat.properties) {\n const fieldName = prop.fieldName.toLowerCase();\n \n if (fieldName.includes('color') || fieldName.includes('tint')) {\n material.color.setRGB(prop.value[0], prop.value[1], prop.value[2]);\n } else if (fieldName === 'metallic') {\n material.metalness = prop.value[0];\n } else if (fieldName === 'roughness') {\n material.roughness = prop.value[0];\n } else if (fieldName === 'alphatest') {\n if (prop.value[0] > 0) {\n material.alphaTest = 0.5;\n material.transparent = true;\n }\n }\n }\n\n materials.push(material);\n }\n\n await this.loadMaterialTextures(materialData, materials);\n\n // Collect root bones (hierarchy already built earlier)\n const rootBones = bones.filter((_, index) => parentIndices[index] < 0);\n\n // Create shared skeleton\n const skeleton = new THREE.Skeleton(bones, boneMatrices);\n\n // Pre-allocate combined buffers\n const totalVertexCount = sortedGeometryInfos.reduce((sum, info) => sum + info.vertexCount, 0);\n const totalIndexCount = sortedGeometryInfos.reduce((sum, info) => sum + info.indexCount, 0);\n\n const combinedPositions = new Float32Array(totalVertexCount * 3);\n const combinedNormals = new Float32Array(totalVertexCount * 3);\n const combinedUVs = new Float32Array(totalVertexCount * 2);\n const combinedSkinIndices = new Uint16Array(totalVertexCount * 4);\n const combinedSkinWeights = new Float32Array(totalVertexCount * 4);\n const combinedIndices = new Uint32Array(totalIndexCount);\n\n const combinedGeometry = new THREE.BufferGeometry();\n combinedGeometry.clearGroups();\n\n let vertexCursor = 0; // counts vertices\n let indexCursor = 0; // counts indices\n\n for (const geomInfo of sortedGeometryInfos) {\n const vertexStrideBytes = 32;\n const vertexBase = vertexCursor; // base vertex index for this submesh\n\n // Validate offsets before parsing\n const requiredVertexBytes = geomInfo.vertexBufferOffset + geomInfo.vertexCount * vertexStrideBytes;\n const requiredIndexBytes = geomInfo.indexBufferOffset + geomInfo.indexCount * 4;\n const requiredWeightBytes = geomInfo.weightsOffset + geomInfo.vertexCount * 32;\n\n if (requiredVertexBytes > data.byteLength) {\n throw new Error(`Vertex buffer out of bounds: need ${requiredVertexBytes}, have ${data.byteLength}`);\n }\n if (requiredIndexBytes > data.byteLength) {\n throw new Error(`Index buffer out of bounds: need ${requiredIndexBytes}, have ${data.byteLength}`);\n }\n if (requiredWeightBytes > data.byteLength) {\n throw new Error(`Weight buffer out of bounds: need ${requiredWeightBytes}, have ${data.byteLength}`);\n }\n\n // Parse vertices\n for (let v = 0; v < geomInfo.vertexCount; v++) {\n const vertexOffset = geomInfo.vertexBufferOffset + v * vertexStrideBytes;\n\n // positions\n combinedPositions[(vertexCursor + v) * 3 + 0] = dataView.getFloat32(vertexOffset + 0, true);\n combinedPositions[(vertexCursor + v) * 3 + 1] = dataView.getFloat32(vertexOffset + 4, true);\n combinedPositions[(vertexCursor + v) * 3 + 2] = dataView.getFloat32(vertexOffset + 8, true);\n\n // normals\n if (geomInfo.hasNormals) {\n combinedNormals[(vertexCursor + v) * 3 + 0] = dataView.getFloat32(vertexOffset + 12, true);\n combinedNormals[(vertexCursor + v) * 3 + 1] = dataView.getFloat32(vertexOffset + 16, true);\n combinedNormals[(vertexCursor + v) * 3 + 2] = dataView.getFloat32(vertexOffset + 20, true);\n }\n\n // uvs\n if (geomInfo.hasUVs) {\n combinedUVs[(vertexCursor + v) * 2 + 0] = dataView.getFloat32(vertexOffset + 24, true);\n combinedUVs[(vertexCursor + v) * 2 + 1] = dataView.getFloat32(vertexOffset + 28, true);\n }\n\n // bone indices & weights\n const weightOffset = geomInfo.weightsOffset + v * 32;\n for (let j = 0; j < 4; j++) {\n const boneIndex = dataView.getUint32(weightOffset + j * 4, true);\n combinedSkinIndices[(vertexCursor + v) * 4 + j] = boneIndex < boneCount ? boneIndex : 0;\n }\n for (let j = 0; j < 4; j++) {\n combinedSkinWeights[(vertexCursor + v) * 4 + j] = dataView.getFloat32(weightOffset + 16 + j * 4, true);\n }\n }\n\n // Parse indices\n const groupStart = indexCursor;\n for (let i = 0; i < geomInfo.indexCount; i++) {\n const indexValue = dataView.getUint32(geomInfo.indexBufferOffset + i * 4, true);\n combinedIndices[indexCursor + i] = indexValue + vertexBase;\n }\n combinedGeometry.addGroup(groupStart, geomInfo.indexCount, Math.min(geomInfo.materialIndex, materials.length - 1));\n\n vertexCursor += geomInfo.vertexCount;\n indexCursor += geomInfo.indexCount;\n }\n\n combinedGeometry.setAttribute('position', new THREE.BufferAttribute(combinedPositions, 3));\n if (geometryInfos.some(info => info.hasNormals)) {\n combinedGeometry.setAttribute('normal', new THREE.BufferAttribute(combinedNormals, 3));\n }\n if (geometryInfos.some(info => info.hasUVs)) {\n combinedGeometry.setAttribute('uv', new THREE.BufferAttribute(combinedUVs, 2));\n }\n combinedGeometry.setAttribute('skinIndex', new THREE.Uint16BufferAttribute(combinedSkinIndices, 4));\n combinedGeometry.setAttribute('skinWeight', new THREE.BufferAttribute(combinedSkinWeights, 4));\n combinedGeometry.setIndex(new THREE.BufferAttribute(combinedIndices, 1));\n\n combinedGeometry.computeBoundingBox();\n combinedGeometry.computeBoundingSphere();\n\n const skinnedMesh = new THREE.SkinnedMesh(combinedGeometry, materials);\n \n // Create a separate bone container to preserve hierarchy\n const boneContainer = new THREE.Group();\n boneContainer.name = 'BoneContainer';\n rootBones.forEach((root) => boneContainer.add(root));\n \n // Bind skeleton with our provided inverse bind matrices\n skinnedMesh.bind(skeleton, skinnedMesh.matrixWorld);\n skinnedMesh.normalizeSkinWeights();\n skinnedMesh.updateMatrixWorld(true);\n\n const container = new THREE.Group();\n container.name = stringId || 'SkinnedMesh';\n container.add(boneContainer);\n container.add(skinnedMesh);\n container.userData.boneOriginalNames = boneOriginalNames;\n container.userData.skinnedMesh = skinnedMesh;\n\n return container;\n }\n\n /**\n * Load a mesh by its canonical path/name\n */\n async loadMesh(assetPath: string): Promise<THREE.Group> {\n const totalStart = performance.now();\n \n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Mesh not found: ${assetPath}`);\n }\n\n // Read mesh data and metadata\n const data = this.reader.readAssetData(assetIndex);\n const metadata = this.reader.readAssetMetadata(assetIndex);\n\n if (!data) {\n throw new Error(`Failed to read mesh data: ${assetPath}`);\n }\n\n if (!metadata) {\n throw new Error(`No metadata available: ${assetPath}`);\n }\n\n // Parse mesh data\n const parsedData = MeshParser.parseMeshData(metadata, data);\n\n // Load textures for materials\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\n\n // Build Three.js scene with Draco decoder (with caching)\n const cacheKey = `${this.packUrl}::${assetPath}`;\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader, cacheKey, this.packVersion);\n\n const totalTime = performance.now() - totalStart;\n PerfLogger.log(`[Perf] === Mesh \"${assetPath}\": ${totalTime.toFixed(2)}ms total ===`);\n return scene;\n }\n\n /**\n * Load a texture by its canonical path/name\n */\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\n // Check cache first\n if (this.textureCache.has(assetPath)) {\n return this.textureCache.get(assetPath)!;\n }\n\n // Cache the promise to avoid duplicate loads\n const loadPromise = (async () => {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Read texture data\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data: ${assetPath}`);\n }\n\n // Load as KTX2\n return await this.loadKTX2Texture(data, assetPath);\n })();\n\n this.textureCache.set(assetPath, loadPromise);\n return loadPromise;\n }\n\n /**\n * Load audio by its canonical path/name\n */\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Read audio data\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read audio data: ${assetPath}`);\n }\n\n // Create audio object\n const audio = new THREE.Audio(listener);\n\n // Decode audio data\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioContext = listener.context;\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n\n audio.setBuffer(audioBuffer);\n\n return audio;\n }\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number): any {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Read asset data by index\n */\n readAssetData(index: number): Uint8Array | null {\n return this.reader.readAssetData(index);\n }\n\n /**\n * Read asset metadata by index\n */\n readAssetMetadata(index: number): Uint8Array | null {\n return this.reader.readAssetMetadata(index);\n }\n\n\n /**\n * Load skinned mesh by index\n */\n async loadSkinnedMeshByIndex(index: number): Promise<THREE.Group> {\n const data = this.reader.readAssetData(index);\n const metadata = this.reader.readAssetMetadata(index);\n\n if (!data) throw new Error(`Failed to read skinned mesh data for index ${index}`);\n if (!metadata) throw new Error(`No metadata for skinned mesh index ${index}`);\n\n return await this.parseSkinnedMesh(metadata, data);\n }\n\n /**\n * Load mesh by index\n */\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\n const data = this.reader.readAssetData(index);\n const metadata = this.reader.readAssetMetadata(index);\n\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\n if (!metadata) throw new Error(`No metadata for index ${index}`);\n\n const parsedData = MeshParser.parseMeshData(metadata, data);\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\n }\n\n /**\n * Load texture by index\n */\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\n const data = this.reader.readAssetData(index);\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\n return await this.loadKTX2Texture(data);\n }\n\n /**\n * Create HTML audio preview element\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\n\n const blob = new Blob([data as any], { type: 'audio/ogg' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n /**\n * Get audio metadata by path (uses WASM parsing)\n */\n getAudioMetadata(assetPath: string) {\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) return null;\n return this.reader.parseAudioMetadata(assetIndex);\n }\n\n /**\n * Get animation metadata by index (uses WASM parsing)\n */\n getAnimationMetadata(index: number) {\n return this.reader.parseAnimationMetadata(index);\n }\n\n /**\n * Get texture metadata by index (uses WASM parsing)\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n\n /**\n * Load animation clip by string ID\n */\n async loadAnimationClip(stringId: string): Promise<THREE.AnimationClip> {\n const index = this.reader.findAssetByPath(stringId);\n if (index < 0) {\n throw new Error(`Animation clip not found: ${stringId}`);\n }\n return this.loadAnimationClipByIndex(index);\n }\n\n /**\n * Load and play animation on a skinned mesh group\n */\n async loadAnimation(\n skinnedMeshGroup: THREE.Group, \n animationPath: string\n ): Promise<{ mixer: THREE.AnimationMixer, action: THREE.AnimationAction, clip: THREE.AnimationClip }> {\n const clip = await this.loadAnimationClip(animationPath);\n const mixer = new THREE.AnimationMixer(skinnedMeshGroup as unknown as THREE.Object3D);\n const action = mixer.clipAction(clip);\n action.setLoop(THREE.LoopRepeat, Infinity);\n action.play();\n \n return { mixer, action, clip };\n }\n\n /**\n * Load and play animation by index\n */\n async loadAnimationByIndex(\n skinnedMeshGroup: THREE.Group,\n animationIndex: number\n ): Promise<{ mixer: THREE.AnimationMixer, action: THREE.AnimationAction, clip: THREE.AnimationClip }> {\n const clip = await this.loadAnimationClipByIndex(animationIndex);\n const mixer = new THREE.AnimationMixer(skinnedMeshGroup as unknown as THREE.Object3D);\n const action = mixer.clipAction(clip);\n action.setLoop(THREE.LoopRepeat, Infinity);\n action.play();\n \n return { mixer, action, clip };\n }\n\n /**\n * Load animation clip by index\n */\n async loadAnimationClipByIndex(index: number): Promise<THREE.AnimationClip> {\n const metadata = this.reader.readAssetMetadata(index);\n const data = this.reader.readAssetData(index);\n\n if (!metadata || !data) {\n throw new Error('Failed to read animation clip data');\n }\n\n return this.parseAnimationClip(metadata, data);\n }\n\n /**\n * Parse animation clip from binary data\n */\n private parseAnimationClip(metadata: Uint8Array, data: Uint8Array): THREE.AnimationClip {\n // NEW FORMAT: Skip past tag header\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n // Skip to actual metadata\n const actualMetadata = metadata.slice(tagHeaderSize);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n const decoder = new TextDecoder();\n\n // Parse AnimationClipMetadata (272 bytes total)\n const stringIdBytes = actualMetadata.slice(0, 128);\n const stringIdNullIndex = stringIdBytes.indexOf(0);\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdNullIndex >= 0 ? stringIdNullIndex : 128));\n\n const targetMeshIdBytes = actualMetadata.slice(128, 256);\n const targetMeshIdNullIndex = targetMeshIdBytes.indexOf(0);\n const targetMeshId = decoder\n .decode(targetMeshIdBytes.slice(0, targetMeshIdNullIndex >= 0 ? targetMeshIdNullIndex : 128))\n .trim();\n\n const durationSeconds = metaView.getFloat32(256, true); // Duration in seconds (per C header)\n const ticksPerSecond = metaView.getFloat32(260, true); // For custom playback rate if needed\n const channelCount = metaView.getUint32(264, true);\n const boneCount = metaView.getUint32(268, true);\n\n // Parse AnimationChannel[] (starts at offset 272, each is 28 bytes)\n const channelsOffset = 272;\n const channels: Array<{\n boneIndex: number;\n keyframeType: number;\n keyframeCount: number;\n keyframeTimesOffset: number;\n keyframeValuesOffset: number;\n }> = [];\n\n for (let i = 0; i < channelCount; i++) {\n const chOffset = channelsOffset + i * 28;\n channels.push({\n boneIndex: metaView.getUint32(chOffset, true),\n keyframeType: metaView.getUint32(chOffset + 4, true),\n keyframeCount: metaView.getUint32(chOffset + 8, true),\n keyframeTimesOffset: Number(metaView.getBigUint64(chOffset + 12, true)),\n keyframeValuesOffset: Number(metaView.getBigUint64(chOffset + 20, true))\n });\n }\n\n // Parse AnimationBoneInfo[] (starts after all channels, each is 68 bytes)\n const bonesOffset = channelsOffset + channelCount * 28;\n const bones: Array<{ name: string; parentIndex: number; sanitizedName: string }> = [];\n const originalBoneNames: string[] = [];\n\n for (let i = 0; i < boneCount; i++) {\n const boneOffset = bonesOffset + i * 68;\n const nameBytes = actualMetadata.slice(boneOffset, boneOffset + 64);\n const nullIndex = nameBytes.indexOf(0);\n const rawName = decoder\n .decode(nameBytes.slice(0, nullIndex >= 0 ? nullIndex : 64))\n .trim();\n const sanitizedName = this.sanitizeTrackName(rawName);\n const parentIndex = metaView.getInt32(boneOffset + 64, true);\n bones.push({ name: rawName, parentIndex, sanitizedName });\n originalBoneNames.push(rawName);\n }\n\n\n // Create DataView for keyframe data\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Create Three.js KeyframeTracks\n const tracks: THREE.KeyframeTrack[] = [];\n let maxKeyframeTime = 0;\n\n // Process channels - each channel specifies which bone it animates via boneIndex\n for (let i = 0; i < channelCount; i++) {\n const channel = channels[i];\n \n // Validate bone index\n if (channel.boneIndex >= boneCount) {\n console.warn(`[AnimationClip] Channel ${i} references invalid bone index ${channel.boneIndex} (have ${boneCount} bones)`);\n continue;\n }\n\n const boneName = bones[channel.boneIndex].sanitizedName;\n \n // Skip scale tracks - bones should always have unit scale\n if (channel.keyframeType === 2) {\n continue;\n }\n \n // Read times (already in seconds per C header)\n const times = this.readFloatArray(dataView, channel.keyframeTimesOffset, channel.keyframeCount);\n \n // Track the maximum keyframe time to calculate actual duration\n if (times.length > 0) {\n const channelMaxTime = times[times.length - 1];\n if (channelMaxTime > maxKeyframeTime) {\n maxKeyframeTime = channelMaxTime;\n }\n }\n\n // Create track based on keyframe type\n if (channel.keyframeType === 0) {\n // Position (vec3)\n const values = this.readFloatArray(dataView, channel.keyframeValuesOffset, channel.keyframeCount * 3);\n tracks.push(new THREE.VectorKeyframeTrack(\n `${boneName}.position`,\n times,\n values\n ));\n } else if (channel.keyframeType === 1) {\n // Rotation (quaternion)\n const values = this.readFloatArray(dataView, channel.keyframeValuesOffset, channel.keyframeCount * 4);\n tracks.push(new THREE.QuaternionKeyframeTrack(\n `${boneName}.quaternion`,\n times,\n values\n ));\n }\n }\n\n // Use the actual maximum keyframe time as duration instead of metadata duration\n const actualDuration = maxKeyframeTime > 0 ? maxKeyframeTime : durationSeconds;\n return new THREE.AnimationClip(stringId, actualDuration, tracks);\n }\n\n /**\n * Helper to read float array from DataView\n */\n private readFloatArray(view: DataView, offset: number, count: number): Float32Array {\n const result = new Float32Array(count);\n for (let i = 0; i < count; i++) {\n result[i] = view.getFloat32(offset + i * 4, true);\n }\n return result;\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n this.textureCache.clear();\n this.reader.close();\n }\n\n // Private methods moved from StowKitLoader\n private async loadMaterialTextures(\n materialData: Array<{\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: Array<{\n fieldName: string;\n value: [number, number, number, number];\n textureId: string;\n }>;\n }>,\n materials: THREE.Material[]\n ): Promise<string[]> {\n // Collect all texture load promises to load in parallel\n const textureLoads: Array<{\n materialIndex: number;\n propertyName: string;\n textureId: string;\n texturePromise: Promise<THREE.CompressedTexture>;\n }> = [];\n\n const uniqueTextures = new Set<string>();\n\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n for (const prop of matData.properties) {\n const textureId = prop.textureId?.trim();\n if (textureId && textureId.length > 0) {\n uniqueTextures.add(textureId);\n textureLoads.push({\n materialIndex: i,\n propertyName: prop.fieldName,\n textureId: textureId,\n texturePromise: this.loadTexture(textureId).catch(error => {\n console.error(`Failed to load texture \"${textureId}\":`, error);\n throw error;\n })\n });\n }\n }\n }\n\n // Load all textures in parallel\n const results = await Promise.allSettled(textureLoads.map(load => load.texturePromise));\n\n // Apply successfully loaded textures\n for (let i = 0; i < textureLoads.length; i++) {\n const result = results[i];\n if (result.status === 'fulfilled') {\n const load = textureLoads[i];\n const material = materials[load.materialIndex] as THREE.MeshStandardMaterial;\n this.applyTextureToMaterial(material, load.propertyName, result.value);\n }\n }\n\n return Array.from(uniqueTextures);\n }\n\n private async loadKTX2Texture(data: Uint8Array, textureName?: string): Promise<THREE.CompressedTexture> {\n // Try IndexedDB cache first\n const cacheKey = textureName ? `${this.packUrl}::${textureName}` : undefined;\n if (cacheKey) {\n const cached = await AssetMemoryCache.getTexture(cacheKey, this.packVersion);\n if (cached) {\n PerfLogger.log(`[Perf] ✓ Texture \"${textureName}\": 0ms (IndexedDB cache)`);\n \n const texture = new (THREE.CompressedTexture as any)(\n [{ data: cached.data, width: cached.width, height: cached.height }],\n cached.width,\n cached.height,\n cached.format,\n THREE.UnsignedByteType\n ) as THREE.CompressedTexture;\n texture.needsUpdate = true;\n return texture;\n }\n }\n\n // Decode using Basis transcoder\n const decodeStart = performance.now();\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n\n try {\n const texture = await new Promise<THREE.CompressedTexture>((resolve, reject) => {\n this.ktx2Loader.load(\n url,\n (texture) => {\n URL.revokeObjectURL(url);\n texture.needsUpdate = true;\n resolve(texture);\n },\n undefined,\n (error) => {\n URL.revokeObjectURL(url);\n reject(error);\n }\n );\n });\n\n const decodeTime = performance.now() - decodeStart;\n PerfLogger.log(`[Perf] ✓ Texture \"${textureName || 'unknown'}\": ${decodeTime.toFixed(2)}ms (Basis decode ${texture.image?.width}x${texture.image?.height})`);\n\n // Cache the transcoded texture data to IndexedDB\n if (cacheKey && texture.mipmaps && texture.mipmaps.length > 0) {\n const mipmap = texture.mipmaps[0];\n const dataArray = new Uint8Array(mipmap.data.buffer, mipmap.data.byteOffset, mipmap.data.byteLength);\n AssetMemoryCache.setTexture(cacheKey, this.packVersion, {\n data: dataArray,\n width: mipmap.width,\n height: mipmap.height,\n format: texture.format,\n internalFormat: texture.format,\n compressed: true\n }).catch(() => {\n // Silent fail - caching is optional\n });\n }\n\n return texture;\n } catch (error) {\n URL.revokeObjectURL(url);\n throw error;\n }\n }\n\n private applyTextureToMaterial(\n material: THREE.MeshStandardMaterial,\n propertyName: string,\n texture: THREE.CompressedTexture\n ): void {\n const propNameLower = propertyName.toLowerCase();\n\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \n propNameLower.includes('albedo') || propNameLower.includes('base')) {\n material.map = texture;\n } else if (propNameLower.includes('normal')) {\n material.normalMap = texture;\n } else if (propNameLower.includes('metallic')) {\n material.metalnessMap = texture;\n } else if (propNameLower.includes('roughness')) {\n material.roughnessMap = texture;\n } else {\n material.map = texture;\n }\n\n material.needsUpdate = true;\n }\n\n\n private sanitizeTrackName(name: string): string {\n return name\n .trim()\n .replace(/[^A-Za-z0-9_\\-]+/g, '_')\n .replace(/_{2,}/g, '_');\n }\n}\n\n\n","import * as THREE from 'three';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { StowKitReader } from '@stowkit/reader';\nimport { StowKitPack } from './StowKitPack';\n\nexport interface StowKitLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/stowkit/basis/'\n */\n basisPath?: string;\n \n /**\n * Path to Draco decoder for mesh decompression\n * @default '/stowkit/draco/'\n */\n dracoPath?: string;\n \n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n}\n\n/**\n * Three.js loader for StowKit asset packs\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitLoader.load('assets.stow');\n * const mesh = await pack.loadMesh('models/character');\n * const texture = await pack.loadTexture('textures/diffuse');\n * const audio = await pack.loadAudio('sounds/bgm', listener);\n * ```\n */\nexport class StowKitLoader {\n private static ktx2Loader: KTX2Loader | null = null;\n private static dracoLoader: DRACOLoader | null = null;\n private static initialized = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n \n // Generate version for cache invalidation (based on file size)\n const version = `${arrayBuffer.byteLength}`;\n \n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPack(reader, this.ktx2Loader!, this.dracoLoader!, url, version);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n * @param data - The .stow file data\n * @param options - Loader options\n * @param cacheKey - Optional unique identifier for caching (e.g., CDN URL). Recommended for files loaded from CDN.\n */\n static async loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions, cacheKey?: string): Promise<StowKitPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n \n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Generate version for cache invalidation (based on file size)\n const version = `${arrayBuffer.byteLength}`;\n const packUrl = cacheKey || 'memory';\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPack(reader, this.ktx2Loader!, this.dracoLoader!, packUrl, version);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/stowkit/basis/';\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\n\n // Setup KTX2 loader (shared across all packs)\n this.ktx2Loader = new KTX2Loader();\n this.ktx2Loader.setTranscoderPath(basisPath);\n\n // Setup Draco loader (shared across all packs)\n this.dracoLoader = new DRACOLoader();\n this.dracoLoader.setDecoderPath(dracoPath);\n\n // Detect support\n const tempRenderer = new THREE.WebGLRenderer();\n this.ktx2Loader.detectSupport(tempRenderer);\n tempRenderer.dispose();\n\n this.initialized = true;\n }\n}\n"],"names":["THREE","PerfLogger","reader","StowKitReader","KTX2Loader","DRACOLoader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stowkit-three-loader.js","sources":["../src/AssetCache.ts","../src/MeshParser.ts","../src/StowKitPack.ts","../src/StowKitLoader.ts"],"sourcesContent":["/**\r\n * Persistent asset cache using IndexedDB\r\n * Caches decoded Draco geometries and transcoded Basis textures\r\n * Invalidates when source .stow file changes\r\n */\r\n\r\ninterface CachedGeometry {\r\n positions: Float32Array;\r\n normals?: Float32Array;\r\n uvs?: Float32Array;\r\n indices: Uint32Array;\r\n version: string;\r\n}\r\n\r\ninterface CachedTexture {\r\n data: Uint8Array;\r\n width: number;\r\n height: number;\r\n format: number;\r\n internalFormat: number;\r\n compressed: boolean;\r\n version: string;\r\n}\r\n\r\nexport class AssetMemoryCache {\r\n private static db: IDBDatabase | null = null;\r\n private static initPromise: Promise<void> | null = null;\r\n private static DB_NAME = 'StowKitAssetCache';\r\n private static DB_VERSION = 1;\r\n private static GEOMETRY_STORE = 'geometries';\r\n private static TEXTURE_STORE = 'textures';\r\n\r\n private static async init(): Promise<void> {\r\n if (this.db) return;\r\n if (this.initPromise) return this.initPromise;\r\n\r\n this.initPromise = new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.DB_NAME, this.DB_VERSION);\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve();\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n \r\n if (!db.objectStoreNames.contains(this.GEOMETRY_STORE)) {\r\n db.createObjectStore(this.GEOMETRY_STORE);\r\n }\r\n \r\n if (!db.objectStoreNames.contains(this.TEXTURE_STORE)) {\r\n db.createObjectStore(this.TEXTURE_STORE);\r\n }\r\n };\r\n });\r\n\r\n return this.initPromise;\r\n }\r\n\r\n static async getGeometry(key: string, version: string): Promise<CachedGeometry | null> {\r\n try {\r\n await this.init();\r\n if (!this.db) return null;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE], 'readonly');\r\n const store = transaction.objectStore(this.GEOMETRY_STORE);\r\n const request = store.get(key);\r\n\r\n request.onsuccess = () => {\r\n const cached = request.result as CachedGeometry | undefined;\r\n if (cached && cached.version === version) {\r\n resolve(cached);\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n\r\n request.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n static async setGeometry(key: string, version: string, geometry: {\r\n positions: Float32Array;\r\n normals?: Float32Array;\r\n uvs?: Float32Array;\r\n indices: Uint32Array;\r\n }): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n const cached: CachedGeometry = { ...geometry, version };\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE], 'readwrite');\r\n const store = transaction.objectStore(this.GEOMETRY_STORE);\r\n store.put(cached, key);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail if IndexedDB unavailable\r\n }\r\n }\r\n\r\n static async getTexture(key: string, version: string): Promise<CachedTexture | null> {\r\n try {\r\n await this.init();\r\n if (!this.db) return null;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.TEXTURE_STORE], 'readonly');\r\n const store = transaction.objectStore(this.TEXTURE_STORE);\r\n const request = store.get(key);\r\n\r\n request.onsuccess = () => {\r\n const cached = request.result as CachedTexture | undefined;\r\n if (cached && cached.version === version) {\r\n resolve(cached);\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n\r\n request.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n static async setTexture(key: string, version: string, textureData: {\r\n data: Uint8Array;\r\n width: number;\r\n height: number;\r\n format: number;\r\n internalFormat: number;\r\n compressed: boolean;\r\n }): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n const cached: CachedTexture = { ...textureData, version };\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.TEXTURE_STORE], 'readwrite');\r\n const store = transaction.objectStore(this.TEXTURE_STORE);\r\n store.put(cached, key);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail if IndexedDB unavailable\r\n }\r\n }\r\n\r\n static async clear(): Promise<void> {\r\n try {\r\n await this.init();\r\n if (!this.db) return;\r\n\r\n return new Promise((resolve) => {\r\n const transaction = this.db!.transaction([this.GEOMETRY_STORE, this.TEXTURE_STORE], 'readwrite');\r\n transaction.objectStore(this.GEOMETRY_STORE).clear();\r\n transaction.objectStore(this.TEXTURE_STORE).clear();\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = () => resolve();\r\n });\r\n } catch {\r\n // Silently fail\r\n }\r\n }\r\n\r\n /**\r\n * Generate a version hash for cache invalidation\r\n * Based on file size only\r\n */\r\n static generateVersion(fileSize: number): string {\r\n return `${fileSize}`;\r\n }\r\n}\r\n\r\n","import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { PerfLogger } from '@stowkit/reader';\nimport { AssetMemoryCache } from './AssetCache';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n // NEW FORMAT: Skip past tag header\n // Format: [4-byte tag_csv_length][CSV string][MeshMetadata struct]\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const metadataOffset = 4 + tagCsvLength;\n \n if (metadataOffset >= data.length) {\n throw new Error('Invalid metadata: tag header exceeds bounds');\n }\n \n const actualMetadata = data.slice(metadataOffset);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: metaView.getUint32(0, true),\n materialCount: metaView.getUint32(4, true),\n nodeCount: metaView.getUint32(8, true),\n stringId: this.readString(actualMetadata.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // NEW FORMAT: Account for tag header at front\n const view = new DataView(metadataBlob.buffer, metadataBlob.byteOffset, metadataBlob.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n const metadata = this.parseMeshMetadata(metadataBlob); // This already handles tag header\n \n // Check if the metadata blob contains all the mesh info (shifted by tag header)\n // Total expected size = tagHeaderSize + 140 (MeshMetadata) + geometries + materials + nodes\n const expectedMetadataSize = tagHeaderSize + 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n \n // If metadata has everything, read from metadataBlob (accounting for tag header)\n // Otherwise, read from dataBlob (no tag header there)\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n // Offset: skip tag header + MeshMetadata struct if reading from metadata blob\n let offset = hasExtendedMetadata ? (tagHeaderSize + 140) : 0;\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n }\n offset += totalMeshRefs * 4;\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n // Apply properties\n for (const prop of matData.properties) {\n const fieldName = prop.fieldName.toLowerCase();\n if (fieldName === 'tint' || fieldName.includes('color')) {\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n } else if (fieldName === 'alphatest') {\n if (prop.value[0] > 0) {\n mat.alphaTest = 0.5;\n mat.transparent = true;\n }\n }\n }\n \n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader, cacheKey?: string, version?: string): Promise<THREE.BufferGeometry> {\n // Try loading from IndexedDB cache first (non-blocking - don't await in parallel loads)\n let cachePromise: Promise<any> | null = null;\n if (cacheKey && version) {\n cachePromise = AssetMemoryCache.getGeometry(cacheKey, version);\n }\n\n // Check if cache resolved while we were starting\n if (cachePromise) {\n const cached = await cachePromise;\n if (cached) {\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(cached.positions, 3));\n if (cached.normals) {\n geometry.setAttribute('normal', new THREE.BufferAttribute(cached.normals, 3));\n }\n if (cached.uvs) {\n geometry.setAttribute('uv', new THREE.BufferAttribute(cached.uvs, 2));\n }\n geometry.setIndex(new THREE.BufferAttribute(cached.indices, 1));\n return geometry;\n }\n }\n\n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Cache the decoded geometry (non-blocking)\n if (cacheKey && version) {\n const posAttr = geometry.getAttribute('position');\n const normAttr = geometry.getAttribute('normal');\n const uvAttr = geometry.getAttribute('uv');\n const indexAttr = geometry.index;\n \n if (posAttr && 'array' in posAttr && indexAttr && 'array' in indexAttr) {\n AssetMemoryCache.setGeometry(cacheKey, version, {\n positions: posAttr.array as Float32Array,\n normals: (normAttr && 'array' in normAttr) ? normAttr.array as Float32Array : undefined,\n uvs: (uvAttr && 'array' in uvAttr) ? uvAttr.array as Float32Array : undefined,\n indices: indexAttr.array as Uint32Array\n }).catch(() => {});\n }\n }\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader, cacheKeyPrefix?: string, version?: string): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n \n // Pre-load ALL geometries in parallel for maximum speed\n const geometryPromises = geometries.map((geoInfo, index) => \n this.createGeometry(geoInfo, dataBlob, dracoLoader, \n cacheKeyPrefix ? `${cacheKeyPrefix}_geo${index}` : undefined, \n version)\n );\n const loadedGeometries = await Promise.all(geometryPromises);\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n const geometry = loadedGeometries[meshIndex];\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n }\n }\n \n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n nodeObjects[node.parentIndex].add(obj);\n } else {\n root.add(obj);\n }\n }\n \n // If no nodes, create meshes from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n const geometry = loadedGeometries[index];\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n }\n }\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { StowKitReader, PerfLogger } from '@stowkit/reader';\nimport { MeshParser } from './MeshParser';\nimport { AssetMemoryCache } from './AssetCache';\n\n/**\n * Represents an opened StowKit pack with methods to load assets by name\n */\nexport class StowKitPack {\n public reader: StowKitReader;\n private ktx2Loader: KTX2Loader;\n private dracoLoader: DRACOLoader;\n private textureCache: Map<string, Promise<THREE.CompressedTexture>> = new Map();\n private packVersion: string;\n private packUrl: string;\n\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader, packUrl: string = '', packVersion: string = '') {\n this.reader = reader;\n this.ktx2Loader = ktx2Loader;\n this.dracoLoader = dracoLoader;\n this.packUrl = packUrl;\n this.packVersion = packVersion || Date.now().toString();\n }\n\n /**\n * Load a skinned mesh by its string ID\n */\n async loadSkinnedMesh(stringId: string): Promise<THREE.Group> {\n const totalStart = performance.now();\n \n const assetIndex = this.reader.findAssetByPath(stringId);\n if (assetIndex < 0) {\n throw new Error(`Skinned mesh not found: ${stringId}`);\n }\n\n const data = this.reader.readAssetData(assetIndex);\n const metadata = this.reader.readAssetMetadata(assetIndex);\n\n if (!data) throw new Error(`Failed to read skinned mesh data: ${stringId}`);\n if (!metadata) throw new Error(`No metadata for skinned mesh: ${stringId}`);\n\n const result = await this.parseSkinnedMesh(metadata, data);\n \n const totalTime = performance.now() - totalStart;\n PerfLogger.log(`[Perf] === Skinned Mesh \"${stringId}\": ${totalTime.toFixed(2)}ms total ===`);\n \n return result;\n }\n\n /**\n * Parse skinned mesh from binary data\n */\n private async parseSkinnedMesh(metadata: Uint8Array, data: Uint8Array): Promise<THREE.Group> {\n const parseStart = performance.now();\n \n // NEW FORMAT: Skip past tag header\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n // Skip to actual metadata\n const actualMetadata = metadata.slice(tagHeaderSize);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n const decoder = new TextDecoder();\n\n // SkinnedMeshMetadata: 4 uint32s (16 bytes) THEN string_id[128] = 144 bytes total\n const meshGeometryCount = metaView.getUint32(0, true);\n const materialCount = metaView.getUint32(4, true);\n const nodeCount = metaView.getUint32(8, true);\n const boneCount = metaView.getUint32(12, true);\n \n const stringIdBytes = actualMetadata.slice(16, 144);\n const stringIdNullIndex = stringIdBytes.indexOf(0);\n const stringId = decoder\n .decode(stringIdBytes.slice(0, stringIdNullIndex >= 0 ? stringIdNullIndex : 128))\n .trim();\n\n\n let offset = 144;\n\n // Parse all geometry infos\n const geometryInfos: Array<{\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n vertexBufferOffset: number;\n vertexBufferSize: number;\n indexBufferOffset: number;\n indexBufferSize: number;\n weightsOffset: number;\n weightsSize: number;\n materialIndex: number;\n }> = [];\n\n // SkinnedMeshGeometryInfo: 4 uint32s + 6 uint64s + 2 uint32s = 16 + 48 + 8 = 72 bytes\n // Layout: vertex_count, index_count, has_normals, has_uvs (16 bytes)\n // vertex_buffer_offset, vertex_buffer_size, index_buffer_offset, index_buffer_size, weights_offset, weights_size (48 bytes)\n // material_index, _padding (8 bytes)\n for (let g = 0; g < meshGeometryCount; g++) {\n if (offset + 72 > actualMetadata.length) {\n throw new Error(`Metadata too small for geometry ${g}`);\n }\n\n geometryInfos.push({\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n vertexBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n vertexBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n indexBufferOffset: Number(metaView.getBigUint64(offset + 32, true)),\n indexBufferSize: Number(metaView.getBigUint64(offset + 40, true)),\n weightsOffset: Number(metaView.getBigUint64(offset + 48, true)),\n weightsSize: Number(metaView.getBigUint64(offset + 56, true)),\n materialIndex: metaView.getUint32(offset + 64, true)\n // _padding at offset + 68 (ignored)\n });\n\n offset += 72;\n }\n\n\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Sort geometry infos by vertex buffer offset to ensure sequential parsing\n const sortedGeometryInfos = geometryInfos.slice().sort((a, b) => a.vertexBufferOffset - b.vertexBufferOffset);\n\n // Parse materials from metadata (immediately after geometries)\n let metadataOffset = 144 + meshGeometryCount * 72;\n\n const materialData: Array<{\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: Array<{\n fieldName: string;\n value: [number, number, number, number];\n textureId: string;\n }>;\n }> = [];\n\n // Parse MaterialData headers\n for (let i = 0; i < materialCount; i++) {\n if (metadataOffset + 196 > actualMetadata.length) {\n console.warn('Skinned mesh metadata truncated while reading material headers');\n break;\n }\n\n const nameBytes = actualMetadata.slice(metadataOffset, metadataOffset + 64);\n const schemaIdBytes = actualMetadata.slice(metadataOffset + 64, metadataOffset + 192);\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\n const propertyCount = metaView.getUint32(metadataOffset + 192, true);\n\n materialData.push({ name, schemaId, propertyCount, properties: [] });\n metadataOffset += 196;\n }\n\n // Skip Node array and node_mesh_indices (not needed for rendering)\n // Node struct: transform[16 floats] + name[64 bytes] + mesh_index[4 bytes] + parent_index[4 bytes] = 116 bytes\n const NODE_STRIDE = 116;\n metadataOffset += nodeCount * NODE_STRIDE;\n metadataOffset += nodeCount * 4;\n\n // Parse material properties\n const PROPERTY_STRIDE = 144;\n\n for (let i = 0; i < materialCount; i++) {\n const mat = materialData[i];\n \n for (let p = 0; p < mat.propertyCount; p++) {\n try {\n if (metadataOffset + PROPERTY_STRIDE > actualMetadata.length) {\n break;\n }\n\n const fieldNameBytes = actualMetadata.slice(metadataOffset, metadataOffset + 64);\n const fieldName = decoder\n .decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64))\n .trim();\n\n const value: [number, number, number, number] = [\n metaView.getFloat32(metadataOffset + 64, true),\n metaView.getFloat32(metadataOffset + 68, true),\n metaView.getFloat32(metadataOffset + 72, true),\n metaView.getFloat32(metadataOffset + 76, true)\n ];\n\n const textureIdBytes = actualMetadata.slice(metadataOffset + 80, metadataOffset + 144);\n const textureIdNullIndex = textureIdBytes.indexOf(0);\n const textureId = (textureIdNullIndex >= 0 \n ? decoder.decode(textureIdBytes.slice(0, textureIdNullIndex))\n : decoder.decode(textureIdBytes))\n .trim();\n\n mat.properties.push({ fieldName, value, textureId });\n metadataOffset += PROPERTY_STRIDE;\n } catch (err) {\n throw err;\n }\n }\n }\n\n // Parse bones\n const BONE_STRIDE = 64 + 4 + 16 * 4;\n const bones: THREE.Bone[] = [];\n const parentIndices: number[] = [];\n const boneMatrices: THREE.Matrix4[] = [];\n const boneOriginalNames: string[] = [];\n const bindPoses: THREE.Matrix4[] = [];\n\n for (let i = 0; i < boneCount; i++) {\n if (metadataOffset + BONE_STRIDE > actualMetadata.length) {\n throw new Error(`Skinned mesh metadata truncated while reading bone ${i}`);\n }\n\n const nameBytes = new Uint8Array(actualMetadata.buffer, actualMetadata.byteOffset + metadataOffset, 64);\n const nullIndex = nameBytes.indexOf(0);\n const rawName = decoder.decode(nameBytes.subarray(0, nullIndex >= 0 ? nullIndex : 64)).trim();\n const parentIndex = metaView.getInt32(metadataOffset + 64, true);\n\n const offsetMatrix = new THREE.Matrix4();\n const matrixElements = new Float32Array(16);\n for (let j = 0; j < 16; j++) {\n matrixElements[j] = metaView.getFloat32(metadataOffset + 68 + j * 4, true);\n }\n offsetMatrix.fromArray(matrixElements);\n\n const sanitizedName = this.sanitizeTrackName(rawName);\n const bone = new THREE.Bone();\n bone.name = sanitizedName;\n bone.userData.originalName = rawName;\n\n bones.push(bone);\n parentIndices.push(parentIndex);\n boneMatrices.push(offsetMatrix);\n boneOriginalNames.push(rawName);\n bindPoses.push(offsetMatrix.clone().invert());\n\n metadataOffset += BONE_STRIDE;\n }\n \n // Build bone hierarchy\n for (let i = 0; i < bones.length; i++) {\n const parentIndex = parentIndices[i];\n if (parentIndex >= 0 && parentIndex < bones.length && parentIndex !== i) {\n bones[parentIndex].add(bones[i]);\n }\n }\n \n // Set bones to bind pose for correct static display\n for (let i = 0; i < bones.length; i++) {\n const bone = bones[i];\n const bindPose = bindPoses[i];\n const parentIndex = parentIndices[i];\n \n if (parentIndex < 0) {\n const pos = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n bindPose.decompose(pos, quat, scale);\n \n bone.position.copy(pos);\n bone.quaternion.copy(quat);\n bone.scale.set(1, 1, 1);\n } else {\n const parentBindPose = bindPoses[parentIndex];\n const parentInv = new THREE.Matrix4().copy(parentBindPose).invert();\n const localMatrix = new THREE.Matrix4().multiplyMatrices(parentInv, bindPose);\n \n const pos = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n localMatrix.decompose(pos, quat, scale);\n \n bone.position.copy(pos);\n bone.quaternion.copy(quat);\n bone.scale.set(1, 1, 1);\n }\n \n bone.updateMatrix();\n }\n\n // Create Three.js materials with properties (same as static meshes)\n const materials: THREE.Material[] = [];\n for (let i = 0; i < materialCount; i++) {\n const mat = materialData[i];\n const material = new THREE.MeshStandardMaterial({\n side: THREE.DoubleSide,\n name: mat.name || `Material_${i}`,\n color: new THREE.Color(0.8, 0.8, 0.8) // Default gray\n });\n\n // Apply non-texture properties\n for (const prop of mat.properties) {\n const fieldName = prop.fieldName.toLowerCase();\n \n if (fieldName.includes('color') || fieldName.includes('tint')) {\n material.color.setRGB(prop.value[0], prop.value[1], prop.value[2]);\n } else if (fieldName === 'metallic') {\n material.metalness = prop.value[0];\n } else if (fieldName === 'roughness') {\n material.roughness = prop.value[0];\n } else if (fieldName === 'alphatest') {\n if (prop.value[0] > 0) {\n material.alphaTest = 0.5;\n material.transparent = true;\n }\n }\n }\n\n materials.push(material);\n }\n\n const parseTime = performance.now() - parseStart;\n PerfLogger.log(`[Perf] Parse skinned metadata: ${parseTime.toFixed(2)}ms`);\n \n const textureStart = performance.now();\n await this.loadMaterialTextures(materialData, materials);\n const textureTime = performance.now() - textureStart;\n if (materialData.length > 0) {\n PerfLogger.log(`[Perf] Load textures: ${textureTime.toFixed(2)}ms`);\n }\n\n // Collect root bones (hierarchy already built earlier)\n const buildStart = performance.now();\n const rootBones = bones.filter((_, index) => parentIndices[index] < 0);\n\n // Create shared skeleton\n const skeleton = new THREE.Skeleton(bones, boneMatrices);\n\n // Use WASM to parse geometry data (10-50x faster!)\n const geomData = this.reader.parseSkinnedMeshGeometryFast(metadata, data);\n if (!geomData) {\n throw new Error('Failed to parse skinned mesh geometry');\n }\n\n // Convert Uint32Array skinIndices to Uint16Array for Three.js\n const skinIndices16 = new Uint16Array(geomData.skinIndices);\n\n const combinedGeometry = new THREE.BufferGeometry();\n combinedGeometry.setAttribute('position', new THREE.BufferAttribute(geomData.positions, 3));\n combinedGeometry.setAttribute('normal', new THREE.BufferAttribute(geomData.normals, 3));\n combinedGeometry.setAttribute('uv', new THREE.BufferAttribute(geomData.uvs, 2));\n combinedGeometry.setAttribute('skinIndex', new THREE.Uint16BufferAttribute(skinIndices16, 4));\n combinedGeometry.setAttribute('skinWeight', new THREE.BufferAttribute(geomData.skinWeights, 4));\n combinedGeometry.setIndex(new THREE.BufferAttribute(geomData.indices, 1));\n\n // Add geometry groups for materials\n let indexCursor = 0;\n for (const geomInfo of sortedGeometryInfos) {\n combinedGeometry.addGroup(indexCursor, geomInfo.indexCount, Math.min(geomInfo.materialIndex, materials.length - 1));\n indexCursor += geomInfo.indexCount;\n }\n\n combinedGeometry.computeBoundingBox();\n combinedGeometry.computeBoundingSphere();\n\n const skinnedMesh = new THREE.SkinnedMesh(combinedGeometry, materials);\n \n // Create a separate bone container to preserve hierarchy\n const boneContainer = new THREE.Group();\n boneContainer.name = 'BoneContainer';\n rootBones.forEach((root) => boneContainer.add(root));\n \n // Bind skeleton with our provided inverse bind matrices\n skinnedMesh.bind(skeleton, skinnedMesh.matrixWorld);\n skinnedMesh.normalizeSkinWeights();\n skinnedMesh.updateMatrixWorld(true);\n\n const container = new THREE.Group();\n container.name = stringId || 'SkinnedMesh';\n container.add(boneContainer);\n container.add(skinnedMesh);\n container.userData.boneOriginalNames = boneOriginalNames;\n container.userData.skinnedMesh = skinnedMesh;\n\n const buildTime = performance.now() - buildStart;\n PerfLogger.log(`[Perf] Build skinned mesh: ${buildTime.toFixed(2)}ms (${boneCount} bones, ${geomData.vertexCount} verts)`);\n\n return container;\n }\n\n /**\n * Load a mesh by its canonical path/name\n */\n async loadMesh(assetPath: string): Promise<THREE.Group> {\n const totalStart = performance.now();\n \n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Mesh not found: ${assetPath}`);\n }\n\n // Read mesh data and metadata\n const data = this.reader.readAssetData(assetIndex);\n const metadata = this.reader.readAssetMetadata(assetIndex);\n\n if (!data) {\n throw new Error(`Failed to read mesh data: ${assetPath}`);\n }\n\n if (!metadata) {\n throw new Error(`No metadata available: ${assetPath}`);\n }\n\n // Parse mesh data\n const parsedData = MeshParser.parseMeshData(metadata, data);\n\n // Load textures for materials\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\n\n // Build Three.js scene with Draco decoder (with caching)\n const cacheKey = `${this.packUrl}::${assetPath}`;\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader, cacheKey, this.packVersion);\n\n const totalTime = performance.now() - totalStart;\n PerfLogger.log(`[Perf] === Mesh \"${assetPath}\": ${totalTime.toFixed(2)}ms total ===`);\n return scene;\n }\n\n /**\n * Load a texture by its canonical path/name\n */\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\n // Check cache first\n if (this.textureCache.has(assetPath)) {\n return this.textureCache.get(assetPath)!;\n }\n\n // Cache the promise to avoid duplicate loads\n const loadPromise = (async () => {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Read texture data\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data: ${assetPath}`);\n }\n\n // Load as KTX2\n return await this.loadKTX2Texture(data, assetPath);\n })();\n\n this.textureCache.set(assetPath, loadPromise);\n return loadPromise;\n }\n\n /**\n * Load audio by its canonical path/name\n */\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Read audio data\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read audio data: ${assetPath}`);\n }\n\n // Create audio object\n const audio = new THREE.Audio(listener);\n\n // Decode audio data\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioContext = listener.context;\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n\n audio.setBuffer(audioBuffer);\n\n return audio;\n }\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number): any {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Read asset data by index\n */\n readAssetData(index: number): Uint8Array | null {\n return this.reader.readAssetData(index);\n }\n\n /**\n * Read asset metadata by index\n */\n readAssetMetadata(index: number): Uint8Array | null {\n return this.reader.readAssetMetadata(index);\n }\n\n\n /**\n * Load skinned mesh by index\n */\n async loadSkinnedMeshByIndex(index: number): Promise<THREE.Group> {\n const data = this.reader.readAssetData(index);\n const metadata = this.reader.readAssetMetadata(index);\n\n if (!data) throw new Error(`Failed to read skinned mesh data for index ${index}`);\n if (!metadata) throw new Error(`No metadata for skinned mesh index ${index}`);\n\n return await this.parseSkinnedMesh(metadata, data);\n }\n\n /**\n * Load mesh by index\n */\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\n const data = this.reader.readAssetData(index);\n const metadata = this.reader.readAssetMetadata(index);\n\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\n if (!metadata) throw new Error(`No metadata for index ${index}`);\n\n const parsedData = MeshParser.parseMeshData(metadata, data);\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\n }\n\n /**\n * Load texture by index\n */\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\n const data = this.reader.readAssetData(index);\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\n return await this.loadKTX2Texture(data);\n }\n\n /**\n * Create HTML audio preview element\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\n\n const blob = new Blob([data as any], { type: 'audio/ogg' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n /**\n * Get audio metadata by path (uses WASM parsing)\n */\n getAudioMetadata(assetPath: string) {\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) return null;\n return this.reader.parseAudioMetadata(assetIndex);\n }\n\n /**\n * Get animation metadata by index (uses WASM parsing)\n */\n getAnimationMetadata(index: number) {\n return this.reader.parseAnimationMetadata(index);\n }\n\n /**\n * Get texture metadata by index (uses WASM parsing)\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n\n /**\n * Load animation clip by string ID\n */\n async loadAnimationClip(stringId: string): Promise<THREE.AnimationClip> {\n const index = this.reader.findAssetByPath(stringId);\n if (index < 0) {\n throw new Error(`Animation clip not found: ${stringId}`);\n }\n return this.loadAnimationClipByIndex(index);\n }\n\n /**\n * Load and play animation on a skinned mesh group\n */\n async loadAnimation(\n skinnedMeshGroup: THREE.Group, \n animationPath: string\n ): Promise<{ mixer: THREE.AnimationMixer, action: THREE.AnimationAction, clip: THREE.AnimationClip }> {\n const clip = await this.loadAnimationClip(animationPath);\n const mixer = new THREE.AnimationMixer(skinnedMeshGroup as unknown as THREE.Object3D);\n const action = mixer.clipAction(clip);\n action.setLoop(THREE.LoopRepeat, Infinity);\n action.play();\n \n return { mixer, action, clip };\n }\n\n /**\n * Load and play animation by index\n */\n async loadAnimationByIndex(\n skinnedMeshGroup: THREE.Group,\n animationIndex: number\n ): Promise<{ mixer: THREE.AnimationMixer, action: THREE.AnimationAction, clip: THREE.AnimationClip }> {\n const clip = await this.loadAnimationClipByIndex(animationIndex);\n const mixer = new THREE.AnimationMixer(skinnedMeshGroup as unknown as THREE.Object3D);\n const action = mixer.clipAction(clip);\n action.setLoop(THREE.LoopRepeat, Infinity);\n action.play();\n \n return { mixer, action, clip };\n }\n\n /**\n * Load animation clip by index\n */\n async loadAnimationClipByIndex(index: number): Promise<THREE.AnimationClip> {\n const metadata = this.reader.readAssetMetadata(index);\n const data = this.reader.readAssetData(index);\n\n if (!metadata || !data) {\n throw new Error('Failed to read animation clip data');\n }\n\n return this.parseAnimationClip(metadata, data);\n }\n\n /**\n * Parse animation clip from binary data\n */\n private parseAnimationClip(metadata: Uint8Array, data: Uint8Array): THREE.AnimationClip {\n // NEW FORMAT: Skip past tag header\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\n const tagCsvLength = view.getUint32(0, true);\n const tagHeaderSize = 4 + tagCsvLength;\n \n // Skip to actual metadata\n const actualMetadata = metadata.slice(tagHeaderSize);\n const metaView = new DataView(actualMetadata.buffer, actualMetadata.byteOffset, actualMetadata.byteLength);\n const decoder = new TextDecoder();\n\n // Parse AnimationClipMetadata (272 bytes total)\n const stringIdBytes = actualMetadata.slice(0, 128);\n const stringIdNullIndex = stringIdBytes.indexOf(0);\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdNullIndex >= 0 ? stringIdNullIndex : 128));\n\n const targetMeshIdBytes = actualMetadata.slice(128, 256);\n const targetMeshIdNullIndex = targetMeshIdBytes.indexOf(0);\n const targetMeshId = decoder\n .decode(targetMeshIdBytes.slice(0, targetMeshIdNullIndex >= 0 ? targetMeshIdNullIndex : 128))\n .trim();\n\n const durationSeconds = metaView.getFloat32(256, true); // Duration in seconds (per C header)\n const ticksPerSecond = metaView.getFloat32(260, true); // For custom playback rate if needed\n const channelCount = metaView.getUint32(264, true);\n const boneCount = metaView.getUint32(268, true);\n\n // Parse AnimationChannel[] (starts at offset 272, each is 28 bytes)\n const channelsOffset = 272;\n const channels: Array<{\n boneIndex: number;\n keyframeType: number;\n keyframeCount: number;\n keyframeTimesOffset: number;\n keyframeValuesOffset: number;\n }> = [];\n\n for (let i = 0; i < channelCount; i++) {\n const chOffset = channelsOffset + i * 28;\n channels.push({\n boneIndex: metaView.getUint32(chOffset, true),\n keyframeType: metaView.getUint32(chOffset + 4, true),\n keyframeCount: metaView.getUint32(chOffset + 8, true),\n keyframeTimesOffset: Number(metaView.getBigUint64(chOffset + 12, true)),\n keyframeValuesOffset: Number(metaView.getBigUint64(chOffset + 20, true))\n });\n }\n\n // Parse AnimationBoneInfo[] (starts after all channels, each is 68 bytes)\n const bonesOffset = channelsOffset + channelCount * 28;\n const bones: Array<{ name: string; parentIndex: number; sanitizedName: string }> = [];\n const originalBoneNames: string[] = [];\n\n for (let i = 0; i < boneCount; i++) {\n const boneOffset = bonesOffset + i * 68;\n const nameBytes = actualMetadata.slice(boneOffset, boneOffset + 64);\n const nullIndex = nameBytes.indexOf(0);\n const rawName = decoder\n .decode(nameBytes.slice(0, nullIndex >= 0 ? nullIndex : 64))\n .trim();\n const sanitizedName = this.sanitizeTrackName(rawName);\n const parentIndex = metaView.getInt32(boneOffset + 64, true);\n bones.push({ name: rawName, parentIndex, sanitizedName });\n originalBoneNames.push(rawName);\n }\n\n\n // Create DataView for keyframe data\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Create Three.js KeyframeTracks\n const tracks: THREE.KeyframeTrack[] = [];\n let maxKeyframeTime = 0;\n\n // Process channels - each channel specifies which bone it animates via boneIndex\n for (let i = 0; i < channelCount; i++) {\n const channel = channels[i];\n \n // Validate bone index\n if (channel.boneIndex >= boneCount) {\n console.warn(`[AnimationClip] Channel ${i} references invalid bone index ${channel.boneIndex} (have ${boneCount} bones)`);\n continue;\n }\n\n const boneName = bones[channel.boneIndex].sanitizedName;\n \n // Skip scale tracks - bones should always have unit scale\n if (channel.keyframeType === 2) {\n continue;\n }\n \n // Read times (already in seconds per C header)\n const times = this.readFloatArray(dataView, channel.keyframeTimesOffset, channel.keyframeCount);\n \n // Track the maximum keyframe time to calculate actual duration\n if (times.length > 0) {\n const channelMaxTime = times[times.length - 1];\n if (channelMaxTime > maxKeyframeTime) {\n maxKeyframeTime = channelMaxTime;\n }\n }\n\n // Create track based on keyframe type\n if (channel.keyframeType === 0) {\n // Position (vec3)\n const values = this.readFloatArray(dataView, channel.keyframeValuesOffset, channel.keyframeCount * 3);\n tracks.push(new THREE.VectorKeyframeTrack(\n `${boneName}.position`,\n times,\n values\n ));\n } else if (channel.keyframeType === 1) {\n // Rotation (quaternion)\n const values = this.readFloatArray(dataView, channel.keyframeValuesOffset, channel.keyframeCount * 4);\n tracks.push(new THREE.QuaternionKeyframeTrack(\n `${boneName}.quaternion`,\n times,\n values\n ));\n }\n }\n\n // Use the actual maximum keyframe time as duration instead of metadata duration\n const actualDuration = maxKeyframeTime > 0 ? maxKeyframeTime : durationSeconds;\n return new THREE.AnimationClip(stringId, actualDuration, tracks);\n }\n\n /**\n * Helper to read float array from DataView\n */\n private readFloatArray(view: DataView, offset: number, count: number): Float32Array {\n const result = new Float32Array(count);\n for (let i = 0; i < count; i++) {\n result[i] = view.getFloat32(offset + i * 4, true);\n }\n return result;\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n this.textureCache.clear();\n this.reader.close();\n }\n\n // Private methods moved from StowKitLoader\n private async loadMaterialTextures(\n materialData: Array<{\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: Array<{\n fieldName: string;\n value: [number, number, number, number];\n textureId: string;\n }>;\n }>,\n materials: THREE.Material[]\n ): Promise<string[]> {\n // Collect all texture load promises to load in parallel\n const textureLoads: Array<{\n materialIndex: number;\n propertyName: string;\n textureId: string;\n texturePromise: Promise<THREE.CompressedTexture>;\n }> = [];\n\n const uniqueTextures = new Set<string>();\n\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n for (const prop of matData.properties) {\n const textureId = prop.textureId?.trim();\n if (textureId && textureId.length > 0) {\n uniqueTextures.add(textureId);\n textureLoads.push({\n materialIndex: i,\n propertyName: prop.fieldName,\n textureId: textureId,\n texturePromise: this.loadTexture(textureId).catch(error => {\n console.error(`Failed to load texture \"${textureId}\":`, error);\n throw error;\n })\n });\n }\n }\n }\n\n // Load all textures in parallel\n const results = await Promise.allSettled(textureLoads.map(load => load.texturePromise));\n\n // Apply successfully loaded textures\n for (let i = 0; i < textureLoads.length; i++) {\n const result = results[i];\n if (result.status === 'fulfilled') {\n const load = textureLoads[i];\n const material = materials[load.materialIndex] as THREE.MeshStandardMaterial;\n this.applyTextureToMaterial(material, load.propertyName, result.value);\n }\n }\n\n return Array.from(uniqueTextures);\n }\n\n private async loadKTX2Texture(data: Uint8Array, textureName?: string): Promise<THREE.CompressedTexture> {\n // Start cache check but don't block on it\n const cacheKey = textureName ? `${this.packUrl}::${textureName}` : undefined;\n let cachePromise: Promise<any> | null = null;\n if (cacheKey) {\n cachePromise = AssetMemoryCache.getTexture(cacheKey, this.packVersion);\n }\n\n // Check cache while starting decode\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n\n const decodeStart = performance.now();\n \n // Race cache check vs decode start\n const [cached, _] = await Promise.all([\n cachePromise || Promise.resolve(null),\n Promise.resolve() // Start decode immediately\n ]);\n\n if (cached) {\n URL.revokeObjectURL(url);\n PerfLogger.log(`[Perf] ✓ Texture \"${textureName}\": 0ms (IndexedDB cache)`);\n \n const texture = new (THREE.CompressedTexture as any)(\n [{ data: cached.data, width: cached.width, height: cached.height }],\n cached.width,\n cached.height,\n cached.format,\n THREE.UnsignedByteType\n ) as THREE.CompressedTexture;\n texture.needsUpdate = true;\n return texture;\n }\n\n try {\n const texture = await new Promise<THREE.CompressedTexture>((resolve, reject) => {\n this.ktx2Loader.load(\n url,\n (texture) => {\n URL.revokeObjectURL(url);\n texture.needsUpdate = true;\n resolve(texture);\n },\n undefined,\n (error) => {\n URL.revokeObjectURL(url);\n reject(error);\n }\n );\n });\n\n const decodeTime = performance.now() - decodeStart;\n PerfLogger.log(`[Perf] ✓ Texture \"${textureName || 'unknown'}\": ${decodeTime.toFixed(2)}ms (Basis decode ${texture.image?.width}x${texture.image?.height})`);\n\n // Cache the transcoded texture data to IndexedDB (non-blocking)\n if (cacheKey && texture.mipmaps && texture.mipmaps.length > 0) {\n const mipmap = texture.mipmaps[0];\n const dataArray = new Uint8Array(mipmap.data.buffer, mipmap.data.byteOffset, mipmap.data.byteLength);\n AssetMemoryCache.setTexture(cacheKey, this.packVersion, {\n data: dataArray,\n width: mipmap.width,\n height: mipmap.height,\n format: texture.format,\n internalFormat: texture.format,\n compressed: true\n }).catch(() => {});\n }\n\n return texture;\n } catch (error) {\n URL.revokeObjectURL(url);\n throw error;\n }\n }\n\n private applyTextureToMaterial(\n material: THREE.MeshStandardMaterial,\n propertyName: string,\n texture: THREE.CompressedTexture\n ): void {\n const propNameLower = propertyName.toLowerCase();\n\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \n propNameLower.includes('albedo') || propNameLower.includes('base')) {\n material.map = texture;\n } else if (propNameLower.includes('normal')) {\n material.normalMap = texture;\n } else if (propNameLower.includes('metallic')) {\n material.metalnessMap = texture;\n } else if (propNameLower.includes('roughness')) {\n material.roughnessMap = texture;\n } else {\n material.map = texture;\n }\n\n material.needsUpdate = true;\n }\n\n\n private sanitizeTrackName(name: string): string {\n return name\n .trim()\n .replace(/[^A-Za-z0-9_\\-]+/g, '_')\n .replace(/_{2,}/g, '_');\n }\n}\n\n\n","import * as THREE from 'three';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { StowKitReader } from '@stowkit/reader';\nimport { StowKitPack } from './StowKitPack';\n\nexport interface StowKitLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/stowkit/basis/'\n */\n basisPath?: string;\n \n /**\n * Path to Draco decoder for mesh decompression\n * @default '/stowkit/draco/'\n */\n dracoPath?: string;\n \n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n}\n\n/**\n * Three.js loader for StowKit asset packs\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitLoader.load('assets.stow');\n * const mesh = await pack.loadMesh('models/character');\n * const texture = await pack.loadTexture('textures/diffuse');\n * const audio = await pack.loadAudio('sounds/bgm', listener);\n * ```\n */\nexport class StowKitLoader {\n private static ktx2Loader: KTX2Loader | null = null;\n private static dracoLoader: DRACOLoader | null = null;\n private static initialized = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n \n // Generate version for cache invalidation (based on file size)\n const version = `${arrayBuffer.byteLength}`;\n \n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPack(reader, this.ktx2Loader!, this.dracoLoader!, url, version);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n * @param data - The .stow file data\n * @param options - Loader options\n * @param cacheKey - Optional unique identifier for caching (e.g., CDN URL). Recommended for files loaded from CDN.\n */\n static async loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions, cacheKey?: string): Promise<StowKitPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n \n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Generate version for cache invalidation (based on file size)\n const version = `${arrayBuffer.byteLength}`;\n const packUrl = cacheKey || 'memory';\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPack(reader, this.ktx2Loader!, this.dracoLoader!, packUrl, version);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/stowkit/basis/';\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\n\n // Setup KTX2 loader (shared across all packs)\n this.ktx2Loader = new KTX2Loader();\n this.ktx2Loader.setTranscoderPath(basisPath);\n\n // Setup Draco loader (shared across all packs)\n this.dracoLoader = new DRACOLoader();\n this.dracoLoader.setDecoderPath(dracoPath);\n\n // Detect support\n const tempRenderer = new THREE.WebGLRenderer();\n this.ktx2Loader.detectSupport(tempRenderer);\n tempRenderer.dispose();\n\n this.initialized = true;\n }\n}\n"],"names":["THREE","PerfLogger","reader","StowKitReader","KTX2Loader","DRACOLoader"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;AAIG;MAoBU,gBAAgB,CAAA;IAQjB,aAAa,IAAI,GAAA;QACrB,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QACpB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAE9C,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AAC/C,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAE9D,YAAA,OAAO,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9C,YAAA,OAAO,CAAC,SAAS,GAAG,MAAK;AACrB,gBAAA,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AACzB,gBAAA,OAAO,EAAE,CAAC;AACd,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,eAAe,GAAG,CAAC,KAAK,KAAI;AAChC,gBAAA,MAAM,EAAE,GAAI,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC;AAErD,gBAAA,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;AACpD,oBAAA,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;iBAC7C;AAED,gBAAA,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACnD,oBAAA,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBAC5C;AACL,aAAC,CAAC;AACN,SAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC;KAC3B;AAED,IAAA,aAAa,WAAW,CAAC,GAAW,EAAE,OAAe,EAAA;AACjD,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC;AAE1B,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/B,gBAAA,OAAO,CAAC,SAAS,GAAG,MAAK;AACrB,oBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAoC,CAAC;oBAC5D,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE;wBACtC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACnB;yBAAM;wBACH,OAAO,CAAC,IAAI,CAAC,CAAC;qBACjB;AACL,iBAAC,CAAC;gBAEF,OAAO,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1C,aAAC,CAAC,CAAC;SACN;AAAC,QAAA,MAAM;AACJ,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;IAED,aAAa,WAAW,CAAC,GAAW,EAAE,OAAe,EAAE,QAKtD,EAAA;AACG,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAErB,MAAM,MAAM,GAAmB,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;AAExD,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC7E,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC3D,gBAAA,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACvB,WAAW,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;gBACzC,WAAW,CAAC,OAAO,GAAG,MAAM,OAAO,EAAE,CAAC;AAC1C,aAAC,CAAC,CAAC;SACN;AAAC,QAAA,MAAM;;SAEP;KACJ;AAED,IAAA,aAAa,UAAU,CAAC,GAAW,EAAE,OAAe,EAAA;AAChD,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC;AAE1B,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/B,gBAAA,OAAO,CAAC,SAAS,GAAG,MAAK;AACrB,oBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAmC,CAAC;oBAC3D,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE;wBACtC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACnB;yBAAM;wBACH,OAAO,CAAC,IAAI,CAAC,CAAC;qBACjB;AACL,iBAAC,CAAC;gBAEF,OAAO,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1C,aAAC,CAAC,CAAC;SACN;AAAC,QAAA,MAAM;AACJ,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;IAED,aAAa,UAAU,CAAC,GAAW,EAAE,OAAe,EAAE,WAOrD,EAAA;AACG,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAErB,MAAM,MAAM,GAAkB,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;AAE1D,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC3B,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1D,gBAAA,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACvB,WAAW,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;gBACzC,WAAW,CAAC,OAAO,GAAG,MAAM,OAAO,EAAE,CAAC;AAC1C,aAAC,CAAC,CAAC;SACN;AAAC,QAAA,MAAM;;SAEP;KACJ;IAED,aAAa,KAAK,GAAA;AACd,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO;AAErB,YAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;gBAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,CAAC;gBACjG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;gBACrD,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpD,WAAW,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;gBACzC,WAAW,CAAC,OAAO,GAAG,MAAM,OAAO,EAAE,CAAC;AAC1C,aAAC,CAAC,CAAC;SACN;AAAC,QAAA,MAAM;;SAEP;KACJ;AAED;;;AAGG;IACH,OAAO,eAAe,CAAC,QAAgB,EAAA;QACnC,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAC;KACxB;;AAjKc,gBAAE,CAAA,EAAA,GAAuB,IAAI,CAAC;AAC9B,gBAAW,CAAA,WAAA,GAAyB,IAAI,CAAC;AACzC,gBAAO,CAAA,OAAA,GAAG,mBAAmB,CAAC;AAC9B,gBAAU,CAAA,UAAA,GAAG,CAAC,CAAC;AACf,gBAAc,CAAA,cAAA,GAAG,YAAY,CAAC;AAC9B,gBAAa,CAAA,aAAA,GAAG,UAAU;;MCgBhC,UAAU,CAAA;AAEnB;;AAEG;IACH,OAAO,iBAAiB,CAAC,IAAgB,EAAA;;;AAGrC,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,QAAA,MAAM,cAAc,GAAG,CAAC,GAAG,YAAY,CAAC;AAExC,QAAA,IAAI,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAClE;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAClD,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;;AAG3G,QAAA,MAAM,QAAQ,GAAiB;YAC3B,iBAAiB,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;YAC9C,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1C,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;AACtC,YAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;SAC3D,CAAC;AAEF,QAAA,OAAO,QAAQ,CAAC;KACnB;AAED;;AAEG;AACH,IAAA,OAAO,aAAa,CAAC,YAAwB,EAAE,QAAoB,EAAA;;AAS/D,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACjG,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,QAAA,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,CAAC;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;;;AAItD,QAAA,MAAM,oBAAoB,GAAG,aAAa,GAAG,GAAG;AAC5C,aAAC,QAAQ,CAAC,iBAAiB,GAAG,EAAE,CAAC;AACjC,aAAC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC;AAC9B,aAAC,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;AAE/B,QAAA,IAAI,mBAAmB,GAAG,YAAY,CAAC,MAAM,IAAI,oBAAoB,CAAC;;;QAItE,MAAM,UAAU,GAAG,mBAAmB,GAAG,YAAY,GAAG,QAAQ,CAAC;AACjE,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;;AAG/F,QAAA,IAAI,MAAM,GAAG,mBAAmB,IAAI,aAAa,GAAG,GAAG,IAAI,CAAC,CAAC;;QAG7D,MAAM,UAAU,GAAuB,EAAE,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE;YACjD,IAAI,MAAM,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE;gBACjC,OAAO,CAAC,IAAI,CAAC,CAA8B,2BAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,iBAAiB,CAAE,CAAA,CAAC,CAAC;gBAC9E,MAAM;aACT;AACD,YAAA,MAAM,GAAG,GAAqB;gBAC1B,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;gBAC7C,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AAC7C,gBAAA,sBAAsB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACxE,gBAAA,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;gBACtE,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;gBACpD,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;aACjD,CAAC;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,MAAM,IAAI,EAAE,CAAC;SAChB;;QAGD,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAqB,EAAE,CAAC;AAIvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,CAA8B,2BAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,aAAa,CAAE,CAAA,CAAC,CAAC;gBAC1E,MAAM;aACT;AAID,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;YAE7D,YAAY,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,QAAQ;gBACR,aAAa;AACb,gBAAA,UAAU,EAAE,EAAE;AACjB,aAAA,CAAC,CAAC;AAEH,YAAA,MAAM,IAAI,GAAG,CAAC;SACjB;;QAGD,MAAM,KAAK,GAAW,EAAE,CAAC;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,CAA0B,uBAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,SAAS,CAAE,CAAA,CAAC,CAAC;gBAClE,MAAM;aACT;AACD,YAAA,MAAM,IAAI,GAAS;AACf,gBAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC5D,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACjD,gBAAA,QAAQ,EAAE;oBACN,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACzC,iBAAA;AACD,gBAAA,QAAQ,EAAE;oBACN,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACzC,iBAAA;AACD,gBAAA,KAAK,EAAE;oBACH,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;oBACvC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;AAC1C,iBAAA;gBACD,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;gBACjD,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;aACzD,CAAC;AACF,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,YAAA,MAAM,IAAI,GAAG,CAAC;SACjB;;QAGD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC3E,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;AACnD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE;gBAC1C,MAAM;aACT;AACD,YAAA,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;SAC7D;AACD,QAAA,MAAM,IAAI,aAAa,GAAG,CAAC,CAAC;;;AAI5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAEhC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;AAClC,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,2BAAA,EAA8B,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,aAAa,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE,CAAC,CAAC;oBAC1F,MAAM;iBACT;AAED,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACzE,gBAAA,MAAM,KAAK,GAAqC;oBAC5C,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;iBACzC,CAAC;AACF,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAE/E,gBAAA,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACpB,SAAS;oBACT,KAAK;oBACL,SAAS;AACZ,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,IAAI,GAAG,CAAC;aACjB;;AAGD,YAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;gBACvC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAEA,gBAAK,CAAC,UAAU;;gBAEtB,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxC,aAAA,CAAC,CAAC;;AAGH,YAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACrD,oBAAA,GAAG,CAAC,KAAK,GAAG,IAAIA,gBAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5E;AAAM,qBAAA,IAAI,SAAS,KAAK,WAAW,EAAE;oBAClC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACnB,wBAAA,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;AACpB,wBAAA,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;qBAC1B;iBACJ;aACJ;AAED,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;;AAGD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,SAAS,CAAC,IAAI,CAAC,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,gBAAA,SAAS,EAAE,GAAG;AACd,gBAAA,SAAS,EAAE,GAAG;gBACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,aAAA,CAAC,CAAC,CAAC;SACP;AAED,QAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;KAChF;AAED;;AAEG;AACH,IAAA,aAAa,cAAc,CAAC,OAAyB,EAAE,QAAoB,EAAE,WAAwB,EAAE,QAAiB,EAAE,OAAgB,EAAA;;QAEtI,IAAI,YAAY,GAAwB,IAAI,CAAC;AAC7C,QAAA,IAAI,QAAQ,IAAI,OAAO,EAAE;YACrB,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClE;;QAGD,IAAI,YAAY,EAAE;AACd,YAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,IAAI,MAAM,EAAE;AACR,gBAAA,MAAM,QAAQ,GAAG,IAAIA,gBAAK,CAAC,cAAc,EAAE,CAAC;AAC5C,gBAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAClF,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAChB,oBAAA,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;iBACjF;AACD,gBAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACZ,oBAAA,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;iBACzE;AACD,gBAAA,QAAQ,CAAC,QAAQ,CAAC,IAAIA,gBAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,gBAAA,OAAO,QAAQ,CAAC;aACnB;SACJ;;AAGD,QAAA,IAAI,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,EAAE;AACjF,YAAA,MAAM,IAAI,KAAK,CAAC,CAA2C,wCAAA,EAAA,OAAO,CAAC,sBAAsB,CAAA,OAAA,EAAU,OAAO,CAAC,oBAAoB,CAAgB,aAAA,EAAA,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC,CAAC;SACrK;AAED,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CACjC,OAAO,CAAC,sBAAsB,EAC9B,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAChE,CAAC;;QAGF,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAClI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,MAAM,KAAI;YACzE,WAAW,CAAC,IAAI,CACZ,GAAG,EACH,CAAC,OAA6B,KAAI;AAC9B,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,aAAC,EACD,SAAS,EACT,CAAC,KAAU,KAAI;AACX,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAA,CAAE,CAAC,CAAC,CAAC;AACnE,aAAC,CACJ,CAAC;AACN,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,QAAQ,IAAI,OAAO,EAAE;YACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3C,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;AAEjC,YAAA,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,EAAE;AACpE,gBAAA,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE;oBAC5C,SAAS,EAAE,OAAO,CAAC,KAAqB;AACxC,oBAAA,OAAO,EAAE,CAAC,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAqB,GAAG,SAAS;AACvF,oBAAA,GAAG,EAAE,CAAC,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAqB,GAAG,SAAS;oBAC7E,OAAO,EAAE,SAAS,CAAC,KAAoB;iBAC1C,CAAC,CAAC,KAAK,CAAC,MAAO,GAAC,CAAC,CAAC;aACtB;SACJ;AAED,QAAA,OAAO,QAAQ,CAAC;KACnB;AAED;;AAEG;AACH,IAAA,aAAa,UAAU,CAAC,UAAuD,EAAE,QAAoB,EAAE,WAAwB,EAAE,cAAuB,EAAE,OAAgB,EAAA;AACtK,QAAA,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAE1B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;;AAGjE,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KACnD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAC9C,cAAc,GAAG,CAAA,EAAG,cAAc,CAAO,IAAA,EAAA,KAAK,CAAE,CAAA,GAAG,SAAS,EAC5D,OAAO,CAAC,CACf,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;;QAG7D,MAAM,WAAW,GAAqB,EAAE,CAAC;AAEzC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AAC9B,YAAA,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;YAGrB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;;AAG7B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;AACjD,gBAAA,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE;AAC/B,oBAAA,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;AACtC,oBAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;;AAG7C,oBAAA,IAAI,QAAwB,CAAC;oBAC7B,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE;AAC1C,wBAAA,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;qBAC/C;yBAAM;AACH,wBAAA,QAAQ,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;4BACtC,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,4BAAA,SAAS,EAAE,GAAG;AACd,4BAAA,SAAS,EAAE,GAAG;4BACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,yBAAA,CAAC,CAAC;qBACN;oBAED,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAChD,oBAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBACjB;aACJ;AAED,YAAA,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACzB;;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAE3B,YAAA,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE;gBAChE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAC1C;iBAAM;AACH,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACjB;SACJ;;AAGD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACpD,gBAAA,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,gBAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;;AAGzC,gBAAA,IAAI,QAAwB,CAAC;gBAC7B,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE;AAC1C,oBAAA,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;iBAC/C;qBAAM;AACH,oBAAA,QAAQ,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;wBACtC,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,wBAAA,SAAS,EAAE,GAAG;AACd,wBAAA,SAAS,EAAE,GAAG;wBACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,qBAAA,CAAC,CAAC;iBACN;gBAED,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,IAAI,GAAG,CAAQ,KAAA,EAAA,KAAK,EAAE,CAAC;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aAClB;SACJ;AAED,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;IACK,OAAO,UAAU,CAAC,MAAkB,EAAA;QACxC,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,CAAC,CAAC;AAAE,YAAA,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AACpC,QAAA,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;KACzD;AACJ;;AC9bD;;AAEG;MACU,WAAW,CAAA;IAQpB,WAAY,CAAA,MAAqB,EAAE,UAAsB,EAAE,WAAwB,EAAE,OAAkB,GAAA,EAAE,EAAE,WAAA,GAAsB,EAAE,EAAA;AAJ3H,QAAA,IAAA,CAAA,YAAY,GAAkD,IAAI,GAAG,EAAE,CAAC;AAK5E,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;KAC3D;AAED;;AAEG;IACH,MAAM,eAAe,CAAC,QAAgB,EAAA;AAClC,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACzD,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAA,CAAE,CAAC,CAAC;SAC1D;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE3D,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAA,CAAE,CAAC,CAAC;AAC5E,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAA,CAAE,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;AACjD,QAAAC,iBAAU,CAAC,GAAG,CAAC,CAAA,yBAAA,EAA4B,QAAQ,CAAM,GAAA,EAAA,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,YAAA,CAAc,CAAC,CAAC;AAE7F,QAAA,OAAO,MAAM,CAAC;KACjB;AAED;;AAEG;AACK,IAAA,MAAM,gBAAgB,CAAC,QAAoB,EAAE,IAAgB,EAAA;AACjE,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;;AAGrC,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,QAAA,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,CAAC;;QAGvC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAC3G,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;QAGlC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAE/C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO;AACnB,aAAA,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,IAAI,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC,CAAC;AAChF,aAAA,IAAI,EAAE,CAAC;QAGZ,IAAI,MAAM,GAAG,GAAG,CAAC;;QAGjB,MAAM,aAAa,GAYd,EAAE,CAAC;;;;;AAMR,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,MAAM,GAAG,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE;AACrC,gBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA,CAAE,CAAC,CAAC;aAC3D;YAED,aAAa,CAAC,IAAI,CAAC;gBACf,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;gBAC7C,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AAC7C,gBAAA,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACpE,gBAAA,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAClE,gBAAA,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACnE,gBAAA,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACjE,gBAAA,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/D,gBAAA,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7D,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;;AAEvD,aAAA,CAAC,CAAC;YAEH,MAAM,IAAI,EAAE,CAAC;SAChB;AAGD,QAAiB,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;;QAG7E,MAAM,mBAAmB,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;;AAG9G,QAAA,IAAI,cAAc,GAAG,GAAG,GAAG,iBAAiB,GAAG,EAAE,CAAC;QAElD,MAAM,YAAY,GASb,EAAE,CAAC;;AAGR,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE;AAC9C,gBAAA,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC/E,MAAM;aACT;AAED,YAAA,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,EAAE,CAAC,CAAC;AAC5E,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,EAAE,cAAc,GAAG,GAAG,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACzF,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,cAAc,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAErE,YAAA,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACrE,cAAc,IAAI,GAAG,CAAC;SACzB;;;QAID,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,QAAA,cAAc,IAAI,SAAS,GAAG,WAAW,CAAC;AAC1C,QAAA,cAAc,IAAI,SAAS,GAAG,CAAC,CAAC;;QAGhC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAE5B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;AACxC,gBAAA,IAAI;oBACA,IAAI,cAAc,GAAG,eAAe,GAAG,cAAc,CAAC,MAAM,EAAE;wBAC1D,MAAM;qBACT;AAED,oBAAA,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,EAAE,CAAC,CAAC;oBACjF,MAAM,SAAS,GAAG,OAAO;AACpB,yBAAA,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,yBAAA,IAAI,EAAE,CAAC;AAEZ,oBAAA,MAAM,KAAK,GAAqC;wBAC5C,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC;wBAC9C,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC;wBAC9C,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC;wBAC9C,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC;qBACjD,CAAC;AAEF,oBAAA,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,EAAE,cAAc,GAAG,GAAG,CAAC,CAAC;oBACvF,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACrD,oBAAA,MAAM,SAAS,GAAG,CAAC,kBAAkB,IAAI,CAAC;AACtC,0BAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC7D,0BAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;AAC/B,yBAAA,IAAI,EAAE,CAAC;AAEZ,oBAAA,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACrD,cAAc,IAAI,eAAe,CAAC;iBACrC;gBAAC,OAAO,GAAG,EAAE;AACV,oBAAA,MAAM,GAAG,CAAC;iBACb;aACJ;SACJ;;QAGD,MAAM,WAAW,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,YAAY,GAAoB,EAAE,CAAC;QACzC,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,MAAM,SAAS,GAAoB,EAAE,CAAC;AAEtC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,cAAc,GAAG,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE;AACtD,gBAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA,CAAE,CAAC,CAAC;aAC9E;AAED,YAAA,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,GAAG,cAAc,EAAE,EAAE,CAAC,CAAC;YACxG,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvC,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9F,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAEjE,YAAA,MAAM,YAAY,GAAG,IAAID,gBAAK,CAAC,OAAO,EAAE,CAAC;AACzC,YAAA,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAC5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AACzB,gBAAA,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;aAC9E;AACD,YAAA,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAEvC,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACtD,YAAA,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,IAAI,EAAE,CAAC;AAC9B,YAAA,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC;AAErC,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,YAAA,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAChC,YAAA,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAE9C,cAAc,IAAI,WAAW,CAAC;SACjC;;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,KAAK,CAAC,EAAE;gBACrE,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACpC;SACJ;;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,YAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9B,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAErC,YAAA,IAAI,WAAW,GAAG,CAAC,EAAE;AACjB,gBAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC;AAChC,gBAAA,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,UAAU,EAAE,CAAC;AACpC,gBAAA,MAAM,KAAK,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC;gBAClC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAErC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3B;iBAAM;AACH,gBAAA,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAC9C,gBAAA,MAAM,SAAS,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC;AACpE,gBAAA,MAAM,WAAW,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE9E,gBAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC;AAChC,gBAAA,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,UAAU,EAAE,CAAC;AACpC,gBAAA,MAAM,KAAK,GAAG,IAAIA,gBAAK,CAAC,OAAO,EAAE,CAAC;gBAClC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAExC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3B;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;;QAGD,MAAM,SAAS,GAAqB,EAAE,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,QAAQ,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;gBAC5C,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACtB,gBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAA,SAAA,EAAY,CAAC,CAAE,CAAA;AACjC,gBAAA,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxC,aAAA,CAAC,CAAC;;AAGH,YAAA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE;gBAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAE/C,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC3D,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtE;AAAM,qBAAA,IAAI,SAAS,KAAK,UAAU,EAAE;oBACjC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACtC;AAAM,qBAAA,IAAI,SAAS,KAAK,WAAW,EAAE;oBAClC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACtC;AAAM,qBAAA,IAAI,SAAS,KAAK,WAAW,EAAE;oBAClC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACnB,wBAAA,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC;AACzB,wBAAA,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;qBAC/B;iBACJ;aACJ;AAED,YAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;AACjD,QAAAC,iBAAU,CAAC,GAAG,CAAC,CAAA,iCAAA,EAAoC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAI,EAAA,CAAA,CAAC,CAAC;AAE7E,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;AACrD,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAAA,iBAAU,CAAC,GAAG,CAAC,CAAA,wBAAA,EAA2B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAI,EAAA,CAAA,CAAC,CAAC;SACzE;;AAGD,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;;QAGvE,MAAM,QAAQ,GAAG,IAAID,gBAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;;AAGzD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;SAC5D;;QAGD,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE5D,QAAA,MAAM,gBAAgB,GAAG,IAAIA,gBAAK,CAAC,cAAc,EAAE,CAAC;AACpD,QAAA,gBAAgB,CAAC,YAAY,CAAC,UAAU,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5F,QAAA,gBAAgB,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACxF,QAAA,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,QAAA,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAIA,gBAAK,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,QAAA,gBAAgB,CAAC,YAAY,CAAC,YAAY,EAAE,IAAIA,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AAChG,QAAA,gBAAgB,CAAC,QAAQ,CAAC,IAAIA,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;;QAG1E,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,QAAA,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE;YACxC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACpH,YAAA,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC;SACtC;QAED,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;QACtC,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QAEzC,MAAM,WAAW,GAAG,IAAIA,gBAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;;AAGvE,QAAA,MAAM,aAAa,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AACxC,QAAA,aAAa,CAAC,IAAI,GAAG,eAAe,CAAC;AACrC,QAAA,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;;QAGrD,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;QACpD,WAAW,CAAC,oBAAoB,EAAE,CAAC;AACnC,QAAA,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAEpC,QAAA,MAAM,SAAS,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AACpC,QAAA,SAAS,CAAC,IAAI,GAAG,QAAQ,IAAI,aAAa,CAAC;AAC3C,QAAA,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,QAAA,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,QAAA,SAAS,CAAC,QAAQ,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;AACzD,QAAA,SAAS,CAAC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QAE7C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;AACjD,QAAAC,iBAAU,CAAC,GAAG,CAAC,gCAAgC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,SAAS,CAAW,QAAA,EAAA,QAAQ,CAAC,WAAW,CAAA,OAAA,CAAS,CAAC,CAAC;AAE7H,QAAA,OAAO,SAAS,CAAC;KACpB;AAED;;AAEG;IACH,MAAM,QAAQ,CAAC,SAAiB,EAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;;QAGrC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,CAAA,CAAE,CAAC,CAAC;SACnD;;QAGD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAE3D,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,CAAA,CAAE,CAAC,CAAC;SAC7D;QAED,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAA,CAAE,CAAC,CAAC;SAC1D;;QAGD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;AAG5D,QAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;;QAG/E,MAAM,QAAQ,GAAG,CAAG,EAAA,IAAI,CAAC,OAAO,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE1G,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;AACjD,QAAAA,iBAAU,CAAC,GAAG,CAAC,CAAA,iBAAA,EAAoB,SAAS,CAAM,GAAA,EAAA,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,YAAA,CAAc,CAAC,CAAC;AACtF,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;IACH,MAAM,WAAW,CAAC,SAAiB,EAAA;;QAE/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;SAC5C;;AAGD,QAAA,MAAM,WAAW,GAAG,CAAC,YAAW;;YAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAA,CAAE,CAAC,CAAC;aACtD;;YAGD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,CAAA,CAAE,CAAC,CAAC;aAChE;;YAGD,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SACtD,GAAG,CAAC;QAEL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC9C,QAAA,OAAO,WAAW,CAAC;KACtB;AAED;;AAEG;AACH,IAAA,MAAM,SAAS,CAAC,SAAiB,EAAE,QAA6B,EAAA;;QAE5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,CAAA,CAAE,CAAC,CAAC;SACpD;;QAGD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,CAAA,CAAE,CAAC,CAAC;SAC9D;;QAGD,MAAM,KAAK,GAAG,IAAID,gBAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;QAGxC,MAAM,WAAW,GAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAgB,CAAC;AACtH,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;AAEpE,QAAA,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAE7B,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;IACH,UAAU,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;KACnC;AAED;;AAEG;IACH,aAAa,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;KACtC;AAED;;AAEG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC1C;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC3C;AAED;;AAEG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC/C;AAGD;;AAEG;IACH,MAAM,sBAAsB,CAAC,KAAa,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEtD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,KAAK,CAAA,CAAE,CAAC,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAA,CAAE,CAAC,CAAC;QAE9E,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACtD;AAED;;AAEG;IACH,MAAM,eAAe,CAAC,KAAa,EAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEtD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAA,CAAE,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAA,CAAE,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC5D,QAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;AAC/E,QAAA,OAAO,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;KAC1E;AAED;;AAEG;IACH,MAAM,kBAAkB,CAAC,KAAa,EAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAA,CAAE,CAAC,CAAC;AACxE,QAAA,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC3C;AAED;;AAEG;IACH,MAAM,kBAAkB,CAAC,KAAa,EAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAA,CAAE,CAAC,CAAC;AAEtE,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAW,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC9C,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACtB,QAAA,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;AAEhB,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;AACH,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,UAAU,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;KACrD;AAED;;AAEG;AACH,IAAA,oBAAoB,CAAC,KAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;KACpD;AAED;;AAEG;AACH,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;KAClD;AAGD;;AAEG;IACH,MAAM,iBAAiB,CAAC,QAAgB,EAAA;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACpD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAA,CAAE,CAAC,CAAC;SAC5D;AACD,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;KAC/C;AAED;;AAEG;AACH,IAAA,MAAM,aAAa,CACf,gBAA6B,EAC7B,aAAqB,EAAA;QAErB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAIA,gBAAK,CAAC,cAAc,CAAC,gBAA6C,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAACA,gBAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,CAAC;AAEd,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KAClC;AAED;;AAEG;AACH,IAAA,MAAM,oBAAoB,CACtB,gBAA6B,EAC7B,cAAsB,EAAA;QAEtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAIA,gBAAK,CAAC,cAAc,CAAC,gBAA6C,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAACA,gBAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,CAAC;AAEd,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KAClC;AAED;;AAEG;IACH,MAAM,wBAAwB,CAAC,KAAa,EAAA;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAE9C,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACzD;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KAClD;AAED;;AAEG;IACK,kBAAkB,CAAC,QAAoB,EAAE,IAAgB,EAAA;;AAE7D,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,QAAA,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,CAAC;;QAGvC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAC3G,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;QAGlC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,IAAI,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC,CAAC,CAAC;QAE1G,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO;AACvB,aAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,IAAI,CAAC,GAAG,qBAAqB,GAAG,GAAG,CAAC,CAAC;AAC5F,aAAA,IAAI,GAAG;AAEZ,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvD,QAAuB,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;QACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;QAGhD,MAAM,cAAc,GAAG,GAAG,CAAC;QAC3B,MAAM,QAAQ,GAMT,EAAE,CAAC;AAER,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,QAAQ,GAAG,cAAc,GAAG,CAAC,GAAG,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAC7C,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC;gBACpD,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC;AACrD,gBAAA,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACvE,gBAAA,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3E,aAAA,CAAC,CAAC;SACN;;AAGD,QAAA,MAAM,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,EAAE,CAAC;QACvD,MAAM,KAAK,GAAwE,EAAE,CAAC;AAGtF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;AAChC,YAAA,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC;AACxC,YAAA,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;YACpE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,OAAO;AAClB,iBAAA,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;AAC3D,iBAAA,IAAI,EAAE,CAAC;YACZ,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACtD,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7D,YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;SAE7D;;AAID,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;QAG7E,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,IAAI,eAAe,GAAG,CAAC,CAAC;;AAGxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;;AAG5B,YAAA,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,CAAC,CAAA,+BAAA,EAAkC,OAAO,CAAC,SAAS,CAAA,OAAA,EAAU,SAAS,CAAA,OAAA,CAAS,CAAC,CAAC;gBAC1H,SAAS;aACZ;YAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;;AAGxD,YAAA,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC,EAAE;gBAC5B,SAAS;aACZ;;AAGD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;;AAGhG,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClB,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/C,gBAAA,IAAI,cAAc,GAAG,eAAe,EAAE;oBAClC,eAAe,GAAG,cAAc,CAAC;iBACpC;aACJ;;AAGD,YAAA,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC,EAAE;;AAE5B,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AACtG,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAIA,gBAAK,CAAC,mBAAmB,CACrC,CAAG,EAAA,QAAQ,WAAW,EACtB,KAAK,EACL,MAAM,CACT,CAAC,CAAC;aACN;AAAM,iBAAA,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC,EAAE;;AAEnC,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AACtG,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAIA,gBAAK,CAAC,uBAAuB,CACzC,CAAG,EAAA,QAAQ,aAAa,EACxB,KAAK,EACL,MAAM,CACT,CAAC,CAAC;aACN;SACJ;;AAGD,QAAA,MAAM,cAAc,GAAG,eAAe,GAAG,CAAC,GAAG,eAAe,GAAG,eAAe,CAAC;QAC/E,OAAO,IAAIA,gBAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;KACpE;AAED;;AAEG;AACK,IAAA,cAAc,CAAC,IAAc,EAAE,MAAc,EAAE,KAAa,EAAA;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC5B,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;SACrD;AACD,QAAA,OAAO,MAAM,CAAC;KACjB;AAED;;AAEG;IACH,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;KACvB;;AAGO,IAAA,MAAM,oBAAoB,CAC9B,YASE,EACF,SAA2B,EAAA;;QAG3B,MAAM,YAAY,GAKb,EAAE,CAAC;AAER,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;AAEzC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAChC,YAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;gBACzC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,oBAAA,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC9B,YAAY,CAAC,IAAI,CAAC;AACd,wBAAA,aAAa,EAAE,CAAC;wBAChB,YAAY,EAAE,IAAI,CAAC,SAAS;AAC5B,wBAAA,SAAS,EAAE,SAAS;AACpB,wBAAA,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;4BACtD,OAAO,CAAC,KAAK,CAAC,CAAA,wBAAA,EAA2B,SAAS,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC/D,4BAAA,MAAM,KAAK,CAAC;AAChB,yBAAC,CAAC;AACL,qBAAA,CAAC,CAAC;iBACN;aACJ;SACJ;;QAGD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;AAGxF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE;AAC/B,gBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAA+B,CAAC;AAC7E,gBAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;aAC1E;SACJ;AAED,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KACrC;AAEO,IAAA,MAAM,eAAe,CAAC,IAAgB,EAAE,WAAoB,EAAA;;AAEhE,QAAA,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAG,EAAA,IAAI,CAAC,OAAO,KAAK,WAAW,CAAA,CAAE,GAAG,SAAS,CAAC;QAC7E,IAAI,YAAY,GAAwB,IAAI,CAAC;QAC7C,IAAI,QAAQ,EAAE;YACV,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SAC1E;;QAGD,MAAM,WAAW,GAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAgB,CAAC;QACtH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAEtC,QAAA,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;;QAGtC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAClC,YAAA,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,YAAA,OAAO,CAAC,OAAO,EAAE;AACpB,SAAA,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE;AACR,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,YAAAC,iBAAU,CAAC,GAAG,CAAC,qBAAqB,WAAW,CAAA,wBAAA,CAA0B,CAAC,CAAC;YAE3E,MAAM,OAAO,GAAG,IAAKD,gBAAK,CAAC,iBAAyB,CAChD,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACnE,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,MAAM,EACbA,gBAAK,CAAC,gBAAgB,CACE,CAAC;AAC7B,YAAA,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;AAC3B,YAAA,OAAO,OAAO,CAAC;SAClB;AAED,QAAA,IAAI;YACA,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,KAAI;gBAC3E,IAAI,CAAC,UAAU,CAAC,IAAI,CAChB,GAAG,EACH,CAAC,OAAO,KAAI;AACR,oBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,oBAAA,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;oBAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,iBAAC,EACD,SAAS,EACT,CAAC,KAAK,KAAI;AACN,oBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,CAAC;AAClB,iBAAC,CACJ,CAAC;AACN,aAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;AACnD,YAAAC,iBAAU,CAAC,GAAG,CAAC,CAAA,kBAAA,EAAqB,WAAW,IAAI,SAAS,CAAA,GAAA,EAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAoB,iBAAA,EAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAI,CAAA,EAAA,OAAO,CAAC,KAAK,EAAE,MAAM,CAAG,CAAA,CAAA,CAAC,CAAC;;AAG7J,YAAA,IAAI,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;AACpD,oBAAA,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,cAAc,EAAE,OAAO,CAAC,MAAM;AAC9B,oBAAA,UAAU,EAAE,IAAI;iBACnB,CAAC,CAAC,KAAK,CAAC,MAAO,GAAC,CAAC,CAAC;aACtB;AAED,YAAA,OAAO,OAAO,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAEO,IAAA,sBAAsB,CAC1B,QAAoC,EACpC,YAAoB,EACpB,OAAgC,EAAA;AAEhC,QAAA,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QAEjD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChE,YAAA,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpE,YAAA,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC;SAC1B;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACzC,YAAA,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC;SAChC;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC3C,YAAA,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC;SACnC;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC5C,YAAA,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC;SACnC;aAAM;AACH,YAAA,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC;SAC1B;AAED,QAAA,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;KAC/B;AAGO,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAClC,QAAA,OAAO,IAAI;AACN,aAAA,IAAI,EAAE;AACN,aAAA,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;AACjC,aAAA,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;KAC/B;AACJ;;ACp7BD;;;;;;;;;;AAUG;MACU,aAAa,CAAA;AAMtB;;AAEG;AACH,IAAA,aAAa,IAAI,CAAC,GAAW,EAAE,OAA8B,EAAA;;AAEzD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAClC;;AAGD,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,CAAmB,gBAAA,EAAA,GAAG,CAAK,EAAA,EAAA,QAAQ,CAAC,UAAU,CAAE,CAAA,CAAC,CAAC;SACrE;AAED,QAAA,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;;AAGjD,QAAA,MAAM,OAAO,GAAG,CAAA,EAAG,WAAW,CAAC,UAAU,EAAE,CAAC;;QAG5C,MAAMC,QAAM,GAAG,IAAIC,oBAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,QAAA,MAAMD,QAAM,CAAC,IAAI,EAAE,CAAC;AACpB,QAAA,MAAMA,QAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;AAG/B,QAAA,OAAO,IAAI,WAAW,CAACA,QAAM,EAAE,IAAI,CAAC,UAAW,EAAE,IAAI,CAAC,WAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;KACrF;AAED;;;;;AAKG;IACH,aAAa,cAAc,CAAC,IAA+B,EAAE,OAA8B,EAAE,QAAiB,EAAA;;AAE1G,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAClC;;AAGD,QAAA,IAAI,WAAwB,CAAC;AAE7B,QAAA,IAAI,IAAI,YAAY,WAAW,EAAE;YAC7B,WAAW,GAAG,IAAI,CAAC;SACtB;aAAM,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,EAAE;AAC5D,YAAA,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;SAC1C;aAAM,IAAI,aAAa,IAAI,IAAI,IAAI,OAAQ,IAAY,CAAC,WAAW,KAAK,UAAU,EAAE;AACjF,YAAA,WAAW,GAAG,MAAO,IAAY,CAAC,WAAW,EAAE,CAAC;SACnD;aAAM;AACH,YAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;SAC9D;;AAGD,QAAA,MAAM,OAAO,GAAG,CAAA,EAAG,WAAW,CAAC,UAAU,EAAE,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;;QAGrC,MAAMA,QAAM,GAAG,IAAIC,oBAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,QAAA,MAAMD,QAAM,CAAC,IAAI,EAAE,CAAC;AACpB,QAAA,MAAMA,QAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;AAG/B,QAAA,OAAO,IAAI,WAAW,CAACA,QAAM,EAAE,IAAI,CAAC,UAAW,EAAE,IAAI,CAAC,WAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KACzF;AAED;;AAEG;AACK,IAAA,aAAa,UAAU,CAAC,OAA8B,EAAA;QAC1D,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,8BAA8B,CAAC;AACpE,QAAA,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAAC;AAC1D,QAAA,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAAC;;AAG1D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAIE,wBAAU,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;;AAG7C,QAAA,IAAI,CAAC,WAAW,GAAG,IAAIC,0BAAW,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;;AAG3C,QAAA,MAAM,YAAY,GAAG,IAAIL,gBAAK,CAAC,aAAa,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5C,YAAY,CAAC,OAAO,EAAE,CAAC;AAEvB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;KAC3B;;AA9Fc,aAAU,CAAA,UAAA,GAAsB,IAAI,CAAC;AACrC,aAAW,CAAA,WAAA,GAAuB,IAAI,CAAC;AACvC,aAAW,CAAA,WAAA,GAAG,KAAK,CAAC;AACpB,aAAQ,CAAA,QAAA,GAAW,8BAA8B;;;;;;;;;;;;;;"}
|