Files
phanpy-cz/assets/dom-BGTnaPi8.js.map
2026-02-07 19:49:28 +01:00

1 line
81 KiB
Plaintext

{"version":3,"file":"dom-BGTnaPi8.js","sources":["../../node_modules/qr/decode.js","../../node_modules/qr/dom.js"],"sourcesContent":["/*!\nCopyright (c) 2023 Paul Miller (paulmillr.com)\nThe library paulmillr-qr is dual-licensed under the Apache 2.0 OR MIT license.\nYou can select a license of your choice.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n/**\n * Methods for decoding (reading) QR code patterns.\n * @module\n * @example\n```js\n\n```\n */\nimport { Bitmap, utils } from \"./index.js\";\nconst { best, bin, drawTemplate, fillArr, info, interleave, validateVersion, zigzag, popcnt } = utils;\n// Constants\nconst MAX_BITS_ERROR = 3; // Up to 3 bit errors in version/format\nconst GRAYSCALE_BLOCK_SIZE = 8;\nconst GRAYSCALE_RANGE = 24;\nconst PATTERN_VARIANCE = 2;\nconst PATTERN_VARIANCE_DIAGONAL = 1.333;\nconst PATTERN_MIN_CONFIRMATIONS = 2;\nconst DETECT_MIN_ROW_SKIP = 3;\n// TODO: move to index, nearby with bitmap and other graph related stuff?\nconst int = (n) => n >>> 0;\n// distance ^ 2\nconst distance2 = (p1, p2) => {\n const x = p1.x - p2.x;\n const y = p1.y - p2.y;\n return x * x + y * y;\n};\nconst distance = (p1, p2) => Math.sqrt(distance2(p1, p2));\nconst sum = (lst) => lst.reduce((acc, i) => acc + i);\nconst pointIncr = (p, incr) => {\n p.x += incr.x;\n p.y += incr.y;\n};\nconst pointNeg = (p) => ({ x: -p.x, y: -p.y });\nconst pointMirror = (p) => ({ x: p.y, y: p.x });\nconst pointClone = (p) => ({ x: p.x, y: p.y });\nconst pointInt = (p) => ({ x: int(p.x), y: int(p.y) });\nconst pointAdd = (a, b) => ({ x: a.x + b.x, y: a.y + b.y });\nfunction cap(value, min, max) {\n return Math.max(Math.min(value, max || value), min || value);\n}\nconst getBytesPerPixel = (img) => {\n const perPixel = img.data.length / (img.width * img.height);\n if (perPixel === 3 || perPixel === 4)\n return perPixel; // RGB or RGBA\n throw new Error(`Unknown image format, bytes per pixel=${perPixel}`);\n};\n/**\n * Convert to grayscale. The function is the most expensive part of decoding:\n * it takes up to 90% of time. TODO: check gamma correction / sqr.\n */\nfunction toBitmap(img) {\n const bytesPerPixel = getBytesPerPixel(img);\n const brightness = new Uint8Array(img.height * img.width);\n for (let i = 0, j = 0, d = img.data; i < d.length; i += bytesPerPixel) {\n const r = d[i];\n const g = d[i + 1];\n const b = d[i + 2];\n brightness[j++] = int((r + 2 * g + b) / 4) & 0xff;\n }\n // Convert to bitmap\n const block = GRAYSCALE_BLOCK_SIZE;\n if (img.width < block * 5 || img.height < block * 5)\n throw new Error('image too small');\n const bWidth = Math.ceil(img.width / block);\n const bHeight = Math.ceil(img.height / block);\n const maxY = img.height - block;\n const maxX = img.width - block;\n const blocks = new Uint8Array(bWidth * bHeight);\n for (let y = 0; y < bHeight; y++) {\n const yPos = cap(y * block, 0, maxY);\n for (let x = 0; x < bWidth; x++) {\n const xPos = cap(x * block, 0, maxX);\n let sum = 0;\n let min = 0xff;\n let max = 0;\n for (let yy = 0, pos = yPos * img.width + xPos; yy < block; yy = yy + 1, pos = pos + img.width) {\n for (let xx = 0; xx < block; xx++) {\n const pixel = brightness[pos + xx];\n sum += pixel;\n min = Math.min(min, pixel);\n max = Math.max(max, pixel);\n }\n }\n // Average brightness of block\n let average = Math.floor(sum / block ** 2);\n if (max - min <= GRAYSCALE_RANGE) {\n average = min / 2;\n if (y > 0 && x > 0) {\n const idx = (x, y) => y * bWidth + x;\n const prev = (blocks[idx(x, y - 1)] + 2 * blocks[idx(x - 1, y)] + blocks[idx(x - 1, y - 1)]) / 4;\n if (min < prev)\n average = prev;\n }\n }\n blocks[bWidth * y + x] = int(average);\n }\n }\n const matrix = new Bitmap({ width: img.width, height: img.height });\n for (let y = 0; y < bHeight; y++) {\n const yPos = cap(y * block, 0, maxY);\n const top = cap(y, 2, bHeight - 3);\n for (let x = 0; x < bWidth; x++) {\n const xPos = cap(x * block, 0, maxX);\n const left = cap(x, 2, bWidth - 3);\n // 5x5 blocks average\n let sum = 0;\n for (let yy = -2; yy <= 2; yy++) {\n const y2 = bWidth * (top + yy) + left;\n for (let xx = -2; xx <= 2; xx++)\n sum += blocks[y2 + xx];\n }\n const average = sum / 25;\n for (let y = 0, pos = yPos * img.width + xPos; y < block; y += 1, pos += img.width) {\n for (let x = 0; x < block; x++) {\n if (brightness[pos + x] <= average)\n matrix.set(xPos + x, yPos + y, true);\n }\n }\n }\n }\n return matrix;\n}\nfunction patternEquals(p, p2) {\n if (Math.abs(p2.y - p.y) <= p2.moduleSize && Math.abs(p2.x - p.x) <= p2.moduleSize) {\n const diff = Math.abs(p2.moduleSize - p.moduleSize);\n return diff <= 1.0 || diff <= p.moduleSize;\n }\n return false;\n}\nfunction patternMerge(a, b) {\n const count = a.count + b.count;\n return {\n x: (a.count * a.x + b.count * b.x) / count,\n y: (a.count * a.y + b.count * b.y) / count,\n moduleSize: (a.count * a.moduleSize + b.count * b.moduleSize) / count,\n count,\n };\n}\nconst patternsConfirmed = (lst) => lst.filter((i) => i.count >= PATTERN_MIN_CONFIRMATIONS);\n/**\n * Since pattern means runs of identical color (dark or white), we cannot\n * have pattern like [true, true], because it will be hard to separate same color runs.\n * @param p boolean pattern\n * @param size size of run relative to others\n * @returns\n */\nfunction pattern(p, size) {\n const _size = size || fillArr(p.length, 1);\n if (p.length !== _size.length)\n throw new Error('invalid pattern');\n if (!(p.length & 1))\n throw new Error('invalid pattern, length should be odd');\n const res = {\n center: Math.ceil(p.length / 2) - 1,\n length: p.length,\n pattern: p,\n size: _size,\n runs: () => fillArr(p.length, 0),\n totalSize: sum(_size),\n total: (runs) => runs.reduce((acc, i) => acc + i),\n shift: (runs, n) => {\n for (let i = 0; i < runs.length - n; i++)\n runs[i] = runs[i + 2];\n for (let i = runs.length - n; i < runs.length; i++)\n runs[i] = 0;\n },\n checkSize(runs, moduleSize, v = PATTERN_VARIANCE) {\n const variance = moduleSize / v;\n for (let i = 0; i < runs.length; i++) {\n if (Math.abs(_size[i] * moduleSize - runs[i]) >= _size[i] * variance)\n return false;\n }\n return true;\n },\n add(out, x, y, total) {\n const moduleSize = total / FINDER.totalSize;\n const cur = { x, y, moduleSize, count: 1 };\n for (let idx = 0; idx < out.length; idx++) {\n const f = out[idx];\n if (!patternEquals(f, cur))\n continue;\n return (out[idx] = patternMerge(f, cur));\n }\n out.push(cur);\n return;\n },\n toCenter(runs, end) {\n for (let i = p.length - 1; i > res.center; i--)\n end -= runs[i];\n end -= runs[res.center] / 2;\n return end;\n },\n check(b, runs, center, incr, maxCount) {\n let j = 0;\n let i = pointClone(center);\n const neg = pointNeg(incr);\n const check = (p, step) => {\n for (; b.isInside(i) && !!b.point(i) === res.pattern[p]; pointIncr(i, step)) {\n runs[p]++;\n j++;\n }\n if (runs[p] === 0)\n return true;\n const center = p === res.center;\n if (maxCount && !center && runs[p] > res.size[p] * maxCount)\n return true;\n return false;\n };\n for (let p = res.center; p >= 0; p--)\n if (check(p, neg))\n return false;\n i = pointClone(center);\n pointIncr(i, incr);\n j = 1;\n for (let p = res.center; p < res.length; p++)\n if (check(p, incr))\n return false;\n return j;\n },\n scanLine(b, y, xStart, xEnd, fn) {\n const runs = res.runs();\n let pos = 0;\n let x = xStart;\n // If we start in middle of an image, skip first pattern run,\n // since we don't know run length of pixels from left side\n if (xStart)\n while (x < xEnd && !!b.get(x, y) === res.pattern[0])\n x++;\n for (; x < xEnd; x++) {\n // Same run, continue counting\n if (!!b.get(x, y) === res.pattern[pos]) {\n runs[pos]++;\n // If not last element - continue counting\n if (x !== b.width - 1)\n continue;\n // Last element finishes run, set x outside of run\n x++;\n }\n // Not last run: count new one\n if (pos !== res.length - 1) {\n runs[++pos]++;\n continue;\n }\n const found = fn(runs, x);\n if (found) {\n // We found pattern, reset runs counting\n pos = 0;\n runs.fill(0);\n }\n else if (found === false) {\n // Stop scanning\n break;\n }\n else {\n // Not found: shift runs by two (so pattern will continue)\n res.shift(runs, 2);\n pos = res.length - 2;\n runs[pos]++;\n }\n }\n },\n };\n return res;\n}\n// light/dark/light/dark/light in 1:1:3:1:1 ratio\nconst FINDER = pattern([true, false, true, false, true], [1, 1, 3, 1, 1]);\n// dark/light/dark in 1:1:1 ratio\nconst ALIGNMENT = pattern([false, true, false]);\nfunction findFinder(b) {\n let found = [];\n function checkRuns(runs, v = 2) {\n const total = sum(runs);\n if (total < FINDER.totalSize)\n return false;\n const moduleSize = total / FINDER.totalSize;\n return FINDER.checkSize(runs, moduleSize, v);\n }\n // Non-diagonal line (horizontal or vertical)\n function checkLine(center, maxCount, total, incr) {\n const runs = FINDER.runs();\n let i = FINDER.check(b, runs, center, incr, maxCount);\n if (i === false)\n return false;\n const runsTotal = sum(runs);\n if (5 * Math.abs(runsTotal - total) >= 2 * total)\n return false;\n if (checkRuns(runs))\n return FINDER.toCenter(runs, i);\n return false;\n }\n function check(runs, i, j) {\n if (!checkRuns(runs))\n return false;\n const total = sum(runs);\n let x = FINDER.toCenter(runs, j);\n // Vertical\n let y = checkLine({ x: int(x), y: i }, runs[2], total, { y: 1, x: 0 });\n if (y === false)\n return false;\n y += i;\n // Horizontal\n let xx = checkLine({ x: int(x), y: int(y) }, runs[2], total, { y: 0, x: 1 });\n if (xx === false)\n return false;\n x = xx + int(x);\n // Diagonal\n const dRuns = FINDER.runs();\n if (!FINDER.check(b, dRuns, { x: int(x), y: int(y) }, { x: 1, y: 1 }))\n return false;\n if (!checkRuns(dRuns, PATTERN_VARIANCE_DIAGONAL))\n return false;\n FINDER.add(found, x, y, total);\n return true;\n }\n let skipped = false;\n // Start with high skip lines count until we find first pattern\n let ySkip = cap(int((3 * b.height) / (4 * 97)), DETECT_MIN_ROW_SKIP);\n let done = false;\n for (let y = ySkip - 1; y < b.height && !done; y += ySkip) {\n FINDER.scanLine(b, y, 0, b.width, (runs, x) => {\n if (!check(runs, y, x))\n return;\n // Found pattern\n // Reduce row skip, since we found pattern and qr code is nearby\n ySkip = 2;\n if (skipped) {\n // Already skipped, so we have at least 2 patterns, lets check if third is ok\n let count = 0;\n let total = 0;\n for (const p of found) {\n if (p.count < PATTERN_MIN_CONFIRMATIONS)\n continue;\n count++;\n total += p.moduleSize;\n }\n if (count < 3)\n return;\n const average = total / found.length;\n let deviation = 0.0;\n for (const p of found)\n deviation += Math.abs(p.moduleSize - average);\n if (deviation <= 0.05 * total) {\n done = true;\n return false;\n }\n }\n else if (found.length > 1) {\n // We found two top patterns, lets skip to approximate location of third pattern\n const q = patternsConfirmed(found);\n if (q.length < 2)\n return true;\n skipped = true;\n const d = int((Math.abs(q[0].x - q[1].x) - Math.abs(q[0].y - q[1].y)) / 2);\n if (d <= runs[2] + ySkip)\n return true;\n y += d - runs[2] - ySkip;\n return false;\n }\n return;\n });\n }\n const flen = found.length;\n if (flen < 3)\n throw new Error(`Finder: len(found) = ${flen}`);\n found.sort((i, j) => i.moduleSize - j.moduleSize);\n const pBest = best();\n // Qubic complexity, but we stop search when we found 3 patterns, so not a problem\n for (let i = 0; i < flen - 2; i++) {\n const fi = found[i];\n for (let j = i + 1; j < flen - 1; j++) {\n const fj = found[j];\n const square0 = distance2(fi, fj);\n for (let k = j + 1; k < flen; k++) {\n const fk = found[k];\n if (fk.moduleSize > fi.moduleSize * 1.4)\n continue;\n const arr = [square0, distance2(fj, fk), distance2(fi, fk)].sort((a, b) => a - b);\n const a = arr[0];\n const b = arr[1];\n const c = arr[2];\n pBest.add(Math.abs(c - 2 * b) + Math.abs(c - 2 * a), [fi, fj, fk]);\n }\n }\n }\n const p = pBest.get();\n if (!p)\n throw new Error('cannot find finder');\n const p0 = p[0];\n const p1 = p[1];\n const p2 = p[2];\n const d01 = distance(p0, p1);\n const d12 = distance(p1, p2);\n const d02 = distance(p0, p2);\n let tl = p2;\n let bl = p0;\n let tr = p1;\n if (d12 >= d01 && d12 >= d02) {\n tl = p0;\n bl = p1;\n tr = p2;\n }\n else if (d02 >= d12 && d02 >= d01) {\n tl = p1;\n bl = p0;\n tr = p2;\n }\n // If cross product is negative -> flip points\n if ((tr.x - tl.x) * (bl.y - tl.y) - (tr.y - tl.y) * (bl.x - tl.x) < 0.0) {\n let _bl = bl;\n bl = tr;\n tr = _bl;\n }\n return { bl, tl, tr };\n}\nfunction findAlignment(b, est, allowanceFactor) {\n const { moduleSize } = est;\n const allowance = int(allowanceFactor * moduleSize);\n const leftX = cap(est.x - allowance, 0);\n const rightX = cap(est.x + allowance, undefined, b.width - 1);\n const x = rightX - leftX;\n const topY = cap(est.y - allowance, 0);\n const bottomY = cap(est.y + allowance, undefined, b.height - 1);\n const y = bottomY - topY;\n if (x < moduleSize * 3 || y < moduleSize * 3)\n throw new Error(`x = ${x}, y=${y} moduleSize = ${moduleSize}`);\n const xStart = leftX;\n const yStart = topY;\n const width = rightX - leftX;\n const height = bottomY - topY;\n const found = [];\n const xEnd = xStart + width;\n const middleY = int(yStart + height / 2);\n for (let yGen = 0; yGen < height; yGen++) {\n const diff = int((yGen + 1) / 2);\n const y = middleY + (yGen & 1 ? -diff : diff);\n let res;\n ALIGNMENT.scanLine(b, y, xStart, xEnd, (runs, x) => {\n if (!ALIGNMENT.checkSize(runs, moduleSize))\n return;\n const total = sum(runs);\n const xx = ALIGNMENT.toCenter(runs, x);\n // Vertical\n const rVert = ALIGNMENT.runs();\n let v = ALIGNMENT.check(b, rVert, { x: int(xx), y }, { y: 1, x: 0 }, 2 * runs[1]);\n if (v === false)\n return;\n v += y;\n const vTotal = sum(rVert);\n if (5 * Math.abs(vTotal - total) >= 2 * total)\n return;\n if (!ALIGNMENT.checkSize(rVert, moduleSize))\n return;\n const yy = ALIGNMENT.toCenter(rVert, v);\n res = ALIGNMENT.add(found, xx, yy, total);\n if (res)\n return false;\n return;\n });\n if (res)\n return res;\n }\n if (found.length > 0)\n return found[0];\n throw new Error('Alignment pattern not found');\n}\nfunction _single(b, from, to) {\n // http://en.wikipedia.org/wiki/Bresenham's_line_algorithm\n let steep = false;\n let d = { x: Math.abs(to.x - from.x), y: Math.abs(to.y - from.y) };\n if (d.y > d.x) {\n steep = true;\n from = pointMirror(from);\n to = pointMirror(to);\n d = pointMirror(d);\n }\n let error = -d.x / 2;\n let step = { x: from.x >= to.x ? -1 : 1, y: from.y >= to.y ? -1 : 1 };\n let runPos = 0;\n let xLimit = to.x + step.x;\n // TODO: re-use pattern scanLine here?\n for (let x = from.x, y = from.y; x !== xLimit; x += step.x) {\n let real = { x, y };\n if (steep)\n real = pointMirror(real);\n // Same as alignment pattern ([true, false, true])\n if ((runPos === 1) === !!b.point(real)) {\n if (runPos === 2)\n return distance({ x, y }, from);\n runPos++;\n }\n error += d.y;\n if (error <= 0)\n continue;\n if (y === to.y)\n break;\n y += step.y;\n error -= d.x;\n }\n if (runPos === 2)\n return distance({ x: to.x + step.x, y: to.y }, from);\n return NaN;\n}\nfunction BWBRunLength(b, from, to) {\n let result = _single(b, from, to);\n let scaleY = 1.0;\n const { x: fx, y: fy } = from;\n let otherToX = fx - (to.x - fx);\n const bw = b.width;\n if (otherToX < 0) {\n scaleY = fx / (fx - otherToX);\n otherToX = 0;\n }\n else if (otherToX >= bw) {\n scaleY = (bw - 1 - fx) / (otherToX - fx);\n otherToX = bw - 1;\n }\n let otherToY = int(fy - (to.y - fy) * scaleY);\n let scaleX = 1.0;\n const bh = b.height;\n if (otherToY < 0) {\n scaleX = fy / (fy - otherToY);\n otherToY = 0;\n }\n else if (otherToY >= bh) {\n scaleX = (bh - 1 - fy) / (otherToY - fy);\n otherToY = bh - 1;\n }\n otherToX = int(fx + (otherToX - fx) * scaleX);\n result += _single(b, from, { x: otherToX, y: otherToY });\n return result - 1.0;\n}\nfunction moduleSizeAvg(b, p1, p2) {\n const est1 = BWBRunLength(b, pointInt(p1), pointInt(p2));\n const est2 = BWBRunLength(b, pointInt(p2), pointInt(p1));\n if (Number.isNaN(est1))\n return est2 / FINDER.totalSize;\n if (Number.isNaN(est2))\n return est1 / FINDER.totalSize;\n return (est1 + est2) / (2 * FINDER.totalSize);\n}\nfunction detect(b) {\n let bl, tl, tr;\n try {\n ({ bl, tl, tr } = findFinder(b));\n }\n catch (e) {\n try {\n b.negate();\n ({ bl, tl, tr } = findFinder(b));\n }\n catch (e) {\n b.negate(); // undo negate\n throw e;\n }\n }\n const moduleSize = (moduleSizeAvg(b, tl, tr) + moduleSizeAvg(b, tl, bl)) / 2;\n if (moduleSize < 1.0)\n throw new Error(`invalid moduleSize = ${moduleSize}`);\n // Estimate size\n const tltr = int(distance(tl, tr) / moduleSize + 0.5);\n const tlbl = int(distance(tl, bl) / moduleSize + 0.5);\n let size = int((tltr + tlbl) / 2 + 7);\n const rem = size % 4;\n if (rem === 0)\n size++; // -> 1\n else if (rem === 2)\n size--; // -> 1\n else if (rem === 3)\n size -= 2;\n const version = info.size.decode(size);\n validateVersion(version);\n let alignmentPattern;\n if (info.alignmentPatterns(version).length > 0) {\n // Bottom right estimate\n const br = { x: tr.x - tl.x + bl.x, y: tr.y - tl.y + bl.y };\n const c = 1.0 - 3.0 / (info.size.encode(version) - 7);\n // Estimated alignment pattern position\n const est = {\n x: int(tl.x + c * (br.x - tl.x)),\n y: int(tl.y + c * (br.y - tl.y)),\n moduleSize,\n count: 1,\n };\n for (let i = 4; i <= 16; i <<= 1) {\n try {\n alignmentPattern = findAlignment(b, est, i);\n break;\n }\n catch (e) { }\n }\n }\n const toTL = { x: 3.5, y: 3.5 };\n const toTR = { x: size - 3.5, y: 3.5 };\n const toBL = { x: 3.5, y: size - 3.5 };\n let br;\n let toBR;\n if (alignmentPattern) {\n br = alignmentPattern;\n toBR = { x: size - 6.5, y: size - 6.5 };\n }\n else {\n br = { x: tr.x - tl.x + bl.x, y: tr.y - tl.y + bl.y };\n toBR = { x: size - 3.5, y: size - 3.5 };\n }\n const from = [tl, tr, br, bl];\n const bits = transform(b, size, from, [toTL, toTR, toBR, toBL]);\n return { bits: bits, points: from };\n}\n// Perspective transform by 4 points\nfunction squareToQuadrilateral(p) {\n const d3 = { x: p[0].x - p[1].x + p[2].x - p[3].x, y: p[0].y - p[1].y + p[2].y - p[3].y };\n if (d3.x === 0.0 && d3.y === 0.0) {\n return [\n [p[1].x - p[0].x, p[2].x - p[1].x, p[0].x],\n [p[1].y - p[0].y, p[2].y - p[1].y, p[0].y],\n [0.0, 0.0, 1.0],\n ];\n }\n else {\n const d1 = { x: p[1].x - p[2].x, y: p[1].y - p[2].y };\n const d2 = { x: p[3].x - p[2].x, y: p[3].y - p[2].y };\n const den = d1.x * d2.y - d2.x * d1.y;\n const p13 = (d3.x * d2.y - d2.x * d3.y) / den;\n const p23 = (d1.x * d3.y - d3.x * d1.y) / den;\n return [\n [p[1].x - p[0].x + p13 * p[1].x, p[3].x - p[0].x + p23 * p[3].x, p[0].x],\n [p[1].y - p[0].y + p13 * p[1].y, p[3].y - p[0].y + p23 * p[3].y, p[0].y],\n [p13, p23, 1.0],\n ];\n }\n}\n// Transform quadrilateral to square by 4 points\nfunction transform(b, size, from, to) {\n // TODO: check\n // https://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle\n const p = squareToQuadrilateral(to);\n const qToS = [\n [\n p[1][1] * p[2][2] - p[2][1] * p[1][2],\n p[2][1] * p[0][2] - p[0][1] * p[2][2],\n p[0][1] * p[1][2] - p[1][1] * p[0][2],\n ],\n [\n p[2][0] * p[1][2] - p[1][0] * p[2][2],\n p[0][0] * p[2][2] - p[2][0] * p[0][2],\n p[1][0] * p[0][2] - p[0][0] * p[1][2],\n ],\n [\n p[1][0] * p[2][1] - p[2][0] * p[1][1],\n p[2][0] * p[0][1] - p[0][0] * p[2][1],\n p[0][0] * p[1][1] - p[1][0] * p[0][1],\n ],\n ];\n const sToQ = squareToQuadrilateral(from);\n const transform = sToQ.map((i) => i.map((_, qx) => i.reduce((acc, v, j) => acc + v * qToS[j][qx], 0)));\n const res = new Bitmap(size);\n const points = fillArr(2 * size, 0);\n const pointsLength = points.length;\n for (let y = 0; y < size; y++) {\n const p = transform;\n for (let i = 0; i < pointsLength - 1; i += 2) {\n const x = i / 2 + 0.5;\n const y2 = y + 0.5;\n const den = p[2][0] * x + p[2][1] * y2 + p[2][2];\n points[i] = int((p[0][0] * x + p[0][1] * y2 + p[0][2]) / den);\n points[i + 1] = int((p[1][0] * x + p[1][1] * y2 + p[1][2]) / den);\n }\n for (let i = 0; i < pointsLength; i += 2) {\n const px = cap(points[i], 0, b.width - 1);\n const py = cap(points[i + 1], 0, b.height - 1);\n if (b.get(px, py))\n res.set((i / 2) | 0, y, true);\n }\n }\n return res;\n}\n// Same as in drawTemplate, but reading\n// TODO: merge in CoderType?\nfunction readInfoBits(b) {\n const readBit = (x, y, out) => (out << 1) | (b.get(x, y) ? 1 : 0);\n const size = b.height;\n // Version information\n let version1 = 0;\n for (let y = 5; y >= 0; y--)\n for (let x = size - 9; x >= size - 11; x--)\n version1 = readBit(x, y, version1);\n let version2 = 0;\n for (let x = 5; x >= 0; x--)\n for (let y = size - 9; y >= size - 11; y--)\n version2 = readBit(x, y, version2);\n // Format information\n let format1 = 0;\n for (let x = 0; x < 6; x++)\n format1 = readBit(x, 8, format1);\n format1 = readBit(7, 8, format1);\n format1 = readBit(8, 8, format1);\n format1 = readBit(8, 7, format1);\n for (let y = 5; y >= 0; y--)\n format1 = readBit(8, y, format1);\n let format2 = 0;\n for (let y = size - 1; y >= size - 7; y--)\n format2 = readBit(8, y, format2);\n for (let x = size - 8; x < size; x++)\n format2 = readBit(x, 8, format2);\n return { version1, version2, format1, format2 };\n}\nfunction parseInfo(b) {\n // Population count over xor -> hamming distance\n const size = b.height;\n const { version1, version2, format1, format2 } = readInfoBits(b);\n // Guess format\n let format;\n const bestFormat = best();\n for (const ecc of ['medium', 'low', 'high', 'quartile']) {\n for (let mask = 0; mask < 8; mask++) {\n const bits = info.formatBits(ecc, mask);\n const cur = { ecc, mask: mask };\n if (bits === format1 || bits === format2) {\n format = cur;\n break;\n }\n bestFormat.add(popcnt(format1 ^ bits), cur);\n if (format1 !== format2)\n bestFormat.add(popcnt(format2 ^ bits), cur);\n }\n }\n if (format === undefined && bestFormat.score() <= MAX_BITS_ERROR)\n format = bestFormat.get();\n if (format === undefined)\n throw new Error('invalid format pattern');\n let version = info.size.decode(size); // Guess version based on bitmap size\n if (version < 7)\n validateVersion(version);\n else {\n version = undefined;\n // Guess version\n const bestVer = best();\n for (let ver = 7; ver <= 40; ver++) {\n const bits = info.versionBits(ver);\n if (bits === version1 || bits === version2) {\n version = ver;\n break;\n }\n bestVer.add(popcnt(version1 ^ bits), ver);\n if (version1 !== version2)\n bestVer.add(popcnt(version2 ^ bits), ver);\n }\n if (version === undefined && bestVer.score() <= MAX_BITS_ERROR)\n version = bestVer.get();\n if (version === undefined)\n throw new Error('invalid version pattern');\n if (info.size.encode(version) !== size)\n throw new Error('invalid version size');\n }\n return { version, ...format };\n}\n// Common encodings, please open issue if something popular missing\nconst eciToEncoding = {\n 1: 'iso-8859-1',\n 2: 'ibm437',\n 3: 'iso-8859-1',\n 4: 'iso-8859-2',\n 5: 'iso-8859-3',\n 6: 'iso-8859-4',\n 7: 'iso-8859-5',\n 8: 'iso-8859-6',\n 9: 'iso-8859-7',\n 10: 'iso-8859-8',\n 11: 'iso-8859-9',\n 13: 'iso-8859-11',\n 15: 'iso-8859-13',\n 16: 'iso-8859-14',\n 17: 'iso-8859-15',\n 18: 'iso-8859-16',\n 20: 'shift-jis',\n 21: 'windows-1250',\n 22: 'windows-1251',\n 23: 'windows-1252',\n 24: 'windows-1256',\n 25: 'utf-16be',\n 26: 'utf-8',\n 28: 'big5',\n 29: 'gbk',\n 30: 'euc-kr',\n};\nfunction decodeWithEci(bytes, eci = 26) {\n const encoding = eciToEncoding[eci];\n if (!encoding)\n throw new Error(`Unsupported ECI: ${eci}`);\n return new TextDecoder(encoding).decode(bytes);\n}\nfunction decodeBitmap(b, decoder = decodeWithEci) {\n const size = b.height;\n if (size < 21 || (size & 0b11) !== 1 || size !== b.width)\n throw new Error(`decode: invalid size=${size}`);\n const { version, mask, ecc } = parseInfo(b);\n const tpl = drawTemplate(version, ecc, mask);\n const { total } = info.capacity(version, ecc);\n const bytes = new Uint8Array(total);\n let pos = 0;\n let buf = 0;\n let bitPos = 0;\n zigzag(tpl, mask, (x, y, m) => {\n bitPos++;\n buf <<= 1;\n buf |= +(!!b.get(x, y) !== m);\n if (bitPos !== 8)\n return;\n bytes[pos++] = buf;\n bitPos = 0;\n buf = 0;\n });\n if (pos !== total)\n throw new Error(`decode: pos=${pos}, total=${total}`);\n let bits = Array.from(interleave(version, ecc).decode(bytes))\n .map((i) => bin(i, 8))\n .join('');\n // Reverse operation of index.ts/encode working on bits\n const readBits = (n) => {\n if (n > bits.length)\n throw new Error('Not enough bits');\n const val = bits.slice(0, n);\n bits = bits.slice(n);\n return val;\n };\n const toNum = (n) => Number(`0b${n}`);\n // reverse of common.info.modebits\n const modes = {\n '0000': 'terminator',\n '0001': 'numeric',\n '0010': 'alphanumeric',\n '0100': 'byte',\n '0111': 'eci',\n '1000': 'kanji',\n };\n let res = '';\n let eci = 26; // Default to utf-8 for compat with old behavior\n while (true) {\n if (bits.length < 4)\n break;\n const modeBits = readBits(4);\n const mode = modes[modeBits];\n if (mode === undefined)\n throw new Error(`Unknown modeBits=${modeBits} res=\"${res}\"`);\n if (mode === 'terminator')\n break;\n const countBits = info.lengthBits(version, mode);\n let count = toNum(readBits(countBits));\n if (mode === 'numeric') {\n while (count >= 3) {\n const v = toNum(readBits(10));\n if (v >= 1000)\n throw new Error(`numberic(3) = ${v}`);\n res += v.toString().padStart(3, '0');\n count -= 3;\n }\n if (count === 2) {\n const v = toNum(readBits(7));\n if (v >= 100)\n throw new Error(`numeric(2) = ${v}`);\n res += v.toString().padStart(2, '0');\n }\n else if (count === 1) {\n const v = toNum(readBits(4));\n if (v >= 10)\n throw new Error(`Numeric(1) = ${v}`);\n res += v.toString();\n }\n }\n else if (mode === 'alphanumeric') {\n while (count >= 2) {\n const v = toNum(readBits(11));\n res += info.alphabet.alphanumerc.encode([Math.floor(v / 45), v % 45]).join('');\n count -= 2;\n }\n if (count === 1)\n res += info.alphabet.alphanumerc.encode([toNum(readBits(6))]).join('');\n }\n else if (mode === 'eci') {\n const first = toNum(readBits(8));\n if ((first & 0x80) === 0)\n eci = first;\n else if ((first & 0xc0) === 0x80)\n eci = ((first & 0x3f) << 8) | toNum(readBits(8));\n else\n eci = ((first & 0x1f) << 16) | toNum(readBits(16));\n continue; // ECI doesn't carry data, just sets state\n }\n else if (mode === 'byte') {\n const data = new Uint8Array(count);\n for (let i = 0; i < count; i++)\n data[i] = toNum(readBits(8));\n res += decoder(data, eci);\n }\n else\n throw new Error(`Unknown mode=${mode}`);\n }\n return res;\n}\n// Creates square from rectangle\nfunction cropToSquare(img) {\n const data = Array.isArray(img.data) ? new Uint8Array(img.data) : img.data;\n const { height, width } = img;\n const squareSize = Math.min(height, width);\n const offset = {\n x: Math.floor((width - squareSize) / 2),\n y: Math.floor((height - squareSize) / 2),\n };\n const bytesPerPixel = getBytesPerPixel(img);\n const croppedData = new Uint8Array(squareSize * squareSize * bytesPerPixel);\n for (let y = 0; y < squareSize; y++) {\n const srcPos = ((y + offset.y) * width + offset.x) * bytesPerPixel;\n const dstPos = y * squareSize * bytesPerPixel;\n const length = squareSize * bytesPerPixel;\n croppedData.set(data.subarray(srcPos, srcPos + length), dstPos);\n }\n return { offset, img: { height: squareSize, width: squareSize, data: croppedData } };\n}\nexport function decodeQR(img, opts = {}) {\n for (const field of ['height', 'width']) {\n if (!Number.isSafeInteger(img[field]) || img[field] <= 0)\n throw new Error(`invalid img.${field}=${img[field]} (${typeof img[field]})`);\n }\n if (!Array.isArray(img.data) &&\n !(img.data instanceof Uint8Array) &&\n !(img.data instanceof Uint8ClampedArray))\n throw new Error(`invalid image.data=${img.data} (${typeof img.data})`);\n if (opts.cropToSquare !== undefined && typeof opts.cropToSquare !== 'boolean')\n throw new Error(`invalid opts.cropToSquare=${opts.cropToSquare}`);\n for (const fn of ['pointsOnDetect', 'imageOnBitmap', 'imageOnDetect', 'imageOnResult']) {\n if (opts[fn] !== undefined && typeof opts[fn] !== 'function')\n throw new Error(`invalid opts.${fn}=${opts[fn]} (${typeof opts[fn]})`);\n }\n let offset = { x: 0, y: 0 };\n if (opts.cropToSquare)\n ({ img, offset } = cropToSquare(img));\n const bmp = toBitmap(img);\n if (opts.imageOnBitmap)\n opts.imageOnBitmap(bmp.toImage());\n const { bits, points } = detect(bmp);\n if (opts.pointsOnDetect) {\n const p = points.map((i) => ({ ...i, ...pointAdd(i, offset) }));\n opts.pointsOnDetect(p);\n }\n if (opts.imageOnDetect)\n opts.imageOnDetect(bits.toImage());\n const res = decodeBitmap(bits, opts.textDecoder);\n if (opts.imageOnResult)\n opts.imageOnResult(bits.toImage());\n return res;\n}\nexport default decodeQR;\n// Unsafe API utils, exported only for tests\nexport const _tests = {\n toBitmap,\n decodeBitmap,\n findFinder,\n detect,\n};\n//# sourceMappingURL=decode.js.map","/*!\nCopyright (c) 2023 Paul Miller (paulmillr.com)\nThe library paulmillr-qr is dual-licensed under the Apache 2.0 OR MIT license.\nYou can select a license of your choice.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n/**\n * Optional DOM related utilities. Some utilities, useful to decode QR from camera:\n * - draw overlay: helps user to position QR code on camera\n * - draw bitmap: useful for debugging (what decoder sees)\n * - draw result: show scanned QR code\n * The code is fragile: it is easy to make subtle errors, which will break decoding.\n * @module\n */\nimport decodeQR, {} from \"./decode.js\";\nexport const getSize = (elm) => {\n const css = getComputedStyle(elm);\n const width = Math.floor(+css.width.split('px')[0]);\n const height = Math.floor(+css.height.split('px')[0]);\n return { width, height };\n};\nconst setCanvasSize = (canvas, height, width) => {\n // NOTE: setting canvas.width even to same size will clear & redraw it (flickering)\n if (canvas.height !== height)\n canvas.height = height;\n if (canvas.width !== width)\n canvas.width = width;\n};\nconst getCanvasContext = (canvas) => {\n const context = canvas.getContext('2d');\n if (context === null)\n throw new Error('Cannot get canvas context');\n return { canvas, context };\n};\nconst clearCanvas = ({ canvas, context }) => {\n context.clearRect(0, 0, canvas.width, canvas.height);\n};\n/**\n * Handles canvases for QR code decoding\n */\nexport class QRCanvas {\n opts;\n lastDetect = 0;\n main;\n overlay;\n bitmap;\n resultQR;\n constructor({ overlay, bitmap, resultQR } = {}, opts = {}) {\n this.opts = {\n resultBlockSize: 8,\n overlayMainColor: 'green',\n overlayFinderColor: 'blue',\n overlaySideColor: 'black',\n overlayTimeout: 500,\n cropToSquare: true,\n ...opts,\n };\n // TODO: check https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas\n this.main = getCanvasContext(document.createElement('canvas'));\n if (overlay)\n this.overlay = getCanvasContext(overlay);\n if (bitmap)\n this.bitmap = getCanvasContext(bitmap);\n if (resultQR) {\n this.resultQR = getCanvasContext(resultQR);\n this.resultQR.context.imageSmoothingEnabled = false;\n }\n }\n setSize(height, width) {\n setCanvasSize(this.main.canvas, height, width);\n if (this.overlay)\n setCanvasSize(this.overlay.canvas, height, width);\n if (this.bitmap)\n setCanvasSize(this.bitmap.canvas, height, width);\n }\n drawBitmap({ data, height, width }) {\n if (!this.bitmap)\n return;\n const imgData = new ImageData(Uint8ClampedArray.from(data), width, height);\n let offset = { x: 0, y: 0 };\n if (this.opts.cropToSquare) {\n offset = {\n x: Math.ceil((this.bitmap.canvas.width - width) / 2),\n y: Math.ceil((this.bitmap.canvas.height - height) / 2),\n };\n }\n this.bitmap.context.putImageData(imgData, offset.x, offset.y);\n }\n drawResultQr({ data, height, width }) {\n if (!this.resultQR)\n return;\n const blockSize = this.opts.resultBlockSize;\n setCanvasSize(this.resultQR.canvas, height, width);\n const imgData = new ImageData(Uint8ClampedArray.from(data), width, height);\n this.resultQR.context.putImageData(imgData, 0, 0);\n this.resultQR.canvas.style = `image-rendering: pixelated; width: ${blockSize * width}px; height: ${blockSize * height}px`;\n }\n drawOverlay(points) {\n if (!this.overlay)\n return;\n const ctx = this.overlay.context;\n const height = this.overlay.canvas.height;\n const width = this.overlay.canvas.width;\n // Sides\n if (this.opts.cropToSquare && height !== width) {\n const squareSize = Math.min(height, width);\n const offset = {\n x: Math.floor((width - squareSize) / 2),\n y: Math.floor((height - squareSize) / 2),\n };\n // Clear only central part (flickering)\n ctx.clearRect(offset.x, offset.y, squareSize, squareSize);\n ctx.fillStyle = this.opts.overlaySideColor;\n if (width > height) {\n ctx.fillRect(0, 0, offset.x, height); // left\n ctx.fillRect(width - offset.x, 0, offset.x, height); // right\n }\n else if (height > width) {\n ctx.fillRect(0, 0, width, offset.y); // top\n ctx.fillRect(0, height - offset.y, width, offset.y); // bottom\n }\n }\n else {\n ctx.clearRect(0, 0, width, height);\n }\n if (points) {\n const [tl, tr, br, bl] = points;\n // Main area\n ctx.fillStyle = this.opts.overlayMainColor;\n ctx.beginPath();\n ctx.moveTo(tl.x, tl.y);\n ctx.lineTo(tr.x, tr.y);\n ctx.lineTo(br.x, br.y);\n ctx.lineTo(bl.x, bl.y);\n ctx.fill();\n ctx.closePath();\n // Finders\n ctx.fillStyle = this.opts.overlayFinderColor;\n for (const p of points) {\n if (!('moduleSize' in p))\n continue;\n const x = p.x - 3 * p.moduleSize;\n const y = p.y - 3 * p.moduleSize;\n const size = 7 * p.moduleSize;\n ctx.fillRect(x, y, size, size);\n }\n }\n }\n drawImage(image, height, width) {\n this.setSize(height, width);\n const { context } = this.main;\n context.drawImage(image, 0, 0, width, height);\n const data = context.getImageData(0, 0, width, height);\n const options = {\n cropToSquare: this.opts.cropToSquare,\n textDecoder: this.opts.textDecoder,\n };\n if (this.bitmap)\n options.imageOnBitmap = (img) => this.drawBitmap(img);\n if (this.overlay)\n options.pointsOnDetect = (points) => this.drawOverlay(points);\n if (this.resultQR)\n options.imageOnResult = (img) => this.drawResultQr(img);\n try {\n const res = decodeQR(data, options);\n this.lastDetect = Date.now();\n return res;\n }\n catch (e) {\n if (this.overlay && Date.now() - this.lastDetect > this.opts.overlayTimeout)\n this.drawOverlay();\n }\n return;\n }\n clear() {\n clearCanvas(this.main);\n if (this.overlay)\n clearCanvas(this.overlay);\n if (this.bitmap)\n clearCanvas(this.bitmap);\n if (this.resultQR)\n clearCanvas(this.resultQR);\n }\n}\nclass QRCamera {\n stream;\n player;\n constructor(stream, player) {\n this.stream = stream;\n this.player = player;\n this.setStream(stream);\n }\n setStream(stream) {\n this.stream = stream;\n const { player } = this;\n player.setAttribute('autoplay', '');\n player.setAttribute('muted', '');\n player.setAttribute('playsinline', '');\n player.srcObject = stream;\n }\n /**\n * Returns list of cameras\n * NOTE: available only after first getUserMedia request, so cannot be additional method\n */\n async listDevices() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices)\n throw new Error('Media Devices not supported');\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices\n .filter((device) => device.kind === 'videoinput')\n .map((i) => ({\n deviceId: i.deviceId,\n label: i.label || `Camera ${i.deviceId}`,\n }));\n }\n /**\n * Change stream to different camera\n * @param deviceId - devideId from '.listDevices'\n */\n async setDevice(deviceId) {\n this.stop();\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: deviceId } },\n });\n this.setStream(stream);\n }\n readFrame(canvas, fullSize = false) {\n const { player } = this;\n if (fullSize)\n return canvas.drawImage(player, player.videoHeight, player.videoWidth);\n const size = getSize(player);\n return canvas.drawImage(player, size.height, size.width);\n }\n stop() {\n for (const track of this.stream.getTracks())\n track.stop();\n }\n}\n/**\n * Creates new QRCamera from frontal camera\n * @param player - HTML Video element\n * @example\n * const canvas = new QRCanvas();\n * const camera = frontalCamera();\n * const devices = await camera.listDevices();\n * await camera.setDevice(devices[0].deviceId); // Change camera\n * const res = camera.readFrame(canvas);\n */\nexport async function frontalCamera(player) {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n // Ask for screen resolution\n height: { ideal: window.screen.height },\n width: { ideal: window.screen.width },\n // prefer front-facing camera, but can use any other\n // NOTE: 'exact' will cause OverConstrained error if no frontal camera available\n facingMode: 'environment',\n },\n });\n return new QRCamera(stream, player);\n}\n/**\n * Run callback in a loop with requestAnimationFrame\n * @param cb - callback\n * @example\n * const cancel = frameLoop((ns) => console.log(ns));\n * cancel();\n */\nexport function frameLoop(cb) {\n let handle = undefined;\n function loop(ts) {\n cb(ts);\n handle = requestAnimationFrame(loop);\n }\n handle = requestAnimationFrame(loop);\n return () => {\n if (handle === undefined)\n return;\n cancelAnimationFrame(handle);\n handle = undefined;\n };\n}\nexport function svgToPng(svgData, width, height) {\n return new Promise((resolve, reject) => {\n if (!(Number.isSafeInteger(width) &&\n Number.isSafeInteger(height) &&\n width > 0 &&\n height > 0 &&\n width < 8192 &&\n height < 8192))\n return reject(new Error('invalid width and height: ' + width + ' ' + height));\n const domparser = new DOMParser();\n const doc = domparser.parseFromString(svgData, 'image/svg+xml');\n const svgElement = doc.documentElement;\n svgElement.setAttribute('width', String(width));\n svgElement.setAttribute('height', String(height));\n const rect = doc.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n rect.setAttribute('fill', 'white');\n svgElement.insertBefore(rect, svgElement.firstChild);\n const serializer = new XMLSerializer();\n const source = serializer.serializeToString(doc);\n const img = new Image();\n img.src = 'data:image/svg+xml,' + encodeURIComponent(source);\n img.onload = function () {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx)\n return reject(new Error('was not able to create 2d context'));\n ctx.drawImage(img, 0, 0, width, height);\n const dataUrl = canvas.toDataURL('image/png');\n resolve(dataUrl);\n };\n img.onerror = reject;\n });\n}\n//# sourceMappingURL=dom.js.map"],"names":["best","bin","drawTemplate","fillArr","info","interleave","validateVersion","zigzag","popcnt","utils","MAX_BITS_ERROR","GRAYSCALE_BLOCK_SIZE","GRAYSCALE_RANGE","PATTERN_VARIANCE","PATTERN_VARIANCE_DIAGONAL","PATTERN_MIN_CONFIRMATIONS","DETECT_MIN_ROW_SKIP","int","n","distance2","p1","p2","x","y","distance","sum","lst","acc","i","pointIncr","p","incr","pointNeg","pointMirror","pointClone","pointInt","pointAdd","a","b","cap","value","min","max","getBytesPerPixel","img","perPixel","toBitmap","bytesPerPixel","brightness","j","d","r","block","bWidth","bHeight","maxY","maxX","blocks","yPos","xPos","yy","pos","xx","pixel","average","idx","prev","matrix","Bitmap","top","left","y2","patternEquals","diff","patternMerge","count","patternsConfirmed","pattern","size","_size","res","runs","moduleSize","v","variance","out","total","FINDER","cur","f","end","center","maxCount","neg","check","step","xStart","xEnd","fn","found","ALIGNMENT","findFinder","checkRuns","checkLine","runsTotal","dRuns","skipped","ySkip","done","deviation","q","flen","pBest","fi","fj","square0","k","fk","arr","c","p0","d01","d12","d02","tl","bl","tr","_bl","findAlignment","est","allowanceFactor","allowance","leftX","rightX","topY","bottomY","yStart","width","height","middleY","yGen","rVert","vTotal","_single","from","to","steep","error","runPos","xLimit","real","BWBRunLength","result","scaleY","fx","fy","otherToX","bw","otherToY","scaleX","bh","moduleSizeAvg","est1","est2","detect","e","tltr","tlbl","rem","version","alignmentPattern","br","toTL","toTR","toBL","toBR","transform","squareToQuadrilateral","d3","d1","d2","den","p13","p23","qToS","_","qx","points","pointsLength","px","py","readInfoBits","readBit","version1","version2","format1","format2","parseInfo","format","bestFormat","ecc","mask","bits","bestVer","ver","eciToEncoding","decodeWithEci","bytes","eci","encoding","decodeBitmap","decoder","tpl","buf","bitPos","m","readBits","val","toNum","modes","modeBits","mode","countBits","first","data","cropToSquare","squareSize","offset","croppedData","srcPos","dstPos","length","decodeQR","opts","field","bmp","getSize","elm","css","setCanvasSize","canvas","getCanvasContext","context","clearCanvas","QRCanvas","overlay","bitmap","resultQR","imgData","blockSize","ctx","image","options","QRCamera","stream","player","device","deviceId","fullSize","track","frontalCamera","frameLoop","cb","handle","loop","ts","svgToPng","svgData","resolve","reject","doc","svgElement","rect","source","dataUrl"],"mappings":"sJAyBA,KAAM,CAAE,KAAAA,EAAM,IAAAC,GAAK,aAAAC,GAAc,QAAAC,EAAS,KAAAC,EAAM,WAAAC,GAAY,gBAAAC,GAAiB,OAAAC,GAAQ,OAAAC,CAAM,EAAKC,GAE1FC,EAAiB,EACjBC,GAAuB,EACvBC,GAAkB,GAClBC,GAAmB,EACnBC,GAA4B,MAC5BC,GAA4B,EAC5BC,GAAsB,EAEtBC,EAAOC,GAAMA,IAAM,EAEnBC,EAAY,CAACC,EAAIC,IAAO,CAC1B,MAAMC,EAAIF,EAAG,EAAIC,EAAG,EACdE,EAAIH,EAAG,EAAIC,EAAG,EACpB,OAAOC,EAAIA,EAAIC,EAAIA,CACvB,EACMC,EAAW,CAACJ,EAAIC,IAAO,KAAK,KAAKF,EAAUC,EAAIC,CAAE,CAAC,EAClDI,EAAOC,GAAQA,EAAI,OAAO,CAACC,EAAKC,IAAMD,EAAMC,CAAC,EAC7CC,EAAY,CAACC,EAAGC,IAAS,CAC3BD,EAAE,GAAKC,EAAK,EACZD,EAAE,GAAKC,EAAK,CAChB,EACMC,GAAYF,IAAO,CAAE,EAAG,CAACA,EAAE,EAAG,EAAG,CAACA,EAAE,IACpCG,EAAeH,IAAO,CAAE,EAAGA,EAAE,EAAG,EAAGA,EAAE,IACrCI,EAAcJ,IAAO,CAAE,EAAGA,EAAE,EAAG,EAAGA,EAAE,IACpCK,EAAYL,IAAO,CAAE,EAAGb,EAAIa,EAAE,CAAC,EAAG,EAAGb,EAAIa,EAAE,CAAC,CAAC,GAC7CM,GAAW,CAACC,EAAGC,KAAO,CAAE,EAAGD,EAAE,EAAIC,EAAE,EAAG,EAAGD,EAAE,EAAIC,EAAE,CAAC,GACxD,SAASC,EAAIC,EAAOC,EAAKC,EAAK,CAC1B,OAAO,KAAK,IAAI,KAAK,IAAIF,EAAOE,GAAOF,CAAK,EAAGC,GAAOD,CAAK,CAC/D,CACA,MAAMG,GAAoBC,GAAQ,CAC9B,MAAMC,EAAWD,EAAI,KAAK,QAAUA,EAAI,MAAQA,EAAI,QACpD,GAAIC,IAAa,GAAKA,IAAa,EAC/B,OAAOA,EACX,MAAM,IAAI,MAAM,yCAAyCA,CAAQ,EAAE,CACvE,EAKA,SAASC,GAASF,EAAK,CACnB,MAAMG,EAAgBJ,GAAiBC,CAAG,EACpCI,EAAa,IAAI,WAAWJ,EAAI,OAASA,EAAI,KAAK,EACxD,QAAShB,EAAI,EAAGqB,EAAI,EAAGC,EAAIN,EAAI,KAAMhB,EAAIsB,EAAE,OAAQtB,GAAKmB,EAAe,CACnE,MAAMI,EAAID,EAAEtB,CAAC,EACP,EAAIsB,EAAEtB,EAAI,CAAC,EACXU,EAAIY,EAAEtB,EAAI,CAAC,EACjBoB,EAAWC,GAAG,EAAIhC,GAAKkC,EAAI,EAAI,EAAIb,GAAK,CAAC,EAAI,GACjD,CAEA,MAAMc,EAAQzC,GACd,GAAIiC,EAAI,MAAQQ,EAAQ,GAAKR,EAAI,OAASQ,EAAQ,EAC9C,MAAM,IAAI,MAAM,iBAAiB,EACrC,MAAMC,EAAS,KAAK,KAAKT,EAAI,MAAQQ,CAAK,EACpCE,EAAU,KAAK,KAAKV,EAAI,OAASQ,CAAK,EACtCG,EAAOX,EAAI,OAASQ,EACpBI,EAAOZ,EAAI,MAAQQ,EACnBK,EAAS,IAAI,WAAWJ,EAASC,CAAO,EAC9C,QAAS/B,EAAI,EAAGA,EAAI+B,EAAS/B,IAAK,CAC9B,MAAMmC,EAAOnB,EAAIhB,EAAI6B,EAAO,EAAGG,CAAI,EACnC,QAASjC,EAAI,EAAGA,EAAI+B,EAAQ/B,IAAK,CAC7B,MAAMqC,EAAOpB,EAAIjB,EAAI8B,EAAO,EAAGI,CAAI,EACnC,IAAI/B,EAAM,EACNgB,EAAM,IACNC,EAAM,EACV,QAASkB,EAAK,EAAGC,EAAMH,EAAOd,EAAI,MAAQe,EAAMC,EAAKR,EAAOQ,EAAKA,EAAK,EAAGC,EAAMA,EAAMjB,EAAI,MACrF,QAASkB,EAAK,EAAGA,EAAKV,EAAOU,IAAM,CAC/B,MAAMC,EAAQf,EAAWa,EAAMC,CAAE,EACjCrC,GAAOsC,EACPtB,EAAM,KAAK,IAAIA,EAAKsB,CAAK,EACzBrB,EAAM,KAAK,IAAIA,EAAKqB,CAAK,CAC7B,CAGJ,IAAIC,EAAU,KAAK,MAAMvC,EAAM2B,GAAS,CAAC,EACzC,GAAIV,EAAMD,GAAO7B,KACboD,EAAUvB,EAAM,EACZlB,EAAI,GAAKD,EAAI,GAAG,CAChB,MAAM2C,EAAM,CAAC3C,EAAGC,IAAMA,EAAI8B,EAAS/B,EAC7B4C,GAAQT,EAAOQ,EAAI3C,EAAGC,EAAI,CAAC,CAAC,EAAI,EAAIkC,EAAOQ,EAAI3C,EAAI,EAAGC,CAAC,CAAC,EAAIkC,EAAOQ,EAAI3C,EAAI,EAAGC,EAAI,CAAC,CAAC,GAAK,EAC3FkB,EAAMyB,IACNF,EAAUE,EAClB,CAEJT,EAAOJ,EAAS9B,EAAID,CAAC,EAAIL,EAAI+C,CAAO,CACxC,CACJ,CACA,MAAMG,EAAS,IAAIC,GAAO,CAAE,MAAOxB,EAAI,MAAO,OAAQA,EAAI,OAAQ,EAClE,QAASrB,EAAI,EAAGA,EAAI+B,EAAS/B,IAAK,CAC9B,MAAMmC,EAAOnB,EAAIhB,EAAI6B,EAAO,EAAGG,CAAI,EAC7Bc,EAAM9B,EAAIhB,EAAG,EAAG+B,EAAU,CAAC,EACjC,QAAShC,EAAI,EAAGA,EAAI+B,EAAQ/B,IAAK,CAC7B,MAAMqC,EAAOpB,EAAIjB,EAAI8B,EAAO,EAAGI,CAAI,EAC7Bc,EAAO/B,EAAIjB,EAAG,EAAG+B,EAAS,CAAC,EAEjC,IAAI5B,EAAM,EACV,QAASmC,EAAK,GAAIA,GAAM,EAAGA,IAAM,CAC7B,MAAMW,EAAKlB,GAAUgB,EAAMT,GAAMU,EACjC,QAASR,EAAK,GAAIA,GAAM,EAAGA,IACvBrC,GAAOgC,EAAOc,EAAKT,CAAE,CAC7B,CACA,MAAME,EAAUvC,EAAM,GACtB,QAASF,EAAI,EAAGsC,EAAMH,EAAOd,EAAI,MAAQe,EAAMpC,EAAI6B,EAAO7B,GAAK,EAAGsC,GAAOjB,EAAI,MACzE,QAAStB,EAAI,EAAGA,EAAI8B,EAAO9B,IACnB0B,EAAWa,EAAMvC,CAAC,GAAK0C,GACvBG,EAAO,IAAIR,EAAOrC,EAAGoC,EAAOnC,EAAG,EAAI,CAGnD,CACJ,CACA,OAAO4C,CACX,CACA,SAASK,GAAc1C,EAAGT,EAAI,CAC1B,GAAI,KAAK,IAAIA,EAAG,EAAIS,EAAE,CAAC,GAAKT,EAAG,YAAc,KAAK,IAAIA,EAAG,EAAIS,EAAE,CAAC,GAAKT,EAAG,WAAY,CAChF,MAAMoD,EAAO,KAAK,IAAIpD,EAAG,WAAaS,EAAE,UAAU,EAClD,OAAO2C,GAAQ,GAAOA,GAAQ3C,EAAE,UACpC,CACA,MAAO,EACX,CACA,SAAS4C,GAAarC,EAAGC,EAAG,CACxB,MAAMqC,EAAQtC,EAAE,MAAQC,EAAE,MAC1B,MAAO,CACH,GAAID,EAAE,MAAQA,EAAE,EAAIC,EAAE,MAAQA,EAAE,GAAKqC,EACrC,GAAItC,EAAE,MAAQA,EAAE,EAAIC,EAAE,MAAQA,EAAE,GAAKqC,EACrC,YAAatC,EAAE,MAAQA,EAAE,WAAaC,EAAE,MAAQA,EAAE,YAAcqC,EAChE,MAAAA,CACR,CACA,CACA,MAAMC,GAAqBlD,GAAQA,EAAI,OAAQE,GAAMA,EAAE,OAASb,EAAyB,EAQzF,SAAS8D,GAAQ/C,EAAGgD,EAAM,CACtB,MAAMC,EAAQD,GAAQ3E,EAAQ2B,EAAE,OAAQ,CAAC,EACzC,GAAIA,EAAE,SAAWiD,EAAM,OACnB,MAAM,IAAI,MAAM,iBAAiB,EACrC,GAAI,EAAEjD,EAAE,OAAS,GACb,MAAM,IAAI,MAAM,uCAAuC,EAC3D,MAAMkD,EAAM,CACR,OAAQ,KAAK,KAAKlD,EAAE,OAAS,CAAC,EAAI,EAClC,OAAQA,EAAE,OACV,QAASA,EACT,KAAMiD,EACN,KAAM,IAAM5E,EAAQ2B,EAAE,OAAQ,CAAC,EAC/B,UAAWL,EAAIsD,CAAK,EACpB,MAAQE,GAASA,EAAK,OAAO,CAACtD,EAAKC,IAAMD,EAAMC,CAAC,EAChD,MAAO,CAACqD,EAAM/D,IAAM,CAChB,QAASU,EAAI,EAAGA,EAAIqD,EAAK,OAAS/D,EAAGU,IACjCqD,EAAKrD,CAAC,EAAIqD,EAAKrD,EAAI,CAAC,EACxB,QAASA,EAAIqD,EAAK,OAAS/D,EAAGU,EAAIqD,EAAK,OAAQrD,IAC3CqD,EAAKrD,CAAC,EAAI,CAClB,EACA,UAAUqD,EAAMC,EAAYC,EAAItE,GAAkB,CAC9C,MAAMuE,EAAWF,EAAaC,EAC9B,QAASvD,EAAI,EAAGA,EAAIqD,EAAK,OAAQrD,IAC7B,GAAI,KAAK,IAAImD,EAAMnD,CAAC,EAAIsD,EAAaD,EAAKrD,CAAC,CAAC,GAAKmD,EAAMnD,CAAC,EAAIwD,EACxD,MAAO,GAEf,MAAO,EACX,EACA,IAAIC,EAAK/D,EAAGC,EAAG+D,EAAO,CAClB,MAAMJ,EAAaI,EAAQC,EAAO,UAC5BC,EAAM,CAAE,EAAAlE,EAAG,EAAAC,EAAG,WAAA2D,EAAY,MAAO,CAAC,EACxC,QAASjB,EAAM,EAAGA,EAAMoB,EAAI,OAAQpB,IAAO,CACvC,MAAMwB,EAAIJ,EAAIpB,CAAG,EACjB,GAAKO,GAAciB,EAAGD,CAAG,EAEzB,OAAQH,EAAIpB,CAAG,EAAIS,GAAae,EAAGD,CAAG,CAC1C,CACAH,EAAI,KAAKG,CAAG,CAEhB,EACA,SAASP,EAAMS,EAAK,CAChB,QAAS9D,EAAIE,EAAE,OAAS,EAAGF,EAAIoD,EAAI,OAAQpD,IACvC8D,GAAOT,EAAKrD,CAAC,EACjB,OAAA8D,GAAOT,EAAKD,EAAI,MAAM,EAAI,EACnBU,CACX,EACA,MAAMpD,EAAG2C,EAAMU,EAAQ5D,EAAM6D,EAAU,CACnC,IAAI3C,EAAI,EACJrB,EAAIM,EAAWyD,CAAM,EACzB,MAAME,EAAM7D,GAASD,CAAI,EACnB+D,EAAQ,CAAChE,EAAGiE,IAAS,CACvB,KAAOzD,EAAE,SAASV,CAAC,GAAK,CAAC,CAACU,EAAE,MAAMV,CAAC,IAAMoD,EAAI,QAAQlD,CAAC,EAAGD,EAAUD,EAAGmE,CAAI,EACtEd,EAAKnD,CAAC,IACNmB,IAEJ,GAAIgC,EAAKnD,CAAC,IAAM,EACZ,MAAO,GACX,MAAM6D,EAAS7D,IAAMkD,EAAI,OACzB,MAAI,GAAAY,GAAY,CAACD,GAAUV,EAAKnD,CAAC,EAAIkD,EAAI,KAAKlD,CAAC,EAAI8D,EAGvD,EACA,QAAS9D,EAAIkD,EAAI,OAAQlD,GAAK,EAAGA,IAC7B,GAAIgE,EAAMhE,EAAG+D,CAAG,EACZ,MAAO,GACfjE,EAAIM,EAAWyD,CAAM,EACrB9D,EAAUD,EAAGG,CAAI,EACjBkB,EAAI,EACJ,QAASnB,EAAIkD,EAAI,OAAQlD,EAAIkD,EAAI,OAAQlD,IACrC,GAAIgE,EAAMhE,EAAGC,CAAI,EACb,MAAO,GACf,OAAOkB,CACX,EACA,SAASX,EAAGf,EAAGyE,EAAQC,EAAMC,EAAI,CAC7B,MAAMjB,EAAOD,EAAI,KAAI,EACrB,IAAInB,EAAM,EACNvC,EAAI0E,EAGR,GAAIA,EACA,KAAO1E,EAAI2E,GAAQ,CAAC,CAAC3D,EAAE,IAAIhB,EAAGC,CAAC,IAAMyD,EAAI,QAAQ,CAAC,GAC9C1D,IACR,KAAOA,EAAI2E,EAAM3E,IAAK,CAElB,GAAI,CAAC,CAACgB,EAAE,IAAIhB,EAAGC,CAAC,IAAMyD,EAAI,QAAQnB,CAAG,EAAG,CAGpC,GAFAoB,EAAKpB,CAAG,IAEJvC,IAAMgB,EAAE,MAAQ,EAChB,SAEJhB,GACJ,CAEA,GAAIuC,IAAQmB,EAAI,OAAS,EAAG,CACxBC,EAAK,EAAEpB,CAAG,IACV,QACJ,CACA,MAAMsC,EAAQD,EAAGjB,EAAM3D,CAAC,EACxB,GAAI6E,EAEAtC,EAAM,EACNoB,EAAK,KAAK,CAAC,MAEV,IAAIkB,IAAU,GAEf,MAIAnB,EAAI,MAAMC,EAAM,CAAC,EACjBpB,EAAMmB,EAAI,OAAS,EACnBC,EAAKpB,CAAG,IAEhB,CACJ,CACR,EACI,OAAOmB,CACX,CAEA,MAAMO,EAASV,GAAQ,CAAC,GAAM,GAAO,GAAM,GAAO,EAAI,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EAElEuB,EAAYvB,GAAQ,CAAC,GAAO,GAAM,EAAK,CAAC,EAC9C,SAASwB,EAAW/D,EAAG,CACnB,IAAI6D,EAAQ,CAAA,EACZ,SAASG,EAAUrB,EAAME,EAAI,EAAG,CAC5B,MAAMG,EAAQ7D,EAAIwD,CAAI,EACtB,GAAIK,EAAQC,EAAO,UACf,MAAO,GACX,MAAML,EAAaI,EAAQC,EAAO,UAClC,OAAOA,EAAO,UAAUN,EAAMC,EAAYC,CAAC,CAC/C,CAEA,SAASoB,EAAUZ,EAAQC,EAAUN,EAAOvD,EAAM,CAC9C,MAAMkD,EAAOM,EAAO,KAAI,EACxB,IAAI3D,EAAI2D,EAAO,MAAMjD,EAAG2C,EAAMU,EAAQ5D,EAAM6D,CAAQ,EACpD,GAAIhE,IAAM,GACN,MAAO,GACX,MAAM4E,EAAY/E,EAAIwD,CAAI,EAC1B,MAAI,GAAI,KAAK,IAAIuB,EAAYlB,CAAK,GAAK,EAAIA,EAChC,GACPgB,EAAUrB,CAAI,EACPM,EAAO,SAASN,EAAMrD,CAAC,EAC3B,EACX,CACA,SAASkE,EAAMb,EAAMrD,EAAGqB,EAAG,CACvB,GAAI,CAACqD,EAAUrB,CAAI,EACf,MAAO,GACX,MAAMK,EAAQ7D,EAAIwD,CAAI,EACtB,IAAI3D,EAAIiE,EAAO,SAASN,EAAMhC,CAAC,EAE3B1B,EAAIgF,EAAU,CAAE,EAAGtF,EAAIK,CAAC,EAAG,EAAGM,CAAC,EAAIqD,EAAK,CAAC,EAAGK,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EACrE,GAAI/D,IAAM,GACN,MAAO,GACXA,GAAKK,EAEL,IAAIkC,EAAKyC,EAAU,CAAE,EAAGtF,EAAIK,CAAC,EAAG,EAAGL,EAAIM,CAAC,CAAC,EAAI0D,EAAK,CAAC,EAAGK,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAC3E,GAAIxB,IAAO,GACP,MAAO,GACXxC,EAAIwC,EAAK7C,EAAIK,CAAC,EAEd,MAAMmF,EAAQlB,EAAO,KAAI,EAGzB,MAFI,CAACA,EAAO,MAAMjD,EAAGmE,EAAO,CAAE,EAAGxF,EAAIK,CAAC,EAAG,EAAGL,EAAIM,CAAC,GAAK,CAAE,EAAG,EAAG,EAAG,EAAG,GAEhE,CAAC+E,EAAUG,EAAO3F,EAAyB,EACpC,IACXyE,EAAO,IAAIY,EAAO7E,EAAGC,EAAG+D,CAAK,EACtB,GACX,CACA,IAAIoB,EAAU,GAEVC,EAAQpE,EAAItB,EAAK,EAAIqB,EAAE,OAAW,GAAO,EAAGtB,EAAmB,EAC/D4F,EAAO,GACX,QAAS,EAAID,EAAQ,EAAG,EAAIrE,EAAE,QAAU,CAACsE,EAAM,GAAKD,EAChDpB,EAAO,SAASjD,EAAG,EAAG,EAAGA,EAAE,MAAO,CAAC2C,EAAM3D,IAAM,CAC3C,GAAKwE,EAAMb,EAAM,EAAG3D,CAAC,GAKrB,GADAqF,EAAQ,EACJD,EAAS,CAET,IAAI/B,EAAQ,EACRW,EAAQ,EACZ,UAAWxD,KAAKqE,EACRrE,EAAE,MAAQf,KAEd4D,IACAW,GAASxD,EAAE,YAEf,GAAI6C,EAAQ,EACR,OACJ,MAAMX,EAAUsB,EAAQa,EAAM,OAC9B,IAAIU,EAAY,EAChB,UAAW/E,KAAKqE,EACZU,GAAa,KAAK,IAAI/E,EAAE,WAAakC,CAAO,EAChD,GAAI6C,GAAa,IAAOvB,EACpB,OAAAsB,EAAO,GACA,EAEf,SACST,EAAM,OAAS,EAAG,CAEvB,MAAMW,EAAIlC,GAAkBuB,CAAK,EACjC,GAAIW,EAAE,OAAS,EACX,MAAO,GACXJ,EAAU,GACV,MAAMxD,EAAIjC,GAAK,KAAK,IAAI6F,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAI,KAAK,IAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,CAAC,GAAK,CAAC,EACzE,OAAI5D,GAAK+B,EAAK,CAAC,EAAI0B,EACR,IACX,GAAKzD,EAAI+B,EAAK,CAAC,EAAI0B,EACZ,GACX,EAEJ,CAAC,EAEL,MAAMI,EAAOZ,EAAM,OACnB,GAAIY,EAAO,EACP,MAAM,IAAI,MAAM,wBAAwBA,CAAI,EAAE,EAClDZ,EAAM,KAAK,CAACvE,EAAGqB,IAAMrB,EAAE,WAAaqB,EAAE,UAAU,EAChD,MAAM+D,EAAQhH,EAAI,EAElB,QAAS4B,EAAI,EAAGA,EAAImF,EAAO,EAAGnF,IAAK,CAC/B,MAAMqF,EAAKd,EAAMvE,CAAC,EAClB,QAASqB,EAAIrB,EAAI,EAAGqB,EAAI8D,EAAO,EAAG9D,IAAK,CACnC,MAAMiE,EAAKf,EAAMlD,CAAC,EACZkE,EAAUhG,EAAU8F,EAAIC,CAAE,EAChC,QAASE,EAAInE,EAAI,EAAGmE,EAAIL,EAAMK,IAAK,CAC/B,MAAMC,EAAKlB,EAAMiB,CAAC,EAClB,GAAIC,EAAG,WAAaJ,EAAG,WAAa,IAChC,SACJ,MAAMK,EAAM,CAACH,EAAShG,EAAU+F,EAAIG,CAAE,EAAGlG,EAAU8F,EAAII,CAAE,CAAC,EAAE,KAAK,CAAChF,GAAGC,KAAMD,GAAIC,EAAC,EAC1ED,EAAIiF,EAAI,CAAC,EACThF,EAAIgF,EAAI,CAAC,EACTC,EAAID,EAAI,CAAC,EACfN,EAAM,IAAI,KAAK,IAAIO,EAAI,EAAIjF,CAAC,EAAI,KAAK,IAAIiF,EAAI,EAAIlF,CAAC,EAAG,CAAC4E,EAAIC,EAAIG,CAAE,CAAC,CACrE,CACJ,CACJ,CACA,MAAMvF,EAAIkF,EAAM,IAAG,EACnB,GAAI,CAAClF,EACD,MAAM,IAAI,MAAM,oBAAoB,EACxC,MAAM0F,EAAK1F,EAAE,CAAC,EACRV,EAAKU,EAAE,CAAC,EACRT,EAAKS,EAAE,CAAC,EACR2F,EAAMjG,EAASgG,EAAIpG,CAAE,EACrBsG,EAAMlG,EAASJ,EAAIC,CAAE,EACrBsG,EAAMnG,EAASgG,EAAInG,CAAE,EAC3B,IAAIuG,EAAKvG,EACLwG,EAAKL,EACLM,EAAK1G,EAYT,GAXIsG,GAAOD,GAAOC,GAAOC,GACrBC,EAAKJ,EACLK,EAAKzG,EACL0G,EAAKzG,GAEAsG,GAAOD,GAAOC,GAAOF,IAC1BG,EAAKxG,EACLyG,EAAKL,EACLM,EAAKzG,IAGJyG,EAAG,EAAIF,EAAG,IAAMC,EAAG,EAAID,EAAG,IAAME,EAAG,EAAIF,EAAG,IAAMC,EAAG,EAAID,EAAG,GAAK,EAAK,CACrE,IAAIG,EAAMF,EACVA,EAAKC,EACLA,EAAKC,CACT,CACA,MAAO,CAAE,GAAAF,EAAI,GAAAD,EAAI,GAAAE,CAAE,CACvB,CACA,SAASE,GAAc1F,EAAG2F,EAAKC,EAAiB,CAC5C,KAAM,CAAE,WAAAhD,CAAU,EAAK+C,EACjBE,EAAYlH,EAAIiH,EAAkBhD,CAAU,EAC5CkD,EAAQ7F,EAAI0F,EAAI,EAAIE,EAAW,CAAC,EAChCE,EAAS9F,EAAI0F,EAAI,EAAIE,EAAW,OAAW7F,EAAE,MAAQ,CAAC,EACtDhB,EAAI+G,EAASD,EACbE,EAAO/F,EAAI0F,EAAI,EAAIE,EAAW,CAAC,EAC/BI,EAAUhG,EAAI0F,EAAI,EAAIE,EAAW,OAAW7F,EAAE,OAAS,CAAC,EACxDf,EAAIgH,EAAUD,EACpB,GAAIhH,EAAI4D,EAAa,GAAK3D,EAAI2D,EAAa,EACvC,MAAM,IAAI,MAAM,OAAO5D,CAAC,OAAOC,CAAC,iBAAiB2D,CAAU,EAAE,EACjE,MAAMc,EAASoC,EACTI,EAASF,EACTG,EAAQJ,EAASD,EACjBM,EAASH,EAAUD,EACnBnC,EAAQ,CAAA,EACRF,EAAOD,EAASyC,EAChBE,EAAU1H,EAAIuH,EAASE,EAAS,CAAC,EACvC,QAASE,EAAO,EAAGA,EAAOF,EAAQE,IAAQ,CACtC,MAAMnE,EAAOxD,GAAK2H,EAAO,GAAK,CAAC,EACzB,EAAID,GAAWC,EAAO,EAAI,CAACnE,EAAOA,GACxC,IAAIO,EAuBJ,GAtBAoB,EAAU,SAAS9D,EAAG,EAAG0D,EAAQC,EAAM,CAAChB,EAAM3D,IAAM,CAChD,GAAI,CAAC8E,EAAU,UAAUnB,EAAMC,CAAU,EACrC,OACJ,MAAMI,EAAQ7D,EAAIwD,CAAI,EAChBnB,EAAKsC,EAAU,SAASnB,EAAM3D,CAAC,EAE/BuH,EAAQzC,EAAU,KAAI,EAC5B,IAAIjB,EAAIiB,EAAU,MAAM9D,EAAGuG,EAAO,CAAE,EAAG5H,EAAI6C,CAAE,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,EAAImB,EAAK,CAAC,CAAC,EAChF,GAAIE,IAAM,GACN,OACJA,GAAK,EACL,MAAM2D,EAASrH,EAAIoH,CAAK,EAGxB,GAFI,EAAI,KAAK,IAAIC,EAASxD,CAAK,GAAK,EAAIA,GAEpC,CAACc,EAAU,UAAUyC,EAAO3D,CAAU,EACtC,OACJ,MAAMtB,EAAKwC,EAAU,SAASyC,EAAO1D,CAAC,EAEtC,GADAH,EAAMoB,EAAU,IAAID,EAAOrC,EAAIF,EAAI0B,CAAK,EACpCN,EACA,MAAO,EAEf,CAAC,EACGA,EACA,OAAOA,CACf,CACA,GAAImB,EAAM,OAAS,EACf,OAAOA,EAAM,CAAC,EAClB,MAAM,IAAI,MAAM,6BAA6B,CACjD,CACA,SAAS4C,EAAQzG,EAAG0G,EAAMC,EAAI,CAE1B,IAAIC,EAAQ,GACRhG,EAAI,CAAE,EAAG,KAAK,IAAI+F,EAAG,EAAID,EAAK,CAAC,EAAG,EAAG,KAAK,IAAIC,EAAG,EAAID,EAAK,CAAC,CAAC,EAC5D9F,EAAE,EAAIA,EAAE,IACRgG,EAAQ,GACRF,EAAO/G,EAAY+G,CAAI,EACvBC,EAAKhH,EAAYgH,CAAE,EACnB/F,EAAIjB,EAAYiB,CAAC,GAErB,IAAIiG,EAAQ,CAACjG,EAAE,EAAI,EACf6C,EAAO,CAAE,EAAGiD,EAAK,GAAKC,EAAG,EAAI,GAAK,EAAG,EAAGD,EAAK,GAAKC,EAAG,EAAI,GAAK,CAAC,EAC/DG,EAAS,EACTC,EAASJ,EAAG,EAAIlD,EAAK,EAEzB,QAASzE,EAAI0H,EAAK,EAAGzH,EAAIyH,EAAK,EAAG1H,IAAM+H,EAAQ/H,GAAKyE,EAAK,EAAG,CACxD,IAAIuD,EAAO,CAAE,EAAAhI,EAAG,EAAAC,CAAC,EAIjB,GAHI2H,IACAI,EAAOrH,EAAYqH,CAAI,GAEtBF,IAAW,GAAO,CAAC,CAAC9G,EAAE,MAAMgH,CAAI,EAAG,CACpC,GAAIF,IAAW,EACX,OAAO5H,EAAS,CAAE,EAAAF,EAAG,EAAAC,CAAC,EAAIyH,CAAI,EAClCI,GACJ,CAEA,GADAD,GAASjG,EAAE,EACP,EAAAiG,GAAS,GAEb,IAAI5H,IAAM0H,EAAG,EACT,MACJ1H,GAAKwE,EAAK,EACVoD,GAASjG,EAAE,EACf,CACA,OAAIkG,IAAW,EACJ5H,EAAS,CAAE,EAAGyH,EAAG,EAAIlD,EAAK,EAAG,EAAGkD,EAAG,CAAC,EAAID,CAAI,EAChD,GACX,CACA,SAASO,EAAajH,EAAG0G,EAAMC,EAAI,CAC/B,IAAIO,EAAST,EAAQzG,EAAG0G,EAAMC,CAAE,EAC5BQ,EAAS,EACb,KAAM,CAAE,EAAGC,EAAI,EAAGC,CAAE,EAAKX,EACzB,IAAIY,EAAWF,GAAMT,EAAG,EAAIS,GAC5B,MAAMG,EAAKvH,EAAE,MACTsH,EAAW,GACXH,EAASC,GAAMA,EAAKE,GACpBA,EAAW,GAENA,GAAYC,IACjBJ,GAAUI,EAAK,EAAIH,IAAOE,EAAWF,GACrCE,EAAWC,EAAK,GAEpB,IAAIC,EAAW7I,EAAI0I,GAAMV,EAAG,EAAIU,GAAMF,CAAM,EACxCM,EAAS,EACb,MAAMC,EAAK1H,EAAE,OACb,OAAIwH,EAAW,GACXC,EAASJ,GAAMA,EAAKG,GACpBA,EAAW,GAENA,GAAYE,IACjBD,GAAUC,EAAK,EAAIL,IAAOG,EAAWH,GACrCG,EAAWE,EAAK,GAEpBJ,EAAW3I,EAAIyI,GAAME,EAAWF,GAAMK,CAAM,EAC5CP,GAAUT,EAAQzG,EAAG0G,EAAM,CAAE,EAAGY,EAAU,EAAGE,EAAU,EAChDN,EAAS,CACpB,CACA,SAASS,EAAc3H,EAAGlB,EAAIC,EAAI,CAC9B,MAAM6I,EAAOX,EAAajH,EAAGH,EAASf,CAAE,EAAGe,EAASd,CAAE,CAAC,EACjD8I,EAAOZ,EAAajH,EAAGH,EAASd,CAAE,EAAGc,EAASf,CAAE,CAAC,EACvD,OAAI,OAAO,MAAM8I,CAAI,EACVC,EAAO5E,EAAO,UACrB,OAAO,MAAM4E,CAAI,EACVD,EAAO3E,EAAO,WACjB2E,EAAOC,IAAS,EAAI5E,EAAO,UACvC,CACA,SAAS6E,GAAO9H,EAAG,CACf,IAAIuF,EAAID,EAAIE,EACZ,GAAI,EACC,CAAE,GAAAD,EAAI,GAAAD,EAAI,GAAAE,CAAE,EAAKzB,EAAW/D,CAAC,EAClC,MACU,CACN,GAAI,CACAA,EAAE,OAAM,EACP,CAAE,GAAAuF,EAAI,GAAAD,EAAI,GAAAE,CAAE,EAAKzB,EAAW/D,CAAC,CAClC,OACO+H,EAAG,CACN,MAAA/H,EAAE,OAAM,EACF+H,CACV,CACJ,CACA,MAAMnF,GAAc+E,EAAc3H,EAAGsF,EAAIE,CAAE,EAAImC,EAAc3H,EAAGsF,EAAIC,CAAE,GAAK,EAC3E,GAAI3C,EAAa,EACb,MAAM,IAAI,MAAM,wBAAwBA,CAAU,EAAE,EAExD,MAAMoF,EAAOrJ,EAAIO,EAASoG,EAAIE,CAAE,EAAI5C,EAAa,EAAG,EAC9CqF,EAAOtJ,EAAIO,EAASoG,EAAIC,CAAE,EAAI3C,EAAa,EAAG,EACpD,IAAIJ,EAAO7D,GAAKqJ,EAAOC,GAAQ,EAAI,CAAC,EACpC,MAAMC,EAAM1F,EAAO,EACf0F,IAAQ,EACR1F,IACK0F,IAAQ,EACb1F,IACK0F,IAAQ,IACb1F,GAAQ,GACZ,MAAM2F,EAAUrK,EAAK,KAAK,OAAO0E,CAAI,EACrCxE,GAAgBmK,CAAO,EACvB,IAAIC,EACJ,GAAItK,EAAK,kBAAkBqK,CAAO,EAAE,OAAS,EAAG,CAE5C,MAAME,EAAK,CAAE,EAAG7C,EAAG,EAAIF,EAAG,EAAIC,EAAG,EAAG,EAAGC,EAAG,EAAIF,EAAG,EAAIC,EAAG,CAAC,EACnDN,EAAI,EAAM,GAAOnH,EAAK,KAAK,OAAOqK,CAAO,EAAI,GAE7CxC,EAAM,CACR,EAAGhH,EAAI2G,EAAG,EAAIL,GAAKoD,EAAG,EAAI/C,EAAG,EAAE,EAC/B,EAAG3G,EAAI2G,EAAG,EAAIL,GAAKoD,EAAG,EAAI/C,EAAG,EAAE,EAC/B,WAAA1C,EACA,MAAO,CACnB,EACQ,QAAStD,EAAI,EAAGA,GAAK,GAAIA,IAAM,EAC3B,GAAI,CACA8I,EAAmB1C,GAAc1F,EAAG2F,EAAKrG,CAAC,EAC1C,KACJ,MACU,CAAE,CAEpB,CACA,MAAMgJ,EAAO,CAAE,EAAG,IAAK,EAAG,GAAG,EACvBC,EAAO,CAAE,EAAG/F,EAAO,IAAK,EAAG,GAAG,EAC9BgG,EAAO,CAAE,EAAG,IAAK,EAAGhG,EAAO,GAAG,EACpC,IAAI6F,EACAI,EACAL,GACAC,EAAKD,EACLK,EAAO,CAAE,EAAGjG,EAAO,IAAK,EAAGA,EAAO,GAAG,IAGrC6F,EAAK,CAAE,EAAG7C,EAAG,EAAIF,EAAG,EAAIC,EAAG,EAAG,EAAGC,EAAG,EAAIF,EAAG,EAAIC,EAAG,CAAC,EACnDkD,EAAO,CAAE,EAAGjG,EAAO,IAAK,EAAGA,EAAO,GAAG,GAEzC,MAAMkE,EAAO,CAACpB,EAAIE,EAAI6C,EAAI9C,CAAE,EAE5B,MAAO,CAAE,KADImD,GAAU1I,EAAGwC,EAAMkE,EAAM,CAAC4B,EAAMC,EAAME,EAAMD,CAAI,CAAC,EACzC,OAAQ9B,CAAI,CACrC,CAEA,SAASiC,GAAsBnJ,EAAG,CAC9B,MAAMoJ,EAAK,CAAE,EAAGpJ,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAG,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,CAAC,EACvF,GAAIoJ,EAAG,IAAM,GAAOA,EAAG,IAAM,EACzB,MAAO,CACH,CAACpJ,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,CAAC,EACzC,CAACA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,CAAC,EACzC,CAAC,EAAK,EAAK,CAAG,CAC1B,EAES,CACD,MAAMqJ,EAAK,CAAE,EAAGrJ,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAG,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,CAAC,EAC7CsJ,EAAK,CAAE,EAAGtJ,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAG,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,CAAC,EAC7CuJ,EAAMF,EAAG,EAAIC,EAAG,EAAIA,EAAG,EAAID,EAAG,EAC9BG,GAAOJ,EAAG,EAAIE,EAAG,EAAIA,EAAG,EAAIF,EAAG,GAAKG,EACpCE,GAAOJ,EAAG,EAAID,EAAG,EAAIA,EAAG,EAAIC,EAAG,GAAKE,EAC1C,MAAO,CACH,CAACvJ,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIwJ,EAAMxJ,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIyJ,EAAMzJ,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,CAAC,EACvE,CAACA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIwJ,EAAMxJ,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,EAAIyJ,EAAMzJ,EAAE,CAAC,EAAE,EAAGA,EAAE,CAAC,EAAE,CAAC,EACvE,CAACwJ,EAAKC,EAAK,CAAG,CAC1B,CACI,CACJ,CAEA,SAASP,GAAU1I,EAAGwC,EAAMkE,EAAMC,EAAI,CAGlC,MAAMnH,EAAImJ,GAAsBhC,CAAE,EAC5BuC,EAAO,CACT,CACI1J,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,CAChD,EACQ,CACIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,CAChD,EACQ,CACIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EACpCA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,CAChD,CACA,EAEUkJ,EADOC,GAAsBjC,CAAI,EAChB,IAAKpH,GAAMA,EAAE,IAAI,CAAC6J,EAAGC,IAAO9J,EAAE,OAAO,CAACD,EAAKwD,EAAGlC,IAAMtB,EAAMwD,EAAIqG,EAAKvI,CAAC,EAAEyI,CAAE,EAAG,CAAC,CAAC,CAAC,EAC/F1G,EAAM,IAAIZ,GAAOU,CAAI,EACrB6G,EAASxL,EAAQ,EAAI2E,EAAM,CAAC,EAC5B8G,EAAeD,EAAO,OAC5B,QAASpK,EAAI,EAAGA,EAAIuD,EAAMvD,IAAK,CAC3B,MAAMO,EAAIkJ,EACV,QAASpJ,EAAI,EAAGA,EAAIgK,EAAe,EAAGhK,GAAK,EAAG,CAC1C,MAAMN,EAAIM,EAAI,EAAI,GACZ2C,EAAKhD,EAAI,GACT8J,EAAMvJ,EAAE,CAAC,EAAE,CAAC,EAAIR,EAAIQ,EAAE,CAAC,EAAE,CAAC,EAAIyC,EAAKzC,EAAE,CAAC,EAAE,CAAC,EAC/C6J,EAAO/J,CAAC,EAAIX,GAAKa,EAAE,CAAC,EAAE,CAAC,EAAIR,EAAIQ,EAAE,CAAC,EAAE,CAAC,EAAIyC,EAAKzC,EAAE,CAAC,EAAE,CAAC,GAAKuJ,CAAG,EAC5DM,EAAO/J,EAAI,CAAC,EAAIX,GAAKa,EAAE,CAAC,EAAE,CAAC,EAAIR,EAAIQ,EAAE,CAAC,EAAE,CAAC,EAAIyC,EAAKzC,EAAE,CAAC,EAAE,CAAC,GAAKuJ,CAAG,CACpE,CACA,QAASzJ,EAAI,EAAGA,EAAIgK,EAAchK,GAAK,EAAG,CACtC,MAAMiK,EAAKtJ,EAAIoJ,EAAO/J,CAAC,EAAG,EAAGU,EAAE,MAAQ,CAAC,EAClCwJ,EAAKvJ,EAAIoJ,EAAO/J,EAAI,CAAC,EAAG,EAAGU,EAAE,OAAS,CAAC,EACzCA,EAAE,IAAIuJ,EAAIC,CAAE,GACZ9G,EAAI,IAAKpD,EAAI,EAAK,EAAGL,EAAG,EAAI,CACpC,CACJ,CACA,OAAOyD,CACX,CAGA,SAAS+G,GAAazJ,EAAG,CACrB,MAAM0J,EAAU,CAAC1K,EAAGC,EAAG8D,IAASA,GAAO,GAAM/C,EAAE,IAAIhB,EAAGC,CAAC,EAAI,EAAI,GACzDuD,EAAOxC,EAAE,OAEf,IAAI2J,EAAW,EACf,QAAS1K,EAAI,EAAGA,GAAK,EAAGA,IACpB,QAASD,EAAIwD,EAAO,EAAGxD,GAAKwD,EAAO,GAAIxD,IACnC2K,EAAWD,EAAQ1K,EAAGC,EAAG0K,CAAQ,EACzC,IAAIC,EAAW,EACf,QAAS5K,EAAI,EAAGA,GAAK,EAAGA,IACpB,QAASC,EAAIuD,EAAO,EAAGvD,GAAKuD,EAAO,GAAIvD,IACnC2K,EAAWF,EAAQ1K,EAAGC,EAAG2K,CAAQ,EAEzC,IAAIC,EAAU,EACd,QAAS7K,EAAI,EAAGA,EAAI,EAAGA,IACnB6K,EAAUH,EAAQ1K,EAAG,EAAG6K,CAAO,EACnCA,EAAUH,EAAQ,EAAG,EAAGG,CAAO,EAC/BA,EAAUH,EAAQ,EAAG,EAAGG,CAAO,EAC/BA,EAAUH,EAAQ,EAAG,EAAGG,CAAO,EAC/B,QAAS5K,EAAI,EAAGA,GAAK,EAAGA,IACpB4K,EAAUH,EAAQ,EAAGzK,EAAG4K,CAAO,EACnC,IAAIC,EAAU,EACd,QAAS7K,EAAIuD,EAAO,EAAGvD,GAAKuD,EAAO,EAAGvD,IAClC6K,EAAUJ,EAAQ,EAAGzK,EAAG6K,CAAO,EACnC,QAAS9K,EAAIwD,EAAO,EAAGxD,EAAIwD,EAAMxD,IAC7B8K,EAAUJ,EAAQ1K,EAAG,EAAG8K,CAAO,EACnC,MAAO,CAAE,SAAAH,EAAU,SAAAC,EAAU,QAAAC,EAAS,QAAAC,CAAO,CACjD,CACA,SAASC,GAAU/J,EAAG,CAElB,MAAMwC,EAAOxC,EAAE,OACT,CAAE,SAAA2J,EAAU,SAAAC,EAAU,QAAAC,EAAS,QAAAC,CAAO,EAAKL,GAAazJ,CAAC,EAE/D,IAAIgK,EACJ,MAAMC,EAAavM,EAAI,EACvB,UAAWwM,IAAO,CAAC,SAAU,MAAO,OAAQ,UAAU,EAClD,QAASC,EAAO,EAAGA,EAAO,EAAGA,IAAQ,CACjC,MAAMC,EAAOtM,EAAK,WAAWoM,EAAKC,CAAI,EAChCjH,EAAM,CAAE,IAAAgH,EAAK,KAAMC,CAAI,EAC7B,GAAIC,IAASP,GAAWO,IAASN,EAAS,CACtCE,EAAS9G,EACT,KACJ,CACA+G,EAAW,IAAI/L,EAAO2L,EAAUO,CAAI,EAAGlH,CAAG,EACtC2G,IAAYC,GACZG,EAAW,IAAI/L,EAAO4L,EAAUM,CAAI,EAAGlH,CAAG,CAClD,CAIJ,GAFI8G,IAAW,QAAaC,EAAW,MAAK,GAAM7L,IAC9C4L,EAASC,EAAW,IAAG,GACvBD,IAAW,OACX,MAAM,IAAI,MAAM,wBAAwB,EAC5C,IAAI7B,EAAUrK,EAAK,KAAK,OAAO0E,CAAI,EACnC,GAAI2F,EAAU,EACVnK,GAAgBmK,CAAO,MACtB,CACDA,EAAU,OAEV,MAAMkC,EAAU3M,EAAI,EACpB,QAAS4M,EAAM,EAAGA,GAAO,GAAIA,IAAO,CAChC,MAAMF,EAAOtM,EAAK,YAAYwM,CAAG,EACjC,GAAIF,IAAST,GAAYS,IAASR,EAAU,CACxCzB,EAAUmC,EACV,KACJ,CACAD,EAAQ,IAAInM,EAAOyL,EAAWS,CAAI,EAAGE,CAAG,EACpCX,IAAaC,GACbS,EAAQ,IAAInM,EAAO0L,EAAWQ,CAAI,EAAGE,CAAG,CAChD,CAGA,GAFInC,IAAY,QAAakC,EAAQ,MAAK,GAAMjM,IAC5C+J,EAAUkC,EAAQ,IAAG,GACrBlC,IAAY,OACZ,MAAM,IAAI,MAAM,yBAAyB,EAC7C,GAAIrK,EAAK,KAAK,OAAOqK,CAAO,IAAM3F,EAC9B,MAAM,IAAI,MAAM,sBAAsB,CAC9C,CACA,MAAO,CAAE,QAAA2F,EAAS,GAAG6B,CAAM,CAC/B,CAEA,MAAMO,GAAgB,CAClB,EAAG,aACH,EAAG,SACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,GAAI,aACJ,GAAI,aACJ,GAAI,cACJ,GAAI,cACJ,GAAI,cACJ,GAAI,cACJ,GAAI,cACJ,GAAI,YACJ,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,WACJ,GAAI,QACJ,GAAI,OACJ,GAAI,MACJ,GAAI,QACR,EACA,SAASC,GAAcC,EAAOC,EAAM,GAAI,CACpC,MAAMC,EAAWJ,GAAcG,CAAG,EAClC,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,oBAAoBD,CAAG,EAAE,EAC7C,OAAO,IAAI,YAAYC,CAAQ,EAAE,OAAOF,CAAK,CACjD,CACA,SAASG,GAAa5K,EAAG6K,EAAUL,GAAe,CAC9C,MAAMhI,EAAOxC,EAAE,OACf,GAAIwC,EAAO,KAAOA,EAAO,KAAU,GAAKA,IAASxC,EAAE,MAC/C,MAAM,IAAI,MAAM,wBAAwBwC,CAAI,EAAE,EAClD,KAAM,CAAE,QAAA2F,EAAS,KAAAgC,EAAM,IAAAD,CAAG,EAAKH,GAAU/J,CAAC,EACpC8K,EAAMlN,GAAauK,EAAS+B,EAAKC,CAAI,EACrC,CAAE,MAAAnH,CAAK,EAAKlF,EAAK,SAASqK,EAAS+B,CAAG,EACtCO,EAAQ,IAAI,WAAWzH,CAAK,EAClC,IAAIzB,EAAM,EACNwJ,EAAM,EACNC,EAAS,EAWb,GAVA/M,GAAO6M,EAAKX,EAAM,CAAC,EAAGlL,EAAGgM,IAAM,CAC3BD,IACAD,IAAQ,EACRA,GAAO,EAAE,CAAC,CAAC/K,EAAE,IAAI,EAAGf,CAAC,IAAMgM,GACvBD,IAAW,IAEfP,EAAMlJ,GAAK,EAAIwJ,EACfC,EAAS,EACTD,EAAM,EACV,CAAC,EACGxJ,IAAQyB,EACR,MAAM,IAAI,MAAM,eAAezB,CAAG,WAAWyB,CAAK,EAAE,EACxD,IAAIoH,EAAO,MAAM,KAAKrM,GAAWoK,EAAS+B,CAAG,EAAE,OAAOO,CAAK,CAAC,EACvD,IAAKnL,GAAM3B,GAAI2B,EAAG,CAAC,CAAC,EACpB,KAAK,EAAE,EAEZ,MAAM4L,EAAYtM,GAAM,CACpB,GAAIA,EAAIwL,EAAK,OACT,MAAM,IAAI,MAAM,iBAAiB,EACrC,MAAMe,EAAMf,EAAK,MAAM,EAAGxL,CAAC,EAC3B,OAAAwL,EAAOA,EAAK,MAAMxL,CAAC,EACZuM,CACX,EACMC,EAASxM,GAAM,CAAO,KAAKA,CAAC,GAE5ByM,EAAQ,CACV,OAAQ,aACR,OAAQ,UACR,OAAQ,eACR,OAAQ,OACR,OAAQ,MACR,IAAQ,OAChB,EACI,IAAI3I,EAAM,GACNgI,EAAM,GACV,KACQ,EAAAN,EAAK,OAAS,IADT,CAGT,MAAMkB,EAAWJ,EAAS,CAAC,EACrBK,EAAOF,EAAMC,CAAQ,EAC3B,GAAIC,IAAS,OACT,MAAM,IAAI,MAAM,oBAAoBD,CAAQ,SAAS5I,CAAG,GAAG,EAC/D,GAAI6I,IAAS,aACT,MACJ,MAAMC,EAAY1N,EAAK,WAAWqK,EAASoD,CAAI,EAC/C,IAAIlJ,EAAQ+I,EAAMF,EAASM,CAAS,CAAC,EACrC,GAAID,IAAS,UAAW,CACpB,KAAOlJ,GAAS,GAAG,CACf,MAAMQ,EAAIuI,EAAMF,EAAS,EAAE,CAAC,EAC5B,GAAIrI,GAAK,IACL,MAAM,IAAI,MAAM,iBAAiBA,CAAC,EAAE,EACxCH,GAAOG,EAAE,SAAQ,EAAG,SAAS,EAAG,GAAG,EACnCR,GAAS,CACb,CACA,GAAIA,IAAU,EAAG,CACb,MAAMQ,EAAIuI,EAAMF,EAAS,CAAC,CAAC,EAC3B,GAAIrI,GAAK,IACL,MAAM,IAAI,MAAM,gBAAgBA,CAAC,EAAE,EACvCH,GAAOG,EAAE,SAAQ,EAAG,SAAS,EAAG,GAAG,CACvC,SACSR,IAAU,EAAG,CAClB,MAAMQ,EAAIuI,EAAMF,EAAS,CAAC,CAAC,EAC3B,GAAIrI,GAAK,GACL,MAAM,IAAI,MAAM,gBAAgBA,CAAC,EAAE,EACvCH,GAAOG,EAAE,SAAQ,CACrB,CACJ,SACS0I,IAAS,eAAgB,CAC9B,KAAOlJ,GAAS,GAAG,CACf,MAAMQ,EAAIuI,EAAMF,EAAS,EAAE,CAAC,EAC5BxI,GAAO5E,EAAK,SAAS,YAAY,OAAO,CAAC,KAAK,MAAM+E,EAAI,EAAE,EAAGA,EAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAC7ER,GAAS,CACb,CACIA,IAAU,IACVK,GAAO5E,EAAK,SAAS,YAAY,OAAO,CAACsN,EAAMF,EAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAC7E,SACSK,IAAS,MAAO,CACrB,MAAME,EAAQL,EAAMF,EAAS,CAAC,CAAC,GAC1BO,EAAQ,OAAU,EACnBf,EAAMe,GACAA,EAAQ,OAAU,IACxBf,GAAQe,EAAQ,KAAS,EAAKL,EAAMF,EAAS,CAAC,CAAC,EAE/CR,GAAQe,EAAQ,KAAS,GAAML,EAAMF,EAAS,EAAE,CAAC,EACrD,QACJ,SACSK,IAAS,OAAQ,CACtB,MAAMG,EAAO,IAAI,WAAWrJ,CAAK,EACjC,QAAS/C,EAAI,EAAGA,EAAI+C,EAAO/C,IACvBoM,EAAKpM,CAAC,EAAI8L,EAAMF,EAAS,CAAC,CAAC,EAC/BxI,GAAOmI,EAAQa,EAAMhB,CAAG,CAC5B,KAEI,OAAM,IAAI,MAAM,gBAAgBa,CAAI,EAAE,CAC9C,CACA,OAAO7I,CACX,CAEA,SAASiJ,GAAarL,EAAK,CACvB,MAAMoL,EAAO,MAAM,QAAQpL,EAAI,IAAI,EAAI,IAAI,WAAWA,EAAI,IAAI,EAAIA,EAAI,KAChE,CAAE,OAAA8F,EAAQ,MAAAD,CAAK,EAAK7F,EACpBsL,EAAa,KAAK,IAAIxF,EAAQD,CAAK,EACnC0F,EAAS,CACX,EAAG,KAAK,OAAO1F,EAAQyF,GAAc,CAAC,EACtC,EAAG,KAAK,OAAOxF,EAASwF,GAAc,CAAC,CAC/C,EACUnL,EAAgBJ,GAAiBC,CAAG,EACpCwL,EAAc,IAAI,WAAWF,EAAaA,EAAanL,CAAa,EAC1E,QAASxB,EAAI,EAAGA,EAAI2M,EAAY3M,IAAK,CACjC,MAAM8M,IAAW9M,EAAI4M,EAAO,GAAK1F,EAAQ0F,EAAO,GAAKpL,EAC/CuL,EAAS/M,EAAI2M,EAAanL,EAC1BwL,EAASL,EAAanL,EAC5BqL,EAAY,IAAIJ,EAAK,SAASK,EAAQA,EAASE,CAAM,EAAGD,CAAM,CAClE,CACA,MAAO,CAAE,OAAAH,EAAQ,IAAK,CAAE,OAAQD,EAAY,MAAOA,EAAY,KAAME,EAAa,CACtF,CACO,SAASI,GAAS5L,EAAK6L,EAAO,GAAI,CACrC,UAAWC,IAAS,CAAC,SAAU,OAAO,EAClC,GAAI,CAAC,OAAO,cAAc9L,EAAI8L,CAAK,CAAC,GAAK9L,EAAI8L,CAAK,GAAK,EACnD,MAAM,IAAI,MAAM,eAAeA,CAAK,IAAI9L,EAAI8L,CAAK,CAAC,KAAK,OAAO9L,EAAI8L,CAAK,CAAC,GAAG,EAEnF,GAAI,CAAC,MAAM,QAAQ9L,EAAI,IAAI,GACvB,EAAEA,EAAI,gBAAgB,aACtB,EAAEA,EAAI,gBAAgB,mBACtB,MAAM,IAAI,MAAM,sBAAsBA,EAAI,IAAI,KAAK,OAAOA,EAAI,IAAI,GAAG,EACzE,GAAI6L,EAAK,eAAiB,QAAa,OAAOA,EAAK,cAAiB,UAChE,MAAM,IAAI,MAAM,6BAA6BA,EAAK,YAAY,EAAE,EACpE,UAAWvI,IAAM,CAAC,iBAAkB,gBAAiB,gBAAiB,eAAe,EACjF,GAAIuI,EAAKvI,CAAE,IAAM,QAAa,OAAOuI,EAAKvI,CAAE,GAAM,WAC9C,MAAM,IAAI,MAAM,gBAAgBA,CAAE,IAAIuI,EAAKvI,CAAE,CAAC,KAAK,OAAOuI,EAAKvI,CAAE,CAAC,GAAG,EAE7E,IAAIiI,EAAS,CAAE,EAAG,EAAG,EAAG,CAAC,EACrBM,EAAK,eACJ,CAAE,IAAA7L,EAAK,OAAAuL,GAAWF,GAAarL,CAAG,GACvC,MAAM+L,EAAM7L,GAASF,CAAG,EACpB6L,EAAK,eACLA,EAAK,cAAcE,EAAI,SAAS,EACpC,KAAM,CAAE,KAAAjC,EAAM,OAAAf,GAAWvB,GAAOuE,CAAG,EACnC,GAAIF,EAAK,eAAgB,CACrB,MAAM3M,EAAI6J,EAAO,IAAK/J,IAAO,CAAE,GAAGA,EAAG,GAAGQ,GAASR,EAAGuM,CAAM,CAAC,EAAG,EAC9DM,EAAK,eAAe3M,CAAC,CACzB,CACI2M,EAAK,eACLA,EAAK,cAAc/B,EAAK,SAAS,EACrC,MAAM1H,EAAMkI,GAAaR,EAAM+B,EAAK,WAAW,EAC/C,OAAIA,EAAK,eACLA,EAAK,cAAc/B,EAAK,SAAS,EAC9B1H,CACX,CC76BY,MAAC4J,GAAWC,GAAQ,CAC5B,MAAMC,EAAM,iBAAiBD,CAAG,EAC1BpG,EAAQ,KAAK,MAAM,CAACqG,EAAI,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC,EAC5CpG,EAAS,KAAK,MAAM,CAACoG,EAAI,OAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EACpD,MAAO,CAAE,MAAArG,EAAO,OAAAC,CAAM,CAC1B,EACMqG,EAAgB,CAACC,EAAQtG,EAAQD,IAAU,CAEzCuG,EAAO,SAAWtG,IAClBsG,EAAO,OAAStG,GAChBsG,EAAO,QAAUvG,IACjBuG,EAAO,MAAQvG,EACvB,EACMwG,EAAoBD,GAAW,CACjC,MAAME,EAAUF,EAAO,WAAW,IAAI,EACtC,GAAIE,IAAY,KACZ,MAAM,IAAI,MAAM,2BAA2B,EAC/C,MAAO,CAAE,OAAAF,EAAQ,QAAAE,CAAO,CAC5B,EACMC,EAAc,CAAC,CAAE,OAAAH,EAAQ,QAAAE,KAAc,CACzCA,EAAQ,UAAU,EAAG,EAAGF,EAAO,MAAOA,EAAO,MAAM,CACvD,EAIO,MAAMI,EAAS,CAClB,KACA,WAAa,EACb,KACA,QACA,OACA,SACA,YAAY,CAAE,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,CAAQ,EAAK,CAAA,EAAId,EAAO,GAAI,CACvD,KAAK,KAAO,CACR,gBAAiB,EACjB,iBAAkB,QAClB,mBAAoB,OACpB,iBAAkB,QAClB,eAAgB,IAChB,aAAc,GACd,GAAGA,CACf,EAEQ,KAAK,KAAOQ,EAAiB,SAAS,cAAc,QAAQ,CAAC,EACzDI,IACA,KAAK,QAAUJ,EAAiBI,CAAO,GACvCC,IACA,KAAK,OAASL,EAAiBK,CAAM,GACrCC,IACA,KAAK,SAAWN,EAAiBM,CAAQ,EACzC,KAAK,SAAS,QAAQ,sBAAwB,GAEtD,CACA,QAAQ7G,EAAQD,EAAO,CACnBsG,EAAc,KAAK,KAAK,OAAQrG,EAAQD,CAAK,EACzC,KAAK,SACLsG,EAAc,KAAK,QAAQ,OAAQrG,EAAQD,CAAK,EAChD,KAAK,QACLsG,EAAc,KAAK,OAAO,OAAQrG,EAAQD,CAAK,CACvD,CACA,WAAW,CAAE,KAAAuF,EAAM,OAAAtF,EAAQ,MAAAD,CAAK,EAAI,CAChC,GAAI,CAAC,KAAK,OACN,OACJ,MAAM+G,EAAU,IAAI,UAAU,kBAAkB,KAAKxB,CAAI,EAAGvF,EAAOC,CAAM,EACzE,IAAIyF,EAAS,CAAE,EAAG,EAAG,EAAG,CAAC,EACrB,KAAK,KAAK,eACVA,EAAS,CACL,EAAG,KAAK,MAAM,KAAK,OAAO,OAAO,MAAQ1F,GAAS,CAAC,EACnD,EAAG,KAAK,MAAM,KAAK,OAAO,OAAO,OAASC,GAAU,CAAC,CACrE,GAEQ,KAAK,OAAO,QAAQ,aAAa8G,EAASrB,EAAO,EAAGA,EAAO,CAAC,CAChE,CACA,aAAa,CAAE,KAAAH,EAAM,OAAAtF,EAAQ,MAAAD,CAAK,EAAI,CAClC,GAAI,CAAC,KAAK,SACN,OACJ,MAAMgH,EAAY,KAAK,KAAK,gBAC5BV,EAAc,KAAK,SAAS,OAAQrG,EAAQD,CAAK,EACjD,MAAM+G,EAAU,IAAI,UAAU,kBAAkB,KAAKxB,CAAI,EAAGvF,EAAOC,CAAM,EACzE,KAAK,SAAS,QAAQ,aAAa8G,EAAS,EAAG,CAAC,EAChD,KAAK,SAAS,OAAO,MAAQ,sCAAsCC,EAAYhH,CAAK,eAAegH,EAAY/G,CAAM,IACzH,CACA,YAAYiD,EAAQ,CAChB,GAAI,CAAC,KAAK,QACN,OACJ,MAAM+D,EAAM,KAAK,QAAQ,QACnBhH,EAAS,KAAK,QAAQ,OAAO,OAC7BD,EAAQ,KAAK,QAAQ,OAAO,MAElC,GAAI,KAAK,KAAK,cAAgBC,IAAWD,EAAO,CAC5C,MAAMyF,EAAa,KAAK,IAAIxF,EAAQD,CAAK,EACnC0F,EAAS,CACX,EAAG,KAAK,OAAO1F,EAAQyF,GAAc,CAAC,EACtC,EAAG,KAAK,OAAOxF,EAASwF,GAAc,CAAC,CACvD,EAEYwB,EAAI,UAAUvB,EAAO,EAAGA,EAAO,EAAGD,EAAYA,CAAU,EACxDwB,EAAI,UAAY,KAAK,KAAK,iBACtBjH,EAAQC,GACRgH,EAAI,SAAS,EAAG,EAAGvB,EAAO,EAAGzF,CAAM,EACnCgH,EAAI,SAASjH,EAAQ0F,EAAO,EAAG,EAAGA,EAAO,EAAGzF,CAAM,GAE7CA,EAASD,IACdiH,EAAI,SAAS,EAAG,EAAGjH,EAAO0F,EAAO,CAAC,EAClCuB,EAAI,SAAS,EAAGhH,EAASyF,EAAO,EAAG1F,EAAO0F,EAAO,CAAC,EAE1D,MAEIuB,EAAI,UAAU,EAAG,EAAGjH,EAAOC,CAAM,EAErC,GAAIiD,EAAQ,CACR,KAAM,CAAC/D,EAAIE,EAAI6C,EAAI9C,CAAE,EAAI8D,EAEzB+D,EAAI,UAAY,KAAK,KAAK,iBAC1BA,EAAI,UAAS,EACbA,EAAI,OAAO9H,EAAG,EAAGA,EAAG,CAAC,EACrB8H,EAAI,OAAO5H,EAAG,EAAGA,EAAG,CAAC,EACrB4H,EAAI,OAAO/E,EAAG,EAAGA,EAAG,CAAC,EACrB+E,EAAI,OAAO7H,EAAG,EAAGA,EAAG,CAAC,EACrB6H,EAAI,KAAI,EACRA,EAAI,UAAS,EAEbA,EAAI,UAAY,KAAK,KAAK,mBAC1B,UAAW5N,KAAK6J,EAAQ,CACpB,GAAI,EAAE,eAAgB7J,GAClB,SACJ,MAAMR,EAAIQ,EAAE,EAAI,EAAIA,EAAE,WAChBP,EAAIO,EAAE,EAAI,EAAIA,EAAE,WAChBgD,EAAO,EAAIhD,EAAE,WACnB4N,EAAI,SAASpO,EAAGC,EAAGuD,EAAMA,CAAI,CACjC,CACJ,CACJ,CACA,UAAU6K,EAAOjH,EAAQD,EAAO,CAC5B,KAAK,QAAQC,EAAQD,CAAK,EAC1B,KAAM,CAAE,QAAAyG,GAAY,KAAK,KACzBA,EAAQ,UAAUS,EAAO,EAAG,EAAGlH,EAAOC,CAAM,EAC5C,MAAMsF,EAAOkB,EAAQ,aAAa,EAAG,EAAGzG,EAAOC,CAAM,EAC/CkH,EAAU,CACZ,aAAc,KAAK,KAAK,aACxB,YAAa,KAAK,KAAK,WACnC,EACY,KAAK,SACLA,EAAQ,cAAiBhN,GAAQ,KAAK,WAAWA,CAAG,GACpD,KAAK,UACLgN,EAAQ,eAAkBjE,GAAW,KAAK,YAAYA,CAAM,GAC5D,KAAK,WACLiE,EAAQ,cAAiBhN,GAAQ,KAAK,aAAaA,CAAG,GAC1D,GAAI,CACA,MAAMoC,EAAMwJ,GAASR,EAAM4B,CAAO,EAClC,YAAK,WAAa,KAAK,IAAG,EACnB5K,CACX,MACU,CACF,KAAK,SAAW,KAAK,IAAG,EAAK,KAAK,WAAa,KAAK,KAAK,gBACzD,KAAK,YAAW,CACxB,CAEJ,CACA,OAAQ,CACJmK,EAAY,KAAK,IAAI,EACjB,KAAK,SACLA,EAAY,KAAK,OAAO,EACxB,KAAK,QACLA,EAAY,KAAK,MAAM,EACvB,KAAK,UACLA,EAAY,KAAK,QAAQ,CACjC,CACJ,CACA,MAAMU,EAAS,CACX,OACA,OACA,YAAYC,EAAQC,EAAQ,CACxB,KAAK,OAASD,EACd,KAAK,OAASC,EACd,KAAK,UAAUD,CAAM,CACzB,CACA,UAAUA,EAAQ,CACd,KAAK,OAASA,EACd,KAAM,CAAE,OAAAC,CAAM,EAAK,KACnBA,EAAO,aAAa,WAAY,EAAE,EAClCA,EAAO,aAAa,QAAS,EAAE,EAC/BA,EAAO,aAAa,cAAe,EAAE,EACrCA,EAAO,UAAYD,CACvB,CAKA,MAAM,aAAc,CAChB,GAAI,CAAC,UAAU,cAAgB,CAAC,UAAU,aAAa,iBACnD,MAAM,IAAI,MAAM,6BAA6B,EAEjD,OADgB,MAAM,UAAU,aAAa,iBAAgB,GAExD,OAAQE,GAAWA,EAAO,OAAS,YAAY,EAC/C,IAAKpO,IAAO,CACb,SAAUA,EAAE,SACZ,MAAOA,EAAE,OAAS,UAAUA,EAAE,QAAQ,EAClD,EAAU,CACN,CAKA,MAAM,UAAUqO,EAAU,CACtB,KAAK,KAAI,EACT,MAAMH,EAAS,MAAM,UAAU,aAAa,aAAa,CACrD,MAAO,CAAE,SAAU,CAAE,MAAOG,CAAQ,CAAE,CAClD,CAAS,EACD,KAAK,UAAUH,CAAM,CACzB,CACA,UAAUd,EAAQkB,EAAW,GAAO,CAChC,KAAM,CAAE,OAAAH,CAAM,EAAK,KACnB,GAAIG,EACA,OAAOlB,EAAO,UAAUe,EAAQA,EAAO,YAAaA,EAAO,UAAU,EACzE,MAAMjL,EAAO8J,GAAQmB,CAAM,EAC3B,OAAOf,EAAO,UAAUe,EAAQjL,EAAK,OAAQA,EAAK,KAAK,CAC3D,CACA,MAAO,CACH,UAAWqL,KAAS,KAAK,OAAO,UAAS,EACrCA,EAAM,KAAI,CAClB,CACJ,CAWO,eAAeC,GAAcL,EAAQ,CACxC,MAAMD,EAAS,MAAM,UAAU,aAAa,aAAa,CACrD,MAAO,CAEH,OAAQ,CAAE,MAAO,OAAO,OAAO,MAAM,EACrC,MAAO,CAAE,MAAO,OAAO,OAAO,KAAK,EAGnC,WAAY,aACxB,CACA,CAAK,EACD,OAAO,IAAID,GAASC,EAAQC,CAAM,CACtC,CAQO,SAASM,GAAUC,EAAI,CAC1B,IAAIC,EACJ,SAASC,EAAKC,EAAI,CACdH,EAAGG,CAAE,EACLF,EAAS,sBAAsBC,CAAI,CACvC,CACA,OAAAD,EAAS,sBAAsBC,CAAI,EAC5B,IAAM,CACLD,IAAW,SAEf,qBAAqBA,CAAM,EAC3BA,EAAS,OACb,CACJ,CACO,SAASG,GAASC,EAASlI,EAAOC,EAAQ,CAC7C,OAAO,IAAI,QAAQ,CAACkI,EAASC,IAAW,CACpC,GAAI,EAAE,OAAO,cAAcpI,CAAK,GAC5B,OAAO,cAAcC,CAAM,GAC3BD,EAAQ,GACRC,EAAS,GACTD,EAAQ,MACRC,EAAS,MACT,OAAOmI,EAAO,IAAI,MAAM,6BAA+BpI,EAAQ,IAAMC,CAAM,CAAC,EAEhF,MAAMoI,EADY,IAAI,UAAS,EACT,gBAAgBH,EAAS,eAAe,EACxDI,EAAaD,EAAI,gBACvBC,EAAW,aAAa,QAAS,OAAOtI,CAAK,CAAC,EAC9CsI,EAAW,aAAa,SAAU,OAAOrI,CAAM,CAAC,EAChD,MAAMsI,EAAOF,EAAI,gBAAgB,6BAA8B,MAAM,EACrEE,EAAK,aAAa,QAAS,MAAM,EACjCA,EAAK,aAAa,SAAU,MAAM,EAClCA,EAAK,aAAa,OAAQ,OAAO,EACjCD,EAAW,aAAaC,EAAMD,EAAW,UAAU,EAEnD,MAAME,EADa,IAAI,cAAa,EACV,kBAAkBH,CAAG,EACzClO,EAAM,IAAI,MAChBA,EAAI,IAAM,sBAAwB,mBAAmBqO,CAAM,EAC3DrO,EAAI,OAAS,UAAY,CACrB,MAAMoM,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQvG,EACfuG,EAAO,OAAStG,EAChB,MAAMgH,EAAMV,EAAO,WAAW,IAAI,EAClC,GAAI,CAACU,EACD,OAAOmB,EAAO,IAAI,MAAM,mCAAmC,CAAC,EAChEnB,EAAI,UAAU9M,EAAK,EAAG,EAAG6F,EAAOC,CAAM,EACtC,MAAMwI,EAAUlC,EAAO,UAAU,WAAW,EAC5C4B,EAAQM,CAAO,CACnB,EACAtO,EAAI,QAAUiO,CAClB,CAAC,CACL","x_google_ignoreList":[0,1]}