node-font2base64
Version:
Convert font to base64 url or src, and to inject src into style files
1 lines • 22.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/helpers.ts"],"sourcesContent":["/*!\n * node-font2base64\n * Copyright(c) 2023 Junmin Ahn\n * MIT Licensed\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport fileType, { FileTypeResult } from 'file-type';\nconst { fromBuffer: fileTypeFromBuffer } = fileType;\n\nimport css, { Rule, Declaration } from 'css';\nimport {\n isArray,\n each,\n eachArray,\n promiseMap,\n readFileAsync,\n writeFileAsync,\n readAllFilesAsync,\n readAllFilesSync,\n} from './helpers';\n\nlet sync: any;\ntry {\n sync = require('promise-synchronizer');\n} catch (er) {\n sync = null;\n}\n\nconst MAX_PATH_LENGTH = 200;\n\nconst fontMap: { [key: string]: { mediaType: string; format: string } } = {\n '.svg': {\n mediaType: 'image/svg+xml',\n format: 'svg',\n },\n '.ttf': {\n mediaType: 'font/truetype',\n format: 'truetype',\n },\n '.otf': {\n mediaType: 'font/opentype',\n format: 'opentype',\n },\n '.eot': {\n mediaType: 'application/vnd.ms-fontobject',\n format: 'embedded-opentype',\n },\n '.sfnt': {\n mediaType: 'application/font-sfnt',\n format: 'sfnt',\n },\n '.woff2': {\n mediaType: 'application/font-woff2',\n format: 'woff2',\n },\n '.woff': {\n mediaType: 'application/font-woff',\n format: 'woff',\n },\n};\n\ntype FileTypeMeta = FileTypeResult & { base64: string };\ninterface StringMap {\n [key: string]: string | null;\n}\n\nconst _fontTypes = Object.keys(fontMap);\nconst _styleTypes = ['.css', '.scss', '.less'];\n\nconst _buffToBase64 = (buff: Buffer) => buff.toString('base64');\n\nconst _readBuffer = async (buff: Buffer) => {\n const base64 = _buffToBase64(buff);\n const data = await fileTypeFromBuffer(buff);\n (data as FileTypeMeta).base64 = base64;\n return data as FileTypeMeta;\n};\n\nconst _readBufferSync = (buff: Buffer) => {\n const base64 = _buffToBase64(buff);\n let data;\n if (sync) {\n data = sync(fileTypeFromBuffer(buff));\n } else {\n data = {};\n }\n data.base64 = base64;\n return data;\n};\n\n/**\n * A data URI consists of data:[<media type>][;base64],<data>\n * https://en.wikipedia.org/wiki/Data_URI_scheme\n *\n * # Font formats\n * svg = svn:mime-type=image/svg+xml\n * ttf = svn:mime-type=application/x-font-ttf\n * otf = svn:mime-type=application/x-font-opentype\n * woff = svn:mime-type=application/font-woff\n * woff2 = svn:mime-type=application/font-woff2\n * eot = svn:mime-type=application/vnd.ms-fontobject\n * sfnt = svn:mime-type=application/font-sfnt\n */\nconst _toDataUrl = (mediaType: string, base64: string) => `data:${mediaType};charset=utf-8;base64,${base64}`;\nconst _toDataSrc = (dataUrl: string, format: string) => `url(${dataUrl}) format('${format}')`;\n\nconst _getMeta = (fpath: string, ext: string) => {\n const naive = path.parse(fpath).ext;\n\n // https://www.npmjs.com/package/file-type#supported-file-types\n if (naive === '.svg') return fontMap[naive];\n const type = (ext && `.${ext}`) || naive;\n return fontMap[type as string];\n};\n\nconst toDataUrl = (fpath: string, { ext, mime, base64 }: FileTypeMeta) => {\n const meta = _getMeta(fpath, ext);\n const mediaType = meta.mediaType;\n return _toDataUrl(mediaType, base64);\n};\n\nconst toDataSrc = (fpath: string, { ext, mime, base64 }: FileTypeMeta) => {\n const meta = _getMeta(fpath, ext);\n if (!meta) return null;\n\n const mediaType = meta.mediaType;\n const format = meta.format;\n\n const dataUrl = _toDataUrl(mediaType, base64);\n return _toDataSrc(dataUrl, format);\n};\n\nconst _encodeToDataUrl = async (fpath: string) => {\n const buff = await readFileAsync(fpath);\n const data = await _readBuffer(buff as Buffer);\n return toDataUrl(fpath, data);\n};\n\nconst _encodeToDataUrlSync = (fpath: string) => {\n const buff = fs.readFileSync(fpath);\n const data = _readBufferSync(buff);\n return toDataUrl(fpath, data);\n};\n\nconst _encodeToDataSrc = async (fpath: string) => {\n const buff = await readFileAsync(fpath);\n const data = await _readBuffer(buff as Buffer);\n return toDataSrc(fpath, data);\n};\n\nconst _encodeToDataSrcSync = (fpath: string) => {\n const buff = fs.readFileSync(fpath);\n const data = _readBufferSync(buff);\n return toDataSrc(fpath, data);\n};\n\nexport const encodeToDataUrl = async (fpath: string) => {\n if (isArray(fpath)) return Promise.all(fpath.map(_encodeToDataUrl));\n return _encodeToDataUrl(fpath);\n};\n\nexport const encodeToDataUrlSync = (fpath: string) => {\n if (isArray(fpath)) return fpath.map(_encodeToDataUrlSync);\n return _encodeToDataUrlSync(fpath);\n};\n\nexport const encodeToDataSrc = (fpath: string) => {\n if (isArray(fpath)) return Promise.all(fpath.map(_encodeToDataSrcSync));\n return _encodeToDataSrc(fpath);\n};\n\nexport const encodeToDataSrcSync = (fpath: string) => {\n if (isArray(fpath)) return fpath.map(_encodeToDataSrcSync);\n return _encodeToDataSrcSync(fpath);\n};\n\nconst _extractSrcUrl = (value: string) => {\n const rx = /url\\('?(.+?)(\\??#.+?)?'?\\)/g;\n const arr = rx.exec(value);\n if (!arr) return value;\n return arr[1];\n};\n\ninterface CssAstUpdateResult {\n modified: boolean;\n content?: string;\n filepath?: string;\n}\n\nconst _updateCssAst = (\n content: string,\n validator: (tpath: string, kpath: string, upath: string, key: string) => boolean,\n dataUrlMap: StringMap,\n fullpathMatch: boolean,\n cssRoot: string,\n) => {\n const keys = Object.keys(dataUrlMap);\n const ast = css.parse(content);\n\n let modified = false;\n\n each(ast.stylesheet?.rules || [], (rule: Rule) => {\n if (rule.type === 'font-face') {\n each(rule.declarations || [], (dec: Declaration) => {\n if (dec.property === 'src') {\n const urls = dec.value?.split(',') || [];\n\n const nUrls = urls.map((url) => {\n let nUrl = url;\n\n const urlpath = _extractSrcUrl(url);\n if (urlpath.length > MAX_PATH_LENGTH) return nUrl;\n\n const fullmatch = fullpathMatch && cssRoot;\n\n const tpathToCompare = (fullmatch && path.resolve(cssRoot, urlpath)) || path.basename(urlpath);\n\n each(keys, (key) => {\n const kpathToCompare = (fullmatch && path.resolve(key)) || path.basename(key);\n\n if (validator(tpathToCompare, kpathToCompare, urlpath, key)) {\n nUrl = dataUrlMap[key] || '';\n modified = true;\n return false;\n }\n\n return true;\n });\n\n return nUrl;\n });\n dec.value = nUrls.join(',\\n');\n }\n });\n }\n });\n\n const result: CssAstUpdateResult = { modified };\n\n if (modified) {\n const newContent = css.stringify(ast);\n result.content = newContent;\n } else {\n result.content = content;\n }\n\n return result;\n};\n\nconst _defaultValidator = (path1: string, path2: string) => path1 === path2;\n\nconst _generateDataUrlMap = async (fpath: string, fontTypes: string[]) => {\n const dataUrlMap: StringMap = {};\n\n try {\n await promiseMap(await readAllFilesAsync(fpath, fontTypes), async (fp) => {\n dataUrlMap[fp] = await _encodeToDataSrc(fp);\n });\n } catch (e) {\n console.error(e);\n }\n\n return dataUrlMap;\n};\n\nconst _generateDataUrlMapSync = (fpath: string, fontTypes: string[]) => {\n const dataUrlMap: StringMap = {};\n\n eachArray(readAllFilesSync(fpath, fontTypes), (fp) => {\n dataUrlMap[fp] = _encodeToDataSrcSync(fp);\n });\n\n return dataUrlMap;\n};\n\nexport const injectBase64 = async (\n fpath: string,\n cpath: string,\n {\n validator = _defaultValidator,\n fontTypes = _fontTypes,\n cssTypes = _styleTypes,\n resave = true,\n fullpathMatch = false,\n } = {},\n) => {\n const dataUrlMap = await _generateDataUrlMap(fpath, fontTypes);\n const results: CssAstUpdateResult[] = [];\n\n try {\n await promiseMap(await readAllFilesAsync(cpath, cssTypes), async (cp) => {\n const content = await readFileAsync(cp, 'utf8');\n\n const result = _updateCssAst(content as string, validator, dataUrlMap, fullpathMatch, path.parse(cp).dir);\n\n if (result.modified && resave) {\n await writeFileAsync(cp, result.content, 'utf8');\n }\n\n result.filepath = cp;\n results.push(result);\n });\n } catch (err) {\n console.error(err);\n }\n\n return resave ? true : results;\n};\n\nexport const injectBase64Sync = (\n fpath: string,\n cpath: string,\n {\n validator = _defaultValidator,\n fontTypes = _fontTypes,\n cssTypes = _styleTypes,\n resave = true,\n fullpathMatch = false,\n } = {},\n) => {\n const dataUrlMap = _generateDataUrlMapSync(fpath, fontTypes);\n const results: CssAstUpdateResult[] = [];\n\n try {\n eachArray(readAllFilesSync(cpath, cssTypes), (cp) => {\n const content = fs.readFileSync(cp, 'utf8');\n\n const result = _updateCssAst(content, validator, dataUrlMap, fullpathMatch, path.parse(cp).dir);\n\n if (result.modified && resave) {\n fs.writeFileSync(cp, result.content || '', 'utf8');\n }\n\n result.filepath = cp;\n results.push(result);\n });\n } catch (err) {\n console.error(err);\n }\n\n return resave ? true : results;\n};\n\ninterface FromContentOptions {\n validator?: (path1: string, path2: string) => boolean;\n fontTypes?: string[];\n fullpathMatch?: boolean;\n root?: string;\n}\n\ninjectBase64.fromContent = async (\n fpath: string,\n content: string,\n { validator = _defaultValidator, fontTypes = _fontTypes, fullpathMatch = false, root = '' }: FromContentOptions = {},\n) => {\n const dataUrlMap = await _generateDataUrlMap(fpath, fontTypes);\n return _updateCssAst(content, validator, dataUrlMap, fullpathMatch, root);\n};\n\ninjectBase64Sync.fromContent = (\n fpath: string,\n content: string,\n { validator = _defaultValidator, fontTypes = _fontTypes, fullpathMatch = false, root = '' }: FromContentOptions = {},\n) => {\n const dataUrlMap = _generateDataUrlMapSync(fpath, fontTypes);\n return _updateCssAst(content, validator, dataUrlMap, fullpathMatch, root);\n};\n\ninjectBase64.fromBuffer = async (fpath: string, buffer: Buffer, options?: FromContentOptions) => {\n const content = buffer.toString('utf8');\n return injectBase64.fromContent(fpath, content, options);\n};\n\ninjectBase64Sync.fromBuffer = (fpath: string, buffer: Buffer, options?: FromContentOptions) => {\n const content = buffer.toString('utf8');\n return injectBase64Sync.fromContent(fpath, content, options);\n};\n\nexport default {\n encodeToDataUrl,\n encodeToDataSrc,\n encodeToDataUrlSync,\n encodeToDataSrcSync,\n injectBase64,\n injectBase64Sync,\n};\n","import { readFile, writeFile, stat, statSync, readdirSync, readdir, Stats } from 'fs';\nimport { join, extname } from 'path';\n\nexport const isString = (value: any) => typeof value === 'string';\n\nexport const isFunction = (value: any) => typeof value === 'function';\n\nexport const isPlainObject = (obj: any) => Object.prototype.toString.call(obj) === '[object Object]';\n\nexport const isArray = Array.isArray;\n\nexport const isNil = (value: any) => value === undefined || value === null;\n\nexport const castArray = (value: any) => {\n if (isNil(value)) return [];\n return isArray(value) ? value : [value];\n};\n\nexport const each = <T>(\n items: T[],\n fn: (item: T, index: number, items: T[]) => void | undefined | boolean,\n startOffset = 0,\n endOffset = 0,\n) => {\n for (let x = startOffset; x < items.length - endOffset; x++) {\n if (fn(items[x], x, items) === false) break;\n }\n};\n\nexport const eachArray = <T>(\n items: T[] | T | null | undefined,\n fn: (item: T, index: number, items: T[]) => void | undefined | boolean,\n startOffset = 0,\n endOffset = 0,\n) => {\n items = castArray(items);\n each<T>(items, fn, startOffset, endOffset);\n};\n\nexport const eachAsync = async <T>(\n items: T[],\n fn: (item: T, index: number, items: T[]) => Promise<undefined | boolean>,\n startOffset = 0,\n endOffset = 0,\n) => {\n for (let x = startOffset; x < items.length - endOffset; x++) {\n const ret = await fn(items[x], x, items);\n if (ret === false) break;\n }\n};\n\nexport const promiseMap = <T>(\n items: T[] | T | null | undefined,\n fn: (item: T, index: number, items: T[]) => Promise<any>,\n) => {\n items = castArray(items);\n\n const promises = [];\n for (let x = 0; x < items.length; x++) {\n promises.push(fn(items[x], x, items));\n }\n return Promise.all(promises);\n};\n\nexport const promisify =\n <T>(fn: Function) =>\n (...args: any[]) =>\n new Promise((resolve, reject) => {\n fn(...args, (err: Error, data: any) => {\n if (err) return reject(err);\n return resolve(data);\n });\n }) as Promise<T>;\n\nexport const readFileAsync = promisify<string | Buffer>(readFile);\n\nexport const writeFileAsync = promisify<void>(writeFile);\n\nexport const statAsync = promisify<Stats>(stat);\n\nexport const readdirAsync = promisify<string[] | Buffer[]>(readdir);\n\nexport const readAllFilesAsync = async (fileOrPath: string | string[], allowedExts: string[] = []) => {\n const files: string[] = [];\n await promiseMap(fileOrPath, async (fp) => {\n try {\n const stat = await statAsync(fp);\n if (stat.isDirectory()) {\n const subs = (await readdirAsync(fp)) as string[];\n const subPaths = subs.map((s) => join(fp, s));\n const subFiles = await readAllFilesAsync(subPaths, allowedExts);\n files.push(...subFiles);\n } else {\n if (allowedExts.includes(extname(fp))) files.push(fp);\n }\n } catch (e) {} // thing not exists\n });\n\n return files;\n};\n\nexport const readAllFilesSync = (fileOrPath: string | string[], allowedExts: string[] = []) => {\n const files: string[] = [];\n eachArray(fileOrPath, (fp) => {\n try {\n const stat = statSync(fp);\n if (stat.isDirectory()) {\n const subs = readdirSync(fp);\n const subPaths = subs.map((s) => join(fp, s));\n const subFiles = readAllFilesSync(subPaths, allowedExts);\n files.push(...subFiles);\n } else {\n if (allowedExts.includes(extname(fp))) files.push(fp);\n }\n } catch (e) {} // thing not exists\n });\n\n return files;\n};\n"],"mappings":";;;;;;;;;AAMA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,cAAkC;AAGzC,OAAO,SAAgC;;;ACXvC,SAAS,UAAU,WAAW,MAAM,UAAU,aAAa,eAAsB;AACjF,SAAS,MAAM,eAAe;AAQvB,IAAM,UAAU,MAAM;AAEtB,IAAM,QAAQ,CAAC,UAAe,UAAU,UAAa,UAAU;AAE/D,IAAM,YAAY,CAAC,UAAe;AACvC,MAAI,MAAM,KAAK;AAAG,WAAO,CAAC;AAC1B,SAAO,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACxC;AAEO,IAAM,OAAO,CAClB,OACA,IACA,cAAc,GACd,YAAY,MACT;AACH,WAAS,IAAI,aAAa,IAAI,MAAM,SAAS,WAAW,KAAK;AAC3D,QAAI,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,MAAM;AAAO;AAAA,EACxC;AACF;AAEO,IAAM,YAAY,CACvB,OACA,IACA,cAAc,GACd,YAAY,MACT;AACH,UAAQ,UAAU,KAAK;AACvB,OAAQ,OAAO,IAAI,aAAa,SAAS;AAC3C;AAcO,IAAM,aAAa,CACxB,OACA,OACG;AACH,UAAQ,UAAU,KAAK;AAEvB,QAAM,WAAW,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,aAAS,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;AAAA,EACtC;AACA,SAAO,QAAQ,IAAI,QAAQ;AAC7B;AAEO,IAAM,YACX,CAAI,OACJ,IAAI,SACF,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,KAAG,GAAG,MAAM,CAAC,KAAY,SAAc;AACrC,QAAI;AAAK,aAAO,OAAO,GAAG;AAC1B,WAAO,QAAQ,IAAI;AAAA,EACrB,CAAC;AACH,CAAC;AAEE,IAAM,gBAAgB,UAA2B,QAAQ;AAEzD,IAAM,iBAAiB,UAAgB,SAAS;AAEhD,IAAM,YAAY,UAAiB,IAAI;AAEvC,IAAM,eAAe,UAA+B,OAAO;AAE3D,IAAM,oBAAoB,OAAO,YAA+B,cAAwB,CAAC,MAAM;AACpG,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,YAAY,OAAO,OAAO;AACzC,QAAI;AACF,YAAMA,QAAO,MAAM,UAAU,EAAE;AAC/B,UAAIA,MAAK,YAAY,GAAG;AACtB,cAAM,OAAQ,MAAM,aAAa,EAAE;AACnC,cAAM,WAAW,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAC5C,cAAM,WAAW,MAAM,kBAAkB,UAAU,WAAW;AAC9D,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,OAAO;AACL,YAAI,YAAY,SAAS,QAAQ,EAAE,CAAC;AAAG,gBAAM,KAAK,EAAE;AAAA,MACtD;AAAA,IACF,SAAS,GAAP;AAAA,IAAW;AAAA,EACf,CAAC;AAED,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,YAA+B,cAAwB,CAAC,MAAM;AAC7F,QAAM,QAAkB,CAAC;AACzB,YAAU,YAAY,CAAC,OAAO;AAC5B,QAAI;AACF,YAAMA,QAAO,SAAS,EAAE;AACxB,UAAIA,MAAK,YAAY,GAAG;AACtB,cAAM,OAAO,YAAY,EAAE;AAC3B,cAAM,WAAW,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAC5C,cAAM,WAAW,iBAAiB,UAAU,WAAW;AACvD,cAAM,KAAK,GAAG,QAAQ;AAAA,MACxB,OAAO;AACL,YAAI,YAAY,SAAS,QAAQ,EAAE,CAAC;AAAG,gBAAM,KAAK,EAAE;AAAA,MACtD;AAAA,IACF,SAAS,GAAP;AAAA,IAAW;AAAA,EACf,CAAC;AAED,SAAO;AACT;;;AD7GA,IAAM,EAAE,YAAY,mBAAmB,IAAI;AAc3C,IAAI;AACJ,IAAI;AACF,SAAO,UAAQ,sBAAsB;AACvC,SAAS,IAAP;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB;AAExB,IAAM,UAAoE;AAAA,EACxE,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAOA,IAAM,aAAa,OAAO,KAAK,OAAO;AACtC,IAAM,cAAc,CAAC,QAAQ,SAAS,OAAO;AAE7C,IAAM,gBAAgB,CAAC,SAAiB,KAAK,SAAS,QAAQ;AAE9D,IAAM,cAAc,OAAO,SAAiB;AAC1C,QAAM,SAAS,cAAc,IAAI;AACjC,QAAM,OAAO,MAAM,mBAAmB,IAAI;AAC1C,EAAC,KAAsB,SAAS;AAChC,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,SAAiB;AACxC,QAAM,SAAS,cAAc,IAAI;AACjC,MAAI;AACJ,MAAI,MAAM;AACR,WAAO,KAAK,mBAAmB,IAAI,CAAC;AAAA,EACtC,OAAO;AACL,WAAO,CAAC;AAAA,EACV;AACA,OAAK,SAAS;AACd,SAAO;AACT;AAeA,IAAM,aAAa,CAAC,WAAmB,WAAmB,QAAQ,kCAAkC;AACpG,IAAM,aAAa,CAAC,SAAiB,WAAmB,OAAO,oBAAoB;AAEnF,IAAM,WAAW,CAAC,OAAe,QAAgB;AAC/C,QAAM,QAAQ,KAAK,MAAM,KAAK,EAAE;AAGhC,MAAI,UAAU;AAAQ,WAAO,QAAQ,KAAK;AAC1C,QAAM,OAAQ,OAAO,IAAI,SAAU;AACnC,SAAO,QAAQ,IAAc;AAC/B;AAEA,IAAM,YAAY,CAAC,OAAe,EAAE,KAAK,MAAM,OAAO,MAAoB;AACxE,QAAM,OAAO,SAAS,OAAO,GAAG;AAChC,QAAM,YAAY,KAAK;AACvB,SAAO,WAAW,WAAW,MAAM;AACrC;AAEA,IAAM,YAAY,CAAC,OAAe,EAAE,KAAK,MAAM,OAAO,MAAoB;AACxE,QAAM,OAAO,SAAS,OAAO,GAAG;AAChC,MAAI,CAAC;AAAM,WAAO;AAElB,QAAM,YAAY,KAAK;AACvB,QAAM,SAAS,KAAK;AAEpB,QAAM,UAAU,WAAW,WAAW,MAAM;AAC5C,SAAO,WAAW,SAAS,MAAM;AACnC;AAEA,IAAM,mBAAmB,OAAO,UAAkB;AAChD,QAAM,OAAO,MAAM,cAAc,KAAK;AACtC,QAAM,OAAO,MAAM,YAAY,IAAc;AAC7C,SAAO,UAAU,OAAO,IAAI;AAC9B;AAEA,IAAM,uBAAuB,CAAC,UAAkB;AAC9C,QAAM,OAAO,GAAG,aAAa,KAAK;AAClC,QAAM,OAAO,gBAAgB,IAAI;AACjC,SAAO,UAAU,OAAO,IAAI;AAC9B;AAEA,IAAM,mBAAmB,OAAO,UAAkB;AAChD,QAAM,OAAO,MAAM,cAAc,KAAK;AACtC,QAAM,OAAO,MAAM,YAAY,IAAc;AAC7C,SAAO,UAAU,OAAO,IAAI;AAC9B;AAEA,IAAM,uBAAuB,CAAC,UAAkB;AAC9C,QAAM,OAAO,GAAG,aAAa,KAAK;AAClC,QAAM,OAAO,gBAAgB,IAAI;AACjC,SAAO,UAAU,OAAO,IAAI;AAC9B;AAEO,IAAM,kBAAkB,OAAO,UAAkB;AACtD,MAAI,QAAQ,KAAK;AAAG,WAAO,QAAQ,IAAI,MAAM,IAAI,gBAAgB,CAAC;AAClE,SAAO,iBAAiB,KAAK;AAC/B;AAEO,IAAM,sBAAsB,CAAC,UAAkB;AACpD,MAAI,QAAQ,KAAK;AAAG,WAAO,MAAM,IAAI,oBAAoB;AACzD,SAAO,qBAAqB,KAAK;AACnC;AAEO,IAAM,kBAAkB,CAAC,UAAkB;AAChD,MAAI,QAAQ,KAAK;AAAG,WAAO,QAAQ,IAAI,MAAM,IAAI,oBAAoB,CAAC;AACtE,SAAO,iBAAiB,KAAK;AAC/B;AAEO,IAAM,sBAAsB,CAAC,UAAkB;AACpD,MAAI,QAAQ,KAAK;AAAG,WAAO,MAAM,IAAI,oBAAoB;AACzD,SAAO,qBAAqB,KAAK;AACnC;AAEA,IAAM,iBAAiB,CAAC,UAAkB;AACxC,QAAM,KAAK;AACX,QAAM,MAAM,GAAG,KAAK,KAAK;AACzB,MAAI,CAAC;AAAK,WAAO;AACjB,SAAO,IAAI,CAAC;AACd;AAQA,IAAM,gBAAgB,CACpB,SACA,WACA,YACA,eACA,YACG;AArML;AAsME,QAAM,OAAO,OAAO,KAAK,UAAU;AACnC,QAAM,MAAM,IAAI,MAAM,OAAO;AAE7B,MAAI,WAAW;AAEf,SAAK,SAAI,eAAJ,mBAAgB,UAAS,CAAC,GAAG,CAAC,SAAe;AAChD,QAAI,KAAK,SAAS,aAAa;AAC7B,WAAK,KAAK,gBAAgB,CAAC,GAAG,CAAC,QAAqB;AA7M1D,YAAAC;AA8MQ,YAAI,IAAI,aAAa,OAAO;AAC1B,gBAAM,SAAOA,MAAA,IAAI,UAAJ,gBAAAA,IAAW,MAAM,SAAQ,CAAC;AAEvC,gBAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ;AAC9B,gBAAI,OAAO;AAEX,kBAAM,UAAU,eAAe,GAAG;AAClC,gBAAI,QAAQ,SAAS;AAAiB,qBAAO;AAE7C,kBAAM,YAAY,iBAAiB;AAEnC,kBAAM,iBAAkB,aAAa,KAAK,QAAQ,SAAS,OAAO,KAAM,KAAK,SAAS,OAAO;AAE7F,iBAAK,MAAM,CAAC,QAAQ;AAClB,oBAAM,iBAAkB,aAAa,KAAK,QAAQ,GAAG,KAAM,KAAK,SAAS,GAAG;AAE5E,kBAAI,UAAU,gBAAgB,gBAAgB,SAAS,GAAG,GAAG;AAC3D,uBAAO,WAAW,GAAG,KAAK;AAC1B,2BAAW;AACX,uBAAO;AAAA,cACT;AAEA,qBAAO;AAAA,YACT,CAAC;AAED,mBAAO;AAAA,UACT,CAAC;AACD,cAAI,QAAQ,MAAM,KAAK,KAAK;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,SAA6B,EAAE,SAAS;AAE9C,MAAI,UAAU;AACZ,UAAM,aAAa,IAAI,UAAU,GAAG;AACpC,WAAO,UAAU;AAAA,EACnB,OAAO;AACL,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,OAAe,UAAkB,UAAU;AAEtE,IAAM,sBAAsB,OAAO,OAAe,cAAwB;AACxE,QAAM,aAAwB,CAAC;AAE/B,MAAI;AACF,UAAM,WAAW,MAAM,kBAAkB,OAAO,SAAS,GAAG,OAAO,OAAO;AACxE,iBAAW,EAAE,IAAI,MAAM,iBAAiB,EAAE;AAAA,IAC5C,CAAC;AAAA,EACH,SAAS,GAAP;AACA,YAAQ,MAAM,CAAC;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,IAAM,0BAA0B,CAAC,OAAe,cAAwB;AACtE,QAAM,aAAwB,CAAC;AAE/B,YAAU,iBAAiB,OAAO,SAAS,GAAG,CAAC,OAAO;AACpD,eAAW,EAAE,IAAI,qBAAqB,EAAE;AAAA,EAC1C,CAAC;AAED,SAAO;AACT;AAEO,IAAM,eAAe,OAC1B,OACA,OACA;AAAA,EACE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,gBAAgB;AAClB,IAAI,CAAC,MACF;AACH,QAAM,aAAa,MAAM,oBAAoB,OAAO,SAAS;AAC7D,QAAM,UAAgC,CAAC;AAEvC,MAAI;AACF,UAAM,WAAW,MAAM,kBAAkB,OAAO,QAAQ,GAAG,OAAO,OAAO;AACvE,YAAM,UAAU,MAAM,cAAc,IAAI,MAAM;AAE9C,YAAM,SAAS,cAAc,SAAmB,WAAW,YAAY,eAAe,KAAK,MAAM,EAAE,EAAE,GAAG;AAExG,UAAI,OAAO,YAAY,QAAQ;AAC7B,cAAM,eAAe,IAAI,OAAO,SAAS,MAAM;AAAA,MACjD;AAEA,aAAO,WAAW;AAClB,cAAQ,KAAK,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAP;AACA,YAAQ,MAAM,GAAG;AAAA,EACnB;AAEA,SAAO,SAAS,OAAO;AACzB;AAEO,IAAM,mBAAmB,CAC9B,OACA,OACA;AAAA,EACE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,gBAAgB;AAClB,IAAI,CAAC,MACF;AACH,QAAM,aAAa,wBAAwB,OAAO,SAAS;AAC3D,QAAM,UAAgC,CAAC;AAEvC,MAAI;AACF,cAAU,iBAAiB,OAAO,QAAQ,GAAG,CAAC,OAAO;AACnD,YAAM,UAAU,GAAG,aAAa,IAAI,MAAM;AAE1C,YAAM,SAAS,cAAc,SAAS,WAAW,YAAY,eAAe,KAAK,MAAM,EAAE,EAAE,GAAG;AAE9F,UAAI,OAAO,YAAY,QAAQ;AAC7B,WAAG,cAAc,IAAI,OAAO,WAAW,IAAI,MAAM;AAAA,MACnD;AAEA,aAAO,WAAW;AAClB,cAAQ,KAAK,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAP;AACA,YAAQ,MAAM,GAAG;AAAA,EACnB;AAEA,SAAO,SAAS,OAAO;AACzB;AASA,aAAa,cAAc,OACzB,OACA,SACA,EAAE,YAAY,mBAAmB,YAAY,YAAY,gBAAgB,OAAO,OAAO,GAAG,IAAwB,CAAC,MAChH;AACH,QAAM,aAAa,MAAM,oBAAoB,OAAO,SAAS;AAC7D,SAAO,cAAc,SAAS,WAAW,YAAY,eAAe,IAAI;AAC1E;AAEA,iBAAiB,cAAc,CAC7B,OACA,SACA,EAAE,YAAY,mBAAmB,YAAY,YAAY,gBAAgB,OAAO,OAAO,GAAG,IAAwB,CAAC,MAChH;AACH,QAAM,aAAa,wBAAwB,OAAO,SAAS;AAC3D,SAAO,cAAc,SAAS,WAAW,YAAY,eAAe,IAAI;AAC1E;AAEA,aAAa,aAAa,OAAO,OAAe,QAAgB,YAAiC;AAC/F,QAAM,UAAU,OAAO,SAAS,MAAM;AACtC,SAAO,aAAa,YAAY,OAAO,SAAS,OAAO;AACzD;AAEA,iBAAiB,aAAa,CAAC,OAAe,QAAgB,YAAiC;AAC7F,QAAM,UAAU,OAAO,SAAS,MAAM;AACtC,SAAO,iBAAiB,YAAY,OAAO,SAAS,OAAO;AAC7D;AAEA,IAAO,cAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["stat","_a"]}