carta1 1.1.3 → 1.1.5

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":"carta1-worker.min.js","mappings":"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","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/io/bitstream.js","webpack://carta1/./codec/io/serialization.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/transforms/qmf.js","webpack://carta1/./codec/transforms/fft.js","webpack://carta1/./codec/transforms/mdct.js","webpack://carta1/./codec/coding/quantization.js","webpack://carta1/./codec/coding/bitallocation.js","webpack://carta1/./codec/core/buffers.js","webpack://carta1/./codec/analysis/transient.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/io/processor.js","webpack://carta1/./codec/browser/worker.js"],"sourcesContent":["/**\n * Carta1 Audio Codec - Core Constants\n */\n\n// Audio format\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\n\n// AEA file format\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\n\n// Frame structure\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\n// BFU (Block Floating Unit) configuration\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS_COUNT = 8\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\n// BFU start positions\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\n// Transform sizes\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\n\n// Window functions\nexport const WINDOW_SHORT = (() => {\n const table = new Float64Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\n// QMF configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\n// QMF prototype filter coefficients\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\n// QMF window function\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\n// QMF even/odd taps for optimization\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\n// MDCT/IMDCT transform configuration\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 }, // Low band (0-5.5kHz)\n { size: 128, windowStart: 48 }, // Mid band (5.5-11kHz)\n { size: 256, windowStart: 112 }, // High band (11-22kHz)\n]\n\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\n// Frame serialization\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const MAX_WORD_LENGTH_INDEX = 15\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\nexport const SCALE_FACTORS = (() => {\n const table = new Float64Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\n// Bit allocation\nexport const INV_POWER_OF_TWO = (() => {\n const maxBits = WORD_LENGTH_BITS[MAX_WORD_LENGTH_INDEX]\n const table = new Float64Array(maxBits + 1)\n for (let b = 0; b <= maxBits; b++) {\n table[b] = Math.pow(2, -b)\n }\n return table\n})()\n","/**\n * Carta1 Audio Codec - Bitstream Operations\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n value &= (1 << bitCount) - 1\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (value >> shift) & ((1 << bitsToWrite) - 1)\n\n const mask = ((1 << bitsToWrite) - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length; ) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = (1 << bitsToRead) - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value << bitsToRead) | bits\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 1 << (bitCount - 1)\n return value >= signBit ? value - (1 << bitCount) : value\n}\n","/**\n * Carta1 Audio Codec - Serialization Module\n *\n * Handles serialization and deserialization of ATRAC1 audio frames and AEA file format.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n BFU_AMOUNTS,\n SPECS_PER_BFU,\n AEA_HEADER_SIZE,\n AEA_MAGIC,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n AEA_FRAME_COUNT_OFFSET,\n AEA_CHANNEL_COUNT_OFFSET,\n WORD_LENGTH_BITS,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {Object} frameData - The encoded frame data to serialize\n * @param {number} frameData.nBfu - Number of block floating units\n * @param {number[]} frameData.blockModes - Block modes for each band [0-2]\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Int32Array[]} frameData.quantizedCoefficients - Quantized spectral coefficients\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockModes[0]) << 14) |\n ((2 - frameData.blockModes[1]) << 12) |\n ((3 - frameData.blockModes[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {Object} Deserialized frame data\n * @returns {number} returns.nBfu - Number of block floating units\n * @returns {number[]} returns.blockModes - Block modes for each band\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Int32Array[]} returns.quantizedCoefficients - Quantized spectral coefficients\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockModes = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n}\n\n/**\n * AEA file format handler for ATRAC1 audio files\n * Manages creation and parsing of AEA file headers\n */\nexport class AeaFile {\n /**\n * Creates an AEA file header with the specified metadata\n * @param {string} [title=''] - Audio file title (max 255 characters)\n * @param {number} [frameCount=0] - Number of audio frames in the file\n * @param {number} [channelCount=1] - Number of audio channels (1 or 2)\n * @returns {Uint8Array} AEA file header buffer\n */\n static createHeader(title = '', frameCount = 0, channelCount = 1) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n\n // Magic number\n header.set(AEA_MAGIC, 0)\n\n // Title (null-terminated string)\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n\n // Frame count\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n\n // Channel count\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n\n return header\n }\n\n /**\n * Parses an AEA file header to extract metadata\n * @param {Uint8Array} header - AEA file header buffer\n * @returns {Object} Parsed header information\n * @returns {string} returns.title - Audio file title\n * @returns {number} returns.frameCount - Number of audio frames\n * @returns {number} returns.channelCount - Number of audio channels\n * @throws {Error} If header size is invalid or magic number doesn't match\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n // Check magic number\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n\n // Extract title\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n // Extract metadata\n const frameCount = view.getUint32(AEA_FRAME_COUNT_OFFSET, true)\n const channelCount = header[AEA_CHANNEL_COUNT_OFFSET]\n\n return { title, frameCount, channelCount }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n const [min, max] = meta.range\n\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec including\n * pipeline composition, error handling, and audio stream processing utilities\n * for delay compensation and frame padding.\n */\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Creates a pipeline by composing multiple processing stages\n * @param {Object} context - Shared context passed to all stages\n * @param {...Function} stages - Stage functions to compose\n * @returns {Function} Composed pipeline function\n */\nexport function pipe(context, ...stages) {\n const functions = stages.map((stage) => stage(context))\n\n return (input) => {\n return functions.reduce((value, fn) => fn(value), input)\n }\n}\n\n/**\n * Reverses the spectral order of coefficients for mid/high band processing\n *\n * Used in both MDCT and IMDCT stages to handle spectral reversal required\n * by the ATRAC1 format for mid and high frequency bands.\n *\n * @param {Float32Array} spectrum - Input spectrum coefficients\n * @param {Object} reversalBuffers - Pre-allocated buffers for different spectrum sizes\n * @returns {Float32Array} Spectrum with reversed coefficient order\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n\n/**\n * Calculates the starting offset for a frequency band in the coefficient array\n *\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {number} Starting offset in the 512-sample coefficient array\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extracts coefficients for a specific frequency band from the full coefficient array\n *\n * @param {Float32Array} coefficients - Full 512-sample coefficient array\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {Float32Array} Subarray containing coefficients for the specified band\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY, QMF_EVEN, QMF_ODD } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function qmfAnalysis(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError(`qmfAnalysis: qmfWorkBuffers.delay[${inputLength}] is required`)\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function qmfSynthesis(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError(\n `qmfSynthesis: qmfWorkBuffers.delay[${outputLength}] is required`\n )\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 Audio Codec - Fast Fourier Transform\n *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\nexport class FFT {\n static _cache = new Map()\n\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const n = real.length\n if (n !== imag.length)\n throw new Error('Real and imaginary arrays must have the same length.')\n if ((n & (n - 1)) !== 0) throw new Error('Input size must be a power of 2.')\n if (n <= 1) return\n\n let cache = FFT._cache.get(n)\n if (!cache) {\n // build plan in Float64 for precision\n const log2n = Math.log2(n)\n\n const bitRev = new Uint32Array(n)\n for (let i = 1; i < n; i++) {\n bitRev[i] = (bitRev[i >>> 1] >>> 1) | ((i & 1) << (log2n - 1))\n }\n\n const cosTbl = new Float64Array(n / 2)\n const sinTbl = new Float64Array(n / 2)\n for (let i = 0; i < n / 2; i++) {\n const angle = (-2 * Math.PI * i) / n\n // compute in f64, then enforce |W| = 1 to remove tiny drift\n let c = Math.cos(angle)\n let s = Math.sin(angle)\n const invm = 1 / Math.hypot(c, s) // ~1, but fixes cos^2+sin^2 drift\n cosTbl[i] = c * invm\n sinTbl[i] = s * invm\n }\n\n cache = { bitRev, cos: cosTbl, sin: sinTbl }\n FFT._cache.set(n, cache)\n }\n\n const { bitRev, cos: cosTbl, sin: sinTbl } = cache\n\n // work in Float64 to avoid per-stage Float32 rounding\n const needCopyBack =\n !(real instanceof Float64Array) || !(imag instanceof Float64Array)\n const r = needCopyBack ? new Float64Array(real) : real\n const im = needCopyBack ? new Float64Array(imag) : imag\n\n // bit reversal\n for (let i = 0; i < n; i++) {\n const j = bitRev[i]\n if (j > i) {\n let t = r[i]\n r[i] = r[j]\n r[j] = t\n t = im[i]\n im[i] = im[j]\n im[j] = t\n }\n }\n\n // size-2 butterflies\n for (let i = 0; i < n; i += 2) {\n const i1 = i + 1\n const er = r[i],\n ei = im[i]\n const tr = r[i1],\n ti = im[i1]\n r[i] = er + tr\n im[i] = ei + ti\n r[i1] = er - tr\n im[i1] = ei - ti\n }\n\n // size-4 butterflies (uses exact W = -i at k=1)\n if (n >= 4) {\n for (let i = 0; i < n; i += 4) {\n const e0 = i,\n o0 = i + 2\n const er0 = r[e0],\n ei0 = im[e0]\n const tr0 = r[o0],\n ti0 = im[o0]\n r[e0] = er0 + tr0\n im[e0] = ei0 + ti0\n r[o0] = er0 - tr0\n im[o0] = ei0 - ti0\n\n const e1 = i + 1,\n o1 = i + 3\n const tr1 = im[o1] // multiply by -i\n const ti1 = -r[o1]\n const er1 = r[e1],\n ei1 = im[e1]\n r[e1] = er1 + tr1\n im[e1] = ei1 + ti1\n r[o1] = er1 - tr1\n im[o1] = ei1 - ti1\n }\n }\n\n // size >= 8\n for (let stride = 8; stride <= n; stride <<= 1) {\n const half = stride >>> 1\n const step = (n / stride) | 0\n for (let i = 0; i < n; i += stride) {\n let k = 0\n for (let j = 0; j < half; j++, k += step) {\n const even = i + j\n const odd = even + half\n\n const cr = cosTbl[k],\n sr = sinTbl[k]\n const orr = r[odd],\n oii = im[odd]\n\n const tr = orr * cr - oii * sr\n const ti = orr * sr + oii * cr\n\n const er = r[even],\n ei = im[even]\n r[even] = er + tr\n im[even] = ei + ti\n r[odd] = er - tr\n im[odd] = ei - ti\n }\n }\n }\n\n if (needCopyBack) {\n for (let i = 0; i < n; i++) {\n real[i] = r[i]\n imag[i] = im[i]\n }\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Modified Discrete Cosine Transform\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float64Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`MDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`IMDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = -input[i2]\n const im = -input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = im * s + r * c\n imag[i] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 8)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 8)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 4)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n","/**\n * Carta1 Audio Codec - Quantization Module\n *\n * This module handles the quantization and dequantization of MDCT frequency coefficients\n * for the Carta1 audio codec. It provides functions to convert floating-point frequency\n * domain data into integer representations suitable for bitstream encoding.\n *\n * Key functions:\n * - Quantization of coefficients using scale factors and bit depths\n * - Dequantization for reconstruction during decoding\n * - BFU (Band Frequency Unit) organization for psychoacoustic processing\n *\n * The quantization process uses configurable scale factors to maintain audio quality\n * while achieving the target compression ratio. The module supports both uniform\n * and non-uniform quantization schemes based on perceptual importance.\n */\n\nimport {\n SPECS_PER_BFU,\n BFU_START_LONG,\n BFU_START_SHORT,\n BFU_BAND_BOUNDARIES,\n SCALE_FACTORS,\n QUANTIZATION_SIGN_BIT_SHIFT,\n} from '../core/constants.js'\n\n/**\n * Quantize coefficients.\n * @param {Float32Array} coefficients\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Int32Array} out\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n const length = coefficients.length\n const out = new Int32Array(length)\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n out.fill(0, 0, length)\n return out\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const hi = quantRange\n const lo = -quantRange\n\n for (let i = 0; i < length; i++) {\n const x = coefficients[i] * normFactor\n const y = (x + (x >= 0 ? 0.5 : -0.5)) | 0\n out[i] = y > hi ? hi : y < lo ? lo : y\n }\n\n return out\n}\n\n/**\n * Dequantize coefficients.\n * @param {Int32Array} quantized\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Float32Array}\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n\n const deq = new Float32Array(quantized.length)\n for (let i = 0; i < quantized.length; i++) {\n deq[i] = (quantized[i] * scaleFactor) / quantRange\n }\n return deq\n}\n\n/**\n * Groups MDCT coefficients into Band Frequency Units (BFUs) for bit allocation.\n *\n * This function organizes frequency-domain coefficients into perceptually meaningful\n * frequency bands (BFUs) based on the block modes for each of the three frequency bands.\n * It handles both long and short blocks, with different frequency resolutions and\n * BFU start positions for each block type.\n *\n * The function implements copy-avoidance optimization: when a BFU slice is fully\n * contained within a frequency band, it directly copies the data without buffer\n * filling. For BFUs that span band boundaries or extend beyond the available\n * coefficients, it handles partial copying and zero-padding appropriately.\n *\n * Frequency Band Structure:\n * - Band 0: 0-128 coefficients (low frequencies)\n * - Band 1: 128-256 coefficients (mid frequencies)\n * - Band 2: 256-512 coefficients (high frequencies)\n *\n * Block Types:\n * - Long blocks (mode 0): Higher frequency resolution, fewer temporal segments\n * - Short blocks (mode 1): Lower frequency resolution, more temporal segments\n *\n * @param {Float32Array} coefficients\n * @param {Array<number>} blockModes\n * @returns {{bfuData: Array<Float32Array>, bfuSizes: Array<number>, bfuCount: number}}\n */\nexport function groupIntoBFUs(coefficients, blockModes) {\n const bfuData = []\n const bfuSizes = []\n\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const isLongBlock = blockModes[band] === 0\n const startPositions = isLongBlock ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n const endPos = startPos + size\n const bfu = new Float32Array(size)\n\n if (startPos >= 0 && endPos <= bandSize) {\n bfu.set(coefficients.subarray(bandStart + startPos, bandStart + endPos))\n } else {\n bfu.fill(0)\n if (startPos < bandSize && endPos > 0) {\n const srcStart = Math.max(0, startPos)\n const srcEnd = Math.min(bandSize, endPos)\n bfu.set(\n coefficients.subarray(bandStart + srcStart, bandStart + srcEnd),\n Math.max(0, -startPos)\n )\n }\n }\n\n bfuData.push(bfu)\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation system for the Carta1 audio codec,\n * responsible for distributing available bits across frequency bands to minimize\n * perceptual distortion while maintaining the target bitrate.\n *\n * The module uses Rate-Distortion Optimization (RDO) with a greedy algorithm\n * that allocates bits to Band Frequency Units (BFUs) based on the perceptual\n * benefit per bit spent. It employs psychoacoustic modeling to determine\n * scale factors and uses a priority queue to efficiently find the optimal\n * bit distribution.\n *\n * Key components:\n * - RDO-based bit allocation using exponential distortion modeling\n * - Scale factor computation for each frequency band\n * - Max-heap priority queue for greedy optimization\n * - Support for variable word lengths per BFU\n *\n * The algorithm ensures that bits are allocated where they provide the\n * greatest reduction in audible distortion, resulting in high-quality\n * audio compression at the target bitrate.\n */\n\nimport {\n NUM_BFUS,\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n MAX_WORD_LENGTH_INDEX,\n WORD_LENGTH_BITS,\n INV_POWER_OF_TWO,\n SCALE_FACTORS,\n} from '../core/constants.js'\n\n/**\n * Allocate bits to BFUs using optimized greedy Lp-RDO\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} maxBfuCount\n * @returns {{bfuCount:number, allocation:Int32Array, scaleFactorIndices:Int32Array}}\n */\nexport function allocateBits(bfuData, bfuSizes, maxBfuCount) {\n const usedBFU = maxBfuCount\n const avail =\n FRAME_BITS - FRAME_OVERHEAD_BITS - usedBFU * BITS_PER_BFU_METADATA\n\n const rdoResult = distributeBitsRDO(usedBFU, bfuData, bfuSizes, avail)\n\n return {\n bfuCount: usedBFU,\n allocation: rdoResult.wordLengths,\n scaleFactorIndices: rdoResult.scaleFactorIndices,\n }\n}\n\n/**\n * Distributes available bits across Band Frequency Units (BFUs) using Rate-Distortion Optimization.\n *\n * This function implements an optimized greedy RDO allocator that minimizes perceptual distortion\n * while staying within the bit budget. It uses a priority queue (max-heap) to greedily allocate\n * bits to the BFUs that provide the greatest distortion reduction per bit spent.\n *\n * @param {number} activeBfuCount\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} remainingBits\n * @returns {{wordLengths: Int32Array, scaleFactorIndices: Int32Array}}\n */\nfunction distributeBitsRDO(activeBfuCount, bfuData, bfuSizes, remainingBits) {\n const scaleFactorTable = new Int32Array(NUM_BFUS)\n const wordLengths = new Int32Array(activeBfuCount)\n\n const heapIndices = []\n const heapPriorities = []\n\n const deltaDistPerCoeff = (bfuIndex, currentWl, nextWl) => {\n const sfi = scaleFactorTable[bfuIndex]\n const scaleFactor = SCALE_FACTORS[sfi]\n if (scaleFactor === 0) return 0\n\n const bits1 = WORD_LENGTH_BITS[currentWl] | 0\n const bits2 = WORD_LENGTH_BITS[nextWl] | 0\n\n const f1 = bits1 === 0 ? 2.0 : INV_POWER_OF_TWO[bits1]\n const f2 = INV_POWER_OF_TWO[bits2]\n\n return scaleFactor * (f1 - f2)\n }\n\n for (let bfuIndex = 0; bfuIndex < activeBfuCount; bfuIndex++) {\n const sz = bfuSizes[bfuIndex] | 0\n if (sz === 0) continue\n\n const sfi = findScaleFactor(bfuData[bfuIndex].subarray(0, sz))\n scaleFactorTable[bfuIndex] = sfi\n\n if (sfi === 0) continue\n\n const currentWl = 0\n const nextWl = 1\n const deltaBits =\n (WORD_LENGTH_BITS[nextWl] - WORD_LENGTH_BITS[currentWl]) | 0\n if (deltaBits <= 0) continue\n\n const ddPerCoeff = deltaDistPerCoeff(bfuIndex, currentWl, nextWl)\n heapIndices.push(bfuIndex)\n heapPriorities.push(ddPerCoeff / deltaBits)\n }\n\n // Heapify\n for (let i = (heapIndices.length >> 1) - 1; i >= 0; i--)\n siftDown(heapIndices, heapPriorities, i)\n\n // Greedy spending\n while (remainingBits > 0 && heapIndices.length > 0) {\n const bfu = heapIndices[0]\n const cur = wordLengths[bfu] | 0\n const nxt = cur + 1\n\n const sz = bfuSizes[bfu] | 0\n const deltaBits = (WORD_LENGTH_BITS[nxt] - WORD_LENGTH_BITS[cur]) | 0\n const cost = deltaBits * sz\n\n if (cost > remainingBits || cost <= 0) {\n popRoot(heapIndices, heapPriorities)\n continue\n }\n\n remainingBits -= cost\n wordLengths[bfu] = nxt\n\n if (nxt < MAX_WORD_LENGTH_INDEX) {\n const nxt2 = nxt + 1\n const deltaBits2 = (WORD_LENGTH_BITS[nxt2] - WORD_LENGTH_BITS[nxt]) | 0\n if (deltaBits2 > 0) {\n heapPriorities[0] = deltaDistPerCoeff(bfu, nxt, nxt2) / deltaBits2\n siftDown(heapIndices, heapPriorities, 0)\n } else {\n popRoot(heapIndices, heapPriorities)\n }\n } else {\n popRoot(heapIndices, heapPriorities)\n }\n }\n\n return { wordLengths, scaleFactorIndices: scaleFactorTable }\n}\n\n/**\n * Find the optimal scale factor index for a set of coefficients.\n * Same semantics as the original.\n * @param {Float32Array} coefficients\n * @returns {number}\n */\nexport function findScaleFactor(coefficients) {\n let maxAmplitude = 0.0\n for (let i = 0; i < coefficients.length; i++) {\n const a = Math.abs(coefficients[i])\n if (a > maxAmplitude) maxAmplitude = a\n }\n if (maxAmplitude === 0) return 0\n const index = Math.ceil(3 * (Math.log2(maxAmplitude) + 21))\n return Math.max(0, Math.min(63, index))\n}\n\n/**\n * Removes the root element from a max-heap and maintains heap property.\n *\n * This function efficiently removes the maximum priority element from the heap\n * by replacing it with the last element and then restoring the heap property\n * through sifting down.\n *\n * @param {Array<number>} heapIndices\n * @param {Array<number>} heapPriorities\n */\nfunction popRoot(heapIndices, heapPriorities) {\n const last = heapIndices.length - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapIndices.pop()\n heapPriorities.pop()\n if (heapIndices.length) siftDown(heapIndices, heapPriorities, 0)\n}\n\n/**\n * Restores max-heap property by sifting an element down from a given position.\n *\n * This function maintains the heap invariant where parent nodes have higher\n * priority values than their children. It compares the element at startIndex\n * with its children and swaps with the larger child until the heap property\n * is satisfied, or it reaches a leaf position.\n *\n * @param {Array<number>} heapIndices\n * @param {Array<number>} heapPriorities\n * @param {number} startIndex\n */\nfunction siftDown(heapIndices, heapPriorities, startIndex) {\n const heapSize = heapIndices.length\n let i = startIndex\n const idxVal = heapIndices[i]\n const prVal = heapPriorities[i]\n\n while (true) {\n const l = (i << 1) + 1\n const r = l + 1\n let maxI = i\n let maxP = prVal\n\n if (l < heapSize && heapPriorities[l] > maxP) {\n maxI = l\n maxP = heapPriorities[l]\n }\n if (r < heapSize && heapPriorities[r] > maxP) {\n maxI = r\n }\n if (maxI === i) break\n\n heapIndices[i] = heapIndices[maxI]\n heapPriorities[i] = heapPriorities[maxI]\n i = maxI\n }\n\n heapIndices[i] = idxVal\n heapPriorities[i] = prVal\n}\n","/**\n * Carta1 Audio Codec - Buffer Management\n */\n\nimport { QMF_DELAY, QMF_HIGH_BAND_DELAY } from './constants.js'\n\nexport class BufferPool {\n constructor() {\n // Transform buffers\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n // QMF work buffers\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n // QMF delay lines\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n // Transient detector\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n // MDCT/IMDCT work buffers\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n // MDCT overlap buffers (encoder)\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n // IMDCT overlap buffers (decoder)\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n\n // Spectrum reversal buffers\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT } from '../transforms/fft.js'\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The encoding pipeline transforms PCM audio samples into ATRAC1 compressed format\n * through a series of processing stages:\n *\n * 1. QMF Analysis: Splits audio into frequency bands using quadrature mirror filters\n * 2. Block Selection: Detects transients to choose appropriate transform block sizes\n * 3. MDCT Transform: Applies Modified Discrete Cosine Transform to frequency bands\n * 4. Quantization: Performs psychoacoustic analysis, bit allocation, and quantization\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and encoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n calculateBandOffset,\n} from '../utils.js'\nimport { qmfAnalysis } from '../transforms/qmf.js'\nimport { mdct64, mdct256, mdct512 } from '../transforms/mdct.js'\nimport { groupIntoBFUs, quantize } from '../coding/quantization.js'\nimport { allocateBits } from '../coding/bitallocation.js'\nimport { BufferPool } from '../core/buffers.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n FFT_SIZE_LOW,\n FFT_SIZE_MID,\n FFT_SIZE_HIGH,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_OVERLAP_SIZE,\n} from '../core/constants.js'\nimport { performFFT, detectTransient } from '../analysis/transient.js'\n\n/**\n * QMF Analysis Stage - Splits audio into frequency bands\n *\n * Performs two-stage QMF analysis to decompose the input signal into three bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes PCM samples\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfAnalysisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfAnalysisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Process PCM samples through QMF analysis\n * @param {Float32Array} pcmSamples - Input PCM samples\n * @returns {Object} Analysis result containing frequency bands\n * @returns {Array<Float32Array>} returns.bands - Three frequency bands [low, mid, high]\n */\n return (pcmSamples) => {\n const stage1 = qmfAnalysis(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = qmfAnalysis(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return {\n bands: [stage2.lowBand, stage2.highBand, highBand],\n }\n }\n}\n\n/**\n * Block Selection Stage - Detects transients to choose transform block sizes\n *\n * Analyzes frequency bands using FFT and transient detection to determine\n * appropriate MDCT block sizes. Short blocks are used for transient signals\n * to prevent pre-echo artifacts, while long blocks provide better frequency\n * resolution for steady-state signals.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes QMF analysis results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function blockSelectorStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('blockSelectorStage: bufferPool is required')\n const options =\n context?.options ?? throwError('blockSelectorStage: options is required')\n\n /**\n * Analyze frequency bands and determine block modes\n * @param {Object} input - QMF analysis results\n * @param {Array<Float32Array>} input.bands - Three frequency bands [low, mid, high]\n * @returns {Object} Block selection results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { bands } = input\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n const blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n\n return {\n bands,\n blockModes,\n }\n }\n}\n\n/**\n * MDCT Transform Stage - Applies Modified Discrete Cosine Transform\n *\n * Transforms time-domain samples to frequency-domain coefficients using MDCT.\n * The transform size depends on the block mode determined by transient detection:\n * - Long blocks: 512/256 samples for better frequency resolution\n * - Short blocks: 64 samples for better time resolution\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally reversed to match ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes block selection results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [mdct256, mdct256, mdct512]\n\n /**\n * Transform a single frequency band using MDCT.\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformBand(\n samples,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool\n ) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n const isLongBlock = blockMode === 0\n\n if (isLongBlock) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n )\n } else {\n return transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n )\n }\n }\n\n /**\n * Transform using long block (better frequency resolution).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Object} transformFunc\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n // Apply overlap from previous frame\n mdctInput.set(overlapBuffer, config.windowStart)\n\n // Window and save tail for next frame\n applyTailWindowing(samples, overlapBuffer, config.size)\n\n // Add current frame samples\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = transformFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n return spectrum\n }\n\n /**\n * Transform using short blocks (better time resolution for transients).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2) // 8 for band 2, 4 for bands 0-1\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n\n // Prepare MDCT input\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n // Window and save tail\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * Transform frequency bands using MDCT\n * @param {Object} input - Block selection results\n * @param {Array<Float32Array>} input.bands - Three frequency bands\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @param {any} input.originalFrame - Original frame data (passed through)\n * @returns {Object} MDCT transform results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Float32Array} returns.coefficients - MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes\n * @returns {any} returns.originalFrame - Original frame data\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool\n )\n\n const offset = calculateBandOffset(bandIndex)\n coefficients.set(transformed, offset)\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n\n/**\n * Quantization Stage - Performs RDO bit allocation and quantization\n *\n * The final encoding stage that:\n * 1. Groups coefficients into Block Floating Units (BFUs)\n * 2. Allocates bits using Rate-Distortion Optimization (RDO)\n * 3. Quantizes coefficients using scale factors and word lengths\n *\n * Uses RDO to optimize the allocation of bits for maximum quality\n * within the available bit budget.\n *\n * @returns {Function} Stage function that processes MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function quantizationStage() {\n /**\n * Perform RDO bit allocation and quantization\n * @param {Object} input - MDCT transform results\n * @param {Float32Array} input.coefficients - MDCT coefficients\n * @param {Array<number>} input.blockModes - Block modes\n * @returns {Object} Quantization results ready for bitstream encoding\n * @returns {number} returns.nBfu - Number of active BFUs\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Array<Int32Array>} returns.quantizedCoefficients - Quantized coefficient data\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n const { bfuData, bfuSizes, bfuCount } = groupIntoBFUs(\n coefficients,\n blockModes\n )\n\n const {\n bfuCount: selectedBfuCount,\n allocation,\n scaleFactorIndices,\n } = allocateBits(bfuData, bfuSizes, bfuCount)\n\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < selectedBfuCount; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const wordLength = allocation[bfu]\n const bitsPerSample = WORD_LENGTH_BITS[wordLength]\n const quantized = quantize(data, scaleFactorIndices[bfu], bitsPerSample)\n quantizedCoefficients.push(quantized)\n }\n\n return {\n nBfu: selectedBfuCount,\n scaleFactorIndices,\n wordLengthIndices: allocation.slice(0, selectedBfuCount),\n quantizedCoefficients,\n blockModes,\n }\n }\n}\n\n/**\n * Create ATRAC1 encoding pipeline\n *\n * Constructs a complete encoding pipeline that transforms PCM audio samples\n * into ATRAC1 compressed format. The pipeline processes audio through QMF\n * analysis, transient detection, MDCT transform, and psychoacoustic quantization.\n *\n * The returned function can be called repeatedly to encode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()] - Encoding configuration\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Encoding pipeline function that processes PCM samples\n *\n * @example\n * const encoder = encode(new EncoderOptions(), new BufferPool())\n * const result = encoder(pcmSamples) // Returns quantized ATRAC1 frame data\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(\n context,\n qmfAnalysisStage,\n blockSelectorStage,\n mdctStage,\n quantizationStage\n )\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The decoding pipeline transforms ATRAC1 compressed format back into PCM audio samples\n * through a series of processing stages:\n *\n * 1. Dequantization: Reconstructs MDCT coefficients from quantized data using scale factors\n * 2. Inverse MDCT: Applies Inverse Modified Discrete Cosine Transform to frequency bands\n * 3. QMF Synthesis: Reconstructs full-spectrum audio using quadrature mirror filters\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and decoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n extractBandCoefficients,\n} from '../utils.js'\nimport { qmfSynthesis } from '../transforms/qmf.js'\nimport { imdct64, imdct256, imdct512, overlapAdd } from '../transforms/mdct.js'\nimport { dequantize } from '../coding/quantization.js'\nimport { BufferPool } from '../core/buffers.js'\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\n\n/**\n * Dequantization Stage - Reconstructs MDCT coefficients from quantized data\n *\n * Reverses the quantization process by:\n * - Reconstructing coefficient values using scale factors and word lengths\n * - Organizing coefficients back into Block Floating Units (BFUs)\n * - Preparing coefficient array for inverse MDCT transform\n *\n * Uses the same BFU organization as the encoder but reconstructs the original\n * coefficient values from the quantized representation.\n *\n * @returns {Function} Stage function that processes quantized frame data\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function dequantizationStage() {\n /**\n * Reconstruct MDCT coefficients from quantized data\n * @param {Object} frameData - Quantized frame data\n * @param {number} frameData.nBfu - Number of active BFUs\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Array<Int32Array>} frameData.quantizedCoefficients - Quantized coefficient data\n * @param {Array<number>} frameData.blockModes - Block modes for each band\n * @returns {Object} Dequantization results\n * @returns {Float32Array} returns.coefficients - Reconstructed MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const isLongBlock = blockModes[band] === 0\n const position = isLongBlock ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const quantized = quantizedCoefficients[bfu]\n const dequantized = dequantize(\n quantized,\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return { coefficients, blockModes }\n }\n}\n\n/**\n * Inverse MDCT Stage - Transforms frequency coefficients back to time domain\n *\n * Applies Inverse Modified Discrete Cosine Transform to reconstruct time-domain\n * samples from frequency coefficients. The transform size depends on block modes:\n * - Long blocks: 512/256 samples for steady-state signals\n * - Short blocks: 64 samples for transient signals\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally unreversed from ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes dequantization results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [imdct256, imdct256, imdct512]\n\n /**\n * Inverse transform a single frequency band.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function transformBand(\n coeffs,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const isLongBlock = blockMode === 0\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n\n if (isLongBlock) {\n return inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n )\n } else {\n return inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n )\n }\n }\n\n /**\n * Inverse transform using long block.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @param {Object} transformFunc\n * @returns {Float32Array}\n */\n function inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n ) {\n // Unreverse spectral reversal for mid/high bands\n let blockSpecs = coeffs\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(coeffs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = transformFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Prepare output buffer\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n // Copy transformed samples\n for (let i = 0; i < config.size; i++) {\n invBuf[i] = inv[invStart + i]\n }\n\n // Handle overlap-add with previous frame\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, 0)\n\n // Save tail for next frame\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy main samples\n const copyLen = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n overlapBuffer[32 + i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy final samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Inverse transform using short blocks.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n // Extract block coefficients\n let blockSpecs = coeffs.slice(pos, pos + MDCT_SHORT_BLOCK_SIZE)\n\n // Unreverse spectral reversal for mid/high bands\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(blockSpecs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = imdct64.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Copy to intermediate buffer\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n // Overlap-add with previous block\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, start)\n\n // Save tail for next block\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n pos += MDCT_SHORT_BLOCK_SIZE\n }\n\n // Copy final tail samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Transform coefficients back to time domain using inverse MDCT\n * @param {Object} input - Dequantization results\n * @param {Float32Array} input.coefficients - MDCT coefficients (512 samples)\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @returns {Array<Float32Array>} Three reconstructed frequency bands [low, mid, high]\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoeffs = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoeffs,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool,\n config\n )\n })\n }\n}\n\n/**\n * QMF Synthesis Stage - Reconstructs full-spectrum audio from frequency bands\n *\n * Performs two-stage QMF synthesis to reconstruct the full-spectrum signal\n * from three frequency bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * This is the inverse operation of the QMF analysis performed during encoding,\n * combining the separate frequency bands back into a single wideband signal.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes inverse MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfSynthesisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfSynthesisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Reconstruct full-spectrum PCM samples from frequency bands\n * @param {Array<Float32Array>} bands - Three frequency bands [low, mid, high]\n * @returns {Float32Array} Reconstructed PCM samples\n */\n return (bands) => {\n // Apply high band delay compensation\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2], delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n // Second stage synthesis: combine low and mid bands\n const stage2 = qmfSynthesis(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n // First stage synthesis: combine result with high band\n const stage1 = qmfSynthesis(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n\n/**\n * Create ATRAC1 decoding pipeline\n *\n * Constructs a complete decoding pipeline that transforms ATRAC1 compressed format\n * back into PCM audio samples. The pipeline processes quantized data through\n * dequantization, inverse MDCT transform, and QMF synthesis.\n *\n * The returned function can be called repeatedly to decode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Decoding pipeline function that processes quantized frame data\n *\n * @example\n * const decoder = decode(new BufferPool())\n * const result = decoder(quantizedFrame) // Returns reconstructed PCM samples\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantizationStage, imdctStage, qmfSynthesisStage)\n}\n","/**\n * Carta1 Audio Codec - Audio Processing Module\n *\n * High-level audio processing interface that provides stream-based encoding and decoding\n * for ATRAC1 audio format. Handles both mono and stereo audio processing with proper\n * delay compensation and frame management.\n *\n * Key features:\n * - Stream-based processing for large audio files\n * - Automatic delay compensation for codec processing\n * - Support for mono and stereo audio\n * - Progress tracking callbacks\n * - AEA file format creation and parsing\n * - WAV file generation from decoded audio\n */\n\nimport { encode } from '../pipeline/encoder.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n SAMPLES_PER_FRAME,\n SAMPLE_RATE,\n AEA_HEADER_SIZE,\n SOUND_UNIT_SIZE,\n WAV_HEADER_SIZE,\n WAV_BYTES_PER_SAMPLE,\n WAV_BITS_PER_SAMPLE,\n WAV_PCM_MAX_POSITIVE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_DATA_OFFSET,\n} from '../core/constants.js'\nimport { serializeFrame, deserializeFrame, AeaFile } from './serialization.js'\n\n/**\n * Audio processing utility class providing high-level encoding and decoding operations\n */\nexport class AudioProcessor {\n /**\n * Encodes a stream of audio frames to ATRAC1 format\n * @param {AsyncIterable<Float32Array>|AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Audio frame stream\n * @param {Object} [options={}] - Encoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @param {EncoderOptions} [options.encoderOptions] - Encoder configuration options\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @throws {Error} If unsupported channel count is provided\n */\n static async *encodeStream(audioFrames, options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._encodeMonoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else if (channelCount === 2) {\n yield* AudioProcessor._encodeStereoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for encoding mono audio streams\n * @param {AsyncIterable<Float32Array>} audioFrames - Mono audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @private\n */\n static async *_encodeMonoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const encoder = encode(options)\n let frameIndex = 0\n for await (const frame of audioFrames) {\n const result = encoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Internal method for encoding stereo audio streams\n * @param {AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Stereo audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data (left then right)\n * @private\n */\n static async *_encodeStereoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const leftEncoder = encode(options)\n const rightEncoder = encode(options)\n let frameIndex = 0\n\n for await (const [leftFrame, rightFrame] of audioFrames) {\n const leftResult = leftEncoder(leftFrame)\n const rightResult = rightEncoder(rightFrame)\n\n yield leftResult\n yield rightResult\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Decodes a stream of ATRAC1 encoded frames back to PCM audio\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - Decoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @returns {AsyncGenerator<Float32Array>|AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded PCM frames\n * @throws {Error} If unsupported channel count is provided\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const { channelCount = 1, onProgress } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._decodeMonoStream(encodedFrames, onProgress)\n } else if (channelCount === 2) {\n yield* AudioProcessor._decodeStereoStream(encodedFrames, onProgress)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for decoding mono audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Mono encoded frame stream\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<Float32Array>} Stream of decoded mono PCM frames\n * @private\n */\n static async *_decodeMonoStream(encodedFrames, onProgress) {\n const decoder = decode()\n let frameIndex = 0\n\n // Create raw PCM frame stream\n const rawPcmFrames = async function* () {\n for await (const frame of encodedFrames) {\n const result = decoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Internal method for decoding stereo audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Stereo encoded frame stream (interleaved left/right)\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded stereo PCM frame pairs\n * @private\n */\n static async *_decodeStereoStream(encodedFrames, onProgress) {\n const leftDecoder = decode()\n const rightDecoder = decode()\n let frameIndex = 0\n\n const rawPcmFrames = async function* () {\n let leftFrame = null\n let isLeftChannel = true\n\n for await (const frame of encodedFrames) {\n if (isLeftChannel) {\n leftFrame = frame\n } else {\n const rightFrame = frame\n\n // Decode and yield the pair\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n\n isLeftChannel = !isLeftChannel\n }\n\n if (!isLeftChannel && leftFrame) {\n const rightFrame = AudioProcessor._createDummyFrame()\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply stereo delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Converts channel buffer arrays to frame-based stream format\n * @param {Float32Array[]} buffers - Array of channel buffers (1 for mono, 2 for stereo)\n * @param {number} [frameSize=SAMPLES_PER_FRAME] - Frame size in samples\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>} Stream of audio frames\n * @throws {Error} If unsupported channel count is provided\n */\n static *frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n const channelCount = buffers.length\n\n if (channelCount === 1) {\n const [left] = buffers\n for (let i = 0; i < left.length; i += frameSize) {\n const frame = new Float32Array(frameSize)\n const end = Math.min(i + frameSize, left.length)\n for (let j = 0; j < end - i; j++) {\n frame[j] = left[i + j]\n }\n yield frame\n }\n } else if (channelCount === 2) {\n const [left, right] = buffers\n const maxLength = Math.max(left.length, right.length)\n\n for (let i = 0; i < maxLength; i += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n\n const end = Math.min(i + frameSize, maxLength)\n\n for (let j = 0; j < end - i; j++) {\n leftFrame[j] = i + j < left.length ? left[i + j] : 0\n rightFrame[j] = i + j < right.length ? right[i + j] : 0\n }\n\n yield [leftFrame, rightFrame]\n }\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Collects all frames from a stream into an array\n * @param {AsyncIterable} frameStream - Stream of frames to collect\n * @returns {Promise<Array>} Array of all frames from the stream\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * Creates a dummy frame for padding purposes\n * @returns {Object} Empty frame structure\n * @private\n */\n static _createDummyFrame() {\n return {\n nBfu: 0,\n blockModes: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n }\n\n /**\n * Creates an AEA file blob from encoded frames\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - AEA file options\n * @param {string} [options.title='encoded by atrac1.js'] - File title\n * @param {number} [options.channelCount=1] - Number of audio channels\n * @returns {Promise<Blob>} AEA file blob\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const header = AeaFile.createHeader(title, frames.length, channelCount)\n const totalSize =\n header.length + frames.reduce((sum, frame) => sum + frame.length, 0)\n\n const buffer = new Uint8Array(totalSize)\n buffer.set(header, 0)\n\n let offset = header.length\n for (const frame of frames) {\n buffer.set(frame, offset)\n offset += frame.length\n }\n\n return new Blob([buffer], { type: 'application/octet-stream' })\n }\n\n /**\n * Creates a WAV file blob from PCM audio frames\n * @param {Float32Array[]|Float32Array|[Float32Array, Float32Array][]} pcmFrames - PCM audio frames\n * @param {number} [channelCount=1] - Number of audio channels\n * @param {number} [sampleRate=SAMPLE_RATE] - Audio sample rate\n * @returns {Blob} WAV file blob\n * @throws {Error} If unsupported channel count is provided\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n const frames = Array.isArray(pcmFrames) ? pcmFrames : [pcmFrames]\n\n if (channelCount === 1) {\n return AudioProcessor._createMonoWavBlob(frames, sampleRate)\n } else if (channelCount === 2) {\n return AudioProcessor._createStereoWavBlob(frames, sampleRate)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Creates a mono WAV file blob from PCM frames\n * @param {Float32Array[]} frames - Array of mono PCM frames\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Mono WAV file blob\n * @private\n */\n static _createMonoWavBlob(frames, sampleRate) {\n const totalSamples = frames.reduce((sum, frame) => sum + frame.length, 0)\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 1, sampleRate)\n\n // PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const frame of frames) {\n for (let i = 0; i < frame.length; i++) {\n const sample = Math.max(-1, Math.min(1, frame[i]))\n view.setInt16(\n offset,\n sample < 0\n ? sample * WAV_PCM_MAX_NEGATIVE\n : sample * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Creates a stereo WAV file blob from PCM frame pairs\n * @param {[Float32Array, Float32Array][]} framePairs - Array of stereo PCM frame pairs\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Stereo WAV file blob\n * @private\n */\n static _createStereoWavBlob(framePairs, sampleRate) {\n const totalSamples = framePairs.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE * 2\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 2, sampleRate)\n\n // Interleaved PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const [leftFrame, rightFrame] of framePairs) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let i = 0; i < frameLength; i++) {\n const leftSample = i < leftFrame.length ? leftFrame[i] : 0\n const rightSample = i < rightFrame.length ? rightFrame[i] : 0\n const leftClipped = Math.max(-1, Math.min(1, leftSample))\n const rightClipped = Math.max(-1, Math.min(1, rightSample))\n view.setInt16(\n offset,\n leftClipped < 0\n ? leftClipped * WAV_PCM_MAX_NEGATIVE\n : leftClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n view.setInt16(\n offset,\n rightClipped < 0\n ? rightClipped * WAV_PCM_MAX_NEGATIVE\n : rightClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Writes WAV file header to DataView\n * @param {DataView} view - DataView to write to\n * @param {number} totalSamples - Total number of samples\n * @param {number} channelCount - Number of audio channels\n * @param {number} sampleRate - Audio sample rate\n * @private\n */\n static _writeWavHeader(view, totalSamples, channelCount, sampleRate) {\n const byteRate = sampleRate * channelCount * WAV_BYTES_PER_SAMPLE\n const blockAlign = channelCount * WAV_BYTES_PER_SAMPLE\n const dataSize = totalSamples * blockAlign\n const fileSize = WAV_DATA_OFFSET + dataSize\n\n let pos = 0\n\n // Helper function to write ASCII strings\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i))\n }\n }\n\n // RIFF header\n writeString(pos, 'RIFF')\n pos += 4\n view.setUint32(pos, fileSize, true)\n pos += 4\n writeString(pos, 'WAVE')\n pos += 4\n\n // fmt chunk\n writeString(pos, 'fmt ')\n pos += 4\n view.setUint32(pos, 16, true) // chunk size\n pos += 4\n view.setUint16(pos, 1, true) // PCM format\n pos += 2\n view.setUint16(pos, channelCount, true)\n pos += 2\n view.setUint32(pos, sampleRate, true)\n pos += 4\n view.setUint32(pos, byteRate, true)\n pos += 4\n view.setUint16(pos, blockAlign, true)\n pos += 2\n view.setUint16(pos, WAV_BITS_PER_SAMPLE, true) // bits per sample\n pos += 2\n\n // data chunk\n writeString(pos, 'data')\n pos += 4\n view.setUint32(pos, dataSize, true)\n }\n\n /**\n * Parses an AEA file blob to extract header info and frame data\n * @param {Blob} blob - AEA file blob to parse\n * @returns {Promise<Object>} Parsed AEA file data\n * @returns {Object} returns.info - AEA file header information\n * @returns {Uint8Array[]} returns.frameData - Array of frame data buffers\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n\n const frameData = []\n for (let i = AEA_HEADER_SIZE; i < buffer.byteLength; i += SOUND_UNIT_SIZE) {\n const frame = new Uint8Array(buffer.slice(i, i + SOUND_UNIT_SIZE))\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n }\n\n return { info, frameData }\n }\n\n /**\n * Creates a stream of deserialized frames from binary frame data\n * @param {Uint8Array[]} frameData - Array of binary frame data\n * @returns {Generator<Object>} Stream of deserialized frame objects\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * Assembles PCM frames into a continuous buffer\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames - Array of PCM frames\n * @param {number} channelCount - Number of audio channels\n * @returns {Float32Array} Continuous PCM buffer (interleaved for stereo)\n * @throws {Error} If unsupported channel count is provided\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n const totalSamples = pcmFrames.reduce(\n (sum, frame) => sum + frame.length,\n 0\n )\n const pcm = new Float32Array(totalSamples)\n let offset = 0\n for (const frame of pcmFrames) {\n pcm.set(frame, offset)\n offset += frame.length\n }\n return pcm\n } else if (channelCount === 2) {\n const totalSamples = pcmFrames.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n const pcm = new Float32Array(totalSamples * 2)\n\n let pcmOffset = 0\n for (const [leftFrame, rightFrame] of pcmFrames) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let j = 0; j < frameLength; j++) {\n pcm[pcmOffset * 2] = j < leftFrame.length ? leftFrame[j] : 0\n pcm[pcmOffset * 2 + 1] = j < rightFrame.length ? rightFrame[j] : 0\n pcmOffset++\n }\n }\n return pcm\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from '../io/serialization.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from '../io/processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createWavBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n"],"names":["SAMPLE_RATE","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","table","Float64Array","i","Math","sin","PI","QMF_DELAY","QMF_COEFFS","Float32Array","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MDCT_BAND_CONFIGS","size","windowStart","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","WORD_LENGTH_BITS","SCALE_FACTORS","pow","INV_POWER_OF_TWO","maxBits","b","packBits","buffer","bitPosition","value","bitCount","byteIndex","floor","bitOffset","bitsWritten","length","bitsAvailable","bitsToWrite","min","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","view","DataView","bfuIndex","indexOf","nBfu","header","blockModes","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","Error","concat","byteOffset","byteLength","getUint16","bfuSize","coefficients","j","push","AeaFile","_classCallCheck","key","title","arguments","undefined","frameCount","channelCount","set","titleBytes","TextEncoder","encode","subarray","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","this","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","metadata","default","name","description","range","step","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","meta","throwError","msg","pipe","context","_len","stages","Array","_key","functions","map","stage","input","reduce","fn","reverseSpectrum","spectrum","reversalBuffers","reversed","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","offset","newDelay","slice","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","real","imag","cache","_cache","log2n","log2","bitRev","Uint32Array","cosTbl","sinTbl","angle","c","cos","invm","hypot","needCopyBack","r","im","t","i1","er","ei","tr","ti","e0","o0","er0","ei0","tr0","ti0","e1","o1","tr1","ti1","er1","ei1","stride","half","k","cr","sr","orr","oii","Map","MDCTBase","_createClass","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_callSuper","_inherits","_mdctBuffers$this$fft","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","i4","fft","re","IMDCT","_mdctBuffers$this$fft2","_buffers$real2","_buffers$imag2","r1","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w1","w2","p","quantize","scaleFactorIndex","out","quantRange","normFactor","hi","lo","x","y","dequantize","quantized","scaleFactor","deq","allocateBits","bfuData","bfuSizes","maxBfuCount","usedBFU","rdoResult","activeBfuCount","remainingBits","scaleFactorTable","wordLengths","heapIndices","heapPriorities","deltaDistPerCoeff","currentWl","nextWl","sfi","bits1","bits2","sz","findScaleFactor","deltaBits","ddPerCoeff","siftDown","bfu","cur","nxt","cost","popRoot","nxt2","deltaBits2","distributeBitsRDO","FRAME_BITS","bfuCount","allocation","maxAmplitude","a","abs","index","ceil","last","pop","startIndex","heapSize","idxVal","prVal","l","maxI","maxP","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","mdctOverlap","imdctOverlap","detectTransient","currentCoeffs","prevCoeffs","threshold","features","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","log10","calculateEnergyChange","calculateSpectralFeatures","transientScore","fluxContribution","flatnessContribution","hfContribution","log1p","energyContribution","calculateTransientScore","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","fftSizes","bandSamples","bandIndex","samples","copyLen","performFFT","transient","mdctStage","_context$bufferPool3","overlapBuffers","TRANSFORM_FUNCS","transformBand","blockMode","overlapBuffer","config","transformFunc","mdctSize","mdctInput","applyTailWindowing","transform","transformLongBlock","numBlocks","block","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","quantizationStage","_groupIntoBFUs","coeffIndex","band","bandStart","bandSize","bandEnd","startPositions","startPos","endPos","srcStart","srcEnd","groupIntoBFUs","_allocateBits","selectedBfuCount","data","wordLength","dequantizationStage","position","dequantized","imdctStage","blockSpecs","inv","invStart","invBuf","prevBuf","dstPart","inverseLongBlock","start","pos","inverseShortBlocks","bandCoeffs","offsets","extractBandCoefficients","qmfSynthesisStage","Symbol","iterator","o","toStringTag","prototype","Generator","u","create","_regeneratorDefine2","G","v","d","bind","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","enumerable","configurable","writable","_invoke","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","_wrapAsyncGenerator","AsyncGenerator","apply","resume","_OverloadYield","Promise","resolve","then","settle","reject","next","arg","_awaitAsyncGenerator","_asyncGeneratorDelegate","pump","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","AudioProcessor","_x","audioFrames","_callee","_options$channelCount","onProgress","encoderOptions","_context","_regeneratorValues","_encodeMonoStream","_encodeStereoStream","_callee2","encoder","frameIndex","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","frame","result","_t","_context2","_callee3","leftEncoder","rightEncoder","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","_step2$value","leftFrame","rightFrame","leftResult","rightResult","_t2","_context3","_x2","encodedFrames","_callee4","_options$channelCount2","_context4","_decodeMonoStream","_decodeStereoStream","_callee6","decoder","rawPcmFrames","_context6","_ref","_callee5","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_t3","_context5","_callee8","leftDecoder","rightDecoder","_context8","_ref2","_callee7","isLeftChannel","_iteratorAbruptCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_rightFrame","_leftResult","_rightResult","_t4","_context7","_createDummyFrame","frameSize","_callee9","_buffers","left","end","_buffers2","_left","right","maxLength","_end","_j","_context9","_collectFrames","_asyncToGenerator","_callee0","frameStream","frames","_iteratorAbruptCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","_t5","_context0","_x3","_createAeaBlob","_callee1","_options$title","_options$channelCount3","_iteratorAbruptCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","totalSize","_frames","_frame","_t6","_args1","_context1","createHeader","sum","Blob","type","_x4","pcmFrames","sampleRate","isArray","_createMonoWavBlob","_createStereoWavBlob","totalSamples","ArrayBuffer","_writeWavHeader","_step7","_iterator7","sample","setInt16","framePairs","_ref3","_ref4","_step8","_iterator8","_step8$value","frameLength","leftSample","rightSample","leftClipped","rightClipped","byteRate","blockAlign","dataSize","fileSize","writeString","string","setUint8","charCodeAt","_parseAeaBlob","_callee10","blob","info","_context10","arrayBuffer","parseHeader","_x5","deserializedFrameStream","_iterator9","_step9","_t7","_context11","_step0","pcm","_iterator0","_step1","_ref5","_ref6","pcmOffset","_iterator1","_step1$value","asyncGeneratorStep","_next","_throw","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","frameBufferToFrames","encodeStream","collectFrames","createAeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","decodedFrames","wavBlob","decodeStream","createWavBlob","self","onmessage","_e$data","jobId","parseAeaBlob","postMessage","message"],"sourceRoot":""}
1
+ {"version":3,"file":"carta1-worker.min.js","mappings":"SAKaA,EAAc,MAKdC,EAAY,IAAIC,WAAW,CAAC,EAAM,EAAM,EAAM,IAC9CC,EAAkB,KAOlBC,EAAkB,IAUlBC,EAAgB,IAAIC,WAAW,CAC1C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1E,GAAI,GAAI,GAAI,GAAI,KAILC,EAAc,IAAID,WAAW,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAC1DE,EAAsB,IAAIF,WAAW,CAAC,GAAI,GAAI,KAG9CG,EAAiB,IAAIH,WAAW,CAC3C,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IACxE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,MAGCI,EAAkB,IAAIJ,WAAW,CAC5C,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GACzE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,MAKCK,EAAgB,IAChBC,EAAiB,IAGjBC,EAAgB,WAE3B,IADA,IAAMC,EAAQ,IAAIC,aAAa,IACtBC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAME,GAAKC,KAAKC,KAAMF,EAAI,IAAOC,KAAKE,GAAM,IAE9C,OAAOL,CACT,CAN6B,GAUhBM,EAAY,GAIZC,EAAa,IAAIC,aAAa,EACxC,aAAgB,aAAgB,aAAgB,aAAe,aAC/D,cAAgB,YAAc,YAAc,cAAgB,aAC5D,aAAe,aAAe,cAAiB,UAAY,YAC5D,YAAc,YAAc,WAAa,UAAY,YACpD,YAAc,WAAa,UAAY,YAI7BC,EAAc,WAEzB,IADA,IAAMC,EAAS,IAAIF,aAfG,IAgBbN,EAAI,EAAGA,EAAI,GAAIA,IACtBQ,EAAOR,GAAqB,EAAhBK,EAAWL,GACvBQ,EAAO,GAAKR,GAAqB,EAAhBK,EAAWL,GAE9B,OAAOQ,CACT,CAP2B,GAUdC,EAAY,WAEvB,IADA,IAAMC,EAAO,IAAIJ,aAAa,IACrBN,EAAI,EAAGA,EAAI,GAAIA,IACtBU,EAAKV,GAAKO,EAAe,EAAJP,GAEvB,OAAOU,CACT,CANyB,GAQZC,EAAW,WAEtB,IADA,IAAMC,EAAM,IAAIN,aAAa,IACpBN,EAAI,EAAGA,EAAI,GAAIA,IACtBY,EAAIZ,GAAKO,EAAe,EAAJP,EAAQ,GAE9B,OAAOY,CACT,CANwB,GAcXC,EAAoB,CAC/B,CAAEC,KAAM,IAAKC,YAAa,IAC1B,CAAED,KAAM,IAAKC,YAAa,IAC1B,CAAED,KAAM,IAAKC,YAAa,MAGfC,EAAwB,GACxBC,EAAoB,GACpBC,EAAwB,GAMxBC,EAAuB,MACvBC,EAAuB,MAWvBC,EAAmB,IAAI/B,WAAW,CAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAExCgC,EAAiB,WAE5B,IADA,IAAMxB,EAAQ,IAAIC,aAAa,IACtBC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAME,GAAKC,KAAKsB,IAAI,EAAKvB,EAAI,EAAM,IAErC,OAAOF,CACT,CAN8B,GASjB0B,EAAoB,WAG/B,IAFA,IAAMC,EAAUJ,EAdmB,IAe7BvB,EAAQ,IAAIC,aAAa0B,EAAU,GAChCC,EAAI,EAAGA,GAAKD,EAASC,IAC5B5B,EAAM4B,GAAKzB,KAAKsB,IAAI,GAAIG,GAE1B,OAAO5B,CACT,CAPiC,GC1I1B,SAAS6B,EAASC,EAAQC,EAAaC,EAAOC,GACnD,GAAiB,IAAbA,EAAJ,CAEA,IAAIC,EAAY/B,KAAKgC,MAAMJ,EAAc,GACrCK,EAAYL,EAAc,EAE9BC,IAAU,GAAKC,GAAY,EAG3B,IADA,IAAII,EAAc,EACXA,EAAcJ,GAAYC,EAAYJ,EAAOQ,QAAQ,CAC1D,IAAMC,EAAgB,EAAIH,EACpBI,EAAcrC,KAAKsC,IAAIR,EAAWI,EAAaE,GAG/CG,EAAaV,GADLC,EAAWI,EAAcG,GACA,GAAKA,GAAe,EAErDG,GAAS,GAAKH,GAAe,GAAOD,EAAgBC,EAC1DV,EAAOI,GACJJ,EAAOI,IAAcS,EAASD,GAAcH,EAAgBC,EAE/DH,GAAeG,EACfN,IACAE,EAAY,CACd,CAtB0B,CAuB5B,CASO,SAASQ,EAAWd,EAAQC,EAAaE,GAC9C,GAAiB,IAAbA,EAAgB,OAAO,EAM3B,IAJA,IAAIC,EAAY/B,KAAKgC,MAAMJ,EAAc,GACrCK,EAAYL,EAAc,EAC1BC,EAAQ,EAEHa,EAAW,EAAGA,EAAWZ,GAAYC,EAAYJ,EAAOQ,QAAU,CACzE,IAAMC,EAAgB,EAAIH,EACpBU,EAAa3C,KAAKsC,IAAIR,EAAWY,EAAUN,GAE3CI,GAAQ,GAAKG,GAAc,EAGjCd,EAASA,GAASc,EAFJhB,EAAOI,IAAeK,EAAgBO,EAAeH,EAGnEE,GAAYC,EACZZ,IACAE,EAAY,CACd,CAEA,OAAOJ,CACT,CASO,SAASe,EAAiBjB,EAAQC,EAAaE,GACpD,IAAMD,EAAQY,EAAWd,EAAQC,EAAaE,GAE9C,OAAOD,GADS,GAAMC,EAAW,EACPD,GAAS,GAAKC,GAAYD,CACtD,C,2rDCzCO,SAASgB,EAAeC,GAC7B,IAAMnB,EAAS,IAAI1C,WAAWE,GACxB4D,EAAO,IAAIC,SAASrB,EAAOA,QAG3BsB,EAAW3D,EAAY4D,QAAQJ,EAAUK,MACzCC,EACF,EAAIN,EAAUO,WAAW,IAAO,GAChC,EAAIP,EAAUO,WAAW,IAAO,GAChC,EAAIP,EAAUO,WAAW,IAAO,GACjCJ,GAAY,EAEfF,EAAKO,UAAU,EAAGF,GAAQ,GAI1B,IAHA,IAAIxB,EFgF2B,GE7EtB7B,EAAI,EAAGA,EAAI+C,EAAUK,KAAMpD,IAClC2B,EACEC,EACAC,EACAkB,EAAUS,kBAAkBxD,GF0EI,GEvElC6B,GFuEkC,EEnEpC,IAAK,IAAI7B,EAAI,EAAGA,EAAI+C,EAAUK,KAAMpD,IAClC2B,EACEC,EACAC,EACAkB,EAAUU,mBAAmBzD,GFgEI,GE7DnC6B,GF6DmC,EEzDrC,IAAK,IAAI7B,EAAI,EAAGA,EAAI+C,EAAUK,KAAMpD,IAAK,CACvC,IAAM0D,EAAgBrC,EAAiB0B,EAAUS,kBAAkBxD,IACnE,GAAI0D,EAAgB,EAAG,CACrB,IACsCC,EADiBC,EAAAC,EAAlCd,EAAUe,sBAAsB9D,IACf,IAAtC,IAAA4D,EAAAG,MAAAJ,EAAAC,EAAAI,KAAAC,MAAwC,KAA7BC,EAAWP,EAAA7B,MAGpBH,EAASC,EAAQC,EADfqC,EAAc,EAAIA,GAAe,GAAKR,GAAiBQ,EACpBR,GACrC7B,GAAe6B,CACjB,CAAC,OAAAS,GAAAP,EAAAQ,EAAAD,EAAA,SAAAP,EAAAS,GAAA,CACH,CACF,CAOA,OAJAzC,EAAOxC,KAAuB,EAC9BwC,EAAOxC,KAAuB,EAC9BwC,EAAOxC,KAAuB,EAEvBwC,CACT,CAaO,SAAS0C,EAAiB1C,GAC/B,GAAIA,EAAOQ,SAAWhD,EACpB,MAAM,IAAImF,MAAM,iBAADC,OAAkBpF,EAAe,WAmBlD,IAhBA,IAGMiE,EAHO,IAAIJ,SAASrB,EAAOA,OAAQA,EAAO6C,WAAY7C,EAAO8C,YAG/CC,UAAU,GAAG,GAC3BrB,EAAa,CACjB,GAAMD,GAAU,GAAM,GACtB,GAAMA,GAAU,GAAM,GACtB,GAAMA,GAAU,GAAM,IAGlBD,EAAO7D,EADK8D,GAAU,EAAK,GAG7BxB,EFM2B,GEHzB2B,EAAoB,IAAIlE,WAAW8D,GAChCpD,EAAI,EAAGA,EAAIoD,EAAMpD,IACxBwD,EAAkBxD,GAAK0C,EACrBd,EACAC,EFAgC,GEGlCA,GFHkC,EEQpC,IADA,IAAM4B,EAAqB,IAAInE,WAAW8D,GACjCpD,EAAI,EAAGA,EAAIoD,EAAMpD,IACxByD,EAAmBzD,GAAK0C,EACtBd,EACAC,EFViC,GEanCA,GFbmC,EEkBrC,IADA,IAAMiC,EAAwB,GACrB9D,EAAI,EAAGA,EAAIoD,EAAMpD,IAAK,CAC7B,IAAM0D,EAAgBrC,EAAiBmC,EAAkBxD,IACnD4E,EAAUvF,EAAcW,GACxB6E,EAAe,IAAIvF,WAAWsF,GAEpC,GAAIlB,EAAgB,EAClB,IAAK,IAAIoB,EAAI,EAAGA,EAAIF,EAASE,IAC3BD,EAAaC,GAAKjC,EAAiBjB,EAAQC,EAAa6B,GACxD7B,GAAe6B,EAInBI,EAAsBiB,KAAKF,EAC7B,CAEA,MAAO,CACLzB,KAAAA,EACAK,mBAAAA,EACAD,kBAAAA,EACAM,sBAAAA,EACAR,WAAAA,EAEJ,CAMO,IAAM0B,EAAO,kB,EAAA,SAAAA,K,4FAAAC,CAAA,KAAAD,EAAA,E,EAAA,EAAAE,IAAA,eAAApD,MAQlB,WAAkE,IAA9CqD,EAAKC,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,GAAIE,EAAUF,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EAAGG,EAAYH,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EACvD/B,EAAS,IAAInE,WAAWC,GACxB6D,EAAO,IAAIC,SAASI,EAAOzB,QAGjCyB,EAAOmC,IAAIvG,EAAW,GAGtB,IAAMwG,GAAa,IAAIC,aAAcC,OAAOR,GAY5C,OAXA9B,EAAOmC,IACLC,EAAWG,SAAS,EAAG3F,KAAKsC,IAAIkD,EAAWrD,OAAQyD,MF3LzB,GEgM5B7C,EAAK8C,UF9L6B,IE8LKR,GAAY,GAGnDjC,EFhMoC,KEgMDkC,EAE5BlC,CACT,GAEA,CAAA6B,IAAA,cAAApD,MASA,SAAmBuB,GACjB,GAAIA,EAAOjB,SAAWjD,EACpB,MAAM,IAAIoF,MAAM,kBAADC,OAAmBrF,EAAe,WAInD,IAAK,IAAIa,EAAI,EAAGA,EAAIf,EAAUmD,OAAQpC,IACpC,GAAIqD,EAAOrD,KAAOf,EAAUe,GAC1B,MAAM,IAAIuE,MAAM,oBAIpB,IAAMvB,EAAO,IAAIC,SACfI,EAAOzB,OACPyB,EAAOoB,WACPpB,EAAOqB,YAIHqB,EAAW1C,EAAOF,QAAQ,EFpOJ,GEqOtB6C,GACU,IAAdD,EFrOwB,IEqOWA,EFtOT,EE+O5B,MAAO,CAAEZ,OARK,IAAIc,aAAcC,OAC9B7C,EAAOuC,SFxOmB,IEwO2BI,IAOvCV,WAHGtC,EAAKmD,UF1OU,KE0OwB,GAG9BZ,aAFPlC,EF1Oe,KE6OtC,K,EAvEkB,O,yFAuEjB,CAvEiB,G,43EC9KpB,IAGM+C,EAAc,WAsDlB,O,EAjDA,SAAAA,IAA0B,IAAdC,EAAOjB,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,G,4FAACH,CAAA,KAAAmB,GACtBE,KAAKC,OAAS,CACZC,sBAAuB,EACvBC,sBAAuB,IACvBC,uBAAwB,EACxBC,eAAgB,GAGlBL,KAAKM,SAAW,CACdJ,sBAAuB,CACrBK,QAASP,KAAKC,OAAOC,sBACrBM,KAAM,+BACNC,YACE,gNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERR,sBAAuB,CACrBI,QAASP,KAAKC,OAAOE,sBACrBK,KAAM,+BACNC,YACE,iNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERP,uBAAwB,CACtBG,QAASP,KAAKC,OAAOG,uBACrBI,KAAM,gCACNC,YACE,iNACFC,MAAO,CAAC,IAAM,GACdC,KAAM,KAERN,eAAgB,CACdE,QAASP,KAAKC,OAAOI,eACrBG,KAAM,sBACNC,YACE,+MACFC,MAAO,CAAC,GAAK,GACbC,KAAM,MAKNZ,GACFC,KAAKY,WAAWb,EAEpB,G,EAEA,EAAAnB,IAAA,aAAApD,MAIA,SAAWuE,GACT,IAAK,IAALc,EAAA,EAAAC,EAA2BC,OAAOC,QAAQjB,GAAQc,EAAAC,EAAAhF,OAAA+E,IAAE,CAA/C,IAAAI,EAAAC,EAAAJ,EAAAD,GAAA,GAAOjC,EAAGqC,EAAA,GAAEzF,EAAKyF,EAAA,GAChBrC,KAAOoB,KAAKC,QACdD,KAAKmB,SAASvC,EAAKpD,EAEvB,CACF,GAEA,CAAAoD,IAAA,WAAApD,MAMA,SAASoD,EAAKpD,GACZ,KAAMoD,KAAOoB,KAAKM,UAChB,MAAM,IAAIrC,MAAM,mBAADC,OAAoBU,IAGrC,IACAwC,EAAAF,EADalB,KAAKM,SAAS1B,GACH8B,MAAK,GAAtBzE,EAAGmF,EAAA,GAAEC,EAAGD,EAAA,GAEf,GAAI5F,EAAQS,GAAOT,EAAQ6F,EACzB,MAAM,IAAIpD,MAAM,aAADC,OACAU,EAAG,qBAAAV,OAAoBjC,EAAG,SAAAiC,OAAQmD,EAAG,UAAAnD,OAAS1C,IAI/DwE,KAAKC,OAAOrB,GAAOpD,CACrB,GAEA,CAAAoD,IAAA,WAAApD,MAMA,SAASoD,GACP,KAAMA,KAAOoB,KAAKC,QAChB,MAAM,IAAIhC,MAAM,mBAADC,OAAoBU,IAErC,OAAOoB,KAAKC,OAAOrB,EACrB,GAAC,CAAAA,IAAA,wBAAA0C,IAED,WACE,OAAOtB,KAAKC,OAAOC,qBACrB,GAAC,CAAAtB,IAAA,wBAAA0C,IAED,WACE,OAAOtB,KAAKC,OAAOE,qBACrB,GAAC,CAAAvB,IAAA,yBAAA0C,IAED,WACE,OAAOtB,KAAKC,OAAOG,sBACrB,GAAC,CAAAxB,IAAA,iBAAA0C,IAED,WACE,OAAOtB,KAAKC,OAAOI,cACrB,GAAC,CAAAzB,IAAA,cAAApD,MAED,SAAYoD,GACV,OAAOoB,KAAKM,SAAS1B,EACvB,GAAC,CAAAA,IAAA,iBAAApD,MAED,WACE,OAAA+F,EAAA,GAAYvB,KAAKM,SACnB,GAAC,CAAA1B,IAAA,QAAApD,MAED,WACE,IAAK,IAALgG,EAAA,EAAAC,EAA0BV,OAAOC,QAAQhB,KAAKM,UAASkB,EAAAC,EAAA3F,OAAA0F,IAAE,CAApD,IAAAE,EAAAR,EAAAO,EAAAD,GAAA,GAAO5C,EAAG8C,EAAA,GAAEC,EAAID,EAAA,GACnB1B,KAAKC,OAAOrB,GAAO+C,EAAI,OACzB,CACF,GAAC,CAAA/C,IAAA,WAAApD,MAED,WACE,MAAO,CACLyE,OAAMsB,EAAA,GAAOvB,KAAKC,QAClBK,SAAQiB,EAAA,GAAOvB,KAAKM,UAExB,M,yFAAC,CAzIiB,GCGb,SAASsB,EAAWC,GACzB,MAAM,IAAI5D,MAAM4D,EAClB,CAQO,SAASC,EAAKC,GAAoB,QAAAC,EAAAlD,UAAAhD,OAARmG,EAAM,IAAAC,MAAAF,EAAA,EAAAA,EAAA,KAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAANF,EAAME,EAAA,GAAArD,UAAAqD,GACrC,IAAMC,EAAYH,EAAOI,IAAI,SAACC,GAAK,OAAKA,EAAMP,EAAQ,GAEtD,OAAO,SAACQ,GACN,OAAOH,EAAUI,OAAO,SAAChH,EAAOiH,GAAE,OAAKA,EAAGjH,EAAM,EAAE+G,EACpD,CACF,CAYO,SAASG,EAAgBC,EAAUC,GAExC,IADA,IAAMC,EAAWD,EAAgBD,EAAS7G,QACjCpC,EAAI,EAAGA,EAAIiJ,EAAS7G,OAAQpC,IACnCmJ,EAASnJ,GAAKiJ,EAASA,EAAS7G,OAAS,EAAIpC,GAE/C,OAAOmJ,CACT,CC7BO,SAASC,EAAYP,EAAOQ,GAAkC,IAAAC,EAAAC,EAAvBC,EAAcpE,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvDqE,EAAcZ,EAAMzG,OACpBsH,EAAeD,GAAe,EAE9BE,EACgC,QADtBL,EACdE,SAAqB,QAAPD,EAAdC,EAAgBI,aAAK,IAAAL,OAAA,EAArBA,EAAwBE,UAAY,IAAAH,EAAAA,EACpCpB,EAAW,qCAAD1D,OAAsCiF,EAAW,kBAC7DE,EAAWnE,IAAI6D,GACfM,EAAWnE,IAAIqD,EAAOQ,EAAUjH,QAKhC,IAHA,IAAMyH,EAAU,IAAIvJ,aAAaoJ,GAC3BI,EAAW,IAAIxJ,aAAaoJ,GAEzB1J,EAAI,EAAGA,EAAI0J,EAAc1J,IAAK,CAMrC,IALA,IAAI+J,EAAU,EACVC,EAAS,EACPC,EAAa,EAAJjK,EAGN8E,EAAI,EAAGA,EAAI,GAAIA,IACtBiF,GAAWJ,EAAWM,EAAS,GAAS,EAAJnF,GAASrE,EAASqE,GACtDkF,GAAUL,EAAWM,EAAS,GAAS,EAAJnF,GAASnE,EAAQmE,GAGtD+E,EAAQ7J,GAAK+J,EAAUC,EACvBF,EAAS9J,GAAK+J,EAAUC,CAC1B,CAIA,MAAO,CAAEH,QAAAA,EAASC,SAAAA,EAAUI,SADXP,EAAWQ,OAAM,IAEpC,CAUO,SAASC,EACdP,EACAC,EACAT,GAEA,IAAAgB,EAAAC,EADAd,EAAcpE,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KAEXmF,EAAgBV,EAAQzH,OACxBsH,EAA+B,EAAhBa,EAEfZ,EACiC,QADvBU,EACdb,SAAqB,QAAPc,EAAdd,EAAgBI,aAAK,IAAAU,OAAA,EAArBA,EAAwBZ,UAAa,IAAAW,EAAAA,EACrCnC,EAAW,sCAAD1D,OAC8BkF,EAAY,kBAEtDC,EAAWnE,IAAI6D,GAGf,IAAK,IAAIrJ,EAAI,EAAGA,EAAIuK,EAAevK,IAAK,CACtC,IAAMwK,EAAMX,EAAQ7J,GACdyK,EAAOX,EAAS9J,GAChBiK,EAAS7J,EAAgB,EAAJJ,EAC3B2J,EAAWM,GAAU,IAAOO,EAAMC,GAClCd,EAAWM,EAAS,GAAK,IAAOO,EAAMC,EACxC,CAKA,IAHA,IAAMC,EAAS,IAAIpK,aAAaoJ,GAGvB1J,EAAI,EAAGA,EAAIuK,EAAevK,IAAK,CAKtC,IAJA,IAAMiK,EAAa,EAAJjK,EACX2K,EAAU,EACVC,EAAU,EAEL9F,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAM+F,EAAMZ,EAAa,EAAJnF,EACrB6F,GAAWhB,EAAWkB,GAAOpK,EAASqE,GACtC8F,GAAWjB,EAAWkB,EAAM,GAAKlK,EAAQmE,EAC3C,CAEA4F,EAAW,EAAJ1K,GAAS4K,EAChBF,EAAW,EAAJ1K,EAAQ,GAAK2K,CACtB,CAGA,MAAO,CAAED,OAAAA,EAAQR,SADAP,EAAWQ,OAAM,IAEpC,C,wsBCjGO,IAAMW,GAAG,kB,EAAA,SAAAA,K,4FAAA7F,CAAA,KAAA6F,EAAA,E,EAAA,EAAA5F,IAAA,MAAApD,MAMd,SAAWiJ,EAAMC,GACf,IAAMlK,EAAOiK,EAAK3I,OAClB,GAAa,IAATtB,EAAJ,CAKA,IAHA,IAAMmK,EAAOhL,KAAKiL,KAAKpK,GAGdd,EAAI,EAAGA,EAAIc,EAAMd,IAAK,CAG7B,IAFA,IAAImJ,EAAW,EACXgC,EAAOnL,EACF0B,EAAI,EAAGA,EAAIuJ,EAAMvJ,IACxByH,EAAYA,GAAY,EAAa,EAAPgC,EAC9BA,IAAS,EAEX,GAAIhC,EAAWnJ,EAAG,CACf,IAAAoL,EAA4B,CAACL,EAAK5B,GAAW4B,EAAK/K,IAAjD+K,EAAK/K,GAAEoL,EAAA,GAAEL,EAAK5B,GAASiC,EAAA,OAAAC,EACI,CAACL,EAAK7B,GAAW6B,EAAKhL,IAAjDgL,EAAKhL,GAAEqL,EAAA,GAAEL,EAAK7B,GAASkC,EAAA,EAC3B,CACF,CAGA,IAAK,IAAIC,EAAS,EAAGA,GAAUxK,EAAMwK,IAAW,EAM9C,IALA,IAAMC,EAAaD,GAAU,EACvBE,GAAU,EAAIvL,KAAKE,GAAMmL,EACzBG,EAAQxL,KAAKyL,IAAIF,GACjBG,EAAQ1L,KAAKC,IAAIsL,GAEdI,EAAQ,EAAGA,EAAQ9K,EAAM8K,GAASN,EAIzC,IAHA,IAAIO,EAAc,EACdC,EAAc,EAETC,EAAI,EAAGA,EAAIR,EAAYQ,IAAK,CACnC,IAAMC,EAAYJ,EAAQG,EACpBE,EAAWD,EAAYT,EAEvBW,EAAWnB,EAAKiB,GAChBG,EAAWnB,EAAKgB,GAChBI,EAAUrB,EAAKkB,GACfI,EAAUrB,EAAKiB,GAEfK,EAAQF,EAAUP,EAAcQ,EAAUP,EAC1CS,EAAQH,EAAUN,EAAcO,EAAUR,EAEhDd,EAAKiB,GAAaE,EAAWI,EAC7BtB,EAAKgB,GAAaG,EAAWI,EAC7BxB,EAAKkB,GAAYC,EAAWI,EAC5BtB,EAAKiB,GAAYE,EAAWI,EAE5B,IAAMC,EAAWX,EAAcJ,EAAQK,EAAcH,EACrDG,EAAcD,EAAcF,EAAQG,EAAcL,EAClDI,EAAcW,CAChB,CAjDkB,CAoDxB,K,EA5Dc,O,yFA4Db,CA5Da,G,29DCShB,IAGMC,GAAQC,GACZ,SAAAD,EAAY3L,EAAM6L,GAAO1H,GAAA,KAAAwH,GACvBnG,KAAKxF,KAAOA,EACZwF,KAAKsG,SAAW9L,GAAQ,EACxBwF,KAAKuG,YAAc/L,GAAQ,EAC3BwF,KAAKwG,QAAUxG,KAAKsG,UAAY,EAEhC,IAAMG,EAAS,EAAM9M,KAAKE,IAAO,EAAMW,GACjCkM,EAAS,EAAM/M,KAAKE,GAAMW,EAC1BmM,EAAYhN,KAAKiN,KAAKP,EAAQ7L,GAEpCwF,KAAK6G,YAAc,IAAIpN,aAAauG,KAAKsG,UACzC,IAAK,IAAI5M,EAAI,EAAGA,EAAIsG,KAAKuG,YAAa7M,IAAK,CACzC,IAAMwL,EAAQwB,EAAQhN,EAAI+M,EAC1BzG,KAAK6G,YAAgB,EAAJnN,GAASiN,EAAYhN,KAAKyL,IAAIF,GAC/ClF,KAAK6G,YAAgB,EAAJnN,EAAQ,GAAKiN,EAAYhN,KAAKC,IAAIsL,EACrD,CACF,GAMW4B,GAAI,WACf,SAAAA,EAAYtM,EAAM6L,GAAO,OAAA1H,GAAA,KAAAmI,GAAAC,GAAA,KAAAD,EAAA,CACjBtM,EAAM6L,GACd,CAEA,OAAAW,GAAAF,EALwBX,IAKxBC,GAAAU,EAAA,EAAAlI,IAAA,YAAApD,MAMA,SAAU+G,GAA2B,IAAA0E,EAAAC,EAAAC,EAApBC,EAAWtI,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvBuI,EACuB,QADhBJ,EACXG,aAAW,EAAXA,EAAcpH,KAAKwG,gBAAQ,IAAAS,EAAAA,EAC3BrF,EAAW,+BAAD1D,OAAgC8B,KAAKwG,QAAO,kBAClD/B,EACS,QADLyC,EACRG,aAAO,EAAPA,EAAS5C,YAAI,IAAAyC,EAAAA,EACbtF,EAAW,+BAAD1D,OACuB8B,KAAKwG,QAAO,uBAEzC9B,EACS,QADLyC,EACRE,aAAO,EAAPA,EAAS3C,YAAI,IAAAyC,EAAAA,EACbvF,EAAW,+BAAD1D,OACuB8B,KAAKwG,QAAO,uBAGzCc,EAAKtH,KAAKuG,YACVgB,EAAM,EAAID,EAEhB7C,EAAK+C,KAAK,GACV9C,EAAK8C,KAAK,GAGV,IAAK,IAAI9N,EAAI,EAAGA,EAAI4N,EAAI5N,GAAK,EAAG,CAC9B,IACM+N,EAAKF,EAAM7N,EACXgO,EAAKJ,EAAK5N,EACViO,EAAKL,EAAK,EAAI5N,EAEdkO,EAAIrF,EALCgF,EAAM,EAAI7N,GAKC6I,EAAMkF,GACtBI,EAAKtF,EAAMmF,GAAMnF,EAAMoF,GACvBG,EAAI9H,KAAK6G,YAAYnN,GACrB+D,EAAIuC,KAAK6G,YAAYnN,EAAI,GAE/B+K,EAAK/K,GAAK,GAAKkO,EAAIE,EAAID,EAAKpK,EAC5BiH,EAAKhL,GAAK,GAAKmO,EAAKC,EAAIF,EAAInK,CAC9B,CAEA,IAAK,IAAI/D,EAAI4N,EAAI5N,EAAIsG,KAAKsG,SAAU5M,GAAK,EAAG,CAC1C,IAAM6K,EAAM7K,GAAK,EAEX+N,EAAK/N,EAAI4N,EACTI,EAAKJ,EAAK5N,EACViO,EAAK,EAAIL,EAAK,EAAI5N,EAElBkO,EAAIrF,EALCgF,EAAM,EAAI7N,GAKC6I,EAAMkF,GACtBI,EAAKtF,EAAMmF,GAAMnF,EAAMoF,GACvBG,EAAI9H,KAAK6G,YAAYnN,GACrB+D,EAAIuC,KAAK6G,YAAYnN,EAAI,GAE/B+K,EAAKF,GAAOqD,EAAIE,EAAID,EAAKpK,EACzBiH,EAAKH,GAAOsD,EAAKC,EAAIF,EAAInK,CAC3B,CAEA+G,GAAIuD,IAAItD,EAAMC,GAId,IADA,IAAMN,EAAS,IAAIpK,aAAagG,KAAKsG,UAC5B5M,EAAI,EAAGA,EAAIsG,KAAKwG,QAAS9M,IAAK,CACrC,IAAMoO,EAAI9H,KAAK6G,YAAgB,EAAJnN,GACrB+D,EAAIuC,KAAK6G,YAAgB,EAAJnN,EAAQ,GAC7BsO,EAAKvD,EAAK/K,GACVmO,EAAKnD,EAAKhL,GAEhB0K,EAAW,EAAJ1K,IAAUsO,EAAKF,EAAID,EAAKpK,EAC/B2G,EAAOpE,KAAKsG,SAAW,EAAQ,EAAJ5M,IAAUsO,EAAKvK,EAAIoK,EAAKC,CACrD,CAEA,OAAO1D,CACT,IAAC,CA/Ec,GAqFJ6D,GAAK,WAChB,SAAAA,EAAYzN,GAAoB,IAAd6L,EAAKvH,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KAAI,OAAAH,GAAA,KAAAsJ,GAAAlB,GAAA,KAAAkB,EAAA,CACtBzN,EAAM6L,GAAS7L,GACvB,CAEA,OAAAwM,GAAAiB,EALyB9B,IAKzBC,GAAA6B,EAAA,EAAArJ,IAAA,YAAApD,MAMA,SAAU+G,GAA2B,IAAA2F,EAAAC,EAAAC,EAApBhB,EAAWtI,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,KACvBuI,EACuB,QADhBa,EACXd,aAAW,EAAXA,EAAcpH,KAAKwG,gBAAQ,IAAA0B,EAAAA,EAC3BtG,EAAW,gCAAD1D,OAAiC8B,KAAKwG,QAAO,kBACnD/B,EACS,QADL0D,EACRd,aAAO,EAAPA,EAAS5C,YAAI,IAAA0D,EAAAA,EACbvG,EAAW,gCAAD1D,OACwB8B,KAAKwG,QAAO,uBAE1C9B,EACS,QADL0D,EACRf,aAAO,EAAPA,EAAS3C,YAAI,IAAA0D,EAAAA,EACbxG,EAAW,gCAAD1D,OACwB8B,KAAKwG,QAAO,uBAG1Cc,EAAKtH,KAAKuG,YACVgB,EAAM,EAAID,EAEhB7C,EAAK+C,KAAK,GACV9C,EAAK8C,KAAK,GAGV,IAAK,IAAI9N,EAAI,EAAGA,EAAIsG,KAAKwG,QAAS9M,IAAK,CACrC,IAAM+N,EAAS,EAAJ/N,EACLkO,GAAKrF,EAAMkF,GACXI,GAAMtF,EAAMvC,KAAKsG,SAAW,EAAImB,GAChCK,EAAI9H,KAAK6G,YAAYY,GACrBhK,EAAIuC,KAAK6G,YAAYY,EAAK,GAEhChD,EAAK/K,GAAKmO,EAAKpK,EAAImK,EAAIE,EACvBpD,EAAKhL,GAAKmO,EAAKC,EAAIF,EAAInK,CACzB,CAEA+G,GAAIuD,IAAItD,EAAMC,GAKd,IAFA,IAAMN,EAAS,IAAIpK,aAAagG,KAAKxF,MAE5Bd,EAAI,EAAGA,EAAIsG,KAAKwG,QAAU,EAAG9M,IAAK,CACzC,IAAM+N,EAAS,EAAJ/N,EACLoO,EAAI9H,KAAK6G,YAAYY,GACrBhK,EAAIuC,KAAK6G,YAAYY,EAAK,GAC1BO,EAAKvD,EAAK/K,GACVmO,EAAKnD,EAAKhL,GAEV2O,EAAKL,EAAKF,EAAID,EAAKpK,EACnB6K,EAAKN,EAAKvK,EAAIoK,EAAKC,EAEzB1D,EAAOmD,EAAM,EAAIE,GAAMY,EACvBjE,EAAOmD,EAAME,GAAMY,EACnBjE,EAAOkD,EAAKG,GAAMa,EAClBlE,EAAOkD,EAAK,EAAIG,IAAOa,CACzB,CAEA,IAAK,IAAI5O,EAAIsG,KAAKwG,QAAU,EAAG9M,EAAIsG,KAAKwG,QAAS9M,IAAK,CACpD,IAAM6K,EAA+B,GAAxB7K,EAAIsG,KAAKwG,QAAU,GAASc,EACnCG,EAAS,EAAJ/N,EACLoO,EAAI9H,KAAK6G,YAAYY,GACrBhK,EAAIuC,KAAK6G,YAAYY,EAAK,GAC1BO,EAAKvD,EAAK/K,GACVmO,EAAKnD,EAAKhL,GAEV2O,EAAKL,EAAKF,EAAID,EAAKpK,EACnB6K,EAAKN,EAAKvK,EAAIoK,EAAKC,EAEzB1D,EAAOmD,EAAM,EAAIhD,GAAO8D,EACxBjE,EAAOG,EAAM+C,IAAOe,EACpBjE,EAAOkD,EAAK/C,GAAO+D,EACnBlE,EAAO,EAAIkD,EAAK,EAAI/C,GAAO+D,CAC7B,CAEA,OAAOlE,CACT,IAAC,CAnFe,GAuFLmE,GAAS,IAAIzB,GPhKK,GOgKiB,IACnC0B,GAAU,IAAI1B,GAAKzN,EAAe,IAClCoP,GAAU,IAAI3B,GAAKxN,EAAgB,GAEnCoP,GAAU,IAAIT,GPpKI,GOoKmBU,KACrCC,GAAW,IAAIX,GAAM5O,EAAeA,MACpCwP,GAAW,IAAIZ,GAAM3O,EAAgBA,MAS3C,SAASwP,GAAWC,EAAMC,EAAM9O,GAIrC,IAHA,IAAMM,EAAOuO,EAAKjN,OACZsI,EAAS,IAAIpK,aAAoB,EAAPQ,GAEvBd,EAAI,EAAGA,EAAIc,EAAMd,IAAK,CAC7B,IAAMuP,EAAK/O,EAAOR,GACZwP,EAAKhP,EAAO,EAAIM,EAAO,EAAId,GAC3ByP,EAAIJ,EAAKrP,GACToO,EAAIkB,EAAKxO,EAAO,EAAId,GAE1B0K,EAAO1K,GAAKyP,EAAID,EAAKpB,EAAImB,EACzB7E,EAAO,EAAI5J,EAAO,EAAId,GAAKyP,EAAIF,EAAKnB,EAAIoB,CAC1C,CAEA,OAAO9E,CACT,CCnNO,SAASgF,GAAS7K,EAAc8K,EAAkBjM,GACvD,IAAMtB,EAASyC,EAAazC,OACtBwN,EAAM,IAAItQ,WAAW8C,GAC3B,GAAsB,IAAlBsB,GAA4C,IAArBiM,EAEzB,OADAC,EAAI9B,KAAK,EAAG,EAAG1L,GACRwN,EAUT,IAPA,IACMC,GAAc,GAAMnM,ERgGe,GQhGiC,EACpEoM,EAAaD,EAFCvO,EAAcqO,GAI5BI,EAAKF,EACLG,GAAMH,EAEH7P,EAAI,EAAGA,EAAIoC,EAAQpC,IAAK,CAC/B,IAAMiQ,EAAIpL,EAAa7E,GAAK8P,EACtBI,EAAKD,GAAKA,GAAK,EAAI,IAAO,IAAQ,EACxCL,EAAI5P,GAAKkQ,EAAIH,EAAKA,EAAKG,EAAIF,EAAKA,EAAKE,CACvC,CAEA,OAAON,CACT,CASO,SAASO,GAAWC,EAAWT,EAAkBjM,GACtD,GAAsB,IAAlBA,GAA4C,IAArBiM,EACzB,OAAO,IAAIrP,aAAa8P,EAAUhO,QAOpC,IAJA,IAAMiO,EAAc/O,EAAcqO,GAC5BE,GAAc,GAAMnM,ERoEe,GQpEiC,EAEpE4M,EAAM,IAAIhQ,aAAa8P,EAAUhO,QAC9BpC,EAAI,EAAGA,EAAIoQ,EAAUhO,OAAQpC,IACpCsQ,EAAItQ,GAAMoQ,EAAUpQ,GAAKqQ,EAAeR,EAE1C,OAAOS,CACT,CClCO,SAASC,GAAaC,EAASC,EAAUC,EAAa/J,GAC3D,IAAMgK,EAAUD,EAIVE,EA6BR,SACEC,EACAL,EACAC,EACAK,EACAnK,GAwBA,IAtBA,IAAMoK,EAAmB,IAAIzR,WT5DP,IS6DhB0R,EAAc,IAAI1R,WAAWuR,GAE7BI,EAAc,GACdC,EAAiB,GAEjBC,EAAoB,SAACjO,EAAUkO,EAAWC,GAC9C,IAAMC,EAAMP,EAAiB7N,GACvBmN,EAAc/O,EAAcgQ,GAClC,GAAoB,IAAhBjB,EAAmB,OAAO,EAE9B,IAAMkB,EAAuBtR,KAAKsB,IAAI8O,EAAa1J,GAE7C6K,EAAsC,EAA9BnQ,EAAiB+P,GACzBK,EAAmC,EAA3BpQ,EAAiBgQ,GAK/B,OAAOE,IAHc,IAAVC,EAAc,EAAMhQ,EAAiBgQ,IACrChQ,EAAiBiQ,GAG9B,EAESvO,EAAW,EAAGA,EAAW2N,EAAgB3N,IAAY,CAC5D,IAAMwO,EAA0B,EAArBjB,EAASvN,GACpB,GAAW,IAAPwO,EAAJ,CAEA,IAAMJ,EAAMK,GAAgBnB,EAAQtN,GAAU0C,SAAS,EAAG8L,IAG1D,GAFAX,EAAiB7N,GAAYoO,EAEjB,IAARA,EAAJ,CAEA,IAAMF,EAAY,EACZC,EAAS,EACTO,EACHvQ,EAAiBgQ,GAAUhQ,EAAiB+P,GAAc,EAC7D,KAAIQ,GAAa,GAAjB,CAEA,IAAMC,EAAaV,EAAkBjO,EAAUkO,EAAWC,GAC1DJ,EAAYlM,KAAK7B,GACjBgO,EAAenM,KAAK8M,EAAaD,EAJL,CANL,CALD,CAgBxB,CAGA,IAAK,IAAI5R,GAAKiR,EAAY7O,QAAU,GAAK,EAAGpC,GAAK,EAAGA,IAClD8R,GAASb,EAAaC,EAAgBlR,GAGxC,KAAO8Q,EAAgB,GAAKG,EAAY7O,OAAS,GAAG,CAClD,IAAM2P,EAAMd,EAAY,GAClBe,EAAyB,EAAnBhB,EAAYe,GAClBE,EAAMD,EAAM,EAEZN,EAAqB,EAAhBjB,EAASsB,GAEdG,GADa7Q,EAAiB4Q,GAAO5Q,EAAiB2Q,GAAQ,GAC3CN,EAEzB,GAAIQ,EAAOpB,GAAiBoB,GAAQ,EAClCC,GAAQlB,EAAaC,QAOvB,GAHAJ,GAAiBoB,EACjBlB,EAAYe,GAAOE,EAEfA,ETT6B,GSSA,CAC/B,IAAMG,EAAOH,EAAM,EACbI,EAAchR,EAAiB+Q,GAAQ/Q,EAAiB4Q,GAAQ,EAClEI,EAAa,GACfnB,EAAe,GAAKC,EAAkBY,EAAKE,EAAKG,GAAQC,EACxDP,GAASb,EAAaC,EAAgB,IAEtCiB,GAAQlB,EAAaC,EAEzB,MACEiB,GAAQlB,EAAaC,EAEzB,CAEA,MAAO,CAAEF,YAAAA,EAAavN,mBAAoBsN,EAC5C,CAnHoBuB,CAChB3B,EACAH,EACAC,EALA8B,KTpBiC,GSoBE5B,EAOnChK,GAGF,MAAO,CACL6L,SAAU7B,EACV8B,WAAY7B,EAAUI,YACtBvN,mBAAoBmN,EAAUnN,mBAElC,CA8GO,SAASkO,GAAgB9M,GAE9B,IADA,IAAI6N,EAAe,EACV1S,EAAI,EAAGA,EAAI6E,EAAazC,OAAQpC,IAAK,CAC5C,IAAM2S,EAAI1S,KAAK2S,IAAI/N,EAAa7E,IAC5B2S,EAAID,IAAcA,EAAeC,EACvC,CACA,GAAqB,IAAjBD,EAAoB,OAAO,EAC/B,IAAMG,EAAQ5S,KAAK6S,KAAK,GAAK7S,KAAKiL,KAAKwH,GAAgB,KACvD,OAAOzS,KAAK0H,IAAI,EAAG1H,KAAKsC,IAAI,GAAIsQ,GAClC,CAYA,SAASV,GAAQlB,EAAaC,GAC5B,IAAM6B,EAAO9B,EAAY7O,OAAS,EAClC6O,EAAY,GAAKA,EAAY8B,GAC7B7B,EAAe,GAAKA,EAAe6B,GACnC9B,EAAY+B,MACZ9B,EAAe8B,MACX/B,EAAY7O,QAAQ0P,GAASb,EAAaC,EAAgB,EAChE,CAcA,SAASY,GAASb,EAAaC,EAAgB+B,GAM7C,IALA,IAAMC,EAAWjC,EAAY7O,OACzBpC,EAAIiT,EACFE,EAASlC,EAAYjR,GACrBoT,EAAQlC,EAAelR,KAEhB,CACX,IAAMqT,EAAe,GAAVrT,GAAK,GACVkO,EAAImF,EAAI,EACVC,EAAOtT,EACPuT,EAAOH,EASX,GAPIC,EAAIH,GAAYhC,EAAemC,GAAKE,IACtCD,EAAOD,EACPE,EAAOrC,EAAemC,IAEpBnF,EAAIgF,GAAYhC,EAAehD,GAAKqF,IACtCD,EAAOpF,GAELoF,IAAStT,EAAG,MAEhBiR,EAAYjR,GAAKiR,EAAYqC,GAC7BpC,EAAelR,GAAKkR,EAAeoC,GACnCtT,EAAIsT,CACN,CAEArC,EAAYjR,GAAKmT,EACjBjC,EAAelR,GAAKoT,CACtB,C,8zBC3OO,IAAMI,GAAU9G,GACrB,SAAA8G,K,4FAAcvO,CAAA,KAAAuO,GAEZlN,KAAKmN,iBAAmB,CACtB,GAAI,IAAInT,aAAa,IACrB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,MAIxBgG,KAAKkD,eAAiB,CACpBI,MAAO,CACL,IAAK,IAAItJ,aAAaF,KACtB,IAAK,IAAIE,aAAaF,KACtB,IAAK,IAAIE,aAAaF,MAExBsT,cAAe,CACb,IAAK,IAAIpT,aAAaqT,KACtB,IAAK,IAAIrT,aAAaqT,OAK1BrN,KAAKsN,UAAY,CACf/J,QAAS,IAAIvJ,aAAaF,GAC1ByT,QAAS,IAAIvT,aAAaF,GAC1B0J,SAAU,IAAIxJ,aVqCe,KUjC/BgG,KAAKwN,mBAAqB,CACxB,IAAIxT,aAAa,IACjB,IAAIA,aAAa,IACjB,IAAIA,aAAa,MAInBgG,KAAKoH,YAAc,CACjB,GAAI,CACF3C,KAAM,IAAIzK,aAAa,IACvB0K,KAAM,IAAI1K,aAAa,KAEzB,GAAI,CACFyK,KAAM,IAAIzK,aAAa,IACvB0K,KAAM,IAAI1K,aAAa,KAEzB,IAAK,CACHyK,KAAM,IAAIzK,aAAa,KACvB0K,KAAM,IAAI1K,aAAa,OAK3BgG,KAAKyN,YAAc,CACjB,IAAIzT,aAAa,IACjB,IAAIA,aAAa,IACjB,IAAIA,aAAa,KAInBgG,KAAK0N,aAAe,CAClB,IAAI1T,aAAa,KACjB,IAAIA,aAAa,KACjB,IAAIA,aAAa,MAInBgG,KAAK4C,gBAAkB,CACrB,GAAI,IAAI5I,aAAa,IACrB,IAAK,IAAIA,aAAa,KACtB,IAAK,IAAIA,aAAa,KAE1B,GCpCK,SAAS2T,GAAgBC,EAAeC,EAAYC,GAEzD,IAAKD,EAAY,OAAO,EAGxB,IAAME,EAcR,SAAmCH,EAAeC,GAEhD,IAAMG,EA2BR,SAA+BJ,EAAeC,GAI5C,IAHA,IAAII,EAAO,EACPC,EAAgB,EAEXxU,EAAI,EAAGA,EAAIkU,EAAc9R,OAAQpC,IAAK,CAC7C,IAAMyU,EAAaxU,KAAK2S,IAAIsB,EAAclU,IAIpC0U,EAAOD,EAHGxU,KAAK2S,IAAIuB,EAAWnU,IAIhC0U,EAAO,IACTH,GAAQG,GAGVF,GAAiBC,EAAaA,CAChC,CAGA,IAAME,EAAgB1U,KAAKiN,KAAKsH,IAAkB,KAClD,OAAOD,EAAOI,CAChB,CA/CuBC,CAAsBV,EAAeC,GAGpDU,EAAkBC,GAA0BZ,GAC5Ca,EAAeD,GAA0BX,GACzCa,EAAiB/U,KAAK2S,IAAIiC,EAAkBE,GAG5CE,EAAiBC,GAA4BhB,GAC7CiB,EAAcD,GAA4Bf,GAC1CiB,EAAWnV,KAAK2S,IAAIqC,EAAiBE,GAGrCE,EA8FR,SAA+BnB,EAAeC,GAI5C,IAHA,IAAIK,EAAgB,EAChBc,EAAa,EAERtV,EAAI,EAAGA,EAAIkU,EAAc9R,OAAQpC,IACxCwU,GAAiBN,EAAclU,GAAKkU,EAAclU,GAClDsV,GAAcnB,EAAWnU,GAAKmU,EAAWnU,GAI3CwU,EAAgBvU,KAAK0H,IAAI6M,EAAe,OACxCc,EAAarV,KAAK0H,IAAI2N,EAAY,OAElC,IAAMC,EAAW,GAAKtV,KAAKuV,MAAMhB,EAAgBc,GAGjD,OAAOrV,KAAK0H,IAAI,EAAG4N,EACrB,CA/GuBE,CAAsBvB,EAAeC,GAE1D,MAAO,CACLG,aAAAA,EACAU,eAAAA,EACAI,SAAAA,EACAC,aAAAA,EAEJ,CArCmBK,CAA0BxB,EAAeC,GAGpDwB,EAiJR,SAAiCtB,GAC/B,IAAQC,EAAyDD,EAAzDC,aAAcU,EAA2CX,EAA3CW,eAAgBI,EAA2Bf,EAA3Be,SAAUC,EAAiBhB,EAAjBgB,aAI1CO,EAAmBtB,EAKnBuB,EAAuB5V,KAAKiN,KAAK8H,GAIjCc,EAAiB7V,KAAK8V,MAAiB,GAAXX,GAAiBnV,KAAK8V,MAAM,IAIxDC,EAAqB/V,KAAKsC,IAAI8S,EAAe,GAAI,GAIvD,OACGO,EACCC,EACAC,EACAE,GACF,CAEJ,CA9KyBC,CAAwB5B,GAE/C,OAAOsB,EAAiBvB,CAC1B,CAiEA,SAASU,GAA0BoB,GAMjC,IALA,IACIC,EAAS,EACTC,EAAY,EACZC,EAAY,EAEPrW,EAAI,EAAGA,EAAIkW,EAAO9T,OAAQpC,IAAK,CACtC,IAAMsW,EAAYrW,KAAK2S,IAAIsD,EAAOlW,IAC9BsW,EAPU,QAQZH,GAAUlW,KAAKsW,IAAID,GACnBF,GAAaE,EACbD,IAEJ,CAEA,GAAkB,IAAdA,EAAiB,OAAO,EAE5B,IAAMG,EAAgBvW,KAAKwW,IAAIN,EAASE,GAClCK,EAAiBN,EAAYC,EAEnC,OAAOK,EAnBS,MAmBkBF,EAAgBE,EAAiB,CACrE,CAQA,SAASxB,GAA4BgB,GAKnC,IAJA,IAAMS,EAAW1W,KAAKgC,MAAMiU,EAAO9T,OAAS,GACxCwU,EAAY,EACZC,EAAa,EAER7W,EAAI,EAAGA,EAAI2W,EAAU3W,IAC5B4W,GAAaV,EAAOlW,GAAKkW,EAAOlW,GAGlC,IAAK,IAAIA,EAAI2W,EAAU3W,EAAIkW,EAAO9T,OAAQpC,IACxC6W,GAAcX,EAAOlW,GAAKkW,EAAOlW,GAGnC,IAAM8W,EAAcF,EAAYC,EAChC,OAAOC,EAAc,EAAID,EAAaC,EAAc,CACtD,CC3GO,SAASC,GAAiB1O,GAAS,IAAA2O,EAClCC,EACe,QADLD,EACd3O,aAAO,EAAPA,EAAS4O,kBAAU,IAAAD,EAAAA,EACnB9O,EAAW,4CACPgP,EAASD,EAAWrD,UAQ1B,OAAO,SAACuD,GACN,IAAMC,EAAShO,EACb+N,EACAD,EAAOrN,QACPoN,EAAWzN,gBAEb0N,EAAOrN,QAAUuN,EAAOlN,SAExB,IAAMmN,EAASjO,EACbgO,EAAOvN,QACPqN,EAAOrD,QACPoD,EAAWzN,gBAEb0N,EAAOrD,QAAUwD,EAAOnN,SAExB,IAAMoN,EACJL,EAAWzN,eAAekK,cAAc0D,EAAOtN,SAAS1H,QAC1DkV,EAAY9R,IAAI0R,EAAOpN,UACvBwN,EAAY9R,IAAI4R,EAAOtN,SAAUoN,EAAOpN,SAAS1H,QAEjD,IAAM0H,EAAWwN,EAAYnN,MAAM,EAAGiN,EAAOtN,SAAS1H,QAGtD,OAFA8U,EAAOpN,SAAWwN,EAAYnN,MAAMiN,EAAOtN,SAAS1H,QAE7C,CACLmV,MAAO,CAACF,EAAOxN,QAASwN,EAAOvN,SAAUA,GAE7C,CACF,CAeO,SAAS0N,GAAmBnP,GAAS,IAAAoP,EAAAC,EACpCT,EACe,QADLQ,EACdpP,aAAO,EAAPA,EAAS4O,kBAAU,IAAAQ,EAAAA,EACnBvP,EAAW,8CACP7B,EACY,QADLqR,EACXrP,aAAO,EAAPA,EAAShC,eAAO,IAAAqR,EAAAA,EAAIxP,EAAW,2CAUjC,OAAO,SAACW,GACN,IAAQ0O,EAAU1O,EAAV0O,MACFI,EAAW,CZlBO,IACA,IACC,KYiBnBrU,EAAaiU,EAAM5O,IAAI,SAACiP,EAAaC,GACzC,IAAM3B,EDjHL,SAAoB4B,EAAShL,GAClC,IAAM/B,EAAO,IAAIzK,aAAawM,GACxB9B,EAAO,IAAI1K,aAAawM,GAGxBiL,EAAU9X,KAAKsC,IAAIuV,EAAQ1V,OAAQ0K,GACzC/B,EAAKvF,IAAIsS,EAAQlS,SAAS,EAAGmS,IAG7BjN,GAAIuD,IAAItD,EAAMC,GAId,IADA,IAAMsL,EAAY,IAAIhW,aAAawM,EAAU,GACpC9M,EAAI,EAAGA,EAAI8M,EAAU,EAAG9M,IAC/BsW,EAAUtW,GAAKC,KAAKiN,KAAKnC,EAAK/K,GAAK+K,EAAK/K,GAAKgL,EAAKhL,GAAKgL,EAAKhL,IAG9D,OAAOsW,CACT,CC+FqB0B,CAAWJ,EAAaD,EAASE,IAC1CI,EAAYhE,GAChBiC,EACAe,EAAWnD,mBAAmB+D,GAC9BxR,EAAQG,uBAGV,OADAyQ,EAAWnD,mBAAmB+D,GAAa3B,EACpC+B,EAAYhY,KAAK0H,IAAIkQ,EAAY,EAAG,EAC7C,GAEA,MAAO,CACLN,MAAAA,EACAjU,WAAAA,EAEJ,CACF,CAkBO,SAAS4U,GAAU7P,GAAS,IAAA8P,EAC3BlB,EACe,QADLkB,EACd9P,aAAO,EAAPA,EAAS4O,kBAAU,IAAAkB,EAAAA,EAAIjQ,EAAW,qCAC9BkQ,EAAiBnB,EAAWlD,YAG5BsE,EAAkB,CAACvJ,GAASA,GAASC,IAW3C,SAASuJ,EACPR,EACAD,EACAU,EACAC,EACAvB,GAEA,IAAMwB,EAAS5X,EAAkBgX,GAIjC,OAFkC,IAAdU,EAgCtB,SACET,EACAD,EACAY,EACAC,EACAF,EACAvB,GAEA,IAAM0B,EAAyB,IAAdd,EAAkBjY,EAAiBD,EAC9CiZ,EAAY3B,EAAWxD,iBAAiBkF,GAC9CC,EAAU9K,KAAK,GAGf8K,EAAUpT,IAAIgT,EAAeC,EAAO1X,aAGpC8X,EAAmBf,EAASU,EAAeC,EAAO3X,MAGlD8X,EAAUpT,IAAIsS,EAASW,EAAO1X,YZtHD,IYyH7B,IAAIkI,EAAWyP,EAAcI,UAAUF,EAAW3B,EAAWvJ,aAGzDmK,EAAY,IACd5O,EAAWD,EAAgBC,EAAUgO,EAAW/N,kBAGlD,OAAOD,CACT,CA3DW8P,CACLjB,EACAD,EACAY,EAPkBJ,EAAgBR,GASlCW,EACAvB,GAgEN,SACEa,EACAD,EACAY,EACAD,EACAvB,GAKA,IAHA,IAAM+B,EAAY,IAAsB,MAAhBP,EAAO3X,KAAe,EAAI,GAC5C4J,EAAS,IAAIpK,aAAamY,EAAO3X,MAE9BmY,EAAQ,EAAGA,EAAQD,EAAWC,IAAS,CAC9C,IAAMC,EAAaD,EAAQjY,EACrBmY,EAAerB,EAAQlS,SAC3BsT,EACAA,EAAalY,GAIT4X,EAAY3B,EAAWxD,iBZjOJ,IYkOzBmF,EAAU9K,KAAK,GACf8K,EAAUpT,IAAIgT,EAAe,GAG7BK,EAAmBM,EAAcX,EAAexX,GAChD4X,EAAUpT,IAAI2T,EAAclY,GAG5B,IAAIgI,EAAW4F,GAAOiK,UAAUF,EAAW3B,EAAWvJ,aAGlDmK,EAAY,IACd5O,EAAWD,EAAgBC,EAAUgO,EAAW/N,kBAGlDwB,EAAOlF,IAAIyD,EAAUiQ,EACvB,CAEA,OAAOxO,CACT,CAnGW0O,CACLtB,EACAD,EACAY,EACAD,EACAvB,EAGN,CA6FA,SAAS4B,EAAmBf,EAASU,EAAea,GAElD,IADA,IAAMC,EAAYD,EAAYpY,EACrBjB,EAAI,EAAGA,EAAIiB,EAAmBjB,IAAK,CAC1C,IAAMuZ,EAAYzB,EAAQwB,EAAYtZ,GACtCwY,EAAcxY,GAAKH,EAAaG,GAAKuZ,EACrCzB,EAAQwB,EAAYtZ,GAAKuZ,EAAY1Z,EAAa,GAAKG,EACzD,CACF,CAcA,OAAO,SAAC6I,GACN,IAAQ0O,EAAqC1O,EAArC0O,MAAOjU,EAA8BuF,EAA9BvF,WAAYkW,EAAkB3Q,EAAlB2Q,cACrB3U,EAAe,IAAIvE,aAAa,KAetC,OAbAiX,EAAMkC,QAAQ,SAAC7B,EAAaC,GAC1B,IAAM6B,EAAcpB,EAClBV,EACAC,EACAvU,EAAWuU,GACXO,EAAeP,GACfZ,GAGIhN,ERxRL,SAA6B4N,GAClC,OAAqB,IAAdA,EAAkB,EAAkB,IAAdA,EAAkB,IAAM,GACvD,CQsRqB8B,CAAoB9B,GACnChT,EAAaW,IAAIkU,EAAazP,EAChC,GAEO,CAAEsN,MAAAA,EAAO1S,aAAAA,EAAcvB,WAAAA,EAAYkW,cAAAA,EAC5C,CACF,CAgBO,SAASI,GAAkBvR,GAAS,IAAAwR,EACnCxT,EACY,QADLwT,EACXxR,aAAO,EAAPA,EAAShC,eAAO,IAAAwT,EAAAA,EAAI3R,EAAW,0CAcjC,OAAO,SAACW,GAgBN,IAfA,IAAQhE,EAA6BgE,EAA7BhE,aAAcvB,EAAeuF,EAAfvF,WAEtBwW,EJ/QG,SAAuBjV,EAAcvB,GAO1C,IANA,IAAMkN,EAAU,GACVC,EAAW,GAEbsJ,EAAa,EACb7W,EAAW,EAEN8W,EAAO,EAAGA,EAAO,EAAGA,IAAQ,CAOnC,IANA,IAAMC,EAAYF,EACZG,EAAoB,IAATF,EAAa,IAAM,IAC9BG,EAAUH,EAAO,EAAIxa,EAAoBwa,GAAQ3a,EAAc+C,OAE/DgY,EADmC,IAArB9W,EAAW0W,GACMva,EAAiBC,EAE/CwD,EAAWiX,GAAS,CACzB,IAAMrZ,EAAOzB,EAAc6D,GACrBmX,EAAWD,EAAelX,GAAY+W,EACtCK,EAASD,EAAWvZ,EACpBiR,EAAM,IAAIzR,aAAaQ,GAE7B,GAAIuZ,GAAY,GAAKC,GAAUJ,EAC7BnI,EAAIvM,IAAIX,EAAae,SAASqU,EAAYI,EAAUJ,EAAYK,SAGhE,GADAvI,EAAIjE,KAAK,GACLuM,EAAWH,GAAYI,EAAS,EAAG,CACrC,IAAMC,EAAWta,KAAK0H,IAAI,EAAG0S,GACvBG,EAASva,KAAKsC,IAAI2X,EAAUI,GAClCvI,EAAIvM,IACFX,EAAae,SAASqU,EAAYM,EAAUN,EAAYO,GACxDva,KAAK0H,IAAI,GAAI0S,GAEjB,CAGF7J,EAAQzL,KAAKgN,GACbtB,EAAS1L,KAAKjE,GACdoC,GACF,CAEA6W,GAAcG,CAChB,CAEA,MAAO,CAAE1J,QAAAA,EAASC,SAAAA,EAAU+B,SAAUtP,EACxC,CIoO4CuX,CACtC5V,EACAvB,GAFMkN,EAAOsJ,EAAPtJ,QAASC,EAAQqJ,EAARrJ,SAKjBiK,EAIInK,GAAaC,EAASC,EATSqJ,EAARtH,SASmBnM,EAAQM,gBAH1CgU,EAAgBD,EAA1BlI,SACAC,EAAUiI,EAAVjI,WACAhP,EAAkBiX,EAAlBjX,mBAGIK,EAAwB,GAErBiO,EAAM,EAAGA,EAAM4I,EAAkB5I,IAAO,CAC/C,IAAM6I,EAAOpK,EAAQuB,GAAKnM,SAAS,EAAG6K,EAASsB,IACzC8I,EAAapI,EAAWV,GACxBrO,EAAgBrC,EAAiBwZ,GACjCzK,EAAYV,GAASkL,EAAMnX,EAAmBsO,GAAMrO,GAC1DI,EAAsBiB,KAAKqL,EAC7B,CAEA,MAAO,CACLhN,KAAMuX,EACNlX,mBAAAA,EACAD,kBAAmBiP,EAAWtI,MAAM,EAAGwQ,GACvC7W,sBAAAA,EACAR,WAAAA,EAEJ,CACF,CAoBO,SAASqC,KAKd,OAAOyC,EADS,CAAE/B,QAHXjB,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAIgB,EAGa6Q,WAFjB7R,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAIoO,IAKfuD,GACAS,GACAU,GACA0B,GAEJ,CClYO,SAASkB,KAad,OAAO,SAAC/X,GAUN,IATA,IAAM8B,EAAe,IAAIvE,aAAa,KAEpC8C,EAKEL,EALFK,KACAK,EAIEV,EAJFU,mBACAD,EAGET,EAHFS,kBACAM,EAEEf,EAFFe,sBACAR,EACEP,EADFO,WAGOyO,EAAM,EAAGA,EAAM3O,EAAM2O,IAAO,CACnC,IAAMrO,EAAgBrC,EAAiBmC,EAAkBuO,IAErDiI,EAAO,EACPjI,GAAOvS,EAAoB,KAAIwa,EAAO,GACtCjI,GAAOvS,EAAoB,KAAIwa,EAAO,GAE1C,IACMe,EADmC,IAArBzX,EAAW0W,GACAva,EAAesS,GAAOrS,EAAgBqS,GAErE,GAAIrO,EAAgB,EAAG,CACrB,IACMsX,EAAc7K,GADFrM,EAAsBiO,GAGtCtO,EAAmBsO,GACnBrO,GAEFmB,EAAaW,IAAIwV,EAAaD,EAChC,CACF,CAEA,MAAO,CAAElW,aAAAA,EAAcvB,WAAAA,EACzB,CACF,CAkBO,SAAS2X,GAAW5S,GAAS,IAAA2O,EAC5BC,EACe,QADLD,EACd3O,aAAO,EAAPA,EAAS4O,kBAAU,IAAAD,EAAAA,EAAI9O,EAAW,sCAC9BkQ,EAAiBnB,EAAWjD,aAG5BqE,EAAkB,CAACnJ,GAAUA,GAAUC,IAY7C,SAASmJ,EACPpC,EACA2B,EACAU,EACAC,EACAvB,EACAwB,GAKA,OAHkC,IAAdF,EAiCtB,SACErC,EACA2B,EACAW,EACAvB,EACAwB,EACAC,GAGA,IAAIwC,EAAahF,EACb2B,EAAY,IACdqD,EAAalS,EAAgBkN,EAAQe,EAAW/N,kBAIlD,IAAMiS,EAAMzC,EAAcI,UAAUoC,EAAYjE,EAAWvJ,aACrD0N,EAAWD,EAAI/Y,OAAS,EAGxBiZ,EAASpE,EAAWxD,iBAAiB7T,KAC3Cyb,EAAOvN,KAAK,GAGZ,IAAK,IAAI9N,EAAI,EAAGA,EAAIyY,EAAO3X,KAAMd,IAC/Bqb,EAAOrb,GAAKmb,EAAIC,EAAWpb,GAI7B,IAAMsb,EAAU9C,EAAcrO,MACd,EAAdsO,EAAO3X,KAAWI,EACJ,EAAduX,EAAO3X,MAEHya,EAAUnM,GACdkM,EAAQnR,MAAM,EAAGjJ,GACjBma,EAAOlR,MAAM,EAAGjJ,GAChBrB,GAGF2Y,EAAchT,IAAI+V,EAAS,GAG3B,IAAK,IAAIvb,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCsb,EAAQtb,GAAKqb,EAAOna,EAAwBlB,GAK9C,IADA,IAAM+X,EAAwB,IAAdF,EAAkB,IAAM,IAC/B7X,EAAI,EAAGA,EAAI+X,EAAS/X,IAC3BwY,EAAc,GAAKxY,GAAKqb,EAAOna,EAAwBlB,GAIzD,IAAK,IAAIA,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwY,EAA4B,EAAdC,EAAO3X,KAAWI,EAAwBlB,GACtDqb,EAAO5C,EAAO3X,KAAOI,EAAwBlB,GAGjD,OAAOwY,EAAcrO,MAAM,EAAGsO,EAAO3X,KACvC,CAvFW0a,CACLtF,EACA2B,EACAW,EACAvB,EACAwB,EARkBJ,EAAgBR,IAqGxC,SACE3B,EACA2B,EACAW,EACAvB,EACAwB,GAEA,IAAMO,EAAY,IAAsB,MAAhBP,EAAO3X,KAAe,EAAI,GAC5Cua,EAASpE,EAAWxD,iBAAiB7T,KAC3Cyb,EAAOvN,KAAK,GAUZ,IARA,IAAMwN,EAAU9C,EAAcrO,MACd,EAAdsO,EAAO3X,KAAWI,EACJ,EAAduX,EAAO3X,MAGL8K,EAAQ,EACR6P,EAAM,EAEDxC,EAAQ,EAAGA,EAAQD,EAAWC,IAAS,CAE9C,IAAIiC,EAAahF,EAAO/L,MAAMsR,EAAKA,EAAMza,GAGrC6W,EAAY,IACdqD,EAAalS,EAAgBkS,EAAYjE,EAAW/N,kBAQtD,IAJA,IAAMiS,EAAMnM,GAAQ8J,UAAUoC,EAAYjE,EAAWvJ,aAC/C0N,EAAWD,EAAI/Y,OAAS,EAGrBpC,EAAI,EAAGA,EAAIgB,EAAuBhB,IACzCqb,EAAOzP,EAAQ5L,GAAKmb,EAAIC,EAAWpb,GAIrC,IAAMub,EAAUnM,GACdkM,EAAQnR,MAAM,EAAGjJ,GACjBma,EAAOlR,MAAMyB,EAAOA,EAAQ1K,GAC5BrB,GAGF2Y,EAAchT,IAAI+V,EAAS3P,GAG3B,IAAK,IAAI5L,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCsb,EAAQtb,GAAKqb,EAAOzP,EAAQ1K,EAAwBlB,GAGtD4L,GAAS5K,EACTya,GAAOza,CACT,CAGA,IAAK,IAAIhB,EAAI,EAAGA,EAAIkB,EAAuBlB,IACzCwY,EAA4B,EAAdC,EAAO3X,KAAWI,EAAwBlB,GACtDqb,EAAO5C,EAAO3X,KAAOI,EAAwBlB,GAGjD,OAAOwY,EAAcrO,MAAM,EAAGsO,EAAO3X,KACvC,CAvJW4a,CACLxF,EACA2B,EACAW,EACAvB,EACAwB,EAGN,CAwJA,OAAO,SAAC5P,GACN,IAAQhE,EAA6BgE,EAA7BhE,aAAcvB,EAAeuF,EAAfvF,WAEtB,OAAOzC,EAAkB8H,IAAI,SAAC8P,EAAQZ,GACpC,IAAM8D,ET5PL,SAAiC9W,EAAcgT,GACpD,IAAM+D,EAAU,CAAC,EAAG,IAAK,IAAK,KAC9B,OAAO/W,EAAae,SAASgW,EAAQ/D,GAAY+D,EAAQ/D,EAAY,GACvE,CSyPyBgE,CAAwBhX,EAAcgT,GACzD,OAAOS,EACLqD,EACA9D,EACAvU,EAAWuU,GACXO,EAAeP,GACfZ,EACAwB,EAEJ,EACF,CACF,CAmBO,SAASqD,GAAkBzT,GAAS,IAAAoP,EACnCR,EACe,QADLQ,EACdpP,aAAO,EAAPA,EAAS4O,kBAAU,IAAAQ,EAAAA,EACnBvP,EAAW,6CACPgP,EAASD,EAAWrD,UAO1B,OAAO,SAAC2D,GAEN,IAAMD,EAAcL,EAAWzN,eAAekK,cAAc6D,EAAM,GAAGnV,QACrEkV,EAAY9R,IAAI0R,EAAOpN,UACvBwN,EAAY9R,IAAI+R,EAAM,GAAIL,EAAOpN,SAAS1H,QAE1C,IAAM0H,EAAWwN,EAAYnN,MAAM,EAAqB,EAAlBoN,EAAM,GAAGnV,QAC/C8U,EAAOpN,SAAWwN,EAAYnN,MAAwB,EAAlBoN,EAAM,GAAGnV,QAG7C,IAAMiV,EAASjN,EACbmN,EAAM,GACNA,EAAM,GACNL,EAAOrD,QACPoD,EAAWzN,gBAEb0N,EAAOrD,QAAUwD,EAAOnN,SAGxB,IAAMkN,EAAShN,EACbiN,EAAO3M,OACPZ,EACAoN,EAAOrN,QACPoN,EAAWzN,gBAIb,OAFA0N,EAAOrN,QAAUuN,EAAOlN,SAEjBkN,EAAO1M,MAChB,CACF,CAmBO,SAASxE,KAEd,OAAOkC,EADS,CAAE6O,WADa7R,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,IAAIoO,IAEjBsH,GAAqBG,GAAYa,GACxD,C,wpFCzZA,IAAA1X,EAAA2X,EAAA7N,EAAA,mBAAA8N,OAAAA,OAAA,GAAAhY,EAAAkK,EAAA+N,UAAA,aAAAC,EAAAhO,EAAAiO,aAAA,yBAAAnc,EAAAkO,EAAAlK,EAAAkY,EAAAlc,GAAA,IAAAoO,EAAApK,GAAAA,EAAAoY,qBAAAC,EAAArY,EAAAqY,EAAAC,EAAAjV,OAAAkV,OAAAnO,EAAAgO,WAAA,OAAAI,GAAAF,EAAA,mBAAApO,EAAAlK,EAAAkY,GAAA,IAAAlc,EAAAoO,EAAAkO,EAAAjY,EAAA,EAAAoL,EAAAyM,GAAA,GAAAhM,GAAA,EAAAuM,EAAA,CAAAhN,EAAA,EAAAzL,EAAA,EAAA0Y,EAAAtY,EAAAuO,EAAAgK,EAAAtY,EAAAsY,EAAAC,KAAAxY,EAAA,GAAAuY,EAAA,SAAAZ,EAAA7N,GAAA,OAAAlO,EAAA+b,EAAA3N,EAAA,EAAAkO,EAAAlY,EAAAqY,EAAAzY,EAAAkK,EAAAyE,CAAA,YAAAgK,EAAAzO,EAAAlK,GAAA,IAAAoK,EAAAF,EAAAoO,EAAAtY,EAAA+X,EAAA,GAAA7L,GAAA7L,IAAA6X,GAAAH,EAAAtM,EAAArN,OAAA2Z,IAAA,KAAAG,EAAAlc,EAAAyP,EAAAsM,GAAAY,EAAAF,EAAAhN,EAAA4D,EAAArT,EAAA,GAAAkO,EAAA,GAAAgO,EAAA7I,IAAArP,KAAAsY,EAAAtc,GAAAoO,EAAApO,EAAA,OAAAoO,EAAA,MAAApO,EAAA,GAAAA,EAAA,GAAAoE,GAAApE,EAAA,IAAA2c,KAAAT,EAAAhO,EAAA,GAAAyO,EAAA3c,EAAA,KAAAoO,EAAA,EAAAqO,EAAAC,EAAA1Y,EAAAyY,EAAAzY,EAAAhE,EAAA,IAAA2c,EAAAtJ,IAAA6I,EAAAhO,EAAA,GAAAlO,EAAA,GAAAgE,GAAAA,EAAAqP,KAAArT,EAAA,GAAAkO,EAAAlO,EAAA,GAAAgE,EAAAyY,EAAAzY,EAAAqP,EAAAjF,EAAA,OAAA8N,GAAAhO,EAAA,SAAAyE,EAAA,MAAAzC,GAAA,EAAAlM,CAAA,iBAAAkY,EAAAzM,EAAA4D,GAAA,GAAAhP,EAAA,QAAAwY,UAAA,oCAAA3M,GAAA,IAAAT,GAAAkN,EAAAlN,EAAA4D,GAAAjF,EAAAqB,EAAA6M,EAAAjJ,GAAA0I,EAAA3N,EAAA,EAAAhK,EAAAkY,KAAApM,GAAA,CAAAlQ,IAAAoO,EAAAA,EAAA,GAAAA,EAAA,IAAAqO,EAAAzY,GAAA,GAAA2Y,EAAAvO,EAAAkO,IAAAG,EAAAzY,EAAAsY,EAAAG,EAAAC,EAAAJ,GAAA,OAAAjY,EAAA,EAAArE,EAAA,IAAAoO,IAAA8N,EAAA,QAAAH,EAAA/b,EAAAkc,GAAA,MAAAH,EAAAA,EAAAe,KAAA9c,EAAAsc,IAAA,MAAAO,UAAA,wCAAAd,EAAA9X,KAAA,OAAA8X,EAAAO,EAAAP,EAAAja,MAAAsM,EAAA,IAAAA,EAAA,YAAAA,IAAA2N,EAAA/b,EAAA,SAAA+b,EAAAe,KAAA9c,GAAAoO,EAAA,IAAAkO,EAAAO,UAAA,oCAAAX,EAAA,YAAA9N,EAAA,GAAApO,EAAAoE,CAAA,UAAA2X,GAAA7L,EAAAuM,EAAAzY,EAAA,GAAAsY,EAAApO,EAAA4O,KAAA9Y,EAAAyY,MAAA9J,EAAA,YAAAoJ,GAAA/b,EAAAoE,EAAAgK,EAAA,EAAAkO,EAAAP,CAAA,SAAA1X,EAAA,UAAAvC,MAAAia,EAAA9X,KAAAiM,EAAA,GAAAhC,EAAAgO,EAAAlc,IAAA,GAAAsc,CAAA,KAAA3J,EAAA,YAAA0J,IAAA,UAAAU,IAAA,UAAAC,IAAA,CAAAjB,EAAA1U,OAAA4V,eAAA,IAAA7O,EAAA,GAAApK,GAAA+X,EAAAA,EAAA,GAAA/X,QAAAwY,GAAAT,EAAA,GAAA/X,EAAA,yBAAA+X,GAAAO,EAAAU,EAAAZ,UAAAC,EAAAD,UAAA/U,OAAAkV,OAAAnO,GAAA,SAAA/J,EAAAD,GAAA,OAAAiD,OAAA6V,eAAA7V,OAAA6V,eAAA9Y,EAAA4Y,IAAA5Y,EAAA+Y,UAAAH,EAAAR,GAAApY,EAAA8X,EAAA,sBAAA9X,EAAAgY,UAAA/U,OAAAkV,OAAAD,GAAAlY,CAAA,QAAA2Y,EAAAX,UAAAY,EAAAR,GAAAF,EAAA,cAAAU,GAAAR,GAAAQ,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAZ,GAAAQ,EAAAd,EAAA,qBAAAM,GAAAF,GAAAE,GAAAF,EAAAJ,EAAA,aAAAM,GAAAF,EAAAtY,EAAA,yBAAAwY,GAAAF,EAAA,oDAAAe,GAAA,kBAAAC,EAAAtd,EAAAud,EAAAlZ,EAAA,cAAAmY,GAAApY,EAAA8J,EAAAlK,EAAA+X,GAAA,IAAA/b,EAAAqH,OAAAmW,eAAA,IAAAxd,EAAA,gBAAAoE,GAAApE,EAAA,EAAAwc,GAAA,SAAApY,EAAA8J,EAAAlK,EAAA+X,GAAA,GAAA7N,EAAAlO,EAAAA,EAAAoE,EAAA8J,EAAA,CAAApM,MAAAkC,EAAAyZ,YAAA1B,EAAA2B,cAAA3B,EAAA4B,UAAA5B,IAAA3X,EAAA8J,GAAAlK,MAAA,KAAAkY,EAAA,SAAAhO,EAAAlK,GAAAwY,GAAApY,EAAA8J,EAAA,SAAA9J,GAAA,YAAAwZ,QAAA1P,EAAAlK,EAAAI,EAAA,IAAA8X,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAM,GAAApY,EAAA8J,EAAAlK,EAAA+X,EAAA,UAAA8B,GAAAzZ,EAAA8J,GAAA,QAAA6N,EAAA,EAAAA,EAAA7N,EAAA9L,OAAA2Z,IAAA,KAAAG,EAAAhO,EAAA6N,GAAAG,EAAAuB,WAAAvB,EAAAuB,aAAA,EAAAvB,EAAAwB,cAAA,YAAAxB,IAAAA,EAAAyB,UAAA,GAAAtW,OAAAmW,eAAApZ,EAAA0Z,GAAA5B,EAAAhX,KAAAgX,EAAA,WAAA4B,GAAA/B,GAAA,IAAA/b,EAAA,SAAA+b,EAAA7N,GAAA,aAAA6P,GAAAhC,KAAAA,EAAA,OAAAA,EAAA,IAAA3X,EAAA2X,EAAAC,OAAAgC,aAAA,YAAA5Z,EAAA,KAAApE,EAAAoE,EAAA0Y,KAAAf,EAAA7N,GAAA,wBAAA6P,GAAA/d,GAAA,OAAAA,EAAA,UAAA6c,UAAA,kEAAA3O,EAAA+P,OAAAC,QAAAnC,EAAA,CAAAoC,CAAApC,EAAA,0BAAAgC,GAAA/d,GAAAA,EAAAA,EAAA,YAAAoe,GAAAha,GAAA,6BAAAia,GAAAja,EAAAka,MAAA,KAAAlZ,WAAA,WAAAiZ,GAAAja,GAAA,IAAA8J,EAAA6N,EAAA,SAAAwC,EAAArQ,EAAA6N,GAAA,QAAA/X,EAAAI,EAAA8J,GAAA6N,GAAAG,EAAAlY,EAAAlC,MAAAwa,EAAAJ,aAAAsC,GAAAC,QAAAC,QAAApC,EAAAJ,EAAAQ,EAAAR,GAAAyC,KAAA,SAAA5C,GAAA,GAAAO,EAAA,KAAAtc,EAAA,WAAAkO,EAAA,oBAAAgO,EAAAnQ,GAAAgQ,EAAA9X,KAAA,OAAAsa,EAAAve,EAAA+b,GAAAA,EAAA3X,EAAApE,GAAA+b,GAAAja,KAAA,CAAA8c,EAAA5a,EAAAC,KAAA,kBAAA8X,EAAA,WAAA3X,GAAAma,EAAA,QAAAna,EAAA,SAAAA,GAAAwa,EAAA,QAAAxa,EAAA,WAAAwa,EAAAxa,EAAAJ,GAAA,OAAAI,GAAA,aAAA8J,EAAAwQ,QAAA,CAAA5c,MAAAkC,EAAAC,MAAA,sBAAAiK,EAAA2Q,OAAA7a,GAAA,cAAAkK,EAAAwQ,QAAA,CAAA5c,MAAAkC,EAAAC,MAAA,KAAAiK,EAAAA,EAAA4Q,MAAAP,EAAArQ,EAAAhJ,IAAAgJ,EAAA6Q,KAAAhD,EAAA,UAAA6B,QAAA,SAAAxZ,EAAAJ,GAAA,WAAAya,QAAA,SAAAvC,EAAAI,GAAA,IAAAtc,EAAA,CAAAkF,IAAAd,EAAA2a,IAAA/a,EAAA0a,QAAAxC,EAAA2C,OAAAvC,EAAAwC,KAAA,MAAA/C,EAAAA,EAAAA,EAAA+C,KAAA9e,GAAAkO,EAAA6N,EAAA/b,EAAAue,EAAAna,EAAAJ,GAAA,uBAAAI,EAAA,sCAAA4a,GAAA5a,GAAA,WAAAoa,GAAApa,EAAA,YAAA6a,GAAAlD,GAAA,IAAA3X,EAAA,GAAAJ,GAAA,WAAAkb,EAAA9a,EAAA8J,GAAA,OAAAlK,GAAA,EAAAkK,EAAA,IAAAuQ,QAAA,SAAAza,GAAAA,EAAA+X,EAAA3X,GAAA8J,GAAA,IAAAjK,MAAA,EAAAnC,MAAA,IAAA0c,GAAAtQ,EAAA,WAAA9J,EAAA,oBAAA4X,QAAAA,OAAAC,UAAA,sCAAA7X,EAAA0a,KAAA,SAAA/C,GAAA,OAAA/X,GAAAA,GAAA,EAAA+X,GAAAmD,EAAA,OAAAnD,EAAA,qBAAAA,EAAA,QAAA3X,EAAA,eAAA2X,GAAA,GAAA/X,EAAA,MAAAA,GAAA,EAAA+X,EAAA,OAAAmD,EAAA,QAAAnD,EAAA,sBAAAA,EAAA,SAAA3X,EAAA,gBAAA2X,GAAA,OAAA/X,GAAAA,GAAA,EAAA+X,GAAAmD,EAAA,SAAAnD,EAAA,GAAA3X,CAAA,UAAAoa,GAAApa,EAAAuY,GAAA,KAAAD,EAAAtY,EAAA,KAAA2H,EAAA4Q,CAAA,UAAAwC,GAAAjR,GAAA,IAAAlK,EAAA+X,EAAAG,EAAA9X,EAAA,0BAAA4X,SAAAD,EAAAC,OAAAoD,cAAAlD,EAAAF,OAAAC,UAAA7X,KAAA,IAAA2X,GAAA,OAAA/X,EAAAkK,EAAA6N,IAAA,OAAA/X,EAAA8Y,KAAA5O,GAAA,GAAAgO,GAAA,OAAAlY,EAAAkK,EAAAgO,IAAA,WAAAmD,GAAArb,EAAA8Y,KAAA5O,IAAA6N,EAAA,kBAAAG,EAAA,uBAAAW,UAAA,yCAAAwC,GAAAnR,GAAA,SAAAoR,EAAApR,GAAA,GAAA7G,OAAA6G,KAAAA,EAAA,OAAAuQ,QAAAI,OAAA,IAAAhC,UAAA3O,EAAA,2BAAAlK,EAAAkK,EAAAjK,KAAA,OAAAwa,QAAAC,QAAAxQ,EAAApM,OAAA6c,KAAA,SAAAzQ,GAAA,OAAApM,MAAAoM,EAAAjK,KAAAD,EAAA,UAAAqb,GAAA,SAAAnR,GAAA,KAAAnK,EAAAmK,EAAA,KAAAlK,EAAAkK,EAAA4Q,IAAA,EAAAO,GAAAjD,UAAA,CAAArY,EAAA,KAAAC,EAAA,KAAA8a,KAAA,kBAAAQ,EAAA,KAAAtb,EAAAsa,MAAA,KAAAva,EAAAqB,WAAA,kBAAA8I,GAAA,IAAAlK,EAAA,KAAAD,EAAA,uBAAAC,EAAAya,QAAAC,QAAA,CAAA5c,MAAAoM,EAAAjK,MAAA,IAAAqb,EAAAtb,EAAAsa,MAAA,KAAAva,EAAAqB,WAAA,iBAAA8I,GAAA,IAAAlK,EAAA,KAAAD,EAAA,uBAAAC,EAAAya,QAAAI,OAAA3Q,GAAAoR,EAAAtb,EAAAsa,MAAA,KAAAva,EAAAqB,WAAA,OAAAia,GAAAnR,EAAA,CAAAmQ,GAAAjC,UAAA,mBAAAJ,QAAAA,OAAAoD,eAAA,2CAAAf,GAAAjC,UAAA0C,KAAA,SAAA1a,GAAA,YAAAwZ,QAAA,OAAAxZ,EAAA,EAAAia,GAAAjC,UAAA,eAAAhY,GAAA,YAAAwZ,QAAA,QAAAxZ,EAAA,EAAAia,GAAAjC,UAAA,gBAAAhY,GAAA,YAAAwZ,QAAA,SAAAxZ,EAAA,EAmCO,IAAMmb,GAAc,oBAAAA,KAnC3B,SAAA5M,EAAA3O,GAAA,KAAA2O,aAAA3O,GAAA,UAAA6Y,UAAA,qCAmC2B5X,CAAA,KAAAsa,EAAA,QAnC3Bnb,EAmC2Bmb,EAnC3BrR,EAmC2B,KAnC3B6N,EAmC2B,EAAA7W,IAAA,eAAApD,MAWzB,SAA0B0d,GAA4B,OAAApB,GAAA,SAA3BqB,GAAW,IAAEpZ,EAAOjB,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAC,OAAAiY,KAAAE,EAAA,SAAAmC,IAAA,IAAAC,EAAApa,EAAAqa,EAAAC,EAAA,OAAAxC,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAA9b,GAAA,OACE,GADF2b,EACOtZ,EAAjDd,aAAAA,OAAY,IAAAoa,EAAG,EAACA,EAAEC,EAA+BvZ,EAA/BuZ,WAAYC,EAAmBxZ,EAAnBwZ,eAEjB,IAAjBta,EAAkB,CAAAua,EAAA9b,EAAA,QACpB,OAAA8b,EAAAnD,EAAAoD,GAAAd,GAAAE,GAAOI,EAAeS,kBACpBP,EACAG,EACAC,MACD,UAMA,OAAAC,EAAA9b,EAAA,QANA,UACyB,IAAjBuB,EAAkB,CAAAua,EAAA9b,EAAA,QAC3B,OAAA8b,EAAAnD,EAAAoD,GAAAd,GAAAE,GAAOI,EAAeU,oBACpBR,EACAG,EACAC,MACD,gBAEK,IAAItb,MAAM,8BAADC,OAA+Be,IAAe,cAAAua,EAAAnN,EAAA,KAAA+M,EAAA,EAhBbrC,EAgBa,GAAAiB,MAAA,KAAAlZ,UAEjE,GAEA,CAAAF,IAAA,oBAAApD,MAQA,SAAgC2d,EAAaG,EAAYC,GAAgB,OAAAzB,GAAAf,KAAAE,EAAA,SAAA2C,IAAA,IAAA7Z,EAAA8Z,EAAAC,EAAAC,EAAAC,EAAAC,EAAA3c,EAAAD,EAAA6c,EAAAC,EAAAC,EAAA,OAAArD,KAAAC,EAAA,SAAAqD,GAAA,cAAAA,EAAA3c,GAAA,OACjEqC,EAAUwZ,GAAkB,IAAIzZ,EAChC+Z,EAAUxa,GAAOU,GACnB+Z,EAAa,EAACC,GAAA,EAAAC,GAAA,EAAAK,EAAAlR,EAAA,EAAA7L,EAAAub,GACQM,GAAW,cAAAkB,EAAA3c,EAAA,EAAAgb,GAAApb,EAAAkb,QAAA,YAAAuB,IAAA1c,EAAAgd,EAAAjE,GAAAzY,MAAA,CAAA0c,EAAA3c,EAAA,QAEnC,OAFewc,EAAK7c,EAAA7B,MACd2e,EAASN,EAAQK,GAAMG,EAAA3c,EAAA,EACvByc,EAAM,OAERb,GACFA,EAAWQ,KACZ,OAAAC,GAAA,EAAAM,EAAA3c,EAAA,eAAA2c,EAAA3c,EAAA,eAAA2c,EAAAlR,EAAA,EAAAiR,EAAAC,EAAAjE,EAAA4D,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAAlR,EAAA,EAAAkR,EAAAlR,EAAA,GAAA4Q,GAAA,MAAAzc,EAAA,QAAA+c,EAAA3c,EAAA,gBAAA2c,EAAA3c,EAAA,GAAAgb,GAAApb,EAAA,qBAAA+c,EAAAlR,EAAA,IAAA6Q,EAAA,CAAAK,EAAA3c,EAAA,eAAAuc,EAAA,eAAAI,EAAAtc,EAAA,mBAAAsc,EAAAtc,EAAA,kBAAAsc,EAAAhO,EAAA,KAAAuN,EAAA,gCAVoE9B,EAYzE,GAEA,CAAAlZ,IAAA,sBAAApD,MAQA,SAAkC2d,EAAaG,EAAYC,GAAgB,OAAAzB,GAAAf,KAAAE,EAAA,SAAAqD,IAAA,IAAAva,EAAAwa,EAAAC,EAAAV,EAAAW,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAApE,KAAAC,EAAA,SAAAoE,GAAA,cAAAA,EAAA1d,GAAA,OACnEqC,EAAUwZ,GAAkB,IAAIzZ,EAChCya,EAAclb,GAAOU,GACrBya,EAAenb,GAAOU,GACxB+Z,EAAa,EAACW,GAAA,EAAAC,GAAA,EAAAU,EAAAjS,EAAA,EAAAyR,EAAA/B,GAE0BM,GAAW,cAAAiC,EAAA1d,EAAA,EAAAgb,GAAAkC,EAAApC,QAAA,YAAAiC,IAAAI,EAAAO,EAAAhF,GAAAzY,MAAA,CAAAyd,EAAA1d,EAAA,QAIrD,OAJqDod,EAAA5Z,GAAA2Z,EAAArf,MAAA,GAArCuf,EAASD,EAAA,GAAEE,EAAUF,EAAA,GAC/BG,EAAaV,EAAYQ,GACzBG,EAAcV,EAAaQ,GAAWI,EAAA1d,EAAA,EAEtCud,EAAU,OAChB,OADgBG,EAAA1d,EAAA,EACVwd,EAAW,OAEb5B,GACFA,EAAWQ,KACZ,OAAAW,GAAA,EAAAW,EAAA1d,EAAA,eAAA0d,EAAA1d,EAAA,eAAA0d,EAAAjS,EAAA,EAAAgS,EAAAC,EAAAhF,EAAAsE,GAAA,EAAAC,EAAAQ,EAAA,UAAAC,EAAAjS,EAAA,EAAAiS,EAAAjS,EAAA,IAAAsR,GAAA,MAAAG,EAAA,QAAAQ,EAAA1d,EAAA,gBAAA0d,EAAA1d,EAAA,GAAAgb,GAAAkC,EAAA,qBAAAQ,EAAAjS,EAAA,IAAAuR,EAAA,CAAAU,EAAA1d,EAAA,eAAAid,EAAA,eAAAS,EAAArd,EAAA,mBAAAqd,EAAArd,EAAA,kBAAAqd,EAAA/O,EAAA,KAAAiO,EAAA,iCAfsExC,EAiB3E,GAEA,CAAAlZ,IAAA,eAAApD,MASA,SAA0B6f,GAA8B,OAAAvD,GAAA,SAA7BwD,GAAa,IAAEvb,EAAOjB,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAC,OAAAiY,KAAAE,EAAA,SAAAsE,IAAA,IAAAC,EAAAvc,EAAAqa,EAAA,OAAAvC,KAAAC,EAAA,SAAAyE,GAAA,cAAAA,EAAA/d,GAAA,OAChB,GADgB8d,EACXzb,EAAjCd,aAAAA,OAAY,IAAAuc,EAAG,EAACA,EAAElC,EAAevZ,EAAfuZ,WAEL,IAAjBra,EAAkB,CAAAwc,EAAA/d,EAAA,QACpB,OAAA+d,EAAApF,EAAAoD,GAAAd,GAAAE,GAAOI,EAAeyC,kBAAkBJ,EAAehC,MAAW,UAEE,OAAAmC,EAAA/d,EAAA,QAFF,UACxC,IAAjBuB,EAAkB,CAAAwc,EAAA/d,EAAA,QAC3B,OAAA+d,EAAApF,EAAAoD,GAAAd,GAAAE,GAAOI,EAAe0C,oBAAoBL,EAAehC,MAAW,gBAE9D,IAAIrb,MAAM,8BAADC,OAA+Be,IAAe,cAAAwc,EAAApP,EAAA,KAAAkP,EAAA,EARXxE,EAQW,GAAAiB,MAAA,KAAAlZ,UAEjE,GAEA,CAAAF,IAAA,oBAAApD,MAOA,SAAgC8f,EAAehC,GAAY,OAAAxB,GAAAf,KAAAE,EAAA,SAAA2E,IAAA,IAAAC,EAAA/B,EAAAgC,EAAA,OAAA/E,KAAAC,EAAA,SAAA+E,GAAA,cAAAA,EAAAre,GAAA,OAiBzD,OAhBMme,EAAUjc,KACZka,EAAa,EAGXgC,EAAY,eAAAhX,EAAAgT,GAAAf,KAAAE,EAAG,SAAA+E,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAnC,EAAAC,EAAAmC,EAAA,OAAAvF,KAAAC,EAAA,SAAAuF,GAAA,cAAAA,EAAA7e,GAAA,OAAAue,GAAA,EAAAC,GAAA,EAAAK,EAAApT,EAAA,EAAAiT,EAAAvD,GACOyC,GAAa,cAAAiB,EAAA7e,EAAA,EAAAgb,GAAA0D,EAAA5D,QAAA,YAAAyD,IAAAI,EAAAE,EAAAnG,GAAAzY,MAAA,CAAA4e,EAAA7e,EAAA,QAErC,OAFewc,EAAKmC,EAAA7gB,MACd2e,EAAS0B,EAAQ3B,GAAMqC,EAAA7e,EAAA,EACvByc,EAAM,OAERb,GACFA,EAAWQ,KACZ,OAAAmC,GAAA,EAAAM,EAAA7e,EAAA,eAAA6e,EAAA7e,EAAA,eAAA6e,EAAApT,EAAA,EAAAmT,EAAAC,EAAAnG,EAAA8F,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAApT,EAAA,EAAAoT,EAAApT,EAAA,GAAA8S,GAAA,MAAAG,EAAA,QAAAG,EAAA7e,EAAA,gBAAA6e,EAAA7e,EAAA,GAAAgb,GAAA0D,EAAA,qBAAAG,EAAApT,EAAA,IAAA+S,EAAA,CAAAK,EAAA7e,EAAA,eAAAye,EAAA,eAAAI,EAAAxe,EAAA,mBAAAwe,EAAAxe,EAAA,kBAAAwe,EAAAlQ,EAAA,KAAA2P,EAAA,iCAEJ,kBATiB,OAAAlX,EAAAkT,MAAA,KAAAlZ,UAAA,KAYlBid,EAAA1F,EAAAoD,GAAAd,GAAAE,GAAOiD,OAAc,iBAAAC,EAAA1P,EAAA,KAAAuP,EAAA,GAjBoC9D,EAkB3D,GAEA,CAAAlZ,IAAA,sBAAApD,MAOA,SAAkC8f,EAAehC,GAAY,OAAAxB,GAAAf,KAAAE,EAAA,SAAAuF,IAAA,IAAAC,EAAAC,EAAA5C,EAAAgC,EAAA,OAAA/E,KAAAC,EAAA,SAAA2F,GAAA,cAAAA,EAAAjf,GAAA,OA2C3D,OA1CM+e,EAAc7c,KACd8c,EAAe9c,KACjBka,EAAa,EAEXgC,EAAY,eAAA/W,EAAA+S,GAAAf,KAAAE,EAAG,SAAA2F,IAAA,IAAA7B,EAAA8B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAhD,EAAAc,EAAAC,EAAAC,EAAAiC,EAAAC,EAAAC,EAAAC,EAAA,OAAAvG,KAAAC,EAAA,SAAAuG,GAAA,cAAAA,EAAA7f,GAAA,OACfqd,EAAY,KACZ8B,GAAgB,EAAIC,GAAA,EAAAC,GAAA,EAAAQ,EAAApU,EAAA,EAAA8T,EAAApE,GAEEyC,GAAa,cAAAiC,EAAA7f,EAAA,EAAAgb,GAAAuE,EAAAzE,QAAA,YAAAsE,IAAAI,EAAAK,EAAAnH,GAAAzY,MAAA,CAAA4f,EAAA7f,EAAA,QAAjB,GAALwc,EAAKgD,EAAA1hB,OAChBqhB,EAAe,CAAFU,EAAA7f,EAAA,QACfqd,EAAYb,EAAKqD,EAAA7f,EAAA,eAQjB,OANMsd,EAAad,EAGbe,EAAawB,EAAY1B,GACzBG,EAAcwB,EAAa1B,GAAWuC,EAAA7f,EAAA,EAEtC,CAACud,EAAYC,GAAY,OAE3B5B,GACFA,EAAWQ,KACZ,OAGH+C,GAAiBA,EAAa,OAAAC,GAAA,EAAAS,EAAA7f,EAAA,eAAA6f,EAAA7f,EAAA,gBAAA6f,EAAApU,EAAA,EAAAmU,EAAAC,EAAAnH,EAAA2G,GAAA,EAAAC,EAAAM,EAAA,WAAAC,EAAApU,EAAA,GAAAoU,EAAApU,EAAA,IAAA2T,GAAA,MAAAG,EAAA,QAAAM,EAAA7f,EAAA,gBAAA6f,EAAA7f,EAAA,GAAAgb,GAAAuE,EAAA,qBAAAM,EAAApU,EAAA,IAAA4T,EAAA,CAAAQ,EAAA7f,EAAA,eAAAsf,EAAA,eAAAO,EAAAxf,EAAA,mBAAAwf,EAAAxf,EAAA,eAG3B8e,IAAiB9B,EAAS,CAAAwC,EAAA7f,EAAA,SAK7B,OAJMsd,EAAa/B,EAAeuE,oBAC5BvC,EAAawB,EAAY1B,GACzBG,EAAcwB,EAAa1B,GAAWuC,EAAA7f,EAAA,GAEtC,CAACud,EAAYC,GAAY,QAE3B5B,GACFA,EAAWQ,KACZ,eAAAyD,EAAAlR,EAAA,KAAAuQ,EAAA,mCAEJ,kBAnCiB,OAAA7X,EAAAiT,MAAA,KAAAlZ,UAAA,KAsClB6d,EAAAtG,EAAAoD,GAAAd,GAAAE,GAAOiD,OAAc,iBAAAa,EAAAtQ,EAAA,KAAAmQ,EAAA,GA3CsC1E,EA4C7D,GAEA,CAAAlZ,IAAA,sBAAApD,MAOA,SAA4B6L,GAAO,IAAEoW,EAAS3e,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,Gd1Nf,Ic0NmC,OAAAiY,KAAAE,EAAA,SAAAyG,IAAA,IAAAze,EAAA0e,EAAAC,EAAAlkB,EAAAwgB,EAAA2D,EAAArf,EAAAsf,EAAAC,EAAAC,EAAAC,EAAApd,EAAAka,EAAAC,EAAAkD,EAAAC,EAAA,OAAApH,KAAAC,EAAA,SAAAoH,GAAA,cAAAA,EAAA1gB,GAAA,OAC7B,GAEd,KAFfuB,EAAeoI,EAAQvL,QAEP,CAAAsiB,EAAA1gB,EAAA,QAAAigB,EAAAzc,GACLmG,EAAO,GAAfuW,EAAID,EAAA,GACFjkB,EAAI,EAAC,YAAEA,EAAIkkB,EAAK9hB,QAAM,CAAAsiB,EAAA1gB,EAAA,QAG7B,IAFMwc,EAAQ,IAAIlgB,aAAayjB,GACzBI,EAAMlkB,KAAKsC,IAAIvC,EAAI+jB,EAAWG,EAAK9hB,QAChC0C,EAAI,EAAGA,EAAIqf,EAAMnkB,EAAG8E,IAC3B0b,EAAM1b,GAAKof,EAAKlkB,EAAI8E,GAEtB,OADC4f,EAAA1gB,EAAA,EACKwc,EAAK,OANoBxgB,GAAK+jB,EAASW,EAAA1gB,EAAA,eAAA0gB,EAAA1gB,EAAA,kBAQrB,IAAjBuB,EAAkB,CAAAmf,EAAA1gB,EAAA,QAAAogB,EAAA5c,GACLmG,EAAO,GAAtBuW,EAAIE,EAAA,GAAEE,EAAKF,EAAA,GACZG,EAAYtkB,KAAK0H,IAAIuc,EAAK9hB,OAAQkiB,EAAMliB,QAErCpC,EAAI,EAAC,YAAEA,EAAIukB,GAAS,CAAAG,EAAA1gB,EAAA,QAM3B,IALMqd,EAAY,IAAI/gB,aAAayjB,GAC7BzC,EAAa,IAAIhhB,aAAayjB,GAE9BI,EAAMlkB,KAAKsC,IAAIvC,EAAI+jB,EAAWQ,GAE3Bzf,EAAI,EAAGA,EAAIqf,EAAMnkB,EAAG8E,IAC3Buc,EAAUvc,GAAK9E,EAAI8E,EAAIof,EAAK9hB,OAAS8hB,EAAKlkB,EAAI8E,GAAK,EACnDwc,EAAWxc,GAAK9E,EAAI8E,EAAIwf,EAAMliB,OAASkiB,EAAMtkB,EAAI8E,GAAK,EAGxD,OAFC4f,EAAA1gB,EAAA,EAEK,CAACqd,EAAWC,GAAW,OAXAthB,GAAK+jB,EAASW,EAAA1gB,EAAA,eAAA0gB,EAAA1gB,EAAA,qBAcvC,IAAIO,MAAM,8BAADC,OAA+Be,IAAe,cAAAmf,EAAA/R,EAAA,KAAAqR,EAAA,EA/BC3G,EA+BD,GAIjE,CAAAnY,IAAA,gBAAApD,OAAA6iB,EAAAC,GAAAvH,KAAAE,EAKA,SAAAsH,EAA2BC,GAAW,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA5E,EAAA6E,EAAA,OAAAhI,KAAAC,EAAA,SAAAgI,GAAA,cAAAA,EAAAthB,GAAA,OAC9B+gB,EAAS,GAAEC,GAAA,EAAAC,GAAA,EAAAK,EAAA7V,EAAA,EAAA0V,EAAAhG,GACS2F,GAAW,cAAAQ,EAAAthB,EAAA,EAAAmhB,EAAArG,OAAA,YAAAkG,IAAAI,EAAAE,EAAA5I,GAAAzY,MAAA,CAAAqhB,EAAAthB,EAAA,QAApBwc,EAAK4E,EAAAtjB,MACpBijB,EAAOhgB,KAAKyb,GAAM,OAAAwE,GAAA,EAAAM,EAAAthB,EAAA,eAAAshB,EAAAthB,EAAA,eAAAshB,EAAA7V,EAAA,EAAA4V,EAAAC,EAAA5I,EAAAuI,GAAA,EAAAC,EAAAG,EAAA,UAAAC,EAAA7V,EAAA,EAAA6V,EAAA7V,EAAA,GAAAuV,GAAA,MAAAG,EAAA,QAAAG,EAAAthB,EAAA,eAAAshB,EAAAthB,EAAA,EAAAmhB,EAAA,mBAAAG,EAAA7V,EAAA,GAAAwV,EAAA,CAAAK,EAAAthB,EAAA,eAAAkhB,EAAA,eAAAI,EAAAjhB,EAAA,kBAAAihB,EAAAjhB,EAAA,kBAAAihB,EAAA3S,EAAA,EAEboS,GAAM,EAAAF,EAAA,gCACd,SANyBU,GAAA,OAAAZ,EAAArG,MAAC,KAADlZ,UAAA,IAQ1B,CAAAF,IAAA,oBAAApD,MAKA,WACE,MAAO,CACLsB,KAAM,EACNE,WAAY,CAAC,EAAG,EAAG,GACnBG,mBAAoB,IAAInE,WAAW,GACnCkE,kBAAmB,IAAIlE,WAAW,GAClCwE,sBAAuB,GAE3B,GAEA,CAAAoB,IAAA,gBAAApD,OAAA0jB,EAAAZ,GAAAvH,KAAAE,EAQA,SAAAkI,EAA2B7D,GAAa,IAAAvb,EAAAqf,EAAAvgB,EAAAwgB,EAAApgB,EAAAwf,EAAAa,EAAAC,EAAAC,EAAAC,EAAAC,EAAAxF,EAAAnd,EAAA4iB,EAAArkB,EAAAqI,EAAAnC,EAAAoe,EAAAC,EAAAC,EAAAC,EAAAjhB,UAAA,OAAAiY,KAAAC,EAAA,SAAAgJ,GAAA,cAAAA,EAAAtiB,GAAA,OAAc0hB,GAAZrf,EAAOggB,EAAAjkB,OAAA,QAAAiD,IAAAghB,EAAA,GAAAA,EAAA,GAAG,CAAC,GAC3ClhB,MAAAA,OAAK,IAAAugB,EAAG,uBAAsBA,EAAAC,EAAuBtf,EAArBd,aAAAA,OAAY,IAAAogB,EAAG,EAACA,EAElDZ,EAAS,GAAEa,GAAA,EAAAC,GAAA,EAAAS,EAAA7W,EAAA,EAAAsW,EAAA5G,GACSyC,GAAa,cAAA0E,EAAAtiB,EAAA,EAAA+hB,EAAAjH,OAAA,YAAA8G,IAAAI,EAAAM,EAAA5J,GAAAzY,MAAA,CAAAqiB,EAAAtiB,EAAA,QAAtBwc,EAAKwF,EAAAlkB,MACpBijB,EAAOhgB,KAAKjC,EAAe0d,IAAO,OAAAoF,GAAA,EAAAU,EAAAtiB,EAAA,eAAAsiB,EAAAtiB,EAAA,eAAAsiB,EAAA7W,EAAA,EAAA2W,EAAAE,EAAA5J,EAAAmJ,GAAA,EAAAC,EAAAM,EAAA,UAAAE,EAAA7W,EAAA,EAAA6W,EAAA7W,EAAA,GAAAmW,GAAA,MAAAG,EAAA,QAAAO,EAAAtiB,EAAA,eAAAsiB,EAAAtiB,EAAA,EAAA+hB,EAAA,mBAAAO,EAAA7W,EAAA,GAAAoW,EAAA,CAAAS,EAAAtiB,EAAA,eAAA8hB,EAAA,eAAAQ,EAAAjiB,EAAA,kBAAAiiB,EAAAjiB,EAAA,WAWpC,IARMhB,EAAS2B,EAAQuhB,aAAaphB,EAAO4f,EAAO3iB,OAAQmD,GACpD0gB,EACJ5iB,EAAOjB,OAAS2iB,EAAOjc,OAAO,SAAC0d,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAMpe,MAAM,EAAE,IAE9DR,EAAS,IAAI1C,WAAW+mB,IACvBzgB,IAAInC,EAAQ,GAEf4G,EAAS5G,EAAOjB,OACpB0F,EAAA,EAAAoe,EAAoBnB,EAAMjd,EAAAoe,EAAA9jB,OAAA0F,IAAf0Y,EAAK0F,EAAApe,GACdlG,EAAO4D,IAAIgb,EAAOvW,GAClBA,GAAUuW,EAAMpe,OACjB,OAAAkkB,EAAA3T,EAAA,EAEM,IAAI8T,KAAK,CAAC7kB,GAAS,CAAE8kB,KAAM,8BAA6B,EAAAjB,EAAA,gCAChE,SAtByBkB,GAAA,OAAAnB,EAAAlH,MAAC,KAADlZ,UAAA,IAwB1B,CAAAF,IAAA,gBAAApD,MAQA,SAAqB8kB,GAAuD,IAA5CrhB,EAAYH,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAG,EAAGyhB,EAAUzhB,UAAAhD,OAAA,QAAAiD,IAAAD,UAAA,GAAAA,UAAA,GAAGpG,EACvD+lB,EAASvc,MAAMse,QAAQF,GAAaA,EAAY,CAACA,GAEvD,GAAqB,IAAjBrhB,EACF,OAAOga,EAAewH,mBAAmBhC,EAAQ8B,GAC5C,GAAqB,IAAjBthB,EACT,OAAOga,EAAeyH,qBAAqBjC,EAAQ8B,GAEnD,MAAM,IAAItiB,MAAM,8BAADC,OAA+Be,GAElD,GAEA,CAAAL,IAAA,qBAAApD,MAOA,SAA0BijB,EAAQ8B,GAChC,IAAMI,EAAelC,EAAOjc,OAAO,SAAC0d,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAMpe,MAAM,EAAE,GACjER,EAAS,IAAIslB,Yd/NQ,GACK,Ec+NZD,GAEdjkB,EAAO,IAAIC,SAASrB,GAG1B2d,EAAe4H,gBAAgBnkB,EAAMikB,EAAc,EAAGJ,GAGtD,IAC0BO,EADtBnd,EdxOuB,GcwOCod,EAAAxjB,GACRkhB,GAAM,IAA1B,IAAAsC,EAAAtjB,MAAAqjB,EAAAC,EAAArjB,KAAAC,MACE,IAD0B,IAAjBuc,EAAK4G,EAAAtlB,MACL9B,EAAI,EAAGA,EAAIwgB,EAAMpe,OAAQpC,IAAK,CACrC,IAAMsnB,EAASrnB,KAAK0H,KAAK,EAAG1H,KAAKsC,IAAI,EAAGie,EAAMxgB,KAC9CgD,EAAKukB,SACHtd,EACAqd,EAAS,EACLA,EAASlmB,EACTkmB,EAASnmB,GACb,GAEF8I,GdlP4B,CcmP9B,CACD,OAAA9F,GAAAkjB,EAAAjjB,EAAAD,EAAA,SAAAkjB,EAAAhjB,GAAA,CAED,OAAO,IAAIoiB,KAAK,CAAC7kB,GAAS,CAAE8kB,KAAM,aACpC,GAEA,CAAAxhB,IAAA,uBAAApD,MAOA,SAA4B0lB,EAAYX,GACtC,IAAMI,EAAeO,EAAW1e,OAC9B,SAAC0d,EAAGiB,GAAA,IAAAC,EAAAlgB,GAAAigB,EAAE,GAACvD,EAAIwD,EAAA,GAAEpD,EAAKoD,EAAA,UAAMlB,EAAMvmB,KAAK0H,IAAIuc,EAAK9hB,OAAQkiB,EAAMliB,OAAO,EACjE,GAGIR,EAAS,IAAIslB,YdvQQ,GACK,EcuQZD,EAAsC,GAEpDjkB,EAAO,IAAIC,SAASrB,GAG1B2d,EAAe4H,gBAAgBnkB,EAAMikB,EAAc,EAAGJ,GAGtD,IACgDc,EAD5C1d,EdhRuB,GcgRC2d,EAAA/jB,GACU2jB,GAAU,IAAhD,IAAAI,EAAA7jB,MAAA4jB,EAAAC,EAAA5jB,KAAAC,MAEE,IAFgD,IAAA4jB,EAAArgB,GAAAmgB,EAAA7lB,MAAA,GAAtCuf,EAASwG,EAAA,GAAEvG,EAAUuG,EAAA,GACzBC,EAAc7nB,KAAK0H,IAAI0Z,EAAUjf,OAAQkf,EAAWlf,QACjDpC,EAAI,EAAGA,EAAI8nB,EAAa9nB,IAAK,CACpC,IAAM+nB,EAAa/nB,EAAIqhB,EAAUjf,OAASif,EAAUrhB,GAAK,EACnDgoB,EAAchoB,EAAIshB,EAAWlf,OAASkf,EAAWthB,GAAK,EACtDioB,EAAchoB,KAAK0H,KAAK,EAAG1H,KAAKsC,IAAI,EAAGwlB,IACvCG,EAAejoB,KAAK0H,KAAK,EAAG1H,KAAKsC,IAAI,EAAGylB,IAC9ChlB,EAAKukB,SACHtd,EACAge,EAAc,EACVA,EAAc7mB,EACd6mB,EAAc9mB,GAClB,GAEF8I,Gd9R4B,Ec+R5BjH,EAAKukB,SACHtd,EACAie,EAAe,EACXA,EAAe9mB,EACf8mB,EAAe/mB,GACnB,GAEF8I,GdtS4B,CcuS9B,CACD,OAAA9F,GAAAyjB,EAAAxjB,EAAAD,EAAA,SAAAyjB,EAAAvjB,GAAA,CAED,OAAO,IAAIoiB,KAAK,CAAC7kB,GAAS,CAAE8kB,KAAM,aACpC,GAEA,CAAAxhB,IAAA,kBAAApD,MAQA,SAAuBkB,EAAMikB,EAAc1hB,EAAcshB,GACvD,IAAMsB,EAAWtB,EAAathB,EdtTE,EcuT1B6iB,EdvT0B,EcuTb7iB,EACb8iB,EAAWpB,EAAemB,EAC1BE,EdrTqB,GcqTQD,EAE/B5M,EAAM,EAGJ8M,EAAc,SAACte,EAAQue,GAC3B,IAAK,IAAIxoB,EAAI,EAAGA,EAAIwoB,EAAOpmB,OAAQpC,IACjCgD,EAAKylB,SAASxe,EAASjK,EAAGwoB,EAAOE,WAAW1oB,GAEhD,EAGAuoB,EAAY9M,EAAK,QACjBA,GAAO,EACPzY,EAAK8C,UAAU2V,EAAK6M,GAAU,GAE9BC,EADA9M,GAAO,EACU,QAIjB8M,EAHA9M,GAAO,EAGU,QACjBA,GAAO,EACPzY,EAAK8C,UAAU2V,EAAK,IAAI,GACxBA,GAAO,EACPzY,EAAKO,UAAUkY,EAAK,GAAG,GACvBA,GAAO,EACPzY,EAAKO,UAAUkY,EAAKlW,GAAc,GAClCkW,GAAO,EACPzY,EAAK8C,UAAU2V,EAAKoL,GAAY,GAChCpL,GAAO,EACPzY,EAAK8C,UAAU2V,EAAK0M,GAAU,GAC9B1M,GAAO,EACPzY,EAAKO,UAAUkY,EAAK2M,GAAY,GAChC3M,GAAO,EACPzY,EAAKO,UAAUkY,Ed1VgB,Ic0VU,GAIzC8M,EAHA9M,GAAO,EAGU,QACjBA,GAAO,EACPzY,EAAK8C,UAAU2V,EAAK4M,GAAU,EAChC,GAEA,CAAAnjB,IAAA,eAAApD,OAAA6mB,EAAA/D,GAAAvH,KAAAE,EAOA,SAAAqL,EAA0BC,GAAI,IAAAjnB,EAAAyB,EAAAylB,EAAA/lB,EAAA/C,EAAAwgB,EAAA,OAAAnD,KAAAC,EAAA,SAAAyL,GAAA,cAAAA,EAAA/kB,GAAA,cAAA+kB,EAAA/kB,EAAA,EACP6kB,EAAKG,cAAa,OAKvC,IALMpnB,EAAMmnB,EAAArM,EACNrZ,EAAS,IAAInE,WAAW0C,EAAOuI,MAAM,EAAGhL,IACxC2pB,EAAO9jB,EAAQikB,YAAY5lB,GAE3BN,EAAY,GACT/C,EAAIb,EAAiBa,EAAI4B,EAAO8C,WAAY1E,GAAKZ,GAClDohB,EAAQ,IAAIthB,WAAW0C,EAAOuI,MAAMnK,EAAGA,EAAIZ,KACvCgD,SAAWhD,GACnB2D,EAAUgC,KAAKyb,GAElB,OAAAuI,EAAApW,EAAA,EAEM,CAAEmW,KAAAA,EAAM/lB,UAAAA,IAAW,EAAA6lB,EAAA,IAC3B,SAdwBM,GAAA,OAAAP,EAAArK,MAAC,KAADlZ,UAAA,IAgBzB,CAAAF,IAAA,0BAAApD,MAAAub,KAAAE,EAKA,SAAQ4L,EAAwBpmB,GAAS,IAAAqmB,EAAAC,EAAA7I,EAAA8I,EAAA,OAAAjM,KAAAC,EAAA,SAAAiM,GAAA,cAAAA,EAAAvlB,GAAA,OAAAolB,EAAAvlB,GACnBd,GAASwmB,EAAA9Z,EAAA,EAAA2Z,EAAArlB,IAAA,WAAAslB,EAAAD,EAAAplB,KAAAC,KAAE,CAAFslB,EAAAvlB,EAAA,QAC3B,OADSwc,EAAK6I,EAAAvnB,MAAAynB,EAAAvlB,EAAA,EACRM,EAAiBkc,GAAM,OAAA+I,EAAAvlB,EAAA,eAAAulB,EAAAvlB,EAAA,eAAAulB,EAAA9Z,EAAA,EAAA6Z,EAAAC,EAAA7M,EAAA0M,EAAAhlB,EAAAklB,GAAA,cAAAC,EAAA9Z,EAAA,EAAA2Z,EAAA/kB,IAAAklB,EAAAllB,EAAA,iBAAAklB,EAAA5W,EAAA,KAFzBwW,EAAuB,qBAM/B,CAAAjkB,IAAA,oBAAApD,MAOA,SAAyB8kB,EAAWrhB,GAClC,GAAqB,IAAjBA,EAAoB,CACtB,IAM6BikB,EANvBvC,EAAeL,EAAU9d,OAC7B,SAAC0d,EAAKhG,GAAK,OAAKgG,EAAMhG,EAAMpe,MAAM,EAClC,GAEIqnB,EAAM,IAAInpB,aAAa2mB,GACzBhd,EAAS,EAACyf,EAAA7lB,GACM+iB,GAAS,IAA7B,IAAA8C,EAAA3lB,MAAAylB,EAAAE,EAAA1lB,KAAAC,MAA+B,KAApBuc,EAAKgJ,EAAA1nB,MACd2nB,EAAIjkB,IAAIgb,EAAOvW,GACfA,GAAUuW,EAAMpe,MAClB,CAAC,OAAA+B,GAAAulB,EAAAtlB,EAAAD,EAAA,SAAAulB,EAAArlB,GAAA,CACD,OAAOolB,CACT,CAAO,GAAqB,IAAjBlkB,EAAoB,CAC7B,IAO+CokB,EAPzC1C,EAAeL,EAAU9d,OAC7B,SAAC0d,EAAGoD,GAAA,IAAAC,EAAAriB,GAAAoiB,EAAE,GAAC1F,EAAI2F,EAAA,GAAEvF,EAAKuF,EAAA,UAAMrD,EAAMvmB,KAAK0H,IAAIuc,EAAK9hB,OAAQkiB,EAAMliB,OAAO,EACjE,GAEIqnB,EAAM,IAAInpB,aAA4B,EAAf2mB,GAEzB6C,EAAY,EAACC,EAAAlmB,GACqB+iB,GAAS,IAA/C,IAAAmD,EAAAhmB,MAAA4lB,EAAAI,EAAA/lB,KAAAC,MAEE,IAF+C,IAAA+lB,EAAAxiB,GAAAmiB,EAAA7nB,MAAA,GAArCuf,EAAS2I,EAAA,GAAE1I,EAAU0I,EAAA,GACzBlC,EAAc7nB,KAAK0H,IAAI0Z,EAAUjf,OAAQkf,EAAWlf,QACjD0C,EAAI,EAAGA,EAAIgjB,EAAahjB,IAC/B2kB,EAAgB,EAAZK,GAAiBhlB,EAAIuc,EAAUjf,OAASif,EAAUvc,GAAK,EAC3D2kB,EAAgB,EAAZK,EAAgB,GAAKhlB,EAAIwc,EAAWlf,OAASkf,EAAWxc,GAAK,EACjEglB,GAEH,OAAA3lB,GAAA4lB,EAAA3lB,EAAAD,EAAA,SAAA4lB,EAAA1lB,GAAA,CACD,OAAOolB,CACT,CACE,MAAM,IAAIllB,MAAM,8BAADC,OAA+Be,GAElD,IA3iBF2I,GAAA2P,GAAAzZ,EAAAgY,UAAAlO,GAAA6N,GAAA8B,GAAAzZ,EAAA2X,GAAA1U,OAAAmW,eAAApZ,EAAA,aAAAuZ,UAAA,IAAAvZ,EAAA,IAAAA,EAAA8J,EAAA6N,EAieE4M,EAnMAnD,EA5BAb,CAySC,CAxgBwB,G,44CCnC3B,IAAAvgB,EAAA2X,EAAA7N,EAAA,mBAAA8N,OAAAA,OAAA,GAAAhY,EAAAkK,EAAA+N,UAAA,aAAAC,EAAAhO,EAAAiO,aAAA,yBAAAnc,EAAAkO,EAAAlK,EAAAkY,EAAAlc,GAAA,IAAAoO,EAAApK,GAAAA,EAAAoY,qBAAAC,EAAArY,EAAAqY,EAAAC,EAAAjV,OAAAkV,OAAAnO,EAAAgO,WAAA,OAAAI,GAAAF,EAAA,mBAAApO,EAAAlK,EAAAkY,GAAA,IAAAlc,EAAAoO,EAAAkO,EAAAjY,EAAA,EAAAoL,EAAAyM,GAAA,GAAAhM,GAAA,EAAAuM,EAAA,CAAAhN,EAAA,EAAAzL,EAAA,EAAA0Y,EAAAtY,EAAAuO,EAAAgK,EAAAtY,EAAAsY,EAAAC,KAAAxY,EAAA,GAAAuY,EAAA,SAAAZ,EAAA7N,GAAA,OAAAlO,EAAA+b,EAAA3N,EAAA,EAAAkO,EAAAlY,EAAAqY,EAAAzY,EAAAkK,EAAAyE,CAAA,YAAAgK,EAAAzO,EAAAlK,GAAA,IAAAoK,EAAAF,EAAAoO,EAAAtY,EAAA+X,EAAA,GAAA7L,GAAA7L,IAAA6X,GAAAH,EAAAtM,EAAArN,OAAA2Z,IAAA,KAAAG,EAAAlc,EAAAyP,EAAAsM,GAAAY,EAAAF,EAAAhN,EAAA4D,EAAArT,EAAA,GAAAkO,EAAA,GAAAgO,EAAA7I,IAAArP,KAAAsY,EAAAtc,GAAAoO,EAAApO,EAAA,OAAAoO,EAAA,MAAApO,EAAA,GAAAA,EAAA,GAAAoE,GAAApE,EAAA,IAAA2c,KAAAT,EAAAhO,EAAA,GAAAyO,EAAA3c,EAAA,KAAAoO,EAAA,EAAAqO,EAAAC,EAAA1Y,EAAAyY,EAAAzY,EAAAhE,EAAA,IAAA2c,EAAAtJ,IAAA6I,EAAAhO,EAAA,GAAAlO,EAAA,GAAAgE,GAAAA,EAAAqP,KAAArT,EAAA,GAAAkO,EAAAlO,EAAA,GAAAgE,EAAAyY,EAAAzY,EAAAqP,EAAAjF,EAAA,OAAA8N,GAAAhO,EAAA,SAAAyE,EAAA,MAAAzC,GAAA,EAAAlM,CAAA,iBAAAkY,EAAAzM,EAAA4D,GAAA,GAAAhP,EAAA,QAAAwY,UAAA,oCAAA3M,GAAA,IAAAT,GAAAkN,EAAAlN,EAAA4D,GAAAjF,EAAAqB,EAAA6M,EAAAjJ,GAAA0I,EAAA3N,EAAA,EAAAhK,EAAAkY,KAAApM,GAAA,CAAAlQ,IAAAoO,EAAAA,EAAA,GAAAA,EAAA,IAAAqO,EAAAzY,GAAA,GAAA2Y,EAAAvO,EAAAkO,IAAAG,EAAAzY,EAAAsY,EAAAG,EAAAC,EAAAJ,GAAA,OAAAjY,EAAA,EAAArE,EAAA,IAAAoO,IAAA8N,EAAA,QAAAH,EAAA/b,EAAAkc,GAAA,MAAAH,EAAAA,EAAAe,KAAA9c,EAAAsc,IAAA,MAAAO,UAAA,wCAAAd,EAAA9X,KAAA,OAAA8X,EAAAO,EAAAP,EAAAja,MAAAsM,EAAA,IAAAA,EAAA,YAAAA,IAAA2N,EAAA/b,EAAA,SAAA+b,EAAAe,KAAA9c,GAAAoO,EAAA,IAAAkO,EAAAO,UAAA,oCAAAX,EAAA,YAAA9N,EAAA,GAAApO,EAAAoE,CAAA,UAAA2X,GAAA7L,EAAAuM,EAAAzY,EAAA,GAAAsY,EAAApO,EAAA4O,KAAA9Y,EAAAyY,MAAA9J,EAAA,YAAAoJ,GAAA/b,EAAAoE,EAAAgK,EAAA,EAAAkO,EAAAP,CAAA,SAAA1X,EAAA,UAAAvC,MAAAia,EAAA9X,KAAAiM,EAAA,GAAAhC,EAAAgO,EAAAlc,IAAA,GAAAsc,CAAA,KAAA3J,EAAA,YAAA0J,IAAA,UAAAU,IAAA,UAAAC,IAAA,CAAAjB,EAAA1U,OAAA4V,eAAA,IAAA7O,EAAA,GAAApK,GAAA+X,EAAAA,EAAA,GAAA/X,QAAAwY,GAAAT,EAAA,GAAA/X,EAAA,yBAAA+X,GAAAO,EAAAU,EAAAZ,UAAAC,EAAAD,UAAA/U,OAAAkV,OAAAnO,GAAA,SAAA/J,EAAAD,GAAA,OAAAiD,OAAA6V,eAAA7V,OAAA6V,eAAA9Y,EAAA4Y,IAAA5Y,EAAA+Y,UAAAH,EAAAR,GAAApY,EAAA8X,EAAA,sBAAA9X,EAAAgY,UAAA/U,OAAAkV,OAAAD,GAAAlY,CAAA,QAAA2Y,EAAAX,UAAAY,EAAAR,GAAAF,EAAA,cAAAU,GAAAR,GAAAQ,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAZ,GAAAQ,EAAAd,EAAA,qBAAAM,GAAAF,GAAAE,GAAAF,EAAAJ,EAAA,aAAAM,GAAAF,EAAAtY,EAAA,yBAAAwY,GAAAF,EAAA,oDAAAe,GAAA,kBAAAC,EAAAtd,EAAAud,EAAAlZ,EAAA,cAAAmY,GAAApY,EAAA8J,EAAAlK,EAAA+X,GAAA,IAAA/b,EAAAqH,OAAAmW,eAAA,IAAAxd,EAAA,gBAAAoE,GAAApE,EAAA,EAAAwc,GAAA,SAAApY,EAAA8J,EAAAlK,EAAA+X,GAAA,GAAA7N,EAAAlO,EAAAA,EAAAoE,EAAA8J,EAAA,CAAApM,MAAAkC,EAAAyZ,YAAA1B,EAAA2B,cAAA3B,EAAA4B,UAAA5B,IAAA3X,EAAA8J,GAAAlK,MAAA,KAAAkY,EAAA,SAAAhO,EAAAlK,GAAAwY,GAAApY,EAAA8J,EAAA,SAAA9J,GAAA,YAAAwZ,QAAA1P,EAAAlK,EAAAI,EAAA,IAAA8X,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAM,GAAApY,EAAA8J,EAAAlK,EAAA+X,EAAA,UAAAkO,GAAAjmB,EAAA+X,EAAA3X,EAAA8J,EAAAgO,EAAAvJ,EAAAvE,GAAA,QAAApO,EAAAgE,EAAA2O,GAAAvE,GAAAkO,EAAAtc,EAAA8B,KAAA,OAAAkC,GAAA,YAAAI,EAAAJ,EAAA,CAAAhE,EAAAiE,KAAA8X,EAAAO,GAAAmC,QAAAC,QAAApC,GAAAqC,KAAAzQ,EAAAgO,EAAA,UAAA0I,GAAA5gB,GAAA,sBAAA+X,EAAA,KAAA3X,EAAAgB,UAAA,WAAAqZ,QAAA,SAAAvQ,EAAAgO,GAAA,IAAAvJ,EAAA3O,EAAAsa,MAAAvC,EAAA3X,GAAA,SAAA8lB,EAAAlmB,GAAAimB,GAAAtX,EAAAzE,EAAAgO,EAAAgO,EAAAC,EAAA,OAAAnmB,EAAA,UAAAmmB,EAAAnmB,GAAAimB,GAAAtX,EAAAzE,EAAAgO,EAAAgO,EAAAC,EAAA,QAAAnmB,EAAA,CAAAkmB,OAAA,MAsDA,SAOeE,GAAWzI,EAAA4D,EAAAoB,GAAA,OAAA0D,GAAA/L,MAAC,KAADlZ,UAAA,CA6B1B,SAAAilB,KAFC,OAEDA,GAAAzF,GAAAvH,KAAAE,EA7BA,SAAA2C,EAA2BoK,EAASjkB,EAASlB,GAAK,IAAAsa,EAAAla,EAAAsa,EAAA+B,EAAA2I,EAAAC,EAAA5H,EAAA,OAAAvF,KAAAC,EAAA,SAAAqD,GAAA,cAAAA,EAAA3c,GAAA,OAY5C,OAXJmB,EAAQA,QAAAA,EAAS,oBAAmBwb,EAAAlR,EAAA,EAE5BgQ,EAAcF,GAAekL,oBAAoBH,GACjD/kB,EAAe+kB,EAAQloB,OAGvByd,EAAiB,IAAIzZ,EAAeC,GAEpCub,EAAgBrC,GAAemL,aAAajL,EAAa,CAC7Dla,aAAAA,EACAsa,eAAAA,IACAc,EAAA3c,EAAA,EAEuBub,GAAeoL,cAAc/I,GAAc,OAApD,OAAV2I,EAAU5J,EAAAjE,EAAAiE,EAAA3c,EAAG,EAEGub,GAAeqL,cAAcL,EAAY,CAC7DplB,MAAAA,EACAI,aAAAA,IACA,OAHW,OAAPilB,EAAO7J,EAAAjE,EAAAiE,EAAAhO,EAAA,EAMN,CAAE6X,QAAAA,IAAS,OAE0B,MAF1B7J,EAAAlR,EAAA,EAAAmT,EAAAjC,EAAAjE,EAElBmO,QAAQC,MAAM,uBAAsBlI,GAAQA,EAAA,cAAAjC,EAAAhO,EAAA,KAAAuN,EAAA,kBAG/C5B,MAAA,KAAAlZ,UAAA,CAOD,SAAS2lB,KAEP,OADuB,IAAI3kB,GACL4kB,UACxB,CAEA,SASeC,GAAW/B,GAAA,OAAAgC,GAAA5M,MAAC,KAADlZ,UAAA,UAAA8lB,KA6BzB,OA7ByBA,GAAAtG,GAAAvH,KAAAE,EAA1B,SAAAqD,EAA2BuK,GAAG,IAAA9nB,EAAA+nB,EAAAtC,EAAAuC,EAAAC,EAAAC,EAAAC,EAAA5E,EAAA6E,EAAA,OAAApO,KAAAC,EAAA,SAAAoE,GAAA,cAAAA,EAAA1d,GAAA,OAiB1B,OAhBMX,EAA0B8nB,EAA1B9nB,OAAQ+nB,EAAkBD,EAAlBC,SAAStC,EAASqC,EAATrC,MAKvBuC,EAAYxjB,GAAA,CAAKgf,WAAY7nB,GAAgB8pB,GACpCzlB,GACHioB,EAAatmB,EAAQikB,YAAY5lB,GACvCgoB,EAAYxjB,GAAA,CAAKgf,WAAY7nB,GAAgBssB,IAE7CD,EAAe,CAAE9lB,aAAc,EAAGshB,WAAY7nB,GAG1CusB,EAAqBhM,GAAe4J,wBAAwBiC,GAC5DI,EAAgBjM,GAAemM,aAAaH,EAAoB,CACpEhmB,aAAc8lB,EAAa9lB,eAC3Bmc,EAAA1d,EAAA,EAEsBub,GAAeoL,cAAca,GAAc,OAOlE,OAPK5E,EAASlF,EAAAhF,EAGT+O,EAAUlM,GAAeoM,cAC7B/E,EACAyE,EAAa9lB,aACb8lB,EAAaxE,YACdnF,EAAA/O,EAAA,EAEM,CAAE8Y,QAAAA,EAAS3C,KAAMuC,IAAc,EAAAzK,EAAA,KACvCtC,MAAA,KAAAlZ,UAAA,CAlHDwmB,KAAKC,UAAS,eAAAzgB,EAAAwZ,GAAAvH,KAAAE,EAAG,SAAAmC,EAAOtb,GAAC,IAAA0nB,EAAAC,EAAArF,EAAA4D,EAAAa,EAAA9kB,EAAAlB,EAAA0jB,EAAApI,EAAAC,EAAAe,EAAA,OAAApE,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAA9b,GAAA,OAAA8nB,EACqC1nB,EAAEwW,KAAtDmR,EAAKD,EAALC,MAAOrF,EAAIoF,EAAJpF,KAAM4D,EAAOwB,EAAPxB,QAASa,EAAGW,EAAHX,IAAK9kB,EAAOylB,EAAPzlB,QAASlB,EAAK2mB,EAAL3mB,MAAO0jB,EAAIiD,EAAJjD,KAAI/I,EAAArQ,EAAA,EAAAiR,EAK7CgG,EAAI5G,EAAA9b,EACL,WADK0c,EACG,EAGR,WAHQA,EAGA,EAGR,aAHQA,EAGE,EAGV,sBAHUA,EAGS,wBAAAZ,EAAA9b,EAAA,EARPomB,GAAYE,EAASjkB,EAASlB,GAAM,OAA7C,OAANsb,EAAMX,EAAApD,EAAAoD,EAAAnN,EAAA,oBAAAmN,EAAA9b,EAAG,EAGMinB,GAAYE,GAAI,OAAzB,OAAN1K,EAAMX,EAAApD,EAAAoD,EAAAnN,EAAA,oBAAAmN,EAAA9b,EAAG,EAGMub,GAAeyM,aAAanD,GAAK,OAA1C,OAANpI,EAAMX,EAAApD,EAAAoD,EAAAnN,EAAA,aAG8B,OAApC8N,EAASsK,KAA2BjL,EAAAnN,EAAA,mBAG9B,IAAIpO,MAAM,gCAADC,OAAiCkiB,IAAO,QAG3DkF,KAAKK,YAAY,CAAEF,MAAAA,EAAOtL,OAAAA,IAASX,EAAA9b,EAAA,iBAAA8b,EAAArQ,EAAA,GAAAgS,EAAA3B,EAAApD,EAEnCmO,QAAQC,MAAM,gBAAerJ,GAC7BmK,KAAKK,YAAY,CAAEF,MAAAA,EAAOjB,MAAOrJ,EAAMyK,UAAU,eAAApM,EAAAnN,EAAA,KAAA+M,EAAA,kBAEpD,gBAAAF,GAAA,OAAApU,EAAAkT,MAAA,KAAAlZ,UAAA,EA5Ba,G","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/io/bitstream.js","webpack://carta1/./codec/io/serialization.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/transforms/qmf.js","webpack://carta1/./codec/transforms/fft.js","webpack://carta1/./codec/transforms/mdct.js","webpack://carta1/./codec/coding/quantization.js","webpack://carta1/./codec/coding/bitallocation.js","webpack://carta1/./codec/core/buffers.js","webpack://carta1/./codec/analysis/transient.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/io/processor.js","webpack://carta1/./codec/browser/worker.js"],"sourcesContent":["/**\n * Carta1 Audio Codec - Core Constants\n */\n\n// Audio format\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\n\n// AEA file format\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\n\n// Frame structure\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\n// BFU (Block Floating Unit) configuration\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS_COUNT = 8\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\n// BFU start positions\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\n// Transform sizes\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\n\n// Window functions\nexport const WINDOW_SHORT = (() => {\n const table = new Float64Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\n// QMF configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\n// QMF prototype filter coefficients\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\n// QMF window function\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\n// QMF even/odd taps for optimization\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\n// MDCT/IMDCT transform configuration\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 }, // Low band (0-5.5kHz)\n { size: 128, windowStart: 48 }, // Mid band (5.5-11kHz)\n { size: 256, windowStart: 112 }, // High band (11-22kHz)\n]\n\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\n// Frame serialization\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const MAX_WORD_LENGTH_INDEX = 15\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\nexport const SCALE_FACTORS = (() => {\n const table = new Float64Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\n// Bit allocation\nexport const INV_POWER_OF_TWO = (() => {\n const maxBits = WORD_LENGTH_BITS[MAX_WORD_LENGTH_INDEX]\n const table = new Float64Array(maxBits + 1)\n for (let b = 0; b <= maxBits; b++) {\n table[b] = Math.pow(2, -b)\n }\n return table\n})()\n","/**\n * Carta1 Audio Codec - Bitstream Operations\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n value &= (1 << bitCount) - 1\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (value >> shift) & ((1 << bitsToWrite) - 1)\n\n const mask = ((1 << bitsToWrite) - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length; ) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = (1 << bitsToRead) - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value << bitsToRead) | bits\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 1 << (bitCount - 1)\n return value >= signBit ? value - (1 << bitCount) : value\n}\n","/**\n * Carta1 Audio Codec - Serialization Module\n *\n * Handles serialization and deserialization of ATRAC1 audio frames and AEA file format.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n BFU_AMOUNTS,\n SPECS_PER_BFU,\n AEA_HEADER_SIZE,\n AEA_MAGIC,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n AEA_FRAME_COUNT_OFFSET,\n AEA_CHANNEL_COUNT_OFFSET,\n WORD_LENGTH_BITS,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {Object} frameData - The encoded frame data to serialize\n * @param {number} frameData.nBfu - Number of block floating units\n * @param {number[]} frameData.blockModes - Block modes for each band [0-2]\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Int32Array[]} frameData.quantizedCoefficients - Quantized spectral coefficients\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockModes[0]) << 14) |\n ((2 - frameData.blockModes[1]) << 12) |\n ((3 - frameData.blockModes[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {Object} Deserialized frame data\n * @returns {number} returns.nBfu - Number of block floating units\n * @returns {number[]} returns.blockModes - Block modes for each band\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Int32Array[]} returns.quantizedCoefficients - Quantized spectral coefficients\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockModes = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n}\n\n/**\n * AEA file format handler for ATRAC1 audio files\n * Manages creation and parsing of AEA file headers\n */\nexport class AeaFile {\n /**\n * Creates an AEA file header with the specified metadata\n * @param {string} [title=''] - Audio file title (max 255 characters)\n * @param {number} [frameCount=0] - Number of audio frames in the file\n * @param {number} [channelCount=1] - Number of audio channels (1 or 2)\n * @returns {Uint8Array} AEA file header buffer\n */\n static createHeader(title = '', frameCount = 0, channelCount = 1) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n\n // Magic number\n header.set(AEA_MAGIC, 0)\n\n // Title (null-terminated string)\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n\n // Frame count\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n\n // Channel count\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n\n return header\n }\n\n /**\n * Parses an AEA file header to extract metadata\n * @param {Uint8Array} header - AEA file header buffer\n * @returns {Object} Parsed header information\n * @returns {string} returns.title - Audio file title\n * @returns {number} returns.frameCount - Number of audio frames\n * @returns {number} returns.channelCount - Number of audio channels\n * @throws {Error} If header size is invalid or magic number doesn't match\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n // Check magic number\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n\n // Extract title\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n // Extract metadata\n const frameCount = view.getUint32(AEA_FRAME_COUNT_OFFSET, true)\n const channelCount = header[AEA_CHANNEL_COUNT_OFFSET]\n\n return { title, frameCount, channelCount }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n allocationBias: 1.0,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n allocationBias: {\n default: this.values.allocationBias,\n name: 'Bit allocation bias',\n description:\n 'Controls how bits are distributed across the frequency spectrum during allocation. Higher values focus more bits on loud spectral components, while lower values spread bits more evenly across frequencies.',\n range: [0.5, 3.0],\n step: 0.01,\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n const [min, max] = meta.range\n\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n get allocationBias() {\n return this.values.allocationBias\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec including\n * pipeline composition, error handling, and audio stream processing utilities\n * for delay compensation and frame padding.\n */\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Creates a pipeline by composing multiple processing stages\n * @param {Object} context - Shared context passed to all stages\n * @param {...Function} stages - Stage functions to compose\n * @returns {Function} Composed pipeline function\n */\nexport function pipe(context, ...stages) {\n const functions = stages.map((stage) => stage(context))\n\n return (input) => {\n return functions.reduce((value, fn) => fn(value), input)\n }\n}\n\n/**\n * Reverses the spectral order of coefficients for mid/high band processing\n *\n * Used in both MDCT and IMDCT stages to handle spectral reversal required\n * by the ATRAC1 format for mid and high frequency bands.\n *\n * @param {Float32Array} spectrum - Input spectrum coefficients\n * @param {Object} reversalBuffers - Pre-allocated buffers for different spectrum sizes\n * @returns {Float32Array} Spectrum with reversed coefficient order\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n\n/**\n * Calculates the starting offset for a frequency band in the coefficient array\n *\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {number} Starting offset in the 512-sample coefficient array\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extracts coefficients for a specific frequency band from the full coefficient array\n *\n * @param {Float32Array} coefficients - Full 512-sample coefficient array\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {Float32Array} Subarray containing coefficients for the specified band\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY, QMF_EVEN, QMF_ODD } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function qmfAnalysis(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError(`qmfAnalysis: qmfWorkBuffers.delay[${inputLength}] is required`)\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function qmfSynthesis(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError(\n `qmfSynthesis: qmfWorkBuffers.delay[${outputLength}] is required`\n )\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 Audio Codec - Fast Fourier Transform\n *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\n\nexport class FFT {\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const size = real.length\n if (size === 1) return\n\n const bits = Math.log2(size)\n\n // Bit reversal\n for (let i = 0; i < size; i++) {\n let reversed = 0\n let temp = i\n for (let b = 0; b < bits; b++) {\n reversed = (reversed << 1) | (temp & 1)\n temp >>= 1\n }\n if (reversed > i) {\n ;[real[i], real[reversed]] = [real[reversed], real[i]]\n ;[imag[i], imag[reversed]] = [imag[reversed], imag[i]]\n }\n }\n\n // Cooley-Tukey decimation-in-time\n for (let stride = 2; stride <= size; stride <<= 1) {\n const halfStride = stride >> 1\n const angle = (-2 * Math.PI) / stride\n const wReal = Math.cos(angle)\n const wImag = Math.sin(angle)\n\n for (let start = 0; start < size; start += stride) {\n let twiddleReal = 1\n let twiddleImag = 0\n\n for (let k = 0; k < halfStride; k++) {\n const evenIndex = start + k\n const oddIndex = evenIndex + halfStride\n\n const evenReal = real[evenIndex]\n const evenImag = imag[evenIndex]\n const oddReal = real[oddIndex]\n const oddImag = imag[oddIndex]\n\n const tReal = oddReal * twiddleReal - oddImag * twiddleImag\n const tImag = oddReal * twiddleImag + oddImag * twiddleReal\n\n real[evenIndex] = evenReal + tReal\n imag[evenIndex] = evenImag + tImag\n real[oddIndex] = evenReal - tReal\n imag[oddIndex] = evenImag - tImag\n\n const nextReal = twiddleReal * wReal - twiddleImag * wImag\n twiddleImag = twiddleReal * wImag + twiddleImag * wReal\n twiddleReal = nextReal\n }\n }\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Modified Discrete Cosine Transform\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float64Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`MDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`IMDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = -input[i2]\n const im = -input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = im * s + r * c\n imag[i] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 8)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 8)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 4)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n","/**\n * Carta1 Audio Codec - Quantization Module\n *\n * This module handles the quantization and dequantization of MDCT frequency coefficients\n * for the Carta1 audio codec. It provides functions to convert floating-point frequency\n * domain data into integer representations suitable for bitstream encoding.\n *\n * Key functions:\n * - Quantization of coefficients using scale factors and bit depths\n * - Dequantization for reconstruction during decoding\n * - BFU (Band Frequency Unit) organization for psychoacoustic processing\n *\n * The quantization process uses configurable scale factors to maintain audio quality\n * while achieving the target compression ratio. The module supports both uniform\n * and non-uniform quantization schemes based on perceptual importance.\n */\n\nimport {\n SPECS_PER_BFU,\n BFU_START_LONG,\n BFU_START_SHORT,\n BFU_BAND_BOUNDARIES,\n SCALE_FACTORS,\n QUANTIZATION_SIGN_BIT_SHIFT,\n} from '../core/constants.js'\n\n/**\n * Quantize coefficients.\n * @param {Float32Array} coefficients\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Int32Array} out\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n const length = coefficients.length\n const out = new Int32Array(length)\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n out.fill(0, 0, length)\n return out\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const hi = quantRange\n const lo = -quantRange\n\n for (let i = 0; i < length; i++) {\n const x = coefficients[i] * normFactor\n const y = (x + (x >= 0 ? 0.5 : -0.5)) | 0\n out[i] = y > hi ? hi : y < lo ? lo : y\n }\n\n return out\n}\n\n/**\n * Dequantize coefficients.\n * @param {Int32Array} quantized\n * @param {number} scaleFactorIndex\n * @param {number} bitsPerSample\n * @returns {Float32Array}\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n\n const deq = new Float32Array(quantized.length)\n for (let i = 0; i < quantized.length; i++) {\n deq[i] = (quantized[i] * scaleFactor) / quantRange\n }\n return deq\n}\n\n/**\n * Groups MDCT coefficients into Band Frequency Units (BFUs) for bit allocation.\n *\n * This function organizes frequency-domain coefficients into perceptually meaningful\n * frequency bands (BFUs) based on the block modes for each of the three frequency bands.\n * It handles both long and short blocks, with different frequency resolutions and\n * BFU start positions for each block type.\n *\n * The function implements copy-avoidance optimization: when a BFU slice is fully\n * contained within a frequency band, it directly copies the data without buffer\n * filling. For BFUs that span band boundaries or extend beyond the available\n * coefficients, it handles partial copying and zero-padding appropriately.\n *\n * Frequency Band Structure:\n * - Band 0: 0-128 coefficients (low frequencies)\n * - Band 1: 128-256 coefficients (mid frequencies)\n * - Band 2: 256-512 coefficients (high frequencies)\n *\n * Block Types:\n * - Long blocks (mode 0): Higher frequency resolution, fewer temporal segments\n * - Short blocks (mode 1): Lower frequency resolution, more temporal segments\n *\n * @param {Float32Array} coefficients\n * @param {Array<number>} blockModes\n * @returns {{bfuData: Array<Float32Array>, bfuSizes: Array<number>, bfuCount: number}}\n */\nexport function groupIntoBFUs(coefficients, blockModes) {\n const bfuData = []\n const bfuSizes = []\n\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const isLongBlock = blockModes[band] === 0\n const startPositions = isLongBlock ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n const endPos = startPos + size\n const bfu = new Float32Array(size)\n\n if (startPos >= 0 && endPos <= bandSize) {\n bfu.set(coefficients.subarray(bandStart + startPos, bandStart + endPos))\n } else {\n bfu.fill(0)\n if (startPos < bandSize && endPos > 0) {\n const srcStart = Math.max(0, startPos)\n const srcEnd = Math.min(bandSize, endPos)\n bfu.set(\n coefficients.subarray(bandStart + srcStart, bandStart + srcEnd),\n Math.max(0, -startPos)\n )\n }\n }\n\n bfuData.push(bfu)\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation system for the Carta1 audio codec,\n * responsible for distributing available bits across frequency bands to minimize\n * perceptual distortion while maintaining the target bitrate.\n *\n * The module uses Rate-Distortion Optimization (RDO) with a greedy algorithm\n * that allocates bits to Band Frequency Units (BFUs) based on the perceptual\n * benefit per bit spent. It employs psychoacoustic modeling to determine\n * scale factors and uses a priority queue to efficiently find the optimal\n * bit distribution.\n *\n * Key components:\n * - RDO-based bit allocation using exponential distortion modeling\n * - Scale factor computation for each frequency band\n * - Max-heap priority queue for greedy optimization\n * - Support for variable word lengths per BFU\n *\n * The algorithm ensures that bits are allocated where they provide the\n * greatest reduction in audible distortion, resulting in high-quality\n * audio compression at the target bitrate.\n */\n\nimport {\n NUM_BFUS,\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n MAX_WORD_LENGTH_INDEX,\n WORD_LENGTH_BITS,\n INV_POWER_OF_TWO,\n SCALE_FACTORS,\n} from '../core/constants.js'\n\n/**\n * Allocate bits to BFUs using optimized greedy Lp-RDO\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} maxBfuCount\n * @param {number} allocationBias\n * @returns {{bfuCount:number, allocation:Int32Array, scaleFactorIndices:Int32Array}}\n */\nexport function allocateBits(bfuData, bfuSizes, maxBfuCount, allocationBias) {\n const usedBFU = maxBfuCount\n const avail =\n FRAME_BITS - FRAME_OVERHEAD_BITS - usedBFU * BITS_PER_BFU_METADATA\n\n const rdoResult = distributeBitsRDO(\n usedBFU,\n bfuData,\n bfuSizes,\n avail,\n allocationBias\n )\n\n return {\n bfuCount: usedBFU,\n allocation: rdoResult.wordLengths,\n scaleFactorIndices: rdoResult.scaleFactorIndices,\n }\n}\n\n/**\n * Distributes available bits across Band Frequency Units (BFUs) using Rate-Distortion Optimization.\n *\n * This function implements an optimized greedy RDO allocator that minimizes perceptual distortion\n * while staying within the bit budget. It uses a priority queue (max-heap) to greedily allocate\n * bits to the BFUs that provide the greatest distortion reduction per bit spent.\n *\n * @param {number} activeBfuCount\n * @param {Array<Float32Array>} bfuData\n * @param {Int32Array} bfuSizes\n * @param {number} remainingBits\n * @param {number} allocationBias\n * @returns {{wordLengths: Int32Array, scaleFactorIndices: Int32Array}}\n */\nfunction distributeBitsRDO(\n activeBfuCount,\n bfuData,\n bfuSizes,\n remainingBits,\n allocationBias\n) {\n const scaleFactorTable = new Int32Array(NUM_BFUS)\n const wordLengths = new Int32Array(activeBfuCount)\n\n const heapIndices = []\n const heapPriorities = []\n\n const deltaDistPerCoeff = (bfuIndex, currentWl, nextWl) => {\n const sfi = scaleFactorTable[bfuIndex]\n const scaleFactor = SCALE_FACTORS[sfi]\n if (scaleFactor === 0) return 0\n\n const effectiveScaleFactor = Math.pow(scaleFactor, allocationBias)\n\n const bits1 = WORD_LENGTH_BITS[currentWl] | 0\n const bits2 = WORD_LENGTH_BITS[nextWl] | 0\n\n const f1 = bits1 === 0 ? 2.0 : INV_POWER_OF_TWO[bits1]\n const f2 = INV_POWER_OF_TWO[bits2]\n\n return effectiveScaleFactor * (f1 - f2)\n }\n\n for (let bfuIndex = 0; bfuIndex < activeBfuCount; bfuIndex++) {\n const sz = bfuSizes[bfuIndex] | 0\n if (sz === 0) continue\n\n const sfi = findScaleFactor(bfuData[bfuIndex].subarray(0, sz))\n scaleFactorTable[bfuIndex] = sfi\n\n if (sfi === 0) continue\n\n const currentWl = 0\n const nextWl = 1\n const deltaBits =\n (WORD_LENGTH_BITS[nextWl] - WORD_LENGTH_BITS[currentWl]) | 0\n if (deltaBits <= 0) continue\n\n const ddPerCoeff = deltaDistPerCoeff(bfuIndex, currentWl, nextWl)\n heapIndices.push(bfuIndex)\n heapPriorities.push(ddPerCoeff / deltaBits)\n }\n\n // Heapify\n for (let i = (heapIndices.length >> 1) - 1; i >= 0; i--)\n siftDown(heapIndices, heapPriorities, i)\n\n // Greedy spending\n while (remainingBits > 0 && heapIndices.length > 0) {\n const bfu = heapIndices[0]\n const cur = wordLengths[bfu] | 0\n const nxt = cur + 1\n\n const sz = bfuSizes[bfu] | 0\n const deltaBits = (WORD_LENGTH_BITS[nxt] - WORD_LENGTH_BITS[cur]) | 0\n const cost = deltaBits * sz\n\n if (cost > remainingBits || cost <= 0) {\n popRoot(heapIndices, heapPriorities)\n continue\n }\n\n remainingBits -= cost\n wordLengths[bfu] = nxt\n\n if (nxt < MAX_WORD_LENGTH_INDEX) {\n const nxt2 = nxt + 1\n const deltaBits2 = (WORD_LENGTH_BITS[nxt2] - WORD_LENGTH_BITS[nxt]) | 0\n if (deltaBits2 > 0) {\n heapPriorities[0] = deltaDistPerCoeff(bfu, nxt, nxt2) / deltaBits2\n siftDown(heapIndices, heapPriorities, 0)\n } else {\n popRoot(heapIndices, heapPriorities)\n }\n } else {\n popRoot(heapIndices, heapPriorities)\n }\n }\n\n return { wordLengths, scaleFactorIndices: scaleFactorTable }\n}\n\n/**\n * Find the optimal scale factor index for a set of coefficients.\n * Same semantics as the original.\n * @param {Float32Array} coefficients\n * @returns {number}\n */\nexport function findScaleFactor(coefficients) {\n let maxAmplitude = 0.0\n for (let i = 0; i < coefficients.length; i++) {\n const a = Math.abs(coefficients[i])\n if (a > maxAmplitude) maxAmplitude = a\n }\n if (maxAmplitude === 0) return 0\n const index = Math.ceil(3 * (Math.log2(maxAmplitude) + 21))\n return Math.max(0, Math.min(63, index))\n}\n\n/**\n * Removes the root element from a max-heap and maintains heap property.\n *\n * This function efficiently removes the maximum priority element from the heap\n * by replacing it with the last element and then restoring the heap property\n * through sifting down.\n *\n * @param {Array<number>} heapIndices\n * @param {Array<number>} heapPriorities\n */\nfunction popRoot(heapIndices, heapPriorities) {\n const last = heapIndices.length - 1\n heapIndices[0] = heapIndices[last]\n heapPriorities[0] = heapPriorities[last]\n heapIndices.pop()\n heapPriorities.pop()\n if (heapIndices.length) siftDown(heapIndices, heapPriorities, 0)\n}\n\n/**\n * Restores max-heap property by sifting an element down from a given position.\n *\n * This function maintains the heap invariant where parent nodes have higher\n * priority values than their children. It compares the element at startIndex\n * with its children and swaps with the larger child until the heap property\n * is satisfied, or it reaches a leaf position.\n *\n * @param {Array<number>} heapIndices\n * @param {Array<number>} heapPriorities\n * @param {number} startIndex\n */\nfunction siftDown(heapIndices, heapPriorities, startIndex) {\n const heapSize = heapIndices.length\n let i = startIndex\n const idxVal = heapIndices[i]\n const prVal = heapPriorities[i]\n\n while (true) {\n const l = (i << 1) + 1\n const r = l + 1\n let maxI = i\n let maxP = prVal\n\n if (l < heapSize && heapPriorities[l] > maxP) {\n maxI = l\n maxP = heapPriorities[l]\n }\n if (r < heapSize && heapPriorities[r] > maxP) {\n maxI = r\n }\n if (maxI === i) break\n\n heapIndices[i] = heapIndices[maxI]\n heapPriorities[i] = heapPriorities[maxI]\n i = maxI\n }\n\n heapIndices[i] = idxVal\n heapPriorities[i] = prVal\n}\n","/**\n * Carta1 Audio Codec - Buffer Management\n */\n\nimport { QMF_DELAY, QMF_HIGH_BAND_DELAY } from './constants.js'\n\nexport class BufferPool {\n constructor() {\n // Transform buffers\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n // QMF work buffers\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n // QMF delay lines\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n // Transient detector\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n // MDCT/IMDCT work buffers\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n // MDCT overlap buffers (encoder)\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n // IMDCT overlap buffers (decoder)\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n\n // Spectrum reversal buffers\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT } from '../transforms/fft.js'\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The encoding pipeline transforms PCM audio samples into ATRAC1 compressed format\n * through a series of processing stages:\n *\n * 1. QMF Analysis: Splits audio into frequency bands using quadrature mirror filters\n * 2. Block Selection: Detects transients to choose appropriate transform block sizes\n * 3. MDCT Transform: Applies Modified Discrete Cosine Transform to frequency bands\n * 4. Quantization: Performs psychoacoustic analysis, bit allocation, and quantization\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and encoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n calculateBandOffset,\n} from '../utils.js'\nimport { qmfAnalysis } from '../transforms/qmf.js'\nimport { mdct64, mdct256, mdct512 } from '../transforms/mdct.js'\nimport { groupIntoBFUs, quantize } from '../coding/quantization.js'\nimport { allocateBits } from '../coding/bitallocation.js'\nimport { BufferPool } from '../core/buffers.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n FFT_SIZE_LOW,\n FFT_SIZE_MID,\n FFT_SIZE_HIGH,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_OVERLAP_SIZE,\n} from '../core/constants.js'\nimport { performFFT, detectTransient } from '../analysis/transient.js'\n\n/**\n * QMF Analysis Stage - Splits audio into frequency bands\n *\n * Performs two-stage QMF analysis to decompose the input signal into three bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes PCM samples\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfAnalysisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfAnalysisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Process PCM samples through QMF analysis\n * @param {Float32Array} pcmSamples - Input PCM samples\n * @returns {Object} Analysis result containing frequency bands\n * @returns {Array<Float32Array>} returns.bands - Three frequency bands [low, mid, high]\n */\n return (pcmSamples) => {\n const stage1 = qmfAnalysis(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = qmfAnalysis(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return {\n bands: [stage2.lowBand, stage2.highBand, highBand],\n }\n }\n}\n\n/**\n * Block Selection Stage - Detects transients to choose transform block sizes\n *\n * Analyzes frequency bands using FFT and transient detection to determine\n * appropriate MDCT block sizes. Short blocks are used for transient signals\n * to prevent pre-echo artifacts, while long blocks provide better frequency\n * resolution for steady-state signals.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes QMF analysis results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function blockSelectorStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('blockSelectorStage: bufferPool is required')\n const options =\n context?.options ?? throwError('blockSelectorStage: options is required')\n\n /**\n * Analyze frequency bands and determine block modes\n * @param {Object} input - QMF analysis results\n * @param {Array<Float32Array>} input.bands - Three frequency bands [low, mid, high]\n * @returns {Object} Block selection results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { bands } = input\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n const blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n\n return {\n bands,\n blockModes,\n }\n }\n}\n\n/**\n * MDCT Transform Stage - Applies Modified Discrete Cosine Transform\n *\n * Transforms time-domain samples to frequency-domain coefficients using MDCT.\n * The transform size depends on the block mode determined by transient detection:\n * - Long blocks: 512/256 samples for better frequency resolution\n * - Short blocks: 64 samples for better time resolution\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally reversed to match ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes block selection results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [mdct256, mdct256, mdct512]\n\n /**\n * Transform a single frequency band using MDCT.\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformBand(\n samples,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool\n ) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n const isLongBlock = blockMode === 0\n\n if (isLongBlock) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n )\n } else {\n return transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n )\n }\n }\n\n /**\n * Transform using long block (better frequency resolution).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Object} transformFunc\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n // Apply overlap from previous frame\n mdctInput.set(overlapBuffer, config.windowStart)\n\n // Window and save tail for next frame\n applyTailWindowing(samples, overlapBuffer, config.size)\n\n // Add current frame samples\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = transformFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n return spectrum\n }\n\n /**\n * Transform using short blocks (better time resolution for transients).\n * @param {Float32Array} samples\n * @param {number} bandIndex\n * @param {Object} config\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @returns {Float32Array}\n */\n function transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2) // 8 for band 2, 4 for bands 0-1\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n\n // Prepare MDCT input\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n // Window and save tail\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * Transform frequency bands using MDCT\n * @param {Object} input - Block selection results\n * @param {Array<Float32Array>} input.bands - Three frequency bands\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @param {any} input.originalFrame - Original frame data (passed through)\n * @returns {Object} MDCT transform results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Float32Array} returns.coefficients - MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes\n * @returns {any} returns.originalFrame - Original frame data\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool\n )\n\n const offset = calculateBandOffset(bandIndex)\n coefficients.set(transformed, offset)\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n\n/**\n * Quantization Stage - Performs RDO bit allocation and quantization\n *\n * The final encoding stage that:\n * 1. Groups coefficients into Block Floating Units (BFUs)\n * 2. Allocates bits using Rate-Distortion Optimization (RDO)\n * 3. Quantizes coefficients using scale factors and word lengths\n *\n * Uses RDO to optimize the allocation of bits for maximum quality\n * within the available bit budget.\n *\n * @returns {Function} Stage function that processes MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function quantizationStage(context) {\n const options =\n context?.options ?? throwError('quantizationStage: options is required')\n\n /**\n * Perform RDO bit allocation and quantization\n * @param {Object} input - MDCT transform results\n * @param {Float32Array} input.coefficients - MDCT coefficients\n * @param {Array<number>} input.blockModes - Block modes\n * @returns {Object} Quantization results ready for bitstream encoding\n * @returns {number} returns.nBfu - Number of active BFUs\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Array<Int32Array>} returns.quantizedCoefficients - Quantized coefficient data\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n const { bfuData, bfuSizes, bfuCount } = groupIntoBFUs(\n coefficients,\n blockModes\n )\n\n const {\n bfuCount: selectedBfuCount,\n allocation,\n scaleFactorIndices,\n } = allocateBits(bfuData, bfuSizes, bfuCount, options.allocationBias)\n\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < selectedBfuCount; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const wordLength = allocation[bfu]\n const bitsPerSample = WORD_LENGTH_BITS[wordLength]\n const quantized = quantize(data, scaleFactorIndices[bfu], bitsPerSample)\n quantizedCoefficients.push(quantized)\n }\n\n return {\n nBfu: selectedBfuCount,\n scaleFactorIndices,\n wordLengthIndices: allocation.slice(0, selectedBfuCount),\n quantizedCoefficients,\n blockModes,\n }\n }\n}\n\n/**\n * Create ATRAC1 encoding pipeline\n *\n * Constructs a complete encoding pipeline that transforms PCM audio samples\n * into ATRAC1 compressed format. The pipeline processes audio through QMF\n * analysis, transient detection, MDCT transform, and psychoacoustic quantization.\n *\n * The returned function can be called repeatedly to encode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()] - Encoding configuration\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Encoding pipeline function that processes PCM samples\n *\n * @example\n * const encoder = encode(new EncoderOptions(), new BufferPool())\n * const result = encoder(pcmSamples) // Returns quantized ATRAC1 frame data\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(\n context,\n qmfAnalysisStage,\n blockSelectorStage,\n mdctStage,\n quantizationStage\n )\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The decoding pipeline transforms ATRAC1 compressed format back into PCM audio samples\n * through a series of processing stages:\n *\n * 1. Dequantization: Reconstructs MDCT coefficients from quantized data using scale factors\n * 2. Inverse MDCT: Applies Inverse Modified Discrete Cosine Transform to frequency bands\n * 3. QMF Synthesis: Reconstructs full-spectrum audio using quadrature mirror filters\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and decoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n extractBandCoefficients,\n} from '../utils.js'\nimport { qmfSynthesis } from '../transforms/qmf.js'\nimport { imdct64, imdct256, imdct512, overlapAdd } from '../transforms/mdct.js'\nimport { dequantize } from '../coding/quantization.js'\nimport { BufferPool } from '../core/buffers.js'\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\n\n/**\n * Dequantization Stage - Reconstructs MDCT coefficients from quantized data\n *\n * Reverses the quantization process by:\n * - Reconstructing coefficient values using scale factors and word lengths\n * - Organizing coefficients back into Block Floating Units (BFUs)\n * - Preparing coefficient array for inverse MDCT transform\n *\n * Uses the same BFU organization as the encoder but reconstructs the original\n * coefficient values from the quantized representation.\n *\n * @returns {Function} Stage function that processes quantized frame data\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function dequantizationStage() {\n /**\n * Reconstruct MDCT coefficients from quantized data\n * @param {Object} frameData - Quantized frame data\n * @param {number} frameData.nBfu - Number of active BFUs\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Array<Int32Array>} frameData.quantizedCoefficients - Quantized coefficient data\n * @param {Array<number>} frameData.blockModes - Block modes for each band\n * @returns {Object} Dequantization results\n * @returns {Float32Array} returns.coefficients - Reconstructed MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const isLongBlock = blockModes[band] === 0\n const position = isLongBlock ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const quantized = quantizedCoefficients[bfu]\n const dequantized = dequantize(\n quantized,\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return { coefficients, blockModes }\n }\n}\n\n/**\n * Inverse MDCT Stage - Transforms frequency coefficients back to time domain\n *\n * Applies Inverse Modified Discrete Cosine Transform to reconstruct time-domain\n * samples from frequency coefficients. The transform size depends on block modes:\n * - Long blocks: 512/256 samples for steady-state signals\n * - Short blocks: 64 samples for transient signals\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally unreversed from ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes dequantization results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [imdct256, imdct256, imdct512]\n\n /**\n * Inverse transform a single frequency band.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {number} blockMode\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function transformBand(\n coeffs,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const isLongBlock = blockMode === 0\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n\n if (isLongBlock) {\n return inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n )\n } else {\n return inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n )\n }\n }\n\n /**\n * Inverse transform using long block.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @param {Object} transformFunc\n * @returns {Float32Array}\n */\n function inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n ) {\n // Unreverse spectral reversal for mid/high bands\n let blockSpecs = coeffs\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(coeffs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = transformFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Prepare output buffer\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n // Copy transformed samples\n for (let i = 0; i < config.size; i++) {\n invBuf[i] = inv[invStart + i]\n }\n\n // Handle overlap-add with previous frame\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, 0)\n\n // Save tail for next frame\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy main samples\n const copyLen = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n overlapBuffer[32 + i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy final samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Inverse transform using short blocks.\n * @param {Float32Array} coeffs\n * @param {number} bandIndex\n * @param {Float32Array} overlapBuffer\n * @param {Object} bufferPool\n * @param {Object} config\n * @returns {Float32Array}\n */\n function inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n // Extract block coefficients\n let blockSpecs = coeffs.slice(pos, pos + MDCT_SHORT_BLOCK_SIZE)\n\n // Unreverse spectral reversal for mid/high bands\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(blockSpecs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = imdct64.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Copy to intermediate buffer\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n // Overlap-add with previous block\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, start)\n\n // Save tail for next block\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n pos += MDCT_SHORT_BLOCK_SIZE\n }\n\n // Copy final tail samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Transform coefficients back to time domain using inverse MDCT\n * @param {Object} input - Dequantization results\n * @param {Float32Array} input.coefficients - MDCT coefficients (512 samples)\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @returns {Array<Float32Array>} Three reconstructed frequency bands [low, mid, high]\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoeffs = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoeffs,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool,\n config\n )\n })\n }\n}\n\n/**\n * QMF Synthesis Stage - Reconstructs full-spectrum audio from frequency bands\n *\n * Performs two-stage QMF synthesis to reconstruct the full-spectrum signal\n * from three frequency bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * This is the inverse operation of the QMF analysis performed during encoding,\n * combining the separate frequency bands back into a single wideband signal.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes inverse MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfSynthesisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfSynthesisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Reconstruct full-spectrum PCM samples from frequency bands\n * @param {Array<Float32Array>} bands - Three frequency bands [low, mid, high]\n * @returns {Float32Array} Reconstructed PCM samples\n */\n return (bands) => {\n // Apply high band delay compensation\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2], delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n // Second stage synthesis: combine low and mid bands\n const stage2 = qmfSynthesis(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n // First stage synthesis: combine result with high band\n const stage1 = qmfSynthesis(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n\n/**\n * Create ATRAC1 decoding pipeline\n *\n * Constructs a complete decoding pipeline that transforms ATRAC1 compressed format\n * back into PCM audio samples. The pipeline processes quantized data through\n * dequantization, inverse MDCT transform, and QMF synthesis.\n *\n * The returned function can be called repeatedly to decode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Decoding pipeline function that processes quantized frame data\n *\n * @example\n * const decoder = decode(new BufferPool())\n * const result = decoder(quantizedFrame) // Returns reconstructed PCM samples\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantizationStage, imdctStage, qmfSynthesisStage)\n}\n","/**\n * Carta1 Audio Codec - Audio Processing Module\n *\n * High-level audio processing interface that provides stream-based encoding and decoding\n * for ATRAC1 audio format. Handles both mono and stereo audio processing with proper\n * delay compensation and frame management.\n *\n * Key features:\n * - Stream-based processing for large audio files\n * - Automatic delay compensation for codec processing\n * - Support for mono and stereo audio\n * - Progress tracking callbacks\n * - AEA file format creation and parsing\n * - WAV file generation from decoded audio\n */\n\nimport { encode } from '../pipeline/encoder.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n SAMPLES_PER_FRAME,\n SAMPLE_RATE,\n AEA_HEADER_SIZE,\n SOUND_UNIT_SIZE,\n WAV_HEADER_SIZE,\n WAV_BYTES_PER_SAMPLE,\n WAV_BITS_PER_SAMPLE,\n WAV_PCM_MAX_POSITIVE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_DATA_OFFSET,\n} from '../core/constants.js'\nimport { serializeFrame, deserializeFrame, AeaFile } from './serialization.js'\n\n/**\n * Audio processing utility class providing high-level encoding and decoding operations\n */\nexport class AudioProcessor {\n /**\n * Encodes a stream of audio frames to ATRAC1 format\n * @param {AsyncIterable<Float32Array>|AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Audio frame stream\n * @param {Object} [options={}] - Encoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @param {EncoderOptions} [options.encoderOptions] - Encoder configuration options\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @throws {Error} If unsupported channel count is provided\n */\n static async *encodeStream(audioFrames, options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._encodeMonoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else if (channelCount === 2) {\n yield* AudioProcessor._encodeStereoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for encoding mono audio streams\n * @param {AsyncIterable<Float32Array>} audioFrames - Mono audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @private\n */\n static async *_encodeMonoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const encoder = encode(options)\n let frameIndex = 0\n for await (const frame of audioFrames) {\n const result = encoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Internal method for encoding stereo audio streams\n * @param {AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Stereo audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data (left then right)\n * @private\n */\n static async *_encodeStereoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const leftEncoder = encode(options)\n const rightEncoder = encode(options)\n let frameIndex = 0\n\n for await (const [leftFrame, rightFrame] of audioFrames) {\n const leftResult = leftEncoder(leftFrame)\n const rightResult = rightEncoder(rightFrame)\n\n yield leftResult\n yield rightResult\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Decodes a stream of ATRAC1 encoded frames back to PCM audio\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - Decoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @returns {AsyncGenerator<Float32Array>|AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded PCM frames\n * @throws {Error} If unsupported channel count is provided\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const { channelCount = 1, onProgress } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._decodeMonoStream(encodedFrames, onProgress)\n } else if (channelCount === 2) {\n yield* AudioProcessor._decodeStereoStream(encodedFrames, onProgress)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for decoding mono audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Mono encoded frame stream\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<Float32Array>} Stream of decoded mono PCM frames\n * @private\n */\n static async *_decodeMonoStream(encodedFrames, onProgress) {\n const decoder = decode()\n let frameIndex = 0\n\n // Create raw PCM frame stream\n const rawPcmFrames = async function* () {\n for await (const frame of encodedFrames) {\n const result = decoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Internal method for decoding stereo audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Stereo encoded frame stream (interleaved left/right)\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded stereo PCM frame pairs\n * @private\n */\n static async *_decodeStereoStream(encodedFrames, onProgress) {\n const leftDecoder = decode()\n const rightDecoder = decode()\n let frameIndex = 0\n\n const rawPcmFrames = async function* () {\n let leftFrame = null\n let isLeftChannel = true\n\n for await (const frame of encodedFrames) {\n if (isLeftChannel) {\n leftFrame = frame\n } else {\n const rightFrame = frame\n\n // Decode and yield the pair\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n\n isLeftChannel = !isLeftChannel\n }\n\n if (!isLeftChannel && leftFrame) {\n const rightFrame = AudioProcessor._createDummyFrame()\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply stereo delay compensation\n yield* rawPcmFrames()\n }\n\n /**\n * Converts channel buffer arrays to frame-based stream format\n * @param {Float32Array[]} buffers - Array of channel buffers (1 for mono, 2 for stereo)\n * @param {number} [frameSize=SAMPLES_PER_FRAME] - Frame size in samples\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>} Stream of audio frames\n * @throws {Error} If unsupported channel count is provided\n */\n static *frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n const channelCount = buffers.length\n\n if (channelCount === 1) {\n const [left] = buffers\n for (let i = 0; i < left.length; i += frameSize) {\n const frame = new Float32Array(frameSize)\n const end = Math.min(i + frameSize, left.length)\n for (let j = 0; j < end - i; j++) {\n frame[j] = left[i + j]\n }\n yield frame\n }\n } else if (channelCount === 2) {\n const [left, right] = buffers\n const maxLength = Math.max(left.length, right.length)\n\n for (let i = 0; i < maxLength; i += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n\n const end = Math.min(i + frameSize, maxLength)\n\n for (let j = 0; j < end - i; j++) {\n leftFrame[j] = i + j < left.length ? left[i + j] : 0\n rightFrame[j] = i + j < right.length ? right[i + j] : 0\n }\n\n yield [leftFrame, rightFrame]\n }\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Collects all frames from a stream into an array\n * @param {AsyncIterable} frameStream - Stream of frames to collect\n * @returns {Promise<Array>} Array of all frames from the stream\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * Creates a dummy frame for padding purposes\n * @returns {Object} Empty frame structure\n * @private\n */\n static _createDummyFrame() {\n return {\n nBfu: 0,\n blockModes: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n }\n\n /**\n * Creates an AEA file blob from encoded frames\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - AEA file options\n * @param {string} [options.title='encoded by atrac1.js'] - File title\n * @param {number} [options.channelCount=1] - Number of audio channels\n * @returns {Promise<Blob>} AEA file blob\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const header = AeaFile.createHeader(title, frames.length, channelCount)\n const totalSize =\n header.length + frames.reduce((sum, frame) => sum + frame.length, 0)\n\n const buffer = new Uint8Array(totalSize)\n buffer.set(header, 0)\n\n let offset = header.length\n for (const frame of frames) {\n buffer.set(frame, offset)\n offset += frame.length\n }\n\n return new Blob([buffer], { type: 'application/octet-stream' })\n }\n\n /**\n * Creates a WAV file blob from PCM audio frames\n * @param {Float32Array[]|Float32Array|[Float32Array, Float32Array][]} pcmFrames - PCM audio frames\n * @param {number} [channelCount=1] - Number of audio channels\n * @param {number} [sampleRate=SAMPLE_RATE] - Audio sample rate\n * @returns {Blob} WAV file blob\n * @throws {Error} If unsupported channel count is provided\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n const frames = Array.isArray(pcmFrames) ? pcmFrames : [pcmFrames]\n\n if (channelCount === 1) {\n return AudioProcessor._createMonoWavBlob(frames, sampleRate)\n } else if (channelCount === 2) {\n return AudioProcessor._createStereoWavBlob(frames, sampleRate)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Creates a mono WAV file blob from PCM frames\n * @param {Float32Array[]} frames - Array of mono PCM frames\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Mono WAV file blob\n * @private\n */\n static _createMonoWavBlob(frames, sampleRate) {\n const totalSamples = frames.reduce((sum, frame) => sum + frame.length, 0)\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 1, sampleRate)\n\n // PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const frame of frames) {\n for (let i = 0; i < frame.length; i++) {\n const sample = Math.max(-1, Math.min(1, frame[i]))\n view.setInt16(\n offset,\n sample < 0\n ? sample * WAV_PCM_MAX_NEGATIVE\n : sample * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Creates a stereo WAV file blob from PCM frame pairs\n * @param {[Float32Array, Float32Array][]} framePairs - Array of stereo PCM frame pairs\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Stereo WAV file blob\n * @private\n */\n static _createStereoWavBlob(framePairs, sampleRate) {\n const totalSamples = framePairs.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE * 2\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 2, sampleRate)\n\n // Interleaved PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const [leftFrame, rightFrame] of framePairs) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let i = 0; i < frameLength; i++) {\n const leftSample = i < leftFrame.length ? leftFrame[i] : 0\n const rightSample = i < rightFrame.length ? rightFrame[i] : 0\n const leftClipped = Math.max(-1, Math.min(1, leftSample))\n const rightClipped = Math.max(-1, Math.min(1, rightSample))\n view.setInt16(\n offset,\n leftClipped < 0\n ? leftClipped * WAV_PCM_MAX_NEGATIVE\n : leftClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n view.setInt16(\n offset,\n rightClipped < 0\n ? rightClipped * WAV_PCM_MAX_NEGATIVE\n : rightClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Writes WAV file header to DataView\n * @param {DataView} view - DataView to write to\n * @param {number} totalSamples - Total number of samples\n * @param {number} channelCount - Number of audio channels\n * @param {number} sampleRate - Audio sample rate\n * @private\n */\n static _writeWavHeader(view, totalSamples, channelCount, sampleRate) {\n const byteRate = sampleRate * channelCount * WAV_BYTES_PER_SAMPLE\n const blockAlign = channelCount * WAV_BYTES_PER_SAMPLE\n const dataSize = totalSamples * blockAlign\n const fileSize = WAV_DATA_OFFSET + dataSize\n\n let pos = 0\n\n // Helper function to write ASCII strings\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i))\n }\n }\n\n // RIFF header\n writeString(pos, 'RIFF')\n pos += 4\n view.setUint32(pos, fileSize, true)\n pos += 4\n writeString(pos, 'WAVE')\n pos += 4\n\n // fmt chunk\n writeString(pos, 'fmt ')\n pos += 4\n view.setUint32(pos, 16, true) // chunk size\n pos += 4\n view.setUint16(pos, 1, true) // PCM format\n pos += 2\n view.setUint16(pos, channelCount, true)\n pos += 2\n view.setUint32(pos, sampleRate, true)\n pos += 4\n view.setUint32(pos, byteRate, true)\n pos += 4\n view.setUint16(pos, blockAlign, true)\n pos += 2\n view.setUint16(pos, WAV_BITS_PER_SAMPLE, true) // bits per sample\n pos += 2\n\n // data chunk\n writeString(pos, 'data')\n pos += 4\n view.setUint32(pos, dataSize, true)\n }\n\n /**\n * Parses an AEA file blob to extract header info and frame data\n * @param {Blob} blob - AEA file blob to parse\n * @returns {Promise<Object>} Parsed AEA file data\n * @returns {Object} returns.info - AEA file header information\n * @returns {Uint8Array[]} returns.frameData - Array of frame data buffers\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n\n const frameData = []\n for (let i = AEA_HEADER_SIZE; i < buffer.byteLength; i += SOUND_UNIT_SIZE) {\n const frame = new Uint8Array(buffer.slice(i, i + SOUND_UNIT_SIZE))\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n }\n\n return { info, frameData }\n }\n\n /**\n * Creates a stream of deserialized frames from binary frame data\n * @param {Uint8Array[]} frameData - Array of binary frame data\n * @returns {Generator<Object>} Stream of deserialized frame objects\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * Assembles PCM frames into a continuous buffer\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames - Array of PCM frames\n * @param {number} channelCount - Number of audio channels\n * @returns {Float32Array} Continuous PCM buffer (interleaved for stereo)\n * @throws {Error} If unsupported channel count is provided\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n const totalSamples = pcmFrames.reduce(\n (sum, frame) => sum + frame.length,\n 0\n )\n const pcm = new Float32Array(totalSamples)\n let offset = 0\n for (const frame of pcmFrames) {\n pcm.set(frame, offset)\n offset += frame.length\n }\n return pcm\n } else if (channelCount === 2) {\n const totalSamples = pcmFrames.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n const pcm = new Float32Array(totalSamples * 2)\n\n let pcmOffset = 0\n for (const [leftFrame, rightFrame] of pcmFrames) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let j = 0; j < frameLength; j++) {\n pcm[pcmOffset * 2] = j < leftFrame.length ? leftFrame[j] : 0\n pcm[pcmOffset * 2 + 1] = j < rightFrame.length ? rightFrame[j] : 0\n pcmOffset++\n }\n }\n return pcm\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from '../io/serialization.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from '../io/processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createWavBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n"],"names":["SAMPLE_RATE","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","table","Float64Array","i","Math","sin","PI","QMF_DELAY","QMF_COEFFS","Float32Array","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MDCT_BAND_CONFIGS","size","windowStart","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","WORD_LENGTH_BITS","SCALE_FACTORS","pow","INV_POWER_OF_TWO","maxBits","b","packBits","buffer","bitPosition","value","bitCount","byteIndex","floor","bitOffset","bitsWritten","length","bitsAvailable","bitsToWrite","min","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","view","DataView","bfuIndex","indexOf","nBfu","header","blockModes","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","Error","concat","byteOffset","byteLength","getUint16","bfuSize","coefficients","j","push","AeaFile","_classCallCheck","key","title","arguments","undefined","frameCount","channelCount","set","titleBytes","TextEncoder","encode","subarray","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","this","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","allocationBias","metadata","default","name","description","range","step","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","meta","throwError","msg","pipe","context","_len","stages","Array","_key","functions","map","stage","input","reduce","fn","reverseSpectrum","spectrum","reversalBuffers","reversed","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","offset","newDelay","slice","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","real","imag","bits","log2","temp","_ref","_ref2","stride","halfStride","angle","wReal","cos","wImag","start","twiddleReal","twiddleImag","k","evenIndex","oddIndex","evenReal","evenImag","oddReal","oddImag","tReal","tImag","nextReal","MDCTBase","_createClass","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_callSuper","_inherits","_mdctBuffers$this$fft","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","i4","r","im","c","fft","re","IMDCT","_mdctBuffers$this$fft2","_buffers$real2","_buffers$imag2","r1","i1","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w1","w2","p","quantize","scaleFactorIndex","out","quantRange","normFactor","hi","lo","x","y","dequantize","quantized","scaleFactor","deq","allocateBits","bfuData","bfuSizes","maxBfuCount","usedBFU","rdoResult","activeBfuCount","remainingBits","scaleFactorTable","wordLengths","heapIndices","heapPriorities","deltaDistPerCoeff","currentWl","nextWl","sfi","effectiveScaleFactor","bits1","bits2","sz","findScaleFactor","deltaBits","ddPerCoeff","siftDown","bfu","cur","nxt","cost","popRoot","nxt2","deltaBits2","distributeBitsRDO","FRAME_BITS","bfuCount","allocation","maxAmplitude","a","abs","index","ceil","last","pop","startIndex","heapSize","idxVal","prVal","l","maxI","maxP","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","mdctOverlap","imdctOverlap","detectTransient","currentCoeffs","prevCoeffs","threshold","features","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","log10","calculateEnergyChange","calculateSpectralFeatures","transientScore","fluxContribution","flatnessContribution","hfContribution","log1p","energyContribution","calculateTransientScore","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","fftSizes","bandSamples","bandIndex","samples","copyLen","performFFT","transient","mdctStage","_context$bufferPool3","overlapBuffers","TRANSFORM_FUNCS","transformBand","blockMode","overlapBuffer","config","transformFunc","mdctSize","mdctInput","applyTailWindowing","transform","transformLongBlock","numBlocks","block","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","quantizationStage","_context$options2","_groupIntoBFUs","coeffIndex","band","bandStart","bandSize","bandEnd","startPositions","startPos","endPos","srcStart","srcEnd","groupIntoBFUs","_allocateBits","selectedBfuCount","data","wordLength","dequantizationStage","position","dequantized","imdctStage","blockSpecs","inv","invStart","invBuf","prevBuf","dstPart","inverseLongBlock","pos","inverseShortBlocks","bandCoeffs","offsets","extractBandCoefficients","qmfSynthesisStage","t","Symbol","iterator","o","toStringTag","prototype","Generator","u","create","_regeneratorDefine2","G","v","d","bind","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","enumerable","configurable","writable","_invoke","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","_wrapAsyncGenerator","AsyncGenerator","apply","resume","_OverloadYield","Promise","resolve","then","settle","reject","next","arg","_awaitAsyncGenerator","_asyncGeneratorDelegate","pump","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","AudioProcessor","_x","audioFrames","_callee","_options$channelCount","onProgress","encoderOptions","_context","_regeneratorValues","_encodeMonoStream","_encodeStereoStream","_callee2","encoder","frameIndex","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","frame","result","_t","_context2","_callee3","leftEncoder","rightEncoder","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","_step2$value","leftFrame","rightFrame","leftResult","rightResult","_t2","_context3","_x2","encodedFrames","_callee4","_options$channelCount2","_context4","_decodeMonoStream","_decodeStereoStream","_callee6","decoder","rawPcmFrames","_context6","_callee5","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_t3","_context5","_callee8","leftDecoder","rightDecoder","_context8","_callee7","isLeftChannel","_iteratorAbruptCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_rightFrame","_leftResult","_rightResult","_t4","_context7","_createDummyFrame","frameSize","_callee9","_buffers","left","end","_buffers2","_left","right","maxLength","_end","_j","_context9","_collectFrames","_asyncToGenerator","_callee0","frameStream","frames","_iteratorAbruptCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","_t5","_context0","_x3","_createAeaBlob","_callee1","_options$title","_options$channelCount3","_iteratorAbruptCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","totalSize","_frames","_frame","_t6","_args1","_context1","createHeader","sum","Blob","type","_x4","pcmFrames","sampleRate","isArray","_createMonoWavBlob","_createStereoWavBlob","totalSamples","ArrayBuffer","_writeWavHeader","_step7","_iterator7","sample","setInt16","framePairs","_ref3","_ref4","_step8","_iterator8","_step8$value","frameLength","leftSample","rightSample","leftClipped","rightClipped","byteRate","blockAlign","dataSize","fileSize","writeString","string","setUint8","charCodeAt","_parseAeaBlob","_callee10","blob","info","_context10","arrayBuffer","parseHeader","_x5","deserializedFrameStream","_iterator9","_step9","_t7","_context11","_step0","pcm","_iterator0","_step1","_ref5","_ref6","pcmOffset","_iterator1","_step1$value","asyncGeneratorStep","_next","_throw","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","frameBufferToFrames","encodeStream","collectFrames","createAeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","decodedFrames","wavBlob","decodeStream","createWavBlob","self","onmessage","_e$data","jobId","parseAeaBlob","postMessage","message"],"sourceRoot":""}