1 line
42 KiB
Plaintext
1 line
42 KiB
Plaintext
{"version":3,"file":"CanvasTextMetrics.mjs","sources":["../../../../src/scene/text/canvas/CanvasTextMetrics.ts"],"sourcesContent":["import { DOMAdapter } from '../../../environment/adapter';\nimport { fontStringFromTextStyle } from './utils/fontStringFromTextStyle';\n\nimport type { ICanvas, ICanvasRenderingContext2DSettings } from '../../../environment/canvas/ICanvas';\nimport type { ICanvasRenderingContext2D } from '../../../environment/canvas/ICanvasRenderingContext2D';\nimport type { TextStyle, TextStyleWhiteSpace } from '../TextStyle';\n\n// The type for Intl.Segmenter is only available since TypeScript 4.7.2, so let's make a polyfill for it.\ninterface ISegmentData\n{\n segment: string;\n}\ninterface ISegments\n{\n [Symbol.iterator](): IterableIterator<ISegmentData>;\n}\ninterface ISegmenter\n{\n segment(input: string): ISegments;\n}\ninterface IIntl\n{\n Segmenter?: {\n prototype: ISegmenter;\n new(): ISegmenter;\n };\n}\n\n/**\n * A number, or a string containing a number.\n * @memberof text\n * @typedef {object} FontMetrics\n * @property {number} ascent - Font ascent\n * @property {number} descent - Font descent\n * @property {number} fontSize - Font size\n */\nexport interface FontMetrics\n{\n ascent: number;\n descent: number;\n fontSize: number;\n}\n\ntype CharacterWidthCache = Record<string, number>;\n\n// Default settings used for all getContext calls\nconst contextSettings: ICanvasRenderingContext2DSettings = {\n // TextMetrics requires getImageData readback for measuring fonts.\n willReadFrequently: true,\n};\n\n/**\n * The TextMetrics object represents the measurement of a block of text with a specified style.\n * @example\n * import { TextMetrics, TextStyle } from 'pixi.js';\n *\n * const style = new TextStyle({\n * fontFamily: 'Arial',\n * fontSize: 24,\n * fill: 0xff1010,\n * align: 'center',\n * });\n * const textMetrics = TextMetrics.measureText('Your text', style);\n * @memberof text\n */\nexport class CanvasTextMetrics\n{\n /** The text that was measured. */\n public text: string;\n\n /** The style that was measured. */\n public style: TextStyle;\n\n /** The measured width of the text. */\n public width: number;\n\n /** The measured height of the text. */\n public height: number;\n\n /** An array of lines of the text broken by new lines and wrapping is specified in style. */\n public lines: string[];\n\n /** An array of the line widths for each line matched to `lines`. */\n public lineWidths: number[];\n\n /** The measured line height for this style. */\n public lineHeight: number;\n\n /** The maximum line width for all measured lines. */\n public maxLineWidth: number;\n\n /** The font properties object from TextMetrics.measureFont. */\n public fontProperties: FontMetrics;\n\n /**\n * String used for calculate font metrics.\n * These characters are all tall to help calculate the height required for text.\n */\n public static METRICS_STRING = '|ÉqÅ';\n\n /** Baseline symbol for calculate font metrics. */\n public static BASELINE_SYMBOL = 'M';\n\n /** Baseline multiplier for calculate font metrics. */\n public static BASELINE_MULTIPLIER = 1.4;\n\n /** Height multiplier for setting height of canvas to calculate font metrics. */\n public static HEIGHT_MULTIPLIER = 2.0;\n\n /**\n * A Unicode \"character\", or \"grapheme cluster\", can be composed of multiple Unicode code points,\n * such as letters with diacritical marks (e.g. `'\\u0065\\u0301'`, letter e with acute)\n * or emojis with modifiers (e.g. `'\\uD83E\\uDDD1\\u200D\\uD83D\\uDCBB'`, technologist).\n * The new `Intl.Segmenter` API in ES2022 can split the string into grapheme clusters correctly. If it is not available,\n * PixiJS will fallback to use the iterator of String, which can only spilt the string into code points.\n * If you want to get full functionality in environments that don't support `Intl.Segmenter` (such as Firefox),\n * you can use other libraries such as [grapheme-splitter]{@link https://www.npmjs.com/package/grapheme-splitter}\n * or [graphemer]{@link https://www.npmjs.com/package/graphemer} to create a polyfill. Since these libraries can be\n * relatively large in size to handle various Unicode grapheme clusters properly, PixiJS won't use them directly.\n */\n public static graphemeSegmenter: (s: string) => string[] = (() =>\n {\n if (typeof (Intl as IIntl)?.Segmenter === 'function')\n {\n const segmenter = new (Intl as IIntl).Segmenter();\n\n return (s: string) => [...segmenter.segment(s)].map((x) => x.segment);\n }\n\n return (s: string) => [...s];\n })();\n\n public static _experimentalLetterSpacingSupported?: boolean;\n\n /**\n * Checking that we can use modern canvas 2D API.\n *\n * Note: This is an unstable API, Chrome < 94 use `textLetterSpacing`, later versions use `letterSpacing`.\n * @see TextMetrics.experimentalLetterSpacing\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ICanvasRenderingContext2D/letterSpacing\n * @see https://developer.chrome.com/origintrials/#/view_trial/3585991203293757441\n */\n public static get experimentalLetterSpacingSupported(): boolean\n {\n let result = CanvasTextMetrics._experimentalLetterSpacingSupported;\n\n if (result !== undefined)\n {\n const proto = DOMAdapter.get().getCanvasRenderingContext2D().prototype;\n\n result\n = CanvasTextMetrics._experimentalLetterSpacingSupported\n = 'letterSpacing' in proto || 'textLetterSpacing' in proto;\n }\n\n return result;\n }\n\n /**\n * New rendering behavior for letter-spacing which uses Chrome's new native API. This will\n * lead to more accurate letter-spacing results because it does not try to manually draw\n * each character. However, this Chrome API is experimental and may not serve all cases yet.\n * @see TextMetrics.experimentalLetterSpacingSupported\n */\n public static experimentalLetterSpacing = false;\n\n /** Cache of {@see TextMetrics.FontMetrics} objects. */\n private static _fonts: Record<string, FontMetrics> = {};\n\n /** Cache of new line chars. */\n private static readonly _newlines: number[] = [\n 0x000A, // line feed\n 0x000D, // carriage return\n ];\n\n /** Cache of breaking spaces. */\n private static readonly _breakingSpaces: number[] = [\n 0x0009, // character tabulation\n 0x0020, // space\n 0x2000, // en quad\n 0x2001, // em quad\n 0x2002, // en space\n 0x2003, // em space\n 0x2004, // three-per-em space\n 0x2005, // four-per-em space\n 0x2006, // six-per-em space\n 0x2008, // punctuation space\n 0x2009, // thin space\n 0x200A, // hair space\n 0x205F, // medium mathematical space\n 0x3000, // ideographic space\n ];\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private static __canvas: ICanvas;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private static __context: ICanvasRenderingContext2D;\n\n private static readonly _measurementCache: Record<string, CanvasTextMetrics> = {};\n\n /**\n * @param text - the text that was measured\n * @param style - the style that was measured\n * @param width - the measured width of the text\n * @param height - the measured height of the text\n * @param lines - an array of the lines of text broken by new lines and wrapping if specified in style\n * @param lineWidths - an array of the line widths for each line matched to `lines`\n * @param lineHeight - the measured line height for this style\n * @param maxLineWidth - the maximum line width for all measured lines\n * @param {FontMetrics} fontProperties - the font properties object from TextMetrics.measureFont\n */\n constructor(text: string, style: TextStyle, width: number, height: number, lines: string[], lineWidths: number[],\n lineHeight: number, maxLineWidth: number, fontProperties: FontMetrics)\n {\n this.text = text;\n this.style = style;\n this.width = width;\n this.height = height;\n this.lines = lines;\n this.lineWidths = lineWidths;\n this.lineHeight = lineHeight;\n this.maxLineWidth = maxLineWidth;\n this.fontProperties = fontProperties;\n }\n\n /**\n * Measures the supplied string of text and returns a Rectangle.\n * @param text - The text to measure.\n * @param style - The text style to use for measuring\n * @param canvas - optional specification of the canvas to use for measuring.\n * @param wordWrap\n * @returns Measured width and height of the text.\n */\n public static measureText(\n text = ' ',\n style: TextStyle,\n canvas: ICanvas = CanvasTextMetrics._canvas,\n wordWrap: boolean = style.wordWrap,\n ): CanvasTextMetrics\n {\n const textKey = `${text}:${style.styleKey}`;\n\n // TODO - if we find this starts to go nuts with memory, we can remove the cache\n // or instead just stick a usage tick that we increment each time we return it.\n // if some are not used, we can just tidy them up!\n if (CanvasTextMetrics._measurementCache[textKey]) return CanvasTextMetrics._measurementCache[textKey];\n\n const font = fontStringFromTextStyle(style);\n const fontProperties = CanvasTextMetrics.measureFont(font);\n\n // fallback in case UA disallow canvas data extraction\n if (fontProperties.fontSize === 0)\n {\n fontProperties.fontSize = style.fontSize as number;\n fontProperties.ascent = style.fontSize as number;\n }\n\n const context = CanvasTextMetrics.__context; // canvas.getContext('2d', contextSettings);\n\n context.font = font;\n\n const outputText = wordWrap ? CanvasTextMetrics._wordWrap(text, style, canvas) : text;\n const lines = outputText.split(/(?:\\r\\n|\\r|\\n)/);\n const lineWidths = new Array<number>(lines.length);\n let maxLineWidth = 0;\n\n for (let i = 0; i < lines.length; i++)\n {\n const lineWidth = CanvasTextMetrics._measureText(lines[i], style.letterSpacing, context);\n\n lineWidths[i] = lineWidth;\n maxLineWidth = Math.max(maxLineWidth, lineWidth);\n }\n\n const strokeWidth = style._stroke?.width || 0;\n\n let width = maxLineWidth + strokeWidth;\n\n if (style.dropShadow)\n {\n width += style.dropShadow.distance;\n }\n\n const lineHeight = style.lineHeight || fontProperties.fontSize;\n\n let height = Math.max(lineHeight, fontProperties.fontSize + (strokeWidth))\n + ((lines.length - 1) * (lineHeight + style.leading));\n\n if (style.dropShadow)\n {\n height += style.dropShadow.distance;\n }\n\n const measurements = new CanvasTextMetrics(\n text,\n style,\n width,\n height,\n lines,\n lineWidths,\n lineHeight + style.leading,\n maxLineWidth,\n fontProperties\n );\n\n // CanvasTextMetrics._measurementCache[textKey] = measurements;\n\n return measurements;\n }\n\n private static _measureText(\n text: string,\n letterSpacing: number,\n context: ICanvasRenderingContext2D\n )\n {\n let useExperimentalLetterSpacing = false;\n\n if (CanvasTextMetrics.experimentalLetterSpacingSupported)\n {\n if (CanvasTextMetrics.experimentalLetterSpacing)\n {\n context.letterSpacing = `${letterSpacing}px`;\n context.textLetterSpacing = `${letterSpacing}px`;\n useExperimentalLetterSpacing = true;\n }\n else\n {\n context.letterSpacing = '0px';\n context.textLetterSpacing = '0px';\n }\n }\n\n let width = context.measureText(text).width;\n\n if (width > 0)\n {\n if (useExperimentalLetterSpacing)\n {\n width -= letterSpacing;\n }\n else\n {\n width += (CanvasTextMetrics.graphemeSegmenter(text).length - 1) * letterSpacing;\n }\n }\n\n return width;\n }\n\n /**\n * Applies newlines to a string to have it optimally fit into the horizontal\n * bounds set by the Text object's wordWrapWidth property.\n * @param text - String to apply word wrapping to\n * @param style - the style to use when wrapping\n * @param canvas - optional specification of the canvas to use for measuring.\n * @returns New string with new lines applied where required\n */\n private static _wordWrap(\n text: string,\n style: TextStyle,\n canvas: ICanvas = CanvasTextMetrics._canvas\n ): string\n {\n const context = canvas.getContext('2d', contextSettings);\n\n let width = 0;\n let line = '';\n let lines = '';\n\n const cache: CharacterWidthCache = Object.create(null);\n const { letterSpacing, whiteSpace } = style;\n\n // How to handle whitespaces\n const collapseSpaces = CanvasTextMetrics._collapseSpaces(whiteSpace);\n const collapseNewlines = CanvasTextMetrics._collapseNewlines(whiteSpace);\n\n // whether or not spaces may be added to the beginning of lines\n let canPrependSpaces = !collapseSpaces;\n\n // There is letterSpacing after every char except the last one\n // t_h_i_s_' '_i_s_' '_a_n_' '_e_x_a_m_p_l_e_' '_!\n // so for convenience the above needs to be compared to width + 1 extra letterSpace\n // t_h_i_s_' '_i_s_' '_a_n_' '_e_x_a_m_p_l_e_' '_!_\n // ________________________________________________\n // And then the final space is simply no appended to each line\n const wordWrapWidth = style.wordWrapWidth + letterSpacing;\n\n // break text into words, spaces and newline chars\n const tokens = CanvasTextMetrics._tokenize(text);\n\n for (let i = 0; i < tokens.length; i++)\n {\n // get the word, space or newlineChar\n let token = tokens[i];\n\n // if word is a new line\n if (CanvasTextMetrics._isNewline(token))\n {\n // keep the new line\n if (!collapseNewlines)\n {\n lines += CanvasTextMetrics._addLine(line);\n canPrependSpaces = !collapseSpaces;\n line = '';\n width = 0;\n continue;\n }\n\n // if we should collapse new lines\n // we simply convert it into a space\n token = ' ';\n }\n\n // if we should collapse repeated whitespaces\n if (collapseSpaces)\n {\n // check both this and the last tokens for spaces\n const currIsBreakingSpace = CanvasTextMetrics.isBreakingSpace(token);\n const lastIsBreakingSpace = CanvasTextMetrics.isBreakingSpace(line[line.length - 1]);\n\n if (currIsBreakingSpace && lastIsBreakingSpace)\n {\n continue;\n }\n }\n\n // get word width from cache if possible\n const tokenWidth = CanvasTextMetrics._getFromCache(token, letterSpacing, cache, context);\n\n // word is longer than desired bounds\n if (tokenWidth > wordWrapWidth)\n {\n // if we are not already at the beginning of a line\n if (line !== '')\n {\n // start newlines for overflow words\n lines += CanvasTextMetrics._addLine(line);\n line = '';\n width = 0;\n }\n\n // break large word over multiple lines\n if (CanvasTextMetrics.canBreakWords(token, style.breakWords))\n {\n // break word into characters\n const characters = CanvasTextMetrics.wordWrapSplit(token);\n\n // loop the characters\n for (let j = 0; j < characters.length; j++)\n {\n let char = characters[j];\n let lastChar = char;\n\n let k = 1;\n\n // we are not at the end of the token\n while (characters[j + k])\n {\n const nextChar = characters[j + k];\n\n // should not split chars\n if (!CanvasTextMetrics.canBreakChars(lastChar, nextChar, token, j, style.breakWords))\n {\n // combine chars & move forward one\n char += nextChar;\n }\n else\n {\n break;\n }\n\n lastChar = nextChar;\n k++;\n }\n\n j += k - 1;\n\n const characterWidth = CanvasTextMetrics._getFromCache(char, letterSpacing, cache, context);\n\n if (characterWidth + width > wordWrapWidth)\n {\n lines += CanvasTextMetrics._addLine(line);\n canPrependSpaces = false;\n line = '';\n width = 0;\n }\n\n line += char;\n width += characterWidth;\n }\n }\n\n // run word out of the bounds\n else\n {\n // if there are words in this line already\n // finish that line and start a new one\n if (line.length > 0)\n {\n lines += CanvasTextMetrics._addLine(line);\n line = '';\n width = 0;\n }\n\n const isLastToken = i === tokens.length - 1;\n\n // give it its own line if it's not the end\n lines += CanvasTextMetrics._addLine(token, !isLastToken);\n canPrependSpaces = false;\n line = '';\n width = 0;\n }\n }\n\n // word could fit\n else\n {\n // word won't fit because of existing words\n // start a new line\n if (tokenWidth + width > wordWrapWidth)\n {\n // if its a space we don't want it\n canPrependSpaces = false;\n\n // add a new line\n lines += CanvasTextMetrics._addLine(line);\n\n // start a new line\n line = '';\n width = 0;\n }\n\n // don't add spaces to the beginning of lines\n if (line.length > 0 || !CanvasTextMetrics.isBreakingSpace(token) || canPrependSpaces)\n {\n // add the word to the current line\n line += token;\n\n // update width counter\n width += tokenWidth;\n }\n }\n }\n\n lines += CanvasTextMetrics._addLine(line, false);\n\n return lines;\n }\n\n /**\n * Convenience function for logging each line added during the wordWrap method.\n * @param line - The line of text to add\n * @param newLine - Add new line character to end\n * @returns A formatted line\n */\n private static _addLine(line: string, newLine = true): string\n {\n line = CanvasTextMetrics._trimRight(line);\n\n line = (newLine) ? `${line}\\n` : line;\n\n return line;\n }\n\n /**\n * Gets & sets the widths of calculated characters in a cache object\n * @param key - The key\n * @param letterSpacing - The letter spacing\n * @param cache - The cache\n * @param context - The canvas context\n * @returns The from cache.\n */\n private static _getFromCache(key: string, letterSpacing: number, cache: CharacterWidthCache,\n context: ICanvasRenderingContext2D): number\n {\n let width = cache[key];\n\n if (typeof width !== 'number')\n {\n width = CanvasTextMetrics._measureText(key, letterSpacing, context) + letterSpacing;\n cache[key] = width;\n }\n\n return width;\n }\n\n /**\n * Determines whether we should collapse breaking spaces.\n * @param whiteSpace - The TextStyle property whiteSpace\n * @returns Should collapse\n */\n private static _collapseSpaces(whiteSpace: TextStyleWhiteSpace): boolean\n {\n return (whiteSpace === 'normal' || whiteSpace === 'pre-line');\n }\n\n /**\n * Determines whether we should collapse newLine chars.\n * @param whiteSpace - The white space\n * @returns should collapse\n */\n private static _collapseNewlines(whiteSpace: TextStyleWhiteSpace): boolean\n {\n return (whiteSpace === 'normal');\n }\n\n /**\n * Trims breaking whitespaces from string.\n * @param text - The text\n * @returns Trimmed string\n */\n private static _trimRight(text: string): string\n {\n if (typeof text !== 'string')\n {\n return '';\n }\n\n for (let i = text.length - 1; i >= 0; i--)\n {\n const char = text[i];\n\n if (!CanvasTextMetrics.isBreakingSpace(char))\n {\n break;\n }\n\n text = text.slice(0, -1);\n }\n\n return text;\n }\n\n /**\n * Determines if char is a newline.\n * @param char - The character\n * @returns True if newline, False otherwise.\n */\n private static _isNewline(char: string): boolean\n {\n if (typeof char !== 'string')\n {\n return false;\n }\n\n return CanvasTextMetrics._newlines.includes(char.charCodeAt(0));\n }\n\n /**\n * Determines if char is a breaking whitespace.\n *\n * It allows one to determine whether char should be a breaking whitespace\n * For example certain characters in CJK langs or numbers.\n * It must return a boolean.\n * @param char - The character\n * @param [_nextChar] - The next character\n * @returns True if whitespace, False otherwise.\n */\n public static isBreakingSpace(char: string, _nextChar?: string): boolean\n {\n if (typeof char !== 'string')\n {\n return false;\n }\n\n return CanvasTextMetrics._breakingSpaces.includes(char.charCodeAt(0));\n }\n\n /**\n * Splits a string into words, breaking-spaces and newLine characters\n * @param text - The text\n * @returns A tokenized array\n */\n private static _tokenize(text: string): string[]\n {\n const tokens: string[] = [];\n let token = '';\n\n if (typeof text !== 'string')\n {\n return tokens;\n }\n\n for (let i = 0; i < text.length; i++)\n {\n const char = text[i];\n const nextChar = text[i + 1];\n\n if (CanvasTextMetrics.isBreakingSpace(char, nextChar) || CanvasTextMetrics._isNewline(char))\n {\n if (token !== '')\n {\n tokens.push(token);\n token = '';\n }\n\n tokens.push(char);\n\n continue;\n }\n\n token += char;\n }\n\n if (token !== '')\n {\n tokens.push(token);\n }\n\n return tokens;\n }\n\n /**\n * Overridable helper method used internally by TextMetrics, exposed to allow customizing the class's behavior.\n *\n * It allows one to customise which words should break\n * Examples are if the token is CJK or numbers.\n * It must return a boolean.\n * @param _token - The token\n * @param breakWords - The style attr break words\n * @returns Whether to break word or not\n */\n public static canBreakWords(_token: string, breakWords: boolean): boolean\n {\n return breakWords;\n }\n\n /**\n * Overridable helper method used internally by TextMetrics, exposed to allow customizing the class's behavior.\n *\n * It allows one to determine whether a pair of characters\n * should be broken by newlines\n * For example certain characters in CJK langs or numbers.\n * It must return a boolean.\n * @param _char - The character\n * @param _nextChar - The next character\n * @param _token - The token/word the characters are from\n * @param _index - The index in the token of the char\n * @param _breakWords - The style attr break words\n * @returns whether to break word or not\n */\n public static canBreakChars(_char: string, _nextChar: string, _token: string, _index: number,\n _breakWords: boolean): boolean\n {\n return true;\n }\n\n /**\n * Overridable helper method used internally by TextMetrics, exposed to allow customizing the class's behavior.\n *\n * It is called when a token (usually a word) has to be split into separate pieces\n * in order to determine the point to break a word.\n * It must return an array of characters.\n * @param token - The token to split\n * @returns The characters of the token\n * @see CanvasTextMetrics.graphemeSegmenter\n */\n public static wordWrapSplit(token: string): string[]\n {\n return CanvasTextMetrics.graphemeSegmenter(token);\n }\n\n /**\n * Calculates the ascent, descent and fontSize of a given font-style\n * @param font - String representing the style of the font\n * @returns Font properties object\n */\n public static measureFont(font: string): FontMetrics\n {\n // as this method is used for preparing assets, don't recalculate things if we don't need to\n if (CanvasTextMetrics._fonts[font])\n {\n return CanvasTextMetrics._fonts[font];\n }\n\n const context = CanvasTextMetrics._context;\n\n context.font = font;\n const metrics = context.measureText(CanvasTextMetrics.METRICS_STRING + CanvasTextMetrics.BASELINE_SYMBOL);\n\n const properties = {\n ascent: metrics.actualBoundingBoxAscent,\n descent: metrics.actualBoundingBoxDescent,\n fontSize: metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent\n };\n\n CanvasTextMetrics._fonts[font] = properties;\n\n return properties;\n }\n\n /**\n * Clear font metrics in metrics cache.\n * @param {string} [font] - font name. If font name not set then clear cache for all fonts.\n */\n public static clearMetrics(font = ''): void\n {\n if (font)\n {\n delete CanvasTextMetrics._fonts[font];\n }\n else\n {\n CanvasTextMetrics._fonts = {};\n }\n }\n\n /**\n * Cached canvas element for measuring text\n * TODO: this should be private, but isn't because of backward compat, will fix later.\n * @ignore\n */\n public static get _canvas(): ICanvas\n {\n if (!CanvasTextMetrics.__canvas)\n {\n let canvas: ICanvas;\n\n try\n {\n // OffscreenCanvas2D measureText can be up to 40% faster.\n const c = new OffscreenCanvas(0, 0);\n const context = c.getContext('2d', contextSettings);\n\n if (context?.measureText)\n {\n CanvasTextMetrics.__canvas = c as ICanvas;\n\n return c as ICanvas;\n }\n\n canvas = DOMAdapter.get().createCanvas();\n }\n catch (ex)\n {\n canvas = DOMAdapter.get().createCanvas();\n }\n canvas.width = canvas.height = 10;\n CanvasTextMetrics.__canvas = canvas;\n }\n\n return CanvasTextMetrics.__canvas;\n }\n\n /**\n * TODO: this should be private, but isn't because of backward compat, will fix later.\n * @ignore\n */\n public static get _context(): ICanvasRenderingContext2D\n {\n if (!CanvasTextMetrics.__context)\n {\n CanvasTextMetrics.__context = CanvasTextMetrics._canvas.getContext('2d', contextSettings);\n }\n\n return CanvasTextMetrics.__context;\n }\n}\n"],"names":[],"mappings":"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"} |