From da3f0bb180a8bcf599c47585a95c130b000f8b43 Mon Sep 17 00:00:00 2001 From: Crphang Date: Wed, 1 Jan 2020 16:22:55 +0800 Subject: [PATCH 1/2] Add suport for Inline PUML and fix PUML subsite problem --- docs/userGuide/puml.md | 25 +++- package-lock.json | 46 +++---- package.json | 1 + src/Page.js | 1 + src/lib/markbind/src/constants.js | 1 + src/lib/markbind/src/lib/markdown-it/index.js | 25 ++++ src/lib/markbind/src/parser.js | 60 +++++++++ .../default/markbind-plugin-plantuml.js | 116 ------------------ src/{plugins/default => widgets}/plantuml.jar | Bin src/widgets/puml.js | 100 +++++++++++++++ .../b169e11db4f52a01eb352071b156c59b.png | Bin 0 -> 21785 bytes test/functional/test_site/expected/index.html | 47 ++++--- .../test_site/expected/inline-output.png | Bin 0 -> 17943 bytes .../test_site/expected/testPlantUML.html | 42 ++++--- test/functional/test_site/testPlantUML.md | 42 +++++++ test/unit/parser.test.js | 1 + 16 files changed, 328 insertions(+), 179 deletions(-) delete mode 100644 src/plugins/default/markbind-plugin-plantuml.js rename src/{plugins/default => widgets}/plantuml.jar (100%) create mode 100644 src/widgets/puml.js create mode 100644 test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png create mode 100644 test/functional/test_site/expected/inline-output.png diff --git a/docs/userGuide/puml.md b/docs/userGuide/puml.md index d46a132c3f..99c44a5e70 100644 --- a/docs/userGuide/puml.md +++ b/docs/userGuide/puml.md @@ -34,12 +34,15 @@ Name | Type | Default | Description --- | --- | --- | --- alt | `string` | | **This must be specified.**
The alternative text of the diagram. height | `string` | | The height of the diagram in pixels. -src | `string` | | **This must be specified.**
The URL of the diagram.
The URL can be specified as absolute or relative references. More info in: _[Intra-Site Links]({{baseUrl}}/userGuide/formattingContents.html#intraSiteLinks)_ +src | `string` | |
The URL of the diagram if your PUML input is in another file.
The URL can be specified as absolute or relative references. More info in: _[Intra-Site Links]({{baseUrl}}/userGuide/formattingContents.html#intraSiteLinks)_ +name | `string` | | The name of the output file. width | `string` | | The width of the diagram in pixels.
If both width and height are specified, width takes priority over height. It is to maintain the diagram's aspect ratio. ### Example +You could have your PUML be written in a separate file or inline. + @@ -57,17 +60,33 @@ return success @enduml ``` -_Markbind page_: +_Markbind page separate file_: ``` ``` +_Markbind page inline_: +````` + + +```puml +@startuml +alice -> bob ++ : hello +bob -> bob ++ : self call +bob -> bib ++ #005500 : hello +bob -> george ** : create +return done +return rc +bob -> george !! : delete +return success +@enduml +``` +````` - diff --git a/package-lock.json b/package-lock.json index 9bc479320c..1917a44816 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1933,6 +1933,11 @@ "which": "^1.2.9" } }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -3226,8 +3231,7 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "optional": true + "bundled": true }, "aproba": { "version": "1.2.0", @@ -3245,13 +3249,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3264,18 +3266,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -3378,8 +3377,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -3389,7 +3387,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3402,20 +3399,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.3.5", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3432,7 +3426,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -3505,8 +3498,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -3516,7 +3508,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -3592,8 +3583,7 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, - "optional": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", @@ -3623,7 +3613,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3641,7 +3630,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3680,13 +3668,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "yallist": { "version": "3.0.3", - "bundled": true, - "optional": true + "bundled": true } } }, diff --git a/package.json b/package.json index fb90a2a33c..26764464d9 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "cheerio": "^0.22.0", "chokidar": "^3.3.0", "commander": "^3.0.2", + "crypto-js": "^3.1.0", "fastmatter": "^2.1.1", "figlet": "^1.2.4", "find-up": "^4.1.0", diff --git a/src/Page.js b/src/Page.js index 7dc91c9a70..23e4b75aef 100644 --- a/src/Page.js +++ b/src/Page.js @@ -761,6 +761,7 @@ class Page { rootPath: this.rootPath, userDefinedVariablesMap: this.userDefinedVariablesMap, headerIdMap: this.headerIdMap, + resultPath: this.resultPath, }; return new Promise((resolve, reject) => { markbinder.includeFile(this.sourcePath, fileConfig) diff --git a/src/lib/markbind/src/constants.js b/src/lib/markbind/src/constants.js index 758777b634..203ec89ff9 100644 --- a/src/lib/markbind/src/constants.js +++ b/src/lib/markbind/src/constants.js @@ -2,6 +2,7 @@ module.exports = { // src/lib/markbind/src/parser.js ATTRIB_INCLUDE_PATH: 'include-path', ATTRIB_CWF: 'cwf', + ATTRIB_RESULT_PATH: 'resultPath', BOILERPLATE_FOLDER_NAME: '_markbind/boilerplates', diff --git a/src/lib/markbind/src/lib/markdown-it/index.js b/src/lib/markbind/src/lib/markdown-it/index.js index 4d7c4d7cf4..75875c6d30 100644 --- a/src/lib/markbind/src/lib/markdown-it/index.js +++ b/src/lib/markbind/src/lib/markdown-it/index.js @@ -42,6 +42,31 @@ markdownIt.renderer.rules.table_close = (tokens, idx) => { return ''; }; +// rewritten markdown-it renderer.js rule to add a div containing the language of the code block +markdownIt.renderer.rules.fence = (tokens, idx, options, env, slf) => { + var token = tokens[idx], + info = token.info ? markdownIt.utils.unescapeAll(token.info).trim() : '', + langName = '', + highlighted; + + if (info) { + langName = info.split(/\s+/g)[0]; + } + + const widgetHandler = env[langName]; + if (widgetHandler !== undefined) { + return widgetHandler(token.content); + } + + if (options.highlight) { + highlighted = options.highlight(token.content, langName) || escapeHtml(token.content); + } else { + highlighted = escapeHtml(token.content); + } + + return highlighted + '\n'; +} + // highlight inline code markdownIt.renderer.rules.code_inline = (tokens, idx, options, env, slf) => { const token = tokens[idx]; diff --git a/src/lib/markbind/src/parser.js b/src/lib/markbind/src/parser.js index 7a8fc3a11c..6b85682e67 100644 --- a/src/lib/markbind/src/parser.js +++ b/src/lib/markbind/src/parser.js @@ -20,6 +20,7 @@ _.pick = require('lodash/pick'); const CyclicReferenceError = require('./handlers/cyclicReferenceError.js'); const md = require('./lib/markdown-it'); const utils = require('./utils'); +const puml = require('../../../widgets/puml'); cheerio.prototype.options.xmlMode = true; // Enable xml mode for self-closing tag cheerio.prototype.options.decodeEntities = false; // Don't escape HTML entities @@ -374,6 +375,28 @@ class Parser { return element; } else if (element.name === 'variable' || element.name === 'import') { return Parser.createEmptyNode(); + } else if (element.name === 'puml') { + if (!_.hasIn(element.attribs, 'src')) { + return element; + } + const resultPath = path.resolve(path.dirname(config.resultPath), element.attribs.src); + const pumlContext = { + resultPath, + ...element.attribs, + }; + + // Path of the .puml file + const rawDiagramPath = path.resolve(path.dirname(context.cwf), pumlContext.src); + const pumlContent = fs.readFileSync(rawDiagramPath, 'utf8'); + const parseAndRenderPUML = puml.parseAndRender(pumlContext); + + const childrenDOM = parseAndRenderPUML(pumlContent); + element.name = 'div'; + element.attribs = {}; + + element.children = cheerio.parseHTML(childrenDOM); + element.children.cwf = context.cwf; + return element; } else { if (element.name === 'body') { // eslint-disable-next-line no-console @@ -508,6 +531,26 @@ class Parser { delete element.attribs.boilerplate; break; } + case 'puml': { + const pumlContext = { + resultPath: config.resultPath, + ...element.attribs, + }; + + element.name = 'div'; + element.attribs = {}; + cheerio.prototype.options.xmlMode = false; + const parseAndRenderPUML = puml.parseAndRender(pumlContext); + const widgetHandler = { + puml: parseAndRenderPUML, + }; + + const pumlContent = Parser.extractAndGenerateCodeBlock(element, 'puml'); + + element.children = cheerio.parseHTML(md.render(cheerio.html(pumlContent), widgetHandler), true); + cheerio.prototype.options.xmlMode = true; + break; + } default: break; } @@ -568,6 +611,7 @@ class Parser { } return processed; }); + resolve(cheerio.html(nodes)); }); @@ -910,6 +954,22 @@ class Parser { return emptyElement; } + static extractAndGenerateCodeBlock(element, codeLanguage = '') { + let codeBlockElement = this.createEmptyNode(); + element.children.forEach((child) => { + if (child.name === 'pre' && child.children.length >= 1) { + const [nestedChild] = child.children; + if (nestedChild.name !== 'code') { + return; + } + [codeBlockElement] = nestedChild.children; + codeBlockElement.data = `\`\`\`${codeLanguage}\n${codeBlockElement.data}\n\`\`\``; + } + }); + + return codeBlockElement; + } + static isText(element) { return element.type === 'text' || element.type === 'comment'; } diff --git a/src/plugins/default/markbind-plugin-plantuml.js b/src/plugins/default/markbind-plugin-plantuml.js deleted file mode 100644 index a7d87b7a1f..0000000000 --- a/src/plugins/default/markbind-plugin-plantuml.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Parses PlantUML diagrams - * Replaces tags with tags with the appropriate src attribute and generates the diagrams - * by running the JAR executable - */ -const cheerio = module.parent.require('cheerio'); -const fs = require('fs'); -const path = require('path'); -const { exec } = require('child_process'); -const logger = require('../../util/logger'); - -const JAR_PATH = path.resolve(__dirname, 'plantuml.jar'); - -const { - ERR_PROCESSING, - ERR_READING, -} = require('../../constants'); - -// Tracks diagrams that have already been processed -const processedDiagrams = new Set(); - -/** - * Generates diagram and replaces src attribute of puml tag - * @param src src attribute of the puml tag - * @param cwf original file that contains the puml tag, we resolve relative src to this file - * @param config sourcePath and resultPath from parser context - * @returns {string} resolved src attribute - */ -function generateDiagram(src, cwf, config) { - const { sourcePath, resultPath } = config; - const _cwf = cwf || sourcePath; - - // For replacing img.src - const diagramSrc = src.replace('.puml', '.png'); - // Path of the .puml file - const rawDiagramPath = path.resolve(path.dirname(_cwf), src); - // Path of the .png to be generated - const outputFilePath = path.resolve(resultPath, path.relative(sourcePath, rawDiagramPath) - .replace('.puml', '.png')); - // Output dir for the png file - const outputDir = path.dirname(outputFilePath); - - // Tracks built files to avoid accessing twice - if (processedDiagrams.has(outputFilePath)) { return diagramSrc; } - processedDiagrams.add(outputFilePath); - - // Creates output dir if it doesn't exist - if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir, { recursive: true }); - } - - // Read diagram file, launch PlantUML jar - fs.readFile(rawDiagramPath, (err, data) => { - if (err) { - logger.debug(err); - logger.error(`${ERR_READING} ${rawDiagramPath}`); - return; - } - - const umlCode = data.toString(); - - // Java command to launch PlantUML jar - const cmd = `java -jar "${JAR_PATH}" -pipe > "${outputFilePath}"`; - const childProcess = exec(cmd); - - let errorLog = ''; - - childProcess.stdin.write( - umlCode, - (e) => { - if (e) { - logger.debug(e); - logger.error(`${ERR_PROCESSING} ${rawDiagramPath}`); - } - childProcess.stdin.end(); - }, - ); - - childProcess.on('error', (error) => { - logger.debug(error); - logger.error(`${ERR_PROCESSING} ${rawDiagramPath}`); - }); - - childProcess.stderr.on('data', (errorMsg) => { - errorLog += errorMsg; - }); - - childProcess.on('exit', () => { - // This goes to the log file, but not shown on the console - logger.debug(errorLog); - }); - }); - - return diagramSrc; -} - -module.exports = { - preRender: (content, pluginContext, frontmatter, config) => { - // Clear tags processed before for live reload - processedDiagrams.clear(); - // Processes all tags - const $ = cheerio.load(content, { xmlMode: true }); - $('puml').each((i, tag) => { - // eslint-disable-next-line no-param-reassign - tag.name = 'pic'; - const { src, cwf } = tag.attribs; - // eslint-disable-next-line no-param-reassign - tag.attribs.src = generateDiagram(src, cwf, config); - }); - - return $.html(); - }, - getSources: () => ({ - tagMap: [['puml', 'src']], - }), -}; diff --git a/src/plugins/default/plantuml.jar b/src/widgets/plantuml.jar similarity index 100% rename from src/plugins/default/plantuml.jar rename to src/widgets/plantuml.jar diff --git a/src/widgets/puml.js b/src/widgets/puml.js new file mode 100644 index 0000000000..055bb6dd86 --- /dev/null +++ b/src/widgets/puml.js @@ -0,0 +1,100 @@ +const path = require('path'); +const cheerio = require('cheerio'); +const cryptoJS = require('crypto-js'); +const fs = require('fs'); +const { exec } = require('child_process'); +const logger = require('../util/logger'); +const fsUtil = require('../util/fsUtil'); + +const PLANTUML_JAR_NAME = 'plantuml.jar'; + +const { + ATTRIB_RESULT_PATH, +} = require('../lib/markbind/src/constants'); + +function getFileName(context, content) { + if (context.name !== undefined) { + return `${context.name}.png`; + } + + if (context.src !== undefined) { + const fileName = fsUtil.removeExtension(context.src); + return `${fileName}.png`; + } + + const hashedContent = cryptoJS.MD5(content).toString(); + return `${hashedContent}.png`; +} + +function generateElement(context) { + const element = cheerio.parseHTML('')[0]; + const entries = Object.entries(context); + entries.forEach(([key, val]) => { + if (key === ATTRIB_RESULT_PATH) { + return; + } + element.attribs[key] = val; + }); + + return element; +} + +/* +* Curry function takes in context returning a widgetHandler function +* PUML widgetHandler takes in raw PUML contents and returns img with puml +*/ +function parseAndRenderPUML(context) { + return function (content) { + const outputDir = path.dirname(context.resultPath); + const fileName = getFileName(context, content); + // Path of the .puml file + const outputPath = path.join(outputDir, path.basename(fileName)); + const JAR_PATH = path.resolve(__dirname, PLANTUML_JAR_NAME); + + // Creates output dir if it doesn't exist + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + // Java command to launch PlantUML jar + const cmd = `java -jar "${JAR_PATH}" -pipe > "${outputPath}"`; + const childProcess = exec(cmd); + + let errorLog = ''; + childProcess.stdin.write( + content, + (e) => { + if (e) { + logger.debug(e); + } + childProcess.stdin.end(); + }, + ); + + childProcess.on('error', (error) => { + logger.debug(error); + }); + + childProcess.stderr.on('data', (errorMsg) => { + errorLog += errorMsg; + }); + + childProcess.on('exit', () => { + // This goes to the log file, but not shown on the console + logger.debug(errorLog); + }); + + const elementContext = context; + elementContext.src = fileName; + const element = generateElement(elementContext); + + return cheerio.html(element); + }; +} + +/* +* Parse and render PUML widget +*/ +module.exports = { + parseAndRender: parseAndRenderPUML, +}; diff --git a/test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png b/test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e95dbbe905cd68f1256bb6952f54d0a3f5dfa9 GIT binary patch literal 21785 zcmbSybyQs4@+C=tAi)U`G`J;baQEO4+#wL$p#wn^++6|$_u%gC?lca;p>b%WvAN`X z?>BGFyfuGJuf^rAOZVw>PF3xy+WQc!q#%WcLWlwf2Ztv8QT!9|`vwl~85z=Z;O>>w z)dBE}-dRG^+1SqhoAnn{XE>=ZwqG2LoWGd7{rv5%xwEr9FEg{fwUMne$i|w<*vHP2KaL<5YTz~0B*;#e6Ua*Ez4HxgUMahd_-mH%drm|f;l$y&A00)}bdIE*r!!i;dLQ#R z{0jMzN=!znW9E5F6V@b*Dm7fSk6w=Y3V*Dx)h~}I8V79=Xb)sUTBe?XIOAe&(yRhR z^P=Jq&iMU4ems}o9@wI=e*tzfU*n@s)D3-~bb?{ZR?VhUQ`JXaoS--wB`%j2kgJ|5 zdsa|f$#nRR{Lx3e+i@?|nF|h%$W~fhMAdcSF!h-=iG)|L8BOg5cf>}wLRdvOPM-sI z-`8K_jl>8Mvi@}bae2|0xx`ZRmLUv&r9n8N^r9Lv{+Ob>+T@wUf#wm}qH&@b#Q8yz z!aO0kx%4tvxgnoq=p}w-5hqFtg6Zx}O;=kzj}KGo?Cw_N+SZ=4|&X&*N*MnOgOJ>d*VDYLqptH)fVST)DS*8)f|wvLR$| z)`LfCy?*?p{q!M64^pCKD5W*~sEKO31*+^g)jEY>JG$tiCfl}slzWivXJz!3?fZ5g zNmWCt2KfpOXp3KNqnWO}Gs1a%+r$he*DUuL$!ZIG5dK<><5;L!t7d%{Onj$O7}}fr z`3BrQ>x~w9I_zE8YBxm9=x2>Ds~$45I;q%rp+Jm<%CmNS@vNRHVy{6)A(cU?Jltr9 zrs62DblnMhOt^f>;1!0`3D6CJQvr4s@?jVK>Z@Ce8EZ6l*7lO zj2F6KlAWxe_!XKD`54zS;di+W7YcUFm1Lac-8MoR^{BgJ(MYo&?G5M#CAeC04Uzt2 zu|H-XW?r>$p{A6H`@c+D*Nt^booVHf@QtJESUtTH5?X!N32Fcz70K`!)@Y zU9N;#0Wu4B5+1HZL=!OU>*=vkw!2T7^jkrjnXRk#uIjhZV)c@QO%a^DfAW<`g^f0I z$s(TFnBC?=9ym$rTBYG*$%Y@1enRp)T_qD7i1IL|hQcLid_EfEWpGT~$X+GG1ZwH;?=TdTI8V=Y8Woc{d# zCnjfBL!Y+6-lEliisoN|`!{<3`-SSeJE6{`8(qbA>mL%i^bbEz+<(&-@7M`NXG&^58dDc#?*& z#Xc{yJ6_7_os6ZaK`;ik61RI)c{%zP_@KlNe0UcfiTvb=#SEAR$AS%eB>tA&0y@?_ zGYim%#jOjA8e;|dG*tm`e<)epq98aWWpzj@MVppKVuiX-e_Yg#3^xkN`M^5_?FWl> zhJ}01eZqLivYQGhSdGg(r7tu8hx-NY7+huV$^nVuU$2$+5HIJ(9CTstsNIckwoS=3mI6Q@sM9B0p4>uqc9Mpjm3 z^y!lJm18Kw(y&ClHZ4L%ZyhJEdNqxzKJUsio{pQ*X z0_$IKGca9*lEhp0o*^vD7EOp=)k5;vB1F;3cMe?IrBMDR`I+J#5N-g)%r6rUNx%>)KAX~X*ixhyY975zdy(}Z+2k4epf$ua=|L4wMae! zIwq}?7tyv2t=8mhWpXb|tQ0GAF#s~x#$ln#I8;YS)w53hNGk9MEW~Iw=C&NvPu|*su7f}>q6ShhXGfG$@GhQR zQr3b1pDyuP@_!c?`&I=(XLy=77@3Oirge{bmAbeEo!xUc)5DIET;6Z8%*&A0oa_hB zA*KBQ4qLT*^gnJGgSV7Qu(!9~FT*b_Yb7u!ZIV*IE6DRrv@WGaW8-!|%e^K=WBpW@ zGnY?tBBQVJG^pD&YAZ1$I6H=?;roL`tn11TnzNxE&&r*{_y3LIN9wQw2+4w$WRp z-dA5>dkfL>IuS)`T)56-E(#&gK>jNi+~KcwTVtP4^sJ*$k|M4VVblL8&C`ez!v z=*t?LilOrGlRh%^0vdZSIUkZqWq))cGtP+{p73m4weH^x#|cXCJI2+}EiSxtp5TM! zyn=aw4spk4r=@;dsoQ-G3z^6_5vOl=riVVO733WM>~ks}AsPfq#@t5xz?mj8H_c)jXL2_-fz%{*N$STG-A0p#<<`aW&G7#FjmoV zDn10d3=_R9_l$T-frU`#E1p&h{i$I{<@m85{qE3h`*5`L;7sC6&oF^9cL*lZmtyxk z!-AKC+5%ev4xiHblaBWop}H9HO;=17E6xaMEYywI!F@O{-4!mK8twY*h+mfJRH($8 ze4osG2&1(SweGvyzQWy*PJVN*Ju&=CdGlGPD>hKZP*Iog!pd+gQy(BqkIpfQ(YJW_lN%DZj) zc8?&VR$c7<=hB2I_h86j8~VWx(X}9>(ciy8Cwy0a^@?mnnP@>S3^1yU#z|{daZg9w zV#?9P9-#!M#k*~S7g5#npHKwer?Olalm$M*)?Tc9xb*rQ<9xw0=`EnnPx1iCEqUJB zGy?pc_WiSau(Yi3Bj~9V%V}1V0`5wtyqCAyN`<1oeYCw5b$MpQyv~1DU=7L6t1N^f z>QOX3KyGvPCn0lucR{bb?tfCfxCd|aus1$7lA*0i1X97>gNfGKN*jB6F!oVP+yfq- z4~RTM8)0QHt$YhrP_&|{5dSW%6cUJKSKm8_`VO2T46KLQu1k|W;L?r3ngCYT7i89b z0~RQ8LFO~}jghUy33z}&PYn7@kM#?ATh80vI#yp|j0Z?Jk3~N~D%ST-431kxtzDIE zh4P7B)Z*$Oes}G%$#U705CLsW5iba zw6GLoj%MTDo?$cC`*$^IDBS9l`uvO$GfKS0SnM`@7t}9Sp7)0VL);;ppr11jILHh`DZyr(Z=ONOM>3>Bf{m-M@7OE5+ z%=Gtt7ad5Mo7lb&5VY&r?+Lf2E%-Ee)QO%?roJh8CQ|n+ZVqsVNUX8ncVL@_BO+O< zBn7|<;4W{Ho$jQ=KKBX!xr>Mgcja^p>8$_Ra`0-2mwJ(bj>^tO9inIvY781MTkYqt zve<<050Iz*mi|^00o-ZlKf3wffD?%idV8LDwSZxWv8uw4P~MxeMf2>liX_Xkoc*@cEw`+3?-qpz26KFI?C;H`XIBY3{$nHV z^X)4X%NN#&iv&3n|2(Sgt=~jOo-nRJRBXUhB)0T$0050)u8sF# zatLNgdiE^Np&#%>;0`QBdKHGZz(Nmk%6W7vcICYTW9@X@%99lYv#TrNSJ))0{Wt&f z`jg?3{!6e##vl&cvc)vVTLTF1y70D7WR8==}$>8T_h{7Jm3Td2VxB{~7@wtNR()&^g~rW_Y{zHx}1Drey?!ymWlB|^+Al-`dRcIC`_ zFGFTVNj?jyD8ukIH|gAb5hM9z)IM-olyS+^$_?Iw4+}yvlcvV}F6ZSN~)7?4jF^>DWC%o7`lt z#WK-&xdw*0@MVpG%xQ~B#{yq2i1e30(N2zDiV2>WPv6>kpWk4yO$nSajSHhqIZ_rlv*k; zVNe@>cmoPTepg`Y0xMkftMN}IV`}4WanliARIiAHmJK7UT)>oUV$#~iC5x;g5|rFU zvyD#TJwPqTJmYw)v0RWoGHfynYFa49XKf}DfxIwH} zLFMXgWKY$)%yJaiGa0p!RGcBZx!O~vEAlnJ=wUry8GD-NuN#zQ9({4{z9w8WNf8Il zebiLDf?9}~Pce5x4K=H*>B(;fBq`>`Y`XBwVgNeB zm+e(}gEiHUNtGIMEJTctG#2br>)BC;YU`KE`shLoNjX3iB@dhCT2W`t8du(Z8WYI7 zs9sLo%CAo2%|#@myH+nqqu!2My7b?9E_l;g%eDx+hLaX^6n#arGA;ng%$Fc7KX(^d zza$#(@X~E@Nmtc#^OTMx@DfL)g`>=|25$_PlFxd_^IZD z>i8TfYgPm?*LgOx8wJQ(Kx5@&@!gY+i}Cr5*jE?%DwMGZy1k>*&MspK_xlEo)I{6{c$FWrDYbOSLiXMn268G?({b&sI}n zOzWmcKjdg}! z&k?CycBK>K_r{*v3YD3iEVzn)W)Cv1yi{5U?1t?OHxoKpuA{xV3ox`Gw&WPGRH12g zXS&19zVOorc#D@ZSjO+}Z*%Xt>%3nC$LY)VbsxMr=g?q>V#g4rAYC}f&61*+t_7a#M0YLsOJ>Trfk$=tA1lWYuOR znojZYPimH3 zPN_Gli>YE5vP9{ZB4d6?3Jwdde+Rm0IH@XuX0<$ojUk+?j|C1l2Kk*|j>dy>i;HHB zTwq;F>Z>{6d?Dq2xZf&|o_FQN!7ciu2M)g&Ai)L>Om_!!EVREBk9ZP|?bQbK#E5!h zRgVhPxZFmCC?gYVUJ_>3dB4V`WCSz$6B!6lbQJ)BbS2go{ zRTJhAf(cIE^?Va8rMO5QL7qN#d*u;Co4~P>-an6yW43DfcL3mN-#_qM zpljWdsFa8ME!}c?MQ^rj?Dxa%Nmt|+zJ~3HHoxnxGxSPY)$qF>ypzPZ=_)xp6gXql zT5e;*cib|9N*N^P_U*cB1oxcK-apq6a%+&24r#H*jsMheg)0f$j#(_g%<9$w4<0`> z5U)1ZpPO)QwojcUt1v_twSmIBXWDKWVZMKGa}^a~@|UCmEIE09YjpA)rfTHV49s*S zR_5+sm}dU2Re1R=h6%||mM%SK^5hb;2njk21Cn8 zT0hM%&oPqQH-2y+Q%y+BrlLx&0bPywdda7`3WD+?rhW)bq$lmFm4tDOtgSkQuV_3Hyd@xa!A z#tURowg9%=g^phWPUMD_LIiXUF3C{Jtr^|l&2NqKxbG%613#T_yH(vJ-7Mn_>0>Ov zCgdi=J3o(Sa+vcI5^4B=roQCVFoH!nl5KkbtO_z)uPtOMYRl-h7h1ZVzQWORFa^Tv)tvOj#A{I17~S4}wW*dS!_6~R_n z&}AOJky?2h)7HjG>Yp#!#!y9@?cPBVR4&qR*B@e%VcAQut-O`9cI@$DEGC^lSyA(T zxJwy=Rs4H?v(UsgjZI8&hSQBN=Q*dd*WG>1zzNW{109WW5F=Zh=_iXxLSFvFqw2X6 zVzedpVc9y!1%ysGX$b}KQc**n;Qvcpea-<$qfCFr)td z3ueIakB2~>eG%zy+q$%b+Qo#Pa@h?Of%xJ)>~WJ|oWjRehupY^;o;kkDk5dx3o&o0 zgn9a@6?Dh_+zxhTqffTevv9KPgQO~r!G7XvjsXXxbc_V=J3ECKH7|aO+vQ_RLiDmT zW+-_*PYF;yJ4VI&Vc02Q{QkZb!a(Xf_b6awM{`*GCQih$;KtI&C3M~L)O2NYAXXA{ z5P_-SMq9fqOyc`e-bJWD`DP~pkA8e?f&9zQq{?UraSPXEj<}D({39yK<@~a|U*e|F zzA3LxUJ)1)E(X{?+u7%skNK25I>eO0D3)d;{MBh3{szGe%S3kc`FAKB94F7e1y2l3 zy`I#oF@)$(As=&peg-ZC(QgN=!Yt&n!}C~se&#uxOUhu)ADGftVp+V~8j!rJx}L<9 zHqojjz`-ub`Y;j`M6bvyBL7)Vp59bNu40~mGW=t1HwDF?`xSO0{$Ji#OGDn*UTNn` zW~0A&*quyA?>)!tMwc37$N&UlyHuKk2dcaR#V5u98vO4|rXZFmQl{WdLfK%qb!D)- z1@P9-&c{M)HG)0e-R%#YoSYO(Q&Tt@lgrED%XxV;#32z8q|A~_JC<~WqN1YeCE7D9 zD}t(tro$bAl77lBZG2{mG>E2@l#t0c{HqlCC-NCW@nLZ>G0&aUwY5V|B1riBKw@xB zU%q@nqU@lWpv7XMqZ8)l-~c&82Ub@fyMu8kwgJ=3K-0CLpQU4b%ch?SYY%MG%(BCiM+Sn!A3_|78XUhz{59V0m ze-{=eplkMy7Ld8az%Qu1$ z_BwMVN&-G^-p?kAVQ2A)i5u+i-pSGUYQNpS*qfRRN=Y_66-8B7)A4h?!(TykMm6d- zAM-!yXJNxPvM{p=sja)^+|o|n_3%*KZwu4Or4&kMh?F09fWFLo=t+T7^ z#`CRT7?xXdicr1nY@edwUZ`NO1HYyRE4%1$Oi)Nj%!XIq3v+dvxoPKpik`PW?;Co{ zEha_}TT69~*+k6E>6$4@Ci{sA2?@7HQt)wcsa6rS^lHv0_){)0gzi`@Q56-gJR z6)0`keo+7;$?DLShNH508%D{~;2=2kr6k@kO(7 zb8AkoKE+4>-082k3N}u5cL%91A7VhI8YHiraulT^h_Nnhr}E@^dw899qvUAxf0&q< zw5N6Qg27-~T3Vu!T-V2H=e^0x%da;N7R!yGpy9DGDQ;%wvFnEcL2H$2yq}I#RyH>A zteji048_lHaYy`li?ynHGX>vRQIC#{jvgsvHSzH9T*m*oLlW)hUXNX!^|oJrw;PK~ zd;Q5Q-SzomLzP+TJ`NHJ%A|rnx5K*MPx*Y=+HdFE-QD8e-jD6=!gTP?ozpbx>gqJq z)Z}l7(RsWvD9D@NOx?JX%9pE6Xv@gT`deiQO#Id*yRbN3X*oSTUFZ;?g_#t;-Ym(; zFkGm%SO=RT8EQ2DIG0J6+hP2ajzpfV0InKKOG>-`;}Yv%L={(f?>=Phl`C5%fkbX{ z-9vB0J6&+qg;B9MH9dV}uL0 za@0?zA0@K)I{b?ug z`Y(L;`iKXw?sP`OJbHQlPH{II{Snd<)j{-zMS(%*NX3kV4Cxg5P?WOP4j*unhHeYjX>Cj~8wB;k|v zqyRvfS2%?9TQSmlH3*_!sECGE*6gqw{^BM2+XILCNC1n-O@h8vUliUR-=6k{6Ujph z3-?NdNQBViMdwWa=M5)&jRon`cP9@oA6LgXHTR~Pj?-X6Nf;TQklafY)zs7g+}gM= z>yWB{z{#GVVL2cam6S|pa^IbSaJ5!kuht4iUCmwED5mVI=;$oUGPl5!4HXIwFx#7$ z`ct#*lp!Wm~UVh2>b9ncj|e>_p*&Dz*i*Y(nBsE>?FDtBl*=YhS|r2(=QJf zukOy7+r6=aTV`n`eEFy6=iiW$qBr0)wY0R%`TNe!%+$C+_YGgemqT>=Rg7SuuVFQmU`LtgNiH^}FZ!3aQ$))>=wRm<$c(6BG`rCiNCmdGsoI z*SEKP4R=O|^hGj0HCEsN;N|C+QF|Gk2bFRl;IvJ5p4C{nfuMrQY?tb>9%4C9qiz&|`1kksr_ePpNdI;404`iwTB4Rs za4vYK*NEHX3#Oe@;r2ypM>ho$Q$G{}&VD;LpO%&u7WV3mT{^kk3xyxy0a(8{tP)~< zs(;ehI}R+IBy(8RTF?8y6%)OxK+;fGH#IY(#3UnY^M3T2#snkiAQQcJ`Y10S|8-t@4;BL%V1)(z+BrZ439$ z-{=otsr_Id;$VKw+oP%OyW^Q^Me5RKqPKU9>4T^KacwR82L~TU#*LE$0uXP6!(V%Rz+v9%B1eoR5UG)MoSpT3YmwGX>F3?*#azn04zh4J0a>z8-3yKEUOnC1|wH z{N!<>dB^sOtTop)foo)(K_2kSazZ+4pfV80!^7*$OXuB6gE|1E$PJ1(s&4G;tojbj zL^}#^3SK?2_`QNg?Ae*)uZU0yg7k4j9thd#*`b7tOo$r3rrtyU1u&_&~J0#mTOiVb|6%{cuGRlS- zo0yt@4HZh#cqtGQ6LVrs`ua73j&*XTTJrDTzkz5&fQP4|qB4JJd6FtM@iG19Pddah zXIy;z&_B3=FcYUIS-5n%J_x^p&-t(y;vZS=i z-zMq2htGL4QyxtTEz};fvM5-`-cwSF&B}nk=iL{`Zd7o|FU|r{y1hMfDC0>nO-lwH zK(#(d+4StGVOLGDR&rWu3Qfx)O+ZW<&Az_JWPl?Kt@VO_pn3yYr z*~>7`e9PvGxbR0QB!|w$HaoYQ29lMunKPlX$3JVKD`{#5S17ft`$A87lCrvWwefHT z6zL7^rR^+bzIk9kijS>QNWYtcFmHNY7ukKC9TtIWQW&+gbc3WdJ#d_L5|uCCDhi2A zWM?Qsz-0yvj=49;Vgk4u{9UKqD4P!cY070QnpR9$niZcBY(c*VpF| zw(wWq*7Y&B?IqqsrV6;v?iWWyM1WoH@0NG$_HRef9B-Xw-Ur30#LB6$(4Kb;iP?rJ zZTG+53t4=~-Yjf&+L2U9UszZG%D@t@x<30Vtd70d+)J*sQqQqmfM8*2(q{LZG-C(+Gntmr$%#lxqZnO*>Y2EO`_8%E-3t!mQ2_^A_d z&nU;iIC>5a4vNasQYKbbEDmuFWNn7SN3*c;ibt_sh2UMI78Z6`72j`|O`Cgx3~G~@7lD#; zKIIxTCE`Z0O+>MIZ4do52{4m9&68>w4aLYdlROP<>VVr7?u%agy;$4VvYJeX3+9tP zbMH>9XSy5X8$i!!85M~%EZFsO7iAFTaNKq8Ml1&`b8uzBNL&t4upApRGVuyCMQcH_oOe08;33_NsCSMj;>>X&B)M?S_LDsaF^%{#PO(q>L z541L@f}ZKjeb+mzPoItU0Yj&4kdJNeh13OO_bwl*!1ud+QWA17n6Lt#>t+3J%{i#MBrMS(-ZrJmLvwQR4@#BqH0`Zg^}Sjc z{g?W}LW`b|*Pk)5V~m{|nY^pNiirHM$ZSlT;Yhs?IcR+!r|=kzdHAB`o(jn+6NTul zavM@gw!8{9hjE_}&0IJ%$p-2#9a<`VF&iDyU^+j{@mj1{F%+M9cF;Hcant07StO$q zpMliU-~?;wq>T!h@n_nHSc?GdN9p1cGf+Cu4H+img>flwZ*Hph%w_=CP#$ML5)je&4dczTW@nlI)Jz_0Wg<35sRQi== zFwUQw`CS}h^h3C0i`sABzL~E8%~C;_Q&m+JmhWt=UA!C=c~suX$tj(8L|mqL zZ?Bhk&D_Jo1Bgb?F~XElQ;Dy%kfy~Yz0bJHMah10oJ=E29$i8Y@3@W@74B)PnlMK{(ggtv>HIonKm7dU4@A&&J6tYj1I4QT>LH zmRD55(a|yLl@G&?S}27Q>-7hKxZs3Q=`hpNKlN9f`6>FSR4A#}CtVne7k~>|tDCq~ z0;i#t{iRU4Pp%YAVjxq1FO?22He9%02^?9Brp;)kdsfC2ylG;~UzF#qBRJBrj|X>o z0+^+Ld%Pu9?ggK=S~43+km6b+Q^#}~b%$7xo7*GvmKK|`me9@8^7l~*0eP%SI+OQi z&2^S9*Gk(>x^4Xw>KDi6`<Z}6GX&7|t(xN6N^MS^|!PudT}y)w3g?yY#k1}cpEXhH?Q0kgDN?|7G{2aq^G$AOERb8mF)=Lea^ zVQYj{XWaFZ=seh)IUMS(-kSk__O7^7dXudt7U)HkUwvMBJsMJY&x4P|+h4a)I(nJUf zT&K8rwH|N2Xq$sF*R4SPs{XY0b(JzVUG?>Xg?6A8cK$QJ&J66nDV4GpZTx8ND^7@_ zd*`}TVD{8~zPWn$P**|<-D^W{y&9q{!9!r(|vB-!T8ymIL8k9p+MsQqOYInHu9t8>{xFkAFvHy1AG`QY8=N-TrK*kQfErKm~ z`IlTP_c~kbkDjaHF8zO6JMBEIfP_AOmspCA4ha`co-?L0`n@eumzYgZj_=8_GblL?u$mKkTwIVtZ9y)dU_L&7vRmpv*kMkqT`o)4zobF2@qx$X1R;$&?ToaASzpOI&Zds);jtJ^QVg;0jspf zmN6Lo$Xp``!dTXP_TYZ3HL}HiHXRH64~aXh{l|-f@A1EWrunY}xk(b(Vf9hszeYxX z8PN<~n*vc5DsoHg;^;E%IGyJRiu@=JKzpJj*fMvIj=VCDW@7NYcS;0B3^U#^A1$B- zI|?GN1HQZd?&^YHF&0Lp#O8qKH$wB~@0f(gtuAhhM=djf+P@%E1b%u2$x;F4RLqJ2rHD(pDW*iK7gb)~&Sv%UBKp+# zlngWiwdn9c06HBN+u=fut3En1@_e;L zY!DA*_8!Kpz#fb#xq5f2~YTViOTDGEccS#t!PJ4L>{wot^AvM`lsl zzXpo1zsDT=}y+G9L3sSAF*+AQu@K8GVGK&8w=K((xP|8w38EsA*23!D_bn zR6QMjYimn3k!gmc(lYDl$W|A9KTMX9fnhR%?smEra=18>`3Nr(4z#4+pyLW^WOA`Q z#gUPb^X(Baxb!n{PeVh4Y{I)er5_?4rB0sOb+#nK;yOA+2dI8B;=O%+$E$5^b#-<5 z`7fi(`Pg21j71X!8k&H{_IyrG?2S|m-6|_9M@wM($oTViQb6Db9> z`%%%+ivht71q~Eh!^-Oi3Eq z-g{xMbkghryRZoCVs5;v8M4+)MPLWy0f3Icu>N&InJExd2d0gTulxP;993Mnw7LLo zXx-1Ne^hjJ&+#WO=(il4|92}$iQpfno3pK%nVIrwRD7lbr@ORXS5+OGTbfS)cCHw~ zgj(^UToq?MyH#6KC^80PeG&$l;Ja9@8Y*aT)SpROkFC4=`QN27`hExf5?6JZWS1waA^z2^Of@z(lfC`T( zsV{-b?^UiKARo9o&j`lIJ|Y`@G^+G3aX1qC(@~X|C;4tTLUGl!yF;8X)i-mHEKNmP zTH4XE5@};z%kO2O;$O2WTnuDCn!r|M!B#*q?+E^o?&k-8n3076Q`OgJT6M52GFuSW zeniGMSIdemy^>EKH;}OcKb(^2WZnh3V3GS?O-WrVO zJWh`izI~tvsDRebz&D@D2u)5-`mJ?%P?BLG&AYoxA?f--~rsd?B|g^coLO)XKj^$m_0tkFUJBxw$74Ka^E6N8GL3^~?C- zG2_Oaz_eRe@ZmSp4n{UX-3{+K3R%3`)DNQyn3jc!@7_7MM?d{FU zp>kCQUMyVd2C}j{_@NJA@Kc6+XL8ye@6K` zlnMXdl>Hq>+RUTRRd_|)GJ8qB{1$MI_?3EkPBa<{ij0DSpu>81`TmqgJS&BSWXq{Y z=HD!)3!{1tkgNbz%5FAFEa;i;&H-E<8xu^ zWc#A8Pdfc&wpgpAq=d6)I8DHPDB(ROzuw)^a#JFcUZee=PJqpFPi2WnA+P(}D=X10 z<;karo0ysHRDKy!$_4DKH72qjE1w4Vd-dKEjX&tUP;T_1`sJVM>gu~Y5BQVdayg5z z54okK=rn>96wlrANLX~MOyvPW4}fr6+tRwPWLng;v~@K#9aq>haP#x?T3T8KJeBhD z^3d55))`v6^J$4>P7+{C4KAdgOITQ1ikf`<_)$vg<@0NC%{<)b6Bd&kG(c9RXJ7!F zYGJ)6RAP8Ii5-9xkCQc#dYYAm`~Lp^SX#yX$&Ah{nJ65+c;fw7bh5L5jT2XD~{NHkZ5s{ZFUW<0g(?1)!jEr&RRxN}#Icj8iExp<<5%*9lfpFq7DP z3jt7cp1c%LAt^nmeEY_;l-erN=A8^!4xrFMu@`J?Yzzzx;snnQ2E_n2G!TQV7C#aQ zPk>pjuB)S5^znI)m6Vc_lA0P$aBW$nQFgft;hvyP;g^RLhHl1#mH58)qdcmdDVhdjCZe|PYwN(qRZzY6yM zc=`VsEB`%U{*PGcr<%-9PEPjo^ZWiC&f{pMC1vDEQn`Tco&4znDwx}=W2x)44&UhL z=pZB6Cw}gWC!hh$C%o6$Wa&XcVf9D4Tie7a}ph(=lqvd=9d~RZbcKJ4ca8L#~+WM~t z`C@_S65`^-{I2C=EZ+Z!J<}J+2P-Xnf`Tj8x3qs1tcm|Xioa|A?+gD67ykhg|8)=l z>rheA6STSM!A@H^M*6~WF-1VB+l&&(_Zmkz*06+KCQ z_BOy{rn8%&3w|;2^72wr8b6q?($Uee34t6Oh(CNxii`8R`{oU(ganiMfctK4Zr0Y; zrlpbo1QA)0;^TwI$KeEu3JNsq?K6X3VPKS%mEprG+@O{zA9rBzH_{(J3VW_^Y~*H`w8XUI&?>B9 z3LeUW_hW};QfMa^aRZlyUwgk^Ap?dGyrWGW2&f~MJY2IO0DXCUxR=E5{xBH~?3f9_ zq37l2FDBaNDyl!ko`&$dxjreRQt4-BX9@4LCIK@|O=S})hK7d=cwCn+`Ip#PTled}V9JmD&0+vKNQ5t0paOW?$go;`$NQsI}F!WR?ZYqH88OACQ@|G z=BIMeFgD((wwMb0lW7xzRnIdp4#BYvny)e&((}V&-+!1gwDqa*ei3eh)@Q7B2_)#{ zjB z`f>l0AU~kr17hpxGfp69ynPE7AiYl~r}m$$c>J0GY&W|; z0nk9Fr>Al8@IvhM^iumE%heV*pJ2DQp+AA(1dNYc2YA)!sDk?*hq|T<2z>~u`3R_g zna68t8O4CzgH6Hlxg{y`4SC_kJ=O0Vjsnn##!=0QFM@`rirfb@%~EdBUXS-IPLCKH zxK8Ka-Q58)d8l6X9ng3Z?*nIiZA3+%CsXtCx&f_Ly$v8n@bU6?PpquyAJo>=@D%6l zaWLsOy8<*EMF()Er_p2pTaN^BYD0m+bm3>-m2U)aa-sug#=m5gBrjsNchP&InD?nK z&CJXsCnvvNaI?0*r6^E*VQy>NYeQ~}&T|x(k`k)ZEcRt@GItJCpm;rLJ70B$Q zMZCVUl8ujV@#Z>>^HU0T%=a?Z*0Fk*t*&=RucnpMXBfm(U(p`TRlKN$8#AZ)_4DWM zshf(5N-p}JB$5H8z`q)9SaI}|mrhuFScp5K08$rK zA98GLY^uiO1z{wqK!~e2MVM(cWxB%Ahe&}V9f;O4#)1iOXsLWJYhj_h&nd7ryXM~f zQG)$&7X+CV`Cpw|X*iUB+pfQ|Wr+w$2#q3&5HW)y`(!T+Sxc6fvV@^zUsA|!hA<<` zXt6Id8cT%6zGTb3)kqi&GxOZjbG-lOf4uMe>G?9p{bla^zV6@kJFoM+uJb2hDvf-d zJ3%Jv+(K;?VlV~r8|R(#mj12#@~&{gp1FI!bI@V{AVQre%)W$$MYRBmyw%dPg+u;4(7f$988W;oB)S*%4=IRi11J@#lUQ z+HOG2HebeYoJX2a6WrOk4^p=Z4xty8W`D*3eXU(!hWo_NPw5~(@|b{HnPT&t`k7KF z3VhMI_tvkXh>KslyUR*S;P(2Z9<4hyK$4f0aV+*{z%TtBEKz;4JC0u_!4b5?<#^L$ zzmFF0wvDr^E>B?&puy1KTzWMy-uK8Jozsl7d^m$_7U1Sq^08^d#Joz#bUBNJ zNL!DyTDjiYgW69T0)ajp*Ahqy*1x9UMw#d0y!3*6^@`j}mCTt}5;y-d<9=cZeCZrW z7#QaPbV>kxQQk&{kbF^zxD{$1A}!JlXm6|$Ob#$w{*@`g#5yo=`!m8hl=%X1XS&+5 z`u&8{>bby#x{?KUOfiu~b3nOGMN(Flqw{z>NDW<9=DEA2Z&77_)Dm#Um0_*ZZ5xP{gVyt6rWr4f&ZF z16CaZ0lqDBdwV1b1#$FB1U)}il@^LrHgYxw=x4&YKwOmRu*qt+C*_LK5--4BTLW6( zaUWoO#T8v7|M2<$BYQbsfiFq{vU@WdOwg@1LlY7*By3{e}%1C?WyoM&9$y zt`uGmW7u4U8TGsvI>8{kt0z<#M42NUY<#!v6fQna)`uux8~C>Cc5iXze4F9KwpMvg zF%R$$1>{!eT*`JJAJVa8FX0US*jc`GJiNyj&oh9jwWi{7W`A>=+8s8yo4{K)75Si} zpqP!lNzATK_nQhU@Z65TAx!6rpz0Vlu>EIQgq(k(3qpIb0f!qzmanUbS3CQsq77T+Aj zde|@*zbKv&m`z>ok;~TI{mpL4hV&g9MMOsuWZ3J*A_MK_1X5BnE~H;);ToeH-cOR+_P)kbi=7q$$*4yzr#P=7Fi+Ie+mpv0kCI?DwOLCF}$j zz%C9iQ?%z!9oW%G+L)SpDNxAked)r!0Eu) z6ewYl@VWkRq6fttQnC8uK*6;2X+hKVx6rgm=8VU2uWh<6s<&J;xoUka2JnUeeI39A zF|m&7pQv~%377N%9L?h!8r+fOpv#7TolP`9xSm?eoU#Z{S~q66n*k#6d1qcTXJr@3 zO)1Rf@^S5Xf^p2)(pR~m`ZEUB)|e~mXjvTC#c#U?mo_o~J+VR!H*SsHlwdI4l!(S<;_8$m*T7x<5nkbifpV;gwkYRLuRtGd=!yO~HBjTBe z`X*Dt31C>&^m>;JjFwNbR@iNn{JFUU?aQ9rAY0G8wqT`8Txy4fu`-u6I#DllQ1|UD z#WZN(5$Aj#HQ*aB^~$VPc*yH(K%%E+;5U9t^O?+x&F3&ymX$Jp@-;27v_JOZOvHFd znE2NZT5`dIk&DS|!ikiqtUPc!zs>OH(XK{1o47L!Rht`DTG=l(1^Hz7NWrRo+Y#tq zQLgZgj|9|*-$UTOF!|Sos)_@PQTxaCNoi%|k5HH0qlu*P!pT7TiGM)He?a8Fzj`@y z&kZH2T+IY%ALv19#XXicPhASRz)&79Hw>DKzErk^ zTGMJ|=54+6|GI^)pbaWfHSoRTc7LRI!JI0L8jLqwSM1Br^Wf7P6u^?w-*=@hmt#HX zi~jGh)Q*bcI1yVwYgrIg*1RM~L&}hpAhjO#1Fl@Uu*+vS z@tl|>I^cPOgZSW`k`V|{n*oq)m*Ux}ce3}1H*dD)&+xksHF|CM zZ3_tIn3|*+;j^|&hcO9;m%rfHH97Z8`IOHJ727NraL6p8AU&O1FX2(uTr~NCOA)l! zaO5a^N#SJEvegc$QiaMuUWFHRt4|$%ZIcdJu=}fTHDKe{ckNJl*L^Z>7zApMhNH7x zW=)xVEEXkrS?u2iT1dncHGy-jui~FIP%RldrQ@nwJ1BHE_rzb`*GM~cbr4jZgJcAK zJ}nVCG1WPUYWNPn<9REnaR%W(?C;Yqa5ncI8607D13|$ z3;IG0zqy*&Bbaskqan#(mG9pU;KO#?l)a6n3c3vh7cjFxDiA>2g!mEso`t)7+fXTB z{{Aw7t+8JK!TTb;Uvww3^iN=!86Sp^R_O6;N^sRi&tZ3q40q+Mae<*xNHMb1NLx*V zoj`qy0|h-!l4!b`y8FzQ=`XpVUFbs!Th;ZT{19@uWB1|yn2ea18iYUuCH?PYE*&({mk?X=P z9ZO%xs+q(WE9DxP{P&ySpY`~E-KFC;8aml-nqOe%sLh%wwrF3I=&B<$M{zOIXT0U* z2PDu_aGx#X(goUR9w8bkcr)BV| za*Z(mg5pq&L&k2I9)d%8RcT-aW=8sJK?5ba2XdiGE;ZnKmzP5N7C z&k^htk$<6->ErgJ39;vOx1A#q*U}l(ss#&mFt@ysP))U^ubmd%>eO}P+olefmsFf9 zS~LEW&Dw}$3HLM6jj6N|<@C2%8?kCv?!{4ek%H*`7Z{I5O$1~R^W{0Y^&zJ=D#xMB zH-uR8h=J*V7-(|2?E0O_&w3|F->CMuqD1u_Yv|XcTD_EyvO7UTd%L1Kdr|fA{p)5* znolVcQxzf87DTn)Fum@i`zz_}9rGvbS5r3QhmgT3V|6tQXMU?eM2=AcxflwuD4I1N zBGENdetY``)$|SGCPkl=dU1y3x$VBq+T-Tf)4W?U=st@mQT7}%I(zfGd(|>=kchdm zj*3|SP=$ATD72U!JP2A6@W^q%LH&dvmKvC&)emkka(V_%@T`SutWi6C-!n*SbSK$7 ydfR6h%BZW_QL)g$9#zW+6n~w)G0EE7|4%*Qkf)1^zS1TYXc&|O$MOC?yZ0{$NmSwh literal 0 HcmV?d00001 diff --git a/test/functional/test_site/expected/index.html b/test/functional/test_site/expected/index.html index dc18a1dd28..b9598c2667 100644 --- a/test/functional/test_site/expected/index.html +++ b/test/functional/test_site/expected/index.html @@ -469,33 +469,48 @@

Markbind Plugin Pre-render -

+

Test PlantUML live reload with include

PlantUML Test

-

Sequence Diagram +

Sequence Diagram

+
-

-

Use Case Diagram +

+

Use Case Diagram

+
-

-

Class Diagram +

+

Class Diagram

+
-

-

Activity Diagram +

+

Activity Diagram

+
-

-

Component Diagram +

+

Component Diagram

+
-

-

State Diagram +

+

State Diagram

+
-

-

Object Diagram +

+

Object Diagram

+
-

+
+

PlantUML Inline Test

+
+ +
+
+ +

Level 2 header (inside headingSearchIndex) with no-index attribute should not be indexed

Level 6 header (outside headingSearchIndex) with always-index attribute should be indexed
diff --git a/test/functional/test_site/expected/inline-output.png b/test/functional/test_site/expected/inline-output.png new file mode 100644 index 0000000000000000000000000000000000000000..32a71b61dc2e0e5548cf04df55d0cf5ef36bc85e GIT binary patch literal 17943 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 Kynp?6@BaXD=N+j4 literal 0 HcmV?d00001 diff --git a/test/functional/test_site/expected/testPlantUML.html b/test/functional/test_site/expected/testPlantUML.html index f766091d47..859cb60bfd 100644 --- a/test/functional/test_site/expected/testPlantUML.html +++ b/test/functional/test_site/expected/testPlantUML.html @@ -26,27 +26,41 @@

PlantUML Test

-

Sequence Diagram +

Sequence Diagram

+
-

-

Use Case Diagram +

+

Use Case Diagram

+
-

-

Class Diagram +

+

Class Diagram

+
-

-

Activity Diagram +

+

Activity Diagram

+
-

-

Component Diagram +

+

Component Diagram

+
-

-

State Diagram +

+

State Diagram

+
-

-

Object Diagram +

+

Object Diagram

+
-

+
+

PlantUML Inline Test

+
+ +
+
+ +