UNPKG

proskomma-core

Version:
1,282 lines 1.92 MB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); /*! * XRegExp 5.1.1 * <xregexp.com> * Steven Levithan (c) 2007-present MIT License */ const REGEX_DATA = "xregexp"; const features = { astral: false, namespacing: true }; const fixed = {}; let regexCache = {}; let patternCache = {}; const tokens = []; const defaultScope = "default"; const classScope = "class"; const nativeTokens = { // Any native multicharacter token in default scope, or any single character "default": /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, // Any native multicharacter token in character class scope, or any single character "class": /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ }; const replacementToken = /\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g; const correctExecNpcg = /()??/.exec("")[1] === void 0; const hasFlagsProp = /x/.flags !== void 0; function hasNativeFlag(flag) { let isSupported = true; try { new RegExp("", flag); if (flag === "y") { const gy = (() => "gy")(); const incompleteY = ".a".replace(new RegExp("a", gy), ".") === ".."; if (incompleteY) { isSupported = false; } } } catch (exception) { isSupported = false; } return isSupported; } const hasNativeD = hasNativeFlag("d"); const hasNativeS = hasNativeFlag("s"); const hasNativeU = hasNativeFlag("u"); const hasNativeY = hasNativeFlag("y"); const registeredFlags = { d: hasNativeD, g: true, i: true, m: true, s: hasNativeS, u: hasNativeU, y: hasNativeY }; const nonnativeFlags = hasNativeS ? /[^dgimsuy]+/g : /[^dgimuy]+/g; function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { regex[REGEX_DATA] = { captureNames }; if (isInternalOnly) { return regex; } if (regex.__proto__) { regex.__proto__ = XRegExp.prototype; } else { for (const p in XRegExp.prototype) { regex[p] = XRegExp.prototype[p]; } } regex[REGEX_DATA].source = xSource; regex[REGEX_DATA].flags = xFlags ? xFlags.split("").sort().join("") : xFlags; return regex; } function clipDuplicates(str) { return str.replace(/([\s\S])(?=[\s\S]*\1)/g, ""); } function copyRegex(regex, options2) { if (!XRegExp.isRegExp(regex)) { throw new TypeError("Type RegExp expected"); } const xData = regex[REGEX_DATA] || {}; let flags = getNativeFlags(regex); let flagsToAdd = ""; let flagsToRemove = ""; let xregexpSource = null; let xregexpFlags = null; options2 = options2 || {}; if (options2.removeG) { flagsToRemove += "g"; } if (options2.removeY) { flagsToRemove += "y"; } if (flagsToRemove) { flags = flags.replace(new RegExp(`[${flagsToRemove}]+`, "g"), ""); } if (options2.addG) { flagsToAdd += "g"; } if (options2.addY) { flagsToAdd += "y"; } if (flagsToAdd) { flags = clipDuplicates(flags + flagsToAdd); } if (!options2.isInternalOnly) { if (xData.source !== void 0) { xregexpSource = xData.source; } if (xData.flags != null) { xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags; } } regex = augment( new RegExp(options2.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options2.isInternalOnly ); return regex; } function dec(hex2) { return parseInt(hex2, 16); } function getContextualTokenSeparator(match, scope2, flags) { const matchEndPos = match.index + match[0].length; const precedingChar = match.input[match.index - 1]; const followingChar = match.input[matchEndPos]; if ( // No need to separate tokens if at the beginning or end of a group, before or after a // group, or before or after a `|` /^[()|]$/.test(precedingChar) || /^[()|]$/.test(followingChar) || // No need to separate tokens if at the beginning or end of the pattern match.index === 0 || matchEndPos === match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookaround. // Looks only at the last 4 chars (at most) for perf when constructing long regexes. /\(\?(?:[:=!]|<[=!])$/.test(match.input.substring(match.index - 4, match.index)) || // Avoid separating tokens when the following token is a quantifier isQuantifierNext(match.input, matchEndPos, flags) ) { return ""; } return "(?:)"; } function getNativeFlags(regex) { return hasFlagsProp ? regex.flags : ( // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation // with an empty string) allows this to continue working predictably when // `XRegExp.proptotype.toString` is overridden /\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(regex))[1] ); } function hasNamedCapture(regex) { return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); } function hex(dec2) { return parseInt(dec2, 10).toString(16); } function isQuantifierNext(pattern2, pos, flags) { const inlineCommentPattern = "\\(\\?#[^)]*\\)"; const lineCommentPattern = "#[^#\\n]*"; const quantifierPattern = "[?*+]|{\\d+(?:,\\d*)?}"; const regex = flags.includes("x") ? ( // Ignore any leading whitespace, line comments, and inline comments new RegExp(`^(?:\\s|${lineCommentPattern}|${inlineCommentPattern})*(?:${quantifierPattern})`) ) : ( // Ignore any leading inline comments new RegExp(`^(?:${inlineCommentPattern})*(?:${quantifierPattern})`) ); return regex.test(pattern2.slice(pos)); } function isType$1(value, type2) { return Object.prototype.toString.call(value) === `[object ${type2}]`; } function nullThrows(value) { if (value == null) { throw new TypeError("Cannot convert null or undefined to object"); } return value; } function pad4(str) { while (str.length < 4) { str = `0${str}`; } return str; } function prepareFlags(pattern2, flags) { if (clipDuplicates(flags) !== flags) { throw new SyntaxError(`Invalid duplicate regex flag ${flags}`); } pattern2 = pattern2.replace(/^\(\?([\w$]+)\)/, ($0, $1) => { if (/[dgy]/.test($1)) { throw new SyntaxError(`Cannot use flags dgy in mode modifier ${$0}`); } flags = clipDuplicates(flags + $1); return ""; }); for (const flag of flags) { if (!registeredFlags[flag]) { throw new SyntaxError(`Unknown regex flag ${flag}`); } } return { pattern: pattern2, flags }; } function prepareOptions(value) { const options2 = {}; if (isType$1(value, "String")) { XRegExp.forEach(value, /[^\s,]+/, (match) => { options2[match] = true; }); return options2; } return value; } function registerFlag(flag) { if (!/^[\w$]$/.test(flag)) { throw new Error("Flag must be a single character A-Za-z0-9_$"); } registeredFlags[flag] = true; } function runTokens(pattern2, flags, pos, scope2, context) { let i = tokens.length; const leadChar = pattern2[pos]; let result = null; let match; let t; while (i--) { t = tokens[i]; if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope2 && t.scope !== "all" || t.flag && !flags.includes(t.flag)) { continue; } match = XRegExp.exec(pattern2, t.regex, pos, "sticky"); if (match) { result = { matchLength: match[0].length, output: t.handler.call(context, match, scope2, flags), reparse: t.reparse }; break; } } return result; } function setAstral(on) { features.astral = on; } function setNamespacing(on) { features.namespacing = on; } function XRegExp(pattern2, flags) { if (XRegExp.isRegExp(pattern2)) { if (flags !== void 0) { throw new TypeError("Cannot supply flags when copying a RegExp"); } return copyRegex(pattern2); } pattern2 = pattern2 === void 0 ? "" : String(pattern2); flags = flags === void 0 ? "" : String(flags); if (XRegExp.isInstalled("astral") && !flags.includes("A")) { flags += "A"; } if (!patternCache[pattern2]) { patternCache[pattern2] = {}; } if (!patternCache[pattern2][flags]) { const context = { hasNamedCapture: false, captureNames: [] }; let scope2 = defaultScope; let output = ""; let pos = 0; let result; const applied = prepareFlags(pattern2, flags); let appliedPattern = applied.pattern; const appliedFlags = applied.flags; while (pos < appliedPattern.length) { do { result = runTokens(appliedPattern, appliedFlags, pos, scope2, context); if (result && result.reparse) { appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength); } } while (result && result.reparse); if (result) { output += result.output; pos += result.matchLength || 1; } else { const [token] = XRegExp.exec(appliedPattern, nativeTokens[scope2], pos, "sticky"); output += token; pos += token.length; if (token === "[" && scope2 === defaultScope) { scope2 = classScope; } else if (token === "]" && scope2 === classScope) { scope2 = defaultScope; } } } patternCache[pattern2][flags] = { // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty // groups are sometimes inserted during regex transpilation in order to keep tokens // separated. However, more than one empty group in a row is never needed. pattern: output.replace(/(?:\(\?:\))+/g, "(?:)"), // Strip all but native flags flags: appliedFlags.replace(nonnativeFlags, ""), // `context.captureNames` has an item for each capturing group, even if unnamed captures: context.hasNamedCapture ? context.captureNames : null }; } const generated = patternCache[pattern2][flags]; return augment( new RegExp(generated.pattern, generated.flags), generated.captures, pattern2, flags ); } XRegExp.prototype = new RegExp(); XRegExp.version = "5.1.1"; XRegExp._clipDuplicates = clipDuplicates; XRegExp._hasNativeFlag = hasNativeFlag; XRegExp._dec = dec; XRegExp._hex = hex; XRegExp._pad4 = pad4; XRegExp.addToken = (regex, handler, options2) => { options2 = options2 || {}; let { optionalFlags } = options2; if (options2.flag) { registerFlag(options2.flag); } if (optionalFlags) { optionalFlags = optionalFlags.split(""); for (const flag of optionalFlags) { registerFlag(flag); } } tokens.push({ regex: copyRegex(regex, { addG: true, addY: hasNativeY, isInternalOnly: true }), handler, scope: options2.scope || defaultScope, flag: options2.flag, reparse: options2.reparse, leadChar: options2.leadChar }); XRegExp.cache.flush("patterns"); }; XRegExp.cache = (pattern2, flags) => { if (!regexCache[pattern2]) { regexCache[pattern2] = {}; } return regexCache[pattern2][flags] || (regexCache[pattern2][flags] = XRegExp(pattern2, flags)); }; XRegExp.cache.flush = (cacheName) => { if (cacheName === "patterns") { patternCache = {}; } else { regexCache = {}; } }; XRegExp.escape = (str) => String(nullThrows(str)).replace(/[\\\[\]{}()*+?.^$|]/g, "\\$&").replace(/[\s#\-,]/g, (match) => `\\u${pad4(hex(match.charCodeAt(0)))}`); XRegExp.exec = (str, regex, pos, sticky) => { let cacheKey = "g"; let addY = false; let fakeY = false; let match; addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false); if (addY) { cacheKey += "y"; } else if (sticky) { fakeY = true; cacheKey += "FakeY"; } regex[REGEX_DATA] = regex[REGEX_DATA] || {}; const r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: true, addY, source: fakeY ? `${regex.source}|()` : void 0, removeY: sticky === false, isInternalOnly: true })); pos = pos || 0; r2.lastIndex = pos; match = fixed.exec.call(r2, str); if (fakeY && match && match.pop() === "") { match = null; } if (regex.global) { regex.lastIndex = match ? r2.lastIndex : 0; } return match; }; XRegExp.forEach = (str, regex, callback) => { let pos = 0; let i = -1; let match; while (match = XRegExp.exec(str, regex, pos)) { callback(match, ++i, str, regex); pos = match.index + (match[0].length || 1); } }; XRegExp.globalize = (regex) => copyRegex(regex, { addG: true }); XRegExp.install = (options2) => { options2 = prepareOptions(options2); if (!features.astral && options2.astral) { setAstral(true); } if (!features.namespacing && options2.namespacing) { setNamespacing(true); } }; XRegExp.isInstalled = (feature) => !!features[feature]; XRegExp.isRegExp = (value) => Object.prototype.toString.call(value) === "[object RegExp]"; XRegExp.match = (str, regex, scope2) => { const global2 = regex.global && scope2 !== "one" || scope2 === "all"; const cacheKey = (global2 ? "g" : "") + (regex.sticky ? "y" : "") || "noGY"; regex[REGEX_DATA] = regex[REGEX_DATA] || {}; const r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: !!global2, removeG: scope2 === "one", isInternalOnly: true })); const result = String(nullThrows(str)).match(r2); if (regex.global) { regex.lastIndex = scope2 === "one" && result ? ( // Can't use `r2.lastIndex` since `r2` is nonglobal in this case result.index + result[0].length ) : 0; } return global2 ? result || [] : result && result[0]; }; XRegExp.matchChain = (str, chain) => function recurseChain(values, level) { const item = chain[level].regex ? chain[level] : { regex: chain[level] }; const matches = []; function addMatch(match) { if (item.backref) { const ERR_UNDEFINED_GROUP = `Backreference to undefined group: ${item.backref}`; const isNamedBackref = isNaN(item.backref); if (isNamedBackref && XRegExp.isInstalled("namespacing")) { if (!(match.groups && item.backref in match.groups)) { throw new ReferenceError(ERR_UNDEFINED_GROUP); } } else if (!match.hasOwnProperty(item.backref)) { throw new ReferenceError(ERR_UNDEFINED_GROUP); } const backrefValue = isNamedBackref && XRegExp.isInstalled("namespacing") ? match.groups[item.backref] : match[item.backref]; matches.push(backrefValue || ""); } else { matches.push(match[0]); } } for (const value of values) { XRegExp.forEach(value, item.regex, addMatch); } return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1); }([str], 0); XRegExp.replace = (str, search, replacement, scope2) => { const isRegex = XRegExp.isRegExp(search); const global2 = search.global && scope2 !== "one" || scope2 === "all"; const cacheKey = (global2 ? "g" : "") + (search.sticky ? "y" : "") || "noGY"; let s2 = search; if (isRegex) { search[REGEX_DATA] = search[REGEX_DATA] || {}; s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, { addG: !!global2, removeG: scope2 === "one", isInternalOnly: true })); } else if (global2) { s2 = new RegExp(XRegExp.escape(String(search)), "g"); } const result = fixed.replace.call(nullThrows(str), s2, replacement); if (isRegex && search.global) { search.lastIndex = 0; } return result; }; XRegExp.replaceEach = (str, replacements) => { for (const r of replacements) { str = XRegExp.replace(str, r[0], r[1], r[2]); } return str; }; XRegExp.split = (str, separator, limit) => fixed.split.call(nullThrows(str), separator, limit); XRegExp.test = (str, regex, pos, sticky) => !!XRegExp.exec(str, regex, pos, sticky); XRegExp.uninstall = (options2) => { options2 = prepareOptions(options2); if (features.astral && options2.astral) { setAstral(false); } if (features.namespacing && options2.namespacing) { setNamespacing(false); } }; XRegExp.union = (patterns, flags, options2) => { options2 = options2 || {}; const conjunction = options2.conjunction || "or"; let numCaptures = 0; let numPriorCaptures; let captureNames; function rewrite(match, paren, backref) { const name2 = captureNames[numCaptures - numPriorCaptures]; if (paren) { ++numCaptures; if (name2) { return `(?<${name2}>`; } } else if (backref) { return `\\${+backref + numPriorCaptures}`; } return match; } if (!(isType$1(patterns, "Array") && patterns.length)) { throw new TypeError("Must provide a nonempty array of patterns to merge"); } const parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; const output = []; for (const pattern2 of patterns) { if (XRegExp.isRegExp(pattern2)) { numPriorCaptures = numCaptures; captureNames = pattern2[REGEX_DATA] && pattern2[REGEX_DATA].captureNames || []; output.push(XRegExp(pattern2.source).source.replace(parts, rewrite)); } else { output.push(XRegExp.escape(pattern2)); } } const separator = conjunction === "none" ? "" : "|"; return XRegExp(output.join(separator), flags); }; fixed.exec = function(str) { const origLastIndex = this.lastIndex; const match = RegExp.prototype.exec.apply(this, arguments); if (match) { if (!correctExecNpcg && match.length > 1 && match.includes("")) { const r2 = copyRegex(this, { removeG: true, isInternalOnly: true }); String(str).slice(match.index).replace(r2, (...args) => { const len = args.length; for (let i = 1; i < len - 2; ++i) { if (args[i] === void 0) { match[i] = void 0; } } }); } if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { let groupsObject = match; if (XRegExp.isInstalled("namespacing")) { match.groups = /* @__PURE__ */ Object.create(null); groupsObject = match.groups; } for (let i = 1; i < match.length; ++i) { const name2 = this[REGEX_DATA].captureNames[i - 1]; if (name2) { groupsObject[name2] = match[i]; } } } else if (!match.groups && XRegExp.isInstalled("namespacing")) { match.groups = void 0; } if (this.global && !match[0].length && this.lastIndex > match.index) { this.lastIndex = match.index; } } if (!this.global) { this.lastIndex = origLastIndex; } return match; }; fixed.test = function(str) { return !!fixed.exec.call(this, str); }; fixed.match = function(regex) { if (!XRegExp.isRegExp(regex)) { regex = new RegExp(regex); } else if (regex.global) { const result = String.prototype.match.apply(this, arguments); regex.lastIndex = 0; return result; } return fixed.exec.call(regex, nullThrows(this)); }; fixed.replace = function(search, replacement) { const isRegex = XRegExp.isRegExp(search); let origLastIndex; let captureNames; let result; if (isRegex) { if (search[REGEX_DATA]) { ({ captureNames } = search[REGEX_DATA]); } origLastIndex = search.lastIndex; } else { search += ""; } if (isType$1(replacement, "Function")) { result = String(this).replace(search, (...args) => { if (captureNames) { let groupsObject; if (XRegExp.isInstalled("namespacing")) { groupsObject = /* @__PURE__ */ Object.create(null); args.push(groupsObject); } else { args[0] = new String(args[0]); [groupsObject] = args; } for (let i = 0; i < captureNames.length; ++i) { if (captureNames[i]) { groupsObject[captureNames[i]] = args[i + 1]; } } } return replacement(...args); }); } else { result = String(nullThrows(this)).replace(search, (...args) => { return String(replacement).replace(replacementToken, replacer); function replacer($0, bracketed, angled, dollarToken) { bracketed = bracketed || angled; const numNonCaptureArgs = isType$1(args[args.length - 1], "Object") ? 4 : 3; const numCaptures = args.length - numNonCaptureArgs; if (bracketed) { if (/^\d+$/.test(bracketed)) { const n2 = +bracketed; if (n2 <= numCaptures) { return args[n2] || ""; } } const n = captureNames ? captureNames.indexOf(bracketed) : -1; if (n < 0) { throw new SyntaxError(`Backreference to undefined group ${$0}`); } return args[n + 1] || ""; } if (dollarToken === "" || dollarToken === " ") { throw new SyntaxError(`Invalid token ${$0}`); } if (dollarToken === "&" || +dollarToken === 0) { return args[0]; } if (dollarToken === "$") { return "$"; } if (dollarToken === "`") { return args[args.length - 1].slice(0, args[args.length - 2]); } if (dollarToken === "'") { return args[args.length - 1].slice(args[args.length - 2] + args[0].length); } dollarToken = +dollarToken; if (!isNaN(dollarToken)) { if (dollarToken > numCaptures) { throw new SyntaxError(`Backreference to undefined group ${$0}`); } return args[dollarToken] || ""; } throw new SyntaxError(`Invalid token ${$0}`); } }); } if (isRegex) { if (search.global) { search.lastIndex = 0; } else { search.lastIndex = origLastIndex; } } return result; }; fixed.split = function(separator, limit) { if (!XRegExp.isRegExp(separator)) { return String.prototype.split.apply(this, arguments); } const str = String(this); const output = []; const origLastIndex = separator.lastIndex; let lastLastIndex = 0; let lastLength; limit = (limit === void 0 ? -1 : limit) >>> 0; XRegExp.forEach(str, separator, (match) => { if (match.index + match[0].length > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = match.index + lastLength; } }); if (lastLastIndex === str.length) { if (!separator.test("") || lastLength) { output.push(""); } } else { output.push(str.slice(lastLastIndex)); } separator.lastIndex = origLastIndex; return output.length > limit ? output.slice(0, limit) : output; }; XRegExp.addToken( /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, (match, scope2) => { if (match[1] === "B" && scope2 === defaultScope) { return match[0]; } throw new SyntaxError(`Invalid escape ${match[0]}`); }, { scope: "all", leadChar: "\\" } ); XRegExp.addToken( /\\u{([\dA-Fa-f]+)}/, (match, scope2, flags) => { const code2 = dec(match[1]); if (code2 > 1114111) { throw new SyntaxError(`Invalid Unicode code point ${match[0]}`); } if (code2 <= 65535) { return `\\u${pad4(hex(code2))}`; } if (hasNativeU && flags.includes("u")) { return match[0]; } throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u"); }, { scope: "all", leadChar: "\\" } ); XRegExp.addToken( /\(\?#[^)]*\)/, getContextualTokenSeparator, { leadChar: "(" } ); XRegExp.addToken( /\s+|#[^\n]*\n?/, getContextualTokenSeparator, { flag: "x" } ); if (!hasNativeS) { XRegExp.addToken( /\./, () => "[\\s\\S]", { flag: "s", leadChar: "." } ); } XRegExp.addToken( /\\k<([^>]+)>/, function(match) { const index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1]; const endIndex = match.index + match[0].length; if (!index || index > this.captureNames.length) { throw new SyntaxError(`Backreference to undefined group ${match[0]}`); } return `\\${index}${endIndex === match.input.length || isNaN(match.input[endIndex]) ? "" : "(?:)"}`; }, { leadChar: "\\" } ); XRegExp.addToken( /\\(\d+)/, function(match, scope2) { if (!(scope2 === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== "0") { throw new SyntaxError(`Cannot use octal escape or backreference to undefined group ${match[0]}`); } return match[0]; }, { scope: "all", leadChar: "\\" } ); XRegExp.addToken( /\(\?P?<([\p{ID_Start}$_][\p{ID_Continue}$_\u200C\u200D]*)>/u, function(match) { if (!XRegExp.isInstalled("namespacing") && (match[1] === "length" || match[1] === "__proto__")) { throw new SyntaxError(`Cannot use reserved word as capture name ${match[0]}`); } if (this.captureNames.includes(match[1])) { throw new SyntaxError(`Cannot use same name for multiple groups ${match[0]}`); } this.captureNames.push(match[1]); this.hasNamedCapture = true; return "("; }, { leadChar: "(" } ); XRegExp.addToken( /\((?!\?)/, function(match, scope2, flags) { if (flags.includes("n")) { return "(?:"; } this.captureNames.push(null); return "("; }, { optionalFlags: "n", leadChar: "(" } ); /*! * XRegExp.build 5.1.1 * <xregexp.com> * Steven Levithan (c) 2012-present MIT License */ const build = (XRegExp2) => { const REGEX_DATA2 = "xregexp"; const subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; const parts = XRegExp2.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], "g", { conjunction: "or" }); function deanchor(pattern2) { const leadingAnchor = /^(?:\(\?:\))*\^/; const trailingAnchor = /\$(?:\(\?:\))*$/; if (leadingAnchor.test(pattern2) && trailingAnchor.test(pattern2) && // Ensure that the trailing `$` isn't escaped trailingAnchor.test(pattern2.replace(/\\[\s\S]/g, ""))) { return pattern2.replace(leadingAnchor, "").replace(trailingAnchor, ""); } return pattern2; } function asXRegExp(value, addFlagX) { const flags = addFlagX ? "x" : ""; return XRegExp2.isRegExp(value) ? value[REGEX_DATA2] && value[REGEX_DATA2].captureNames ? ( // Don't recompile, to preserve capture names value ) : ( // Recompile as XRegExp XRegExp2(value.source, flags) ) : ( // Compile string as XRegExp XRegExp2(value, flags) ); } function interpolate(substitution) { return substitution instanceof RegExp ? substitution : XRegExp2.escape(substitution); } function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) { subpatterns[`subpattern${subpatternIndex}`] = interpolated; return subpatterns; } function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) { const hasSubpattern = subpatternIndex < rawLiterals.length - 1; return raw + (hasSubpattern ? `{{subpattern${subpatternIndex}}}` : ""); } XRegExp2.tag = (flags) => (literals, ...substitutions) => { const subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {}); const pattern2 = literals.raw.map(embedSubpatternAfter).join(""); return XRegExp2.build(pattern2, subpatterns, flags); }; XRegExp2.build = (pattern2, subs, flags) => { flags = flags || ""; const addFlagX = flags.includes("x"); const inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern2); if (inlineFlags) { flags = XRegExp2._clipDuplicates(flags + inlineFlags[1]); } const data = {}; for (const p in subs) { if (subs.hasOwnProperty(p)) { const sub = asXRegExp(subs[p], addFlagX); data[p] = { // Deanchoring allows embedding independently useful anchored regexes. If you // really need to keep your anchors, double them (i.e., `^^...$$`). pattern: deanchor(sub.source), names: sub[REGEX_DATA2].captureNames || [] }; } } const patternAsRegex = asXRegExp(pattern2, addFlagX); let numCaps = 0; let numPriorCaps; let numOuterCaps = 0; const outerCapsMap = [0]; const outerCapNames = patternAsRegex[REGEX_DATA2].captureNames || []; const output = patternAsRegex.source.replace(parts, ($0, $1, $2, $3, $4) => { const subName = $1 || $2; let capName; let intro; let localCapIndex; if (subName) { if (!data.hasOwnProperty(subName)) { throw new ReferenceError(`Undefined property ${$0}`); } if ($1) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; intro = `(?<${capName || subName}>`; } else { intro = "(?:"; } numPriorCaps = numCaps; const rewrittenSubpattern = data[subName].pattern.replace(subParts, (match, paren, backref) => { if (paren) { capName = data[subName].names[numCaps - numPriorCaps]; ++numCaps; if (capName) { return `(?<${capName}>`; } } else if (backref) { localCapIndex = +backref - 1; return data[subName].names[localCapIndex] ? ( // Need to preserve the backreference name in case using flag `n` `\\k<${data[subName].names[localCapIndex]}>` ) : `\\${+backref + numPriorCaps}`; } return match; }); return `${intro}${rewrittenSubpattern})`; } if ($3) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; if (capName) { return `(?<${capName}>`; } } else if ($4) { localCapIndex = +$4 - 1; return outerCapNames[localCapIndex] ? ( // Need to preserve the backreference name in case using flag `n` `\\k<${outerCapNames[localCapIndex]}>` ) : `\\${outerCapsMap[+$4]}`; } return $0; }); return XRegExp2(output, flags); }; }; /*! * XRegExp.matchRecursive 5.1.1 * <xregexp.com> * Steven Levithan (c) 2009-present MIT License */ const matchRecursive = (XRegExp2) => { function row(name2, value, start, end) { return { name: name2, value, start, end }; } XRegExp2.matchRecursive = (str, left, right, flags, options2) => { flags = flags || ""; options2 = options2 || {}; const global2 = flags.includes("g"); const sticky = flags.includes("y"); const basicFlags = flags.replace(/y/g, ""); left = XRegExp2(left, basicFlags); right = XRegExp2(right, basicFlags); let esc; let { escapeChar } = options2; if (escapeChar) { if (escapeChar.length > 1) { throw new Error("Cannot use more than one escape character"); } escapeChar = XRegExp2.escape(escapeChar); esc = new RegExp( `(?:${escapeChar}[\\S\\s]|(?:(?!${// Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax // transformation resulting from those flags was already applied to `left` and // `right` when they were passed through the XRegExp constructor above. XRegExp2.union([left, right], "", { conjunction: "or" }).source})[^${escapeChar}])+)+`, // Flags `dgy` not needed here flags.replace(XRegExp2._hasNativeFlag("s") ? /[^imsu]/g : /[^imu]/g, "") ); } let openTokens = 0; let delimStart = 0; let delimEnd = 0; let lastOuterEnd = 0; let outerStart; let innerStart; let leftMatch; let rightMatch; const vN = options2.valueNames; const output = []; while (true) { if (escapeChar) { delimEnd += (XRegExp2.exec(str, esc, delimEnd, "sticky") || [""])[0].length; } leftMatch = XRegExp2.exec(str, left, delimEnd); rightMatch = XRegExp2.exec(str, right, delimEnd); if (leftMatch && rightMatch) { if (leftMatch.index <= rightMatch.index) { rightMatch = null; } else { leftMatch = null; } } if (leftMatch || rightMatch) { delimStart = (leftMatch || rightMatch).index; delimEnd = delimStart + (leftMatch || rightMatch)[0].length; } else if (!openTokens) { break; } if (sticky && !openTokens && delimStart > lastOuterEnd) { break; } if (leftMatch) { if (!openTokens) { outerStart = delimStart; innerStart = delimEnd; } openTokens += 1; } else if (rightMatch && openTokens) { openTokens -= 1; if (!openTokens) { if (vN) { if (vN[0] && outerStart > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); } if (vN[1]) { output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); } if (vN[2]) { output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); } if (vN[3]) { output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); } } else { output.push(str.slice(innerStart, delimStart)); } lastOuterEnd = delimEnd; if (!global2) { break; } } } else { const unbalanced = options2.unbalanced || "error"; if (unbalanced === "skip" || unbalanced === "skip-lazy") { if (rightMatch) { rightMatch = null; } else { if (unbalanced === "skip") { const outerStartDelimLength = XRegExp2.exec(str, left, outerStart, "sticky")[0].length; delimEnd = outerStart + (outerStartDelimLength || 1); } else { delimEnd = outerStart + 1; } openTokens = 0; } } else if (unbalanced === "error") { const delimSide = rightMatch ? "right" : "left"; const errorPos = rightMatch ? delimStart : outerStart; throw new Error(`Unbalanced ${delimSide} delimiter found in string at position ${errorPos}`); } else { throw new Error(`Unsupported value for unbalanced: ${unbalanced}`); } } if (delimStart === delimEnd) { delimEnd += 1; } } if (global2 && output.length > 0 && !sticky && vN && vN[0] && str.length > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); } return output; }; }; /*! * XRegExp Unicode Base 5.1.1 * <xregexp.com> * Steven Levithan (c) 2008-present MIT License */ const unicodeBase = (XRegExp2) => { const unicode = {}; const unicodeTypes = {}; const dec2 = XRegExp2._dec; const hex2 = XRegExp2._hex; const pad42 = XRegExp2._pad4; function normalize(name2) { return name2.replace(/[- _]+/g, "").toLowerCase(); } function charCode(chr) { const esc = /^\\[xu](.+)/.exec(chr); return esc ? dec2(esc[1]) : chr.charCodeAt(chr[0] === "\\" ? 1 : 0); } function invertBmp(range) { let output = ""; let lastEnd = -1; XRegExp2.forEach( range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, (m) => { const start = charCode(m[1]); if (start > lastEnd + 1) { output += `\\u${pad42(hex2(lastEnd + 1))}`; if (start > lastEnd + 2) { output += `-\\u${pad42(hex2(start - 1))}`; } } lastEnd = charCode(m[2] || m[1]); } ); if (lastEnd < 65535) { output += `\\u${pad42(hex2(lastEnd + 1))}`; if (lastEnd < 65534) { output += "-\\uFFFF"; } } return output; } function cacheInvertedBmp(slug) { const prop = "b!"; return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)); } function buildAstral(slug, isNegated) { const item = unicode[slug]; let combined = ""; if (item.bmp && !item.isBmpLast) { combined = `[${item.bmp}]${item.astral ? "|" : ""}`; } if (item.astral) { combined += item.astral; } if (item.isBmpLast && item.bmp) { combined += `${item.astral ? "|" : ""}[${item.bmp}]`; } return isNegated ? `(?:(?!${combined})(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-￿]))` : `(?:${combined})`; } function cacheAstral(slug, isNegated) { const prop = isNegated ? "a!" : "a="; return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)); } XRegExp2.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` /\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/, (match, scope2, flags) => { const ERR_DOUBLE_NEG = "Invalid double negation "; const ERR_UNKNOWN_NAME = "Unknown Unicode token "; const ERR_UNKNOWN_REF = "Unicode token missing data "; const ERR_ASTRAL_ONLY = "Astral mode required for Unicode token "; const ERR_ASTRAL_IN_CLASS = "Astral mode does not support Unicode tokens within character classes"; const [ fullToken, pPrefix, caretNegation, typePrefix, tokenName, tokenSingleCharName ] = match; let isNegated = pPrefix === "P" || !!caretNegation; const isAstralMode = flags.includes("A"); let slug = normalize(tokenSingleCharName || tokenName); let item = unicode[slug]; if (pPrefix === "P" && caretNegation) { throw new SyntaxError(ERR_DOUBLE_NEG + fullToken); } if (!unicode.hasOwnProperty(slug)) { throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); } if (typePrefix) { if (!(unicodeTypes[typePrefix] && unicodeTypes[typePrefix][slug])) { throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); } } if (item.inverseOf) { slug = normalize(item.inverseOf); if (!unicode.hasOwnProperty(slug)) { throw new ReferenceError(`${ERR_UNKNOWN_REF + fullToken} -> ${item.inverseOf}`); } item = unicode[slug]; isNegated = !isNegated; } if (!(item.bmp || isAstralMode)) { throw new SyntaxError(ERR_ASTRAL_ONLY + fullToken); } if (isAstralMode) { if (scope2 === "class") { throw new SyntaxError(ERR_ASTRAL_IN_CLASS); } return cacheAstral(slug, isNegated); } return scope2 === "class" ? isNegated ? cacheInvertedBmp(slug) : item.bmp : `${(isNegated ? "[^" : "[") + item.bmp}]`; }, { scope: "all", optionalFlags: "A", leadChar: "\\" } ); XRegExp2.addUnicodeData = (data, typePrefix) => { const ERR_NO_NAME = "Unicode token requires name"; const ERR_NO_DATA = "Unicode token has no character data "; if (typePrefix) { unicodeTypes[typePrefix] = {}; } for (const item of data) { if (!item.name) { throw new Error(ERR_NO_NAME); } if (!(item.inverseOf || item.bmp || item.astral)) { throw new Error(ERR_NO_DATA + item.name); } const normalizedName = normalize(item.name); unicode[normalizedName] = item; if (typePrefix) { unicodeTypes[typePrefix][normalizedName] = true; } if (item.alias) { const normalizedAlias = normalize(item.alias); unicode[normalizedAlias] = item; if (typePrefix) { unicodeTypes[typePrefix][normalizedAlias] = true; } } } XRegExp2.cache.flush("patterns"); }; XRegExp2._getUnicodeProperty = (name2) => { const slug = normalize(name2); return unicode[slug]; }; }; var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; } function getAugmentedNamespace(n) { if (n.__esModule) return n; var f = n.default; if (typeof f == "function") { var a = function a2() { if (this instanceof a2) { return Reflect.construct(f, arguments, this.constructor); } return f.apply(this, arguments); }; a.prototype = f.prototype; } else a = {}; Object.defineProperty(a, "__esModule", { value: true }); Object.keys(n).forEach(function(k) { var d = Object.getOwnPropertyDescriptor(n, k); Object.defineProperty(a, k, d.get ? d : { enumerable: true, get: function() { return n[k]; } }); }); return a; } var categories = [ { "name": "C", "alias": "Other", "isBmpLast": true, "bmp": "\0--Ÿ­͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-؅؜۝܎܏݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏-ࢗ࣢঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠎᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿​-‏‪-‮⁠-⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽-＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￾￿", "astral": "\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCBD\uDCC3-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]" }, { "name": "Cc", "alias": "Control", "bmp": "\0--Ÿ" }, { "name": "Cf", "alias": "Format", "bmp": "­؀-؅؜۝܏࢐࢑࣢᠎​-‏‪-‮⁠-⁤⁦-\uFEFF-", "astral": "\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]" }, { "name": "Cn", "alias": "Unassigned", "bmp": "͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-׿܎݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏࢒-ࢗ঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿⁥⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-퟿﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽﻾＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￸￾￿", "astral": "\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCC3-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-