From a59100176184b9700da1cb1b838106a6baf6736c Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Sat, 25 Aug 2018 20:18:59 +0200 Subject: [PATCH 01/10] add parameter to specify the height of the diagram, fixing #2335 --- browser/components/render/MermaidRender.js | 1 + browser/lib/markdown.js | 2 +- browser/styles/index.styl | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/browser/components/render/MermaidRender.js b/browser/components/render/MermaidRender.js index 12dce327..bac52b2c 100644 --- a/browser/components/render/MermaidRender.js +++ b/browser/components/render/MermaidRender.js @@ -28,6 +28,7 @@ function render (element, content, theme) { }) mermaidAPI.render(getId(), content, (svgGraph) => { element.innerHTML = svgGraph + element.style.height = element.attributes.getNamedItem('data-height').value + 'vh' }) } catch (e) { console.error(e) diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 49fd2f86..d4bc72e4 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -44,7 +44,7 @@ class Markdown { return `
${str}
` } if (langType === 'mermaid') { - return `
${str}
` + return `
${str}
` } return '
' +
           '' + fileName + '' +
diff --git a/browser/styles/index.styl b/browser/styles/index.styl
index 7d32e77a..8f917fcf 100644
--- a/browser/styles/index.styl
+++ b/browser/styles/index.styl
@@ -383,4 +383,8 @@ modalmonokai()
   width 100%
   background-color $ui-monokai-backgroundColor
   overflow hidden
-  border-radius $modal-border-radius
\ No newline at end of file
+  border-radius $modal-border-radius
+
+pre.mermaid svg {
+  max-width 100% !important
+}
\ No newline at end of file

From 189b245b1db18d1ecfdb4034187eb09ae0b0a46a Mon Sep 17 00:00:00 2001
From: Baptiste Augrain 
Date: Thu, 13 Sep 2018 11:07:19 +0200
Subject: [PATCH 02/10] add attributes to fence blocks

---
 browser/components/MarkdownPreview.js      |  13 ++-
 browser/components/markdown.styl           |  32 +++--
 browser/components/render/MermaidRender.js |  18 +--
 browser/lib/markdown-it-fence.js           | 130 +++++++++++++++++++++
 browser/lib/markdown.js                    |  59 +++++-----
 5 files changed, 207 insertions(+), 45 deletions(-)
 create mode 100644 browser/lib/markdown-it-fence.js

diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js
index 5376a773..493b1fc4 100755
--- a/browser/components/MarkdownPreview.js
+++ b/browser/components/MarkdownPreview.js
@@ -738,10 +738,17 @@ export default class MarkdownPreview extends React.Component {
         try {
           const chartConfig = JSON.parse(el.innerHTML)
           el.innerHTML = ''
-          var canvas = document.createElement('canvas')
+
+          const canvas = document.createElement('canvas')
           el.appendChild(canvas)
-          /* eslint-disable no-new */
-          new Chart(canvas, chartConfig)
+
+          const height = el.attributes.getNamedItem('data-height')
+          if (height && height.value !== 'undefined') {
+            el.style.height = height.value + 'vh'
+            canvas.height = height.value + 'vh'
+          }
+
+          const chart = new Chart(canvas, chartConfig)
         } catch (e) {
           console.error(e)
           el.className = 'chart-error'
diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl
index fb30742d..ea46b0b6 100644
--- a/browser/components/markdown.styl
+++ b/browser/components/markdown.styl
@@ -213,10 +213,12 @@ pre
   margin 0 0 1em
   display flex
   line-height 1.4em
-  &.flowchart, &.sequence, &.chart
-    display flex
-    justify-content center
-    background-color white
+  code
+    background-color inherit
+    margin 0
+    padding 0
+    border none
+    border-radius 0
   &.CodeMirror
     height initial
     flex-wrap wrap
@@ -230,12 +232,12 @@ pre
     border none
     border-radius 0
   &>span.filename
-    width 100%
-    border-radius: 5px 0px 0px 0px
-    margin -8px 100% 8px -8px
-    padding 0px 6px
+    margin -8px -7px 8px -8px
+    padding 2px 6px
     background-color #777;
     color white
+    &:empty
+      display none
   &>span.lineNumber
     display none
     font-size 1em
@@ -361,7 +363,7 @@ for name, val in admonition_types
     .admonition.{name}
         @extend $admonition
         border-left-color: val[color]
-    
+
     .admonition.{name}>.admonition-title
         @extend $admonition-title
         border-bottom-color: .1rem solid rgba(val[color], 0.2)
@@ -372,6 +374,18 @@ for name, val in admonition_types
         color: val[color]
         content: val[icon]
 
+pre.fence
+  flex-direction column
+
+  .chart, .flowchart, .mermaid, .sequence
+    display flex
+    justify-content center
+    background-color white
+    max-width 100%
+
+    canvas, svg
+      max-width 100% !important
+
 themeDarkBackground = darken(#21252B, 10%)
 themeDarkText = #f9f9f9
 themeDarkBorder = lighten(themeDarkBackground, 20%)
diff --git a/browser/components/render/MermaidRender.js b/browser/components/render/MermaidRender.js
index bac52b2c..f04d8cd0 100644
--- a/browser/components/render/MermaidRender.js
+++ b/browser/components/render/MermaidRender.js
@@ -2,8 +2,8 @@ import mermaidAPI from 'mermaid'
 
 // fixes bad styling in the mermaid dark theme
 const darkThemeStyling = `
-.loopText tspan { 
-  fill: white; 
+.loopText tspan {
+  fill: white;
 }`
 
 function getRandomInt (min, max) {
@@ -11,9 +11,9 @@ function getRandomInt (min, max) {
 }
 
 function getId () {
-  var pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
-  var id = 'm-'
-  for (var i = 0; i < 7; i++) {
+  const pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+  let id = 'm-'
+  for (let i = 0; i < 7; i++) {
     id += pool[getRandomInt(0, 16)]
   }
   return id
@@ -21,14 +21,18 @@ function getId () {
 
 function render (element, content, theme) {
   try {
+    const height = element.attributes.getNamedItem('data-height')
+    if (height && height.value !== 'undefined') {
+      element.style.height = height.value + 'vh'
+    }
     let isDarkTheme = theme === 'dark' || theme === 'solarized-dark' || theme === 'monokai'
     mermaidAPI.initialize({
       theme: isDarkTheme ? 'dark' : 'default',
-      themeCSS: isDarkTheme ? darkThemeStyling : ''
+      themeCSS: isDarkTheme ? darkThemeStyling : '',
+      useMaxWidth: false
     })
     mermaidAPI.render(getId(), content, (svgGraph) => {
       element.innerHTML = svgGraph
-      element.style.height = element.attributes.getNamedItem('data-height').value + 'vh'
     })
   } catch (e) {
     console.error(e)
diff --git a/browser/lib/markdown-it-fence.js b/browser/lib/markdown-it-fence.js
new file mode 100644
index 00000000..040ac540
--- /dev/null
+++ b/browser/lib/markdown-it-fence.js
@@ -0,0 +1,130 @@
+'use strict'
+
+module.exports = function (md, renderers, defaultRenderer) {
+  function fence (state, startLine, endLine) {
+    let pos = state.bMarks[startLine] + state.tShift[startLine]
+    let max = state.eMarks[startLine]
+
+    if (state.sCount[startLine] - state.blkIndent >= 4 || pos + 3 > max) {
+      return false
+    }
+
+    const marker = state.src.charCodeAt(pos)
+    if (!(marker === 96 || marker === 126)) {
+      return false
+    }
+
+    let mem = pos
+    pos = state.skipChars(pos, marker)
+
+    let len = pos - mem
+    if (len < 3) {
+      return false
+    }
+
+    const markup = state.src.slice(mem, pos)
+    const params = state.src.slice(pos, max)
+
+    let nextLine = startLine
+    let haveEndMarker = false
+
+    while (true) {
+      nextLine++
+      if (nextLine >= endLine) {
+        break
+      }
+
+      pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]
+      max = state.eMarks[nextLine]
+
+      if (pos < max && state.sCount[nextLine] < state.blkIndent) {
+        break
+      }
+      if (state.src.charCodeAt(pos) !== marker || state.sCount[nextLine] - state.blkIndent >= 4) {
+        continue
+      }
+
+      pos = state.skipChars(pos, marker)
+
+      if (pos - mem < len) {
+        continue
+      }
+
+      pos = state.skipSpaces(pos)
+
+      if (pos >= max) {
+        haveEndMarker = true
+        break
+      }
+    }
+
+    len = state.sCount[startLine]
+    state.line = nextLine + (haveEndMarker ? 1 : 0)
+
+    const parameters = {}
+    let langType = ''
+    let fileName = ''
+    let firstLineNumber = 0
+
+    let match = /^(\w[-\w]*)?(?:\(((?:\s*\w[-\w]*(?:=(?:'(?:.*?[^\\])?'|"(?:.*?[^\\])?"|(?:[^'"][^\s]*)))?)*)\))?(?::([^:]*)(?::(\d+))?)?\s*$/.exec(params)
+    if (match) {
+      if (match[1]) {
+        langType = match[1]
+      }
+      if (match[3]) {
+        fileName = match[3]
+      }
+      if (match[4]) {
+        firstLineNumber = parseInt(match[4], 10)
+      }
+
+      if (match[2]) {
+        const params = match[2]
+        const regex = /(\w[-\w]*)(?:=(?:'(.*?[^\\])?'|"(.*?[^\\])?"|([^'"][^\s]*)))?/g
+
+        let name, value
+        while ((match = regex.exec(params))) {
+          name = match[1]
+          value = match[2] || match[3] || match[4] || null
+
+          const height = /^(\d+)h$/.exec(name)
+          if (height && !value) {
+            parameters.height = height[1]
+          } else {
+            parameters[name] = value
+          }
+        }
+      }
+    }
+
+    let token
+    if (renderers[langType]) {
+      token = state.push(`${langType}_fence`, 'div', 0)
+    } else {
+      token = state.push('_fence', 'code', 0)
+    }
+
+    token.langType = langType
+    token.fileName = fileName
+    token.firstLineNumber = firstLineNumber
+    token.parameters = parameters
+
+    token.content = state.getLines(startLine + 1, nextLine, len, true)
+    token.markup = markup
+    token.map = [startLine, state.line]
+
+    return true
+  }
+
+  md.block.ruler.before('fence', '_fence', fence, {
+    alt: ['paragraph', 'reference', 'blockquote', 'list']
+  })
+
+  for (let name in renderers) {
+    md.renderer.rules[`${name}_fence`] = (tokens, index) => renderers[name](tokens[index])
+  }
+
+  if (defaultRenderer) {
+    md.renderer.rules['_fence'] = (tokens, index) => defaultRenderer(tokens[index])
+  }
+}
diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js
index d4bc72e4..40c47aac 100644
--- a/browser/lib/markdown.js
+++ b/browser/lib/markdown.js
@@ -27,32 +27,6 @@ class Markdown {
       html: true,
       xhtmlOut: true,
       breaks: config.preview.breaks,
-      highlight: function (str, lang) {
-        const delimiter = ':'
-        const langInfo = lang.split(delimiter)
-        const langType = langInfo[0]
-        const fileName = langInfo[1] || ''
-        const firstLineNumber = parseInt(langInfo[2], 10)
-
-        if (langType === 'flowchart') {
-          return `
${str}
` - } - if (langType === 'sequence') { - return `
${str}
` - } - if (langType === 'chart') { - return `
${str}
` - } - if (langType === 'mermaid') { - return `
${str}
` - } - return '
' +
-          '' + fileName + '' +
-          createGutter(str, firstLineNumber) +
-          '' +
-          str +
-          '
' - }, sanitize: 'STRICT' } @@ -150,6 +124,39 @@ class Markdown { this.md.use(require('markdown-it-kbd')) this.md.use(require('markdown-it-admonition')) + this.md.use(require('./markdown-it-fence'), { + chart: token => { + return `
+          ${token.fileName}
+          
${token.content}
+
` + }, + flowchart: token => { + return `
+          ${token.fileName}
+          
${token.content}
+
` + }, + mermaid: token => { + return `
+          ${token.fileName}
+          
${token.content}
+
` + }, + sequence: token => { + return `
+          ${token.fileName}
+          
${token.content}
+
` + } + }, token => { + return `
+        ${token.fileName}
+        ${createGutter(token.content, token.firstLineNumber)}
+        ${token.content}
+      
` + }) + const deflate = require('markdown-it-plantuml/lib/deflate') this.md.use(require('markdown-it-plantuml'), '', { generateSource: function (umlCode) { From 75a0f4373c355dcd74f51dfe3227922e855f3cf4 Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Thu, 13 Sep 2018 11:34:29 +0200 Subject: [PATCH 03/10] fix fileName styling --- browser/components/markdown.styl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl index ea46b0b6..2780cb9b 100644 --- a/browser/components/markdown.styl +++ b/browser/components/markdown.styl @@ -225,14 +225,8 @@ pre &>code flex 1 overflow-x auto - code - background-color inherit - margin 0 - padding 0 - border none - border-radius 0 &>span.filename - margin -8px -7px 8px -8px + margin -8px 100% 8px -8px padding 2px 6px background-color #777; color white @@ -375,7 +369,7 @@ for name, val in admonition_types content: val[icon] pre.fence - flex-direction column + flex-wrap wrap .chart, .flowchart, .mermaid, .sequence display flex From 0a205f77b07eb19a01771b7a3c92dc2c0b5ae61e Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Thu, 13 Sep 2018 11:46:09 +0200 Subject: [PATCH 04/10] fix diagram's alignment --- browser/components/markdown.styl | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl index 2780cb9b..ea4219af 100644 --- a/browser/components/markdown.styl +++ b/browser/components/markdown.styl @@ -376,6 +376,7 @@ pre.fence justify-content center background-color white max-width 100% + flex-grow 1 canvas, svg max-width 100% !important From 57fadacda0e2ccbe1252ee705415a26c116fa671 Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Thu, 13 Sep 2018 12:17:59 +0200 Subject: [PATCH 05/10] update ava snapshots --- tests/lib/snapshots/markdown-test.js.md | 9 ++++++--- tests/lib/snapshots/markdown-test.js.snap | Bin 1724 -> 1730 bytes 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md index ffc3d699..dc7efd31 100644 --- a/tests/lib/snapshots/markdown-test.js.md +++ b/tests/lib/snapshots/markdown-test.js.md @@ -39,9 +39,12 @@ Generated by [AVA](https://ava.li). > Snapshot 1 - `
filename.js2var project = 'boostnote';␊
-    
␊ - ` + `
␊
+            filename.js␊
+            2␊
+            var project = 'boostnote';␊
+    ␊
+          
` ## Markdown.render() should renders markdown correctly diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap index fc310cfd28f22b2e7d20fa14c94bd5f9b806b0fd..d814727de0f944aa205e0e2de0a5f953f3a7e9e4 100644 GIT binary patch literal 1730 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 Svl~TT8}l!i*8=N#6951$K|E{# From b03c2a1f80ea09a6583294724915dd71388a952b Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Sat, 15 Sep 2018 15:24:59 +0200 Subject: [PATCH 06/10] fix XSS bug --- browser/lib/markdown-it-fence.js | 2 +- browser/lib/markdown-it-sanitize-html.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/lib/markdown-it-fence.js b/browser/lib/markdown-it-fence.js index 040ac540..c2a77a72 100644 --- a/browser/lib/markdown-it-fence.js +++ b/browser/lib/markdown-it-fence.js @@ -120,7 +120,7 @@ module.exports = function (md, renderers, defaultRenderer) { alt: ['paragraph', 'reference', 'blockquote', 'list'] }) - for (let name in renderers) { + for (const name in renderers) { md.renderer.rules[`${name}_fence`] = (tokens, index) => renderers[name](tokens[index]) } diff --git a/browser/lib/markdown-it-sanitize-html.js b/browser/lib/markdown-it-sanitize-html.js index 05e5e7be..fb7267ee 100644 --- a/browser/lib/markdown-it-sanitize-html.js +++ b/browser/lib/markdown-it-sanitize-html.js @@ -14,7 +14,7 @@ module.exports = function sanitizePlugin (md, options) { options ) } - if (state.tokens[tokenIdx].type === 'fence') { + if (state.tokens[tokenIdx].type === '_fence') { // escapeHtmlCharacters has better performance state.tokens[tokenIdx].content = escapeHtmlCharacters( state.tokens[tokenIdx].content, From 297c764fe1844cba66e0c03c40602fd41264ca11 Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Sat, 15 Sep 2018 18:33:02 +0200 Subject: [PATCH 07/10] - avoid logging to console, the error when the diagram syntax is bad - fix line numbering of code blocks --- browser/components/MarkdownPreview.js | 3 --- browser/components/render/MermaidRender.js | 1 - browser/lib/markdown-it-fence.js | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 493b1fc4..42c649f9 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -704,7 +704,6 @@ export default class MarkdownPreview extends React.Component { el.addEventListener('click', this.linkClickHandler) }) } catch (e) { - console.error(e) el.className = 'flowchart-error' el.innerHTML = 'Flowchart parse error: ' + e.message } @@ -725,7 +724,6 @@ export default class MarkdownPreview extends React.Component { el.addEventListener('click', this.linkClickHandler) }) } catch (e) { - console.error(e) el.className = 'sequence-error' el.innerHTML = 'Sequence diagram parse error: ' + e.message } @@ -750,7 +748,6 @@ export default class MarkdownPreview extends React.Component { const chart = new Chart(canvas, chartConfig) } catch (e) { - console.error(e) el.className = 'chart-error' el.innerHTML = 'chartjs diagram parse error: ' + e.message } diff --git a/browser/components/render/MermaidRender.js b/browser/components/render/MermaidRender.js index f04d8cd0..0ea1960d 100644 --- a/browser/components/render/MermaidRender.js +++ b/browser/components/render/MermaidRender.js @@ -35,7 +35,6 @@ function render (element, content, theme) { element.innerHTML = svgGraph }) } catch (e) { - console.error(e) element.className = 'mermaid-error' element.innerHTML = 'mermaid diagram parse error: ' + e.message } diff --git a/browser/lib/markdown-it-fence.js b/browser/lib/markdown-it-fence.js index c2a77a72..983dc45c 100644 --- a/browser/lib/markdown-it-fence.js +++ b/browser/lib/markdown-it-fence.js @@ -64,7 +64,7 @@ module.exports = function (md, renderers, defaultRenderer) { const parameters = {} let langType = '' let fileName = '' - let firstLineNumber = 0 + let firstLineNumber = 1 let match = /^(\w[-\w]*)?(?:\(((?:\s*\w[-\w]*(?:=(?:'(?:.*?[^\\])?'|"(?:.*?[^\\])?"|(?:[^'"][^\s]*)))?)*)\))?(?::([^:]*)(?::(\d+))?)?\s*$/.exec(params) if (match) { From a24f6e80c76b1e7f44e7e76e542d9d0acb29db55 Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Sat, 15 Sep 2018 18:57:31 +0200 Subject: [PATCH 08/10] fix styling of `lineNumber` and `filename` with big sized font --- browser/components/markdown.styl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl index ea4219af..2e17a75b 100644 --- a/browser/components/markdown.styl +++ b/browser/components/markdown.styl @@ -206,11 +206,11 @@ code text-decoration none margin-right 2px pre - padding 0.5em !important + padding 0.5rem !important border solid 1px #D1D1D1 border-radius 5px overflow-x auto - margin 0 0 1em + margin 0 0 1rem display flex line-height 1.4em code @@ -226,8 +226,8 @@ pre flex 1 overflow-x auto &>span.filename - margin -8px 100% 8px -8px - padding 2px 6px + margin -0.5rem 100% 0.5rem -0.5rem + padding 0.125rem 0.375rem background-color #777; color white &:empty @@ -235,8 +235,8 @@ pre &>span.lineNumber display none font-size 1em - padding 0.5em 0 - margin -0.5em 0.5em -0.5em -0.5em + padding 0.5rem 0 + margin -0.5rem 0.5rem -0.5rem -0.5rem border-right 1px solid text-align right border-top-left-radius 4px From fbdc9c9f8d8c6beba8f9263d09f2f81867702557 Mon Sep 17 00:00:00 2001 From: Baptiste Augrain Date: Mon, 17 Sep 2018 17:25:37 +0200 Subject: [PATCH 09/10] add `data-line` attribute to fenced blocks --- browser/lib/markdown.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 089ba5c6..a0892bc6 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -127,31 +127,31 @@ class Markdown { this.md.use(require('./markdown-it-fence'), { chart: token => { - return `
+        return `
           ${token.fileName}
           
${token.content}
` }, flowchart: token => { - return `
+        return `
           ${token.fileName}
           
${token.content}
` }, mermaid: token => { - return `
+        return `
           ${token.fileName}
           
${token.content}
` }, sequence: token => { - return `
+        return `
           ${token.fileName}
           
${token.content}
` } }, token => { - return `
+      return `
         ${token.fileName}
         ${createGutter(token.content, token.firstLineNumber)}
         ${token.content}

From a816c5dc23dfac5a92bd091cecc98e186cbd5779 Mon Sep 17 00:00:00 2001
From: Baptiste Augrain 
Date: Mon, 17 Sep 2018 21:45:59 +0200
Subject: [PATCH 10/10] fix test

---
 tests/lib/snapshots/markdown-test.js.md   |   2 +-
 tests/lib/snapshots/markdown-test.js.snap | Bin 1730 -> 1731 bytes
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md
index dc7efd31..eba9a668 100644
--- a/tests/lib/snapshots/markdown-test.js.md
+++ b/tests/lib/snapshots/markdown-test.js.md
@@ -39,7 +39,7 @@ Generated by [AVA](https://ava.li).
 
 > Snapshot 1
 
-    `
␊
+    `
filename.js2var project = 'boostnote';␊
diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap
index d814727de0f944aa205e0e2de0a5f953f3a7e9e4..45218ae26f2fe81dd7286a58cd1410b8d79b622f 100644
GIT binary patch
literal 1731
zcmV;!20ZyeRzVM5BN}E%d-`x+twgyIwz%#%b&oc{F{HKA=y5S~Rpy;?fhG;8acs{+V5GY{yPg+H%6uuE+o5`(HEj
z|Gt^YWS-3YII#KF-Ji}~$>03Ni2ho5zAqy`*EeJ`?#Zt%ym+<$#>M;B-@Y{a?5RFQ
zy*-f0Jojzo*UH_i=f8jVy%+9Zp4rl;sDm3bnT0Mg1~)?!(ic
z*`U1Zdm^)`|H_84lSfr7uXx$M
zJ^ukbqD#_p-X&Vj(ERiIG)BSZSd|OC=@NLQ?CY
z-P^q+D=p8^6!T#%VyknUd8ix;&ir|^DN{BQLfbie_`_|W|nlzNs
z9)%eX2cb@VeK#Cq#&wTXi83YWi25j|BT0W0g%|jYz85Y5S6&3LwU%p4gse00k<;W$
z`$v2l1i*{4ojPEsqv~*EtT^uZ(fGVia6xU@N)z06=n`o?`V*R&a8bgQx4@^X-2xDx
zMMc(a7zOXp{=?CzX1+$M^6uO1&$~2q*2s>$;J8vy8RE-#$eScIQm`Wd_8$t&_Lsq?
z9C?YXRku~Z7J_B4{TN(pM_Z)`g^{GIFwcv8dGRIbFHH|k${y0BL*hTYz0Sl>oH%i|
z2G{l;D)vU!Dq*$goGncr+yA;|9<5U$2w$Jlf^FlH(99WZL&sq?w1=}O=#0FrJ3rG`
z4xl00E)K(rX2WqoQ}8-KIcHpJZ`(}-|97g%xu0>r~UoZ%1%oYmn?O}lKs
zyX-Nu0xPCyK|-UZm#)HewV1AWx)RAMMh&AtQE@``Wy(C6u!P0T?TN9bsMSN%h#`|N
z>_hsXl`|g^9})<+VMT)u2Gf=E@
zUAvo-lHid`QkP(GormtnllTgwZJ$z4^ByO#6)TU~NNYgBniAfc65(1BJv`18M@q4q
zi~km(&80o;(WTz2Z2{aB2To!bSsi*y(7}Z+x>9*J>UxicQcOf)Sly);v-x}x
zc%AtfX^~G11ziteAv@ap)X}qYT<6fHg$_T+P9)z&9H|t|Hvc?Xw{@+3W#SU8gt9{n`I@25#n~n$^)@C88`vmd8N9qUAeMBRGplyfP
zHH)2z=h5aby`aI=ijMh;K&t6X_&|t>ayxQSAy2j8u9z45c9etGp)dy%szc!)SBNmW
zcj2>Fj~zO?``(3X@K-YE&@8N?xpgsOVq7W5%P#t}J@th{&>ZEVK$4X$TWYdz<%Yy&
Z@OL|AuRxwzFY@Y`{{WGCs$r-T008LAU*!M*

literal 1730
zcmV;z20i&fRzVP7=M5}Wo82U(loOWLJNrMr|1~rJ
zzn3&kyH)#c_nymFzJKnm!lfV0_|KJl2Q>M7xJ%Q#Q=goD;QZjlmwx^5#n%?@I6a`K
zpYGPQd%mn*t6n+(!q>07df%_-=I|2!nFe(~|QC%ziG{inSHiu%=E
znznfEL=-xAUHoS4uODuE?d69D74`S@GkLeBy?*rK>C#Kjym!jGw79zGvOB1#@1~z?
z@EO#0Deneu(e566YgffBpc)p~@Mu7)dO=6DR@F}u&tX0>1T$tBi$uT#(XEt<1Vb71
z{)*`qtf7iqY=V`|WLLxOP3?K7)jWq&ecs@ToF+V&}7%tD~mXbtLQld*q
z)RIKMeDwAkV5JCF=n}`^K!etVTh&L$@;d0yWmi=7Qejj_5qGM(D?}Jgnr5TX$Te9k
zVw>c^Z@qBXyHNJk3JX1qptRR=Kad91M%dtT&lLISH|CKfjZIFVyZ31uDW6i*!!Lssn1_F&kS!3X!l!G3`emI2^
zUUb7&C8{we>oe_e2KkyJQC+Z5IdF*C)FTEYAkwYJn!@szidbVA*QPRLqpnan5eMFpra_%`k`BxQq)Y7Lbe<
z4P~@{!;Fu^$e@9-4~{Y8hRDCNpq;Qg&`
z0SM5hBIh;DqJQMz(Rf_9o+LGS_w5UoJsP>&WJg|bTq&pw@r^s=SrVBU*s%}?Hw5Mc
z8(_1pyhOIE+ZJFe;Re`246b#eZBc~cXxden@5h0>_|o*3=Z0rw4{6aM@o#>fy48`6M|XF)QpbX<8#Nk*9&UEIsd&9;Fn2}@bbdL%X061Dq?nh9k3
zg#$<*G;bCl5sc<0Op&zYs@f=<(qDPRuSbPC?U#2c=w~-7p
zNl#kU&1rN6BoSdwvEkBMjRaL)@R)R^92!|HU@8+$56*8gsZHi{<*|`MetaT(h(D$G
zw59Zs&4gfnH%uXyA1#lLY`~NOMz&T6+%qs-_Q9l)&lM&{Mn?J?uyNGwvk%iClF?H*
ztWGZ_CBb8lWG=y|x(xk}r|}iXJDzf1^FAlA6{|PdNP9rxwi5of647=NeLT*WM$3tt
ztN#?C*b0!s)?(WBm5Z2{a92To!X+g*BV(6fahdQy2W>Q0Y_QcOi*Je@R3xk8}?
zyzcyrw#lc4!k&k)m>chZ>gX9cpmS)I2vDb$xrk>*>Gu
zZ5rtEX1%FKw%I}U|2ycv*g@NWbxv2GX|3U~<%qyheF2hsKoB2%q(KPXM>InS+Hr|f
zx7m6!fwq1bMIGi;bUaW5Qp={m>q1PGJCREYdA0+0(}Xy%w-UBb$a$DaT?+rPB81V^
zvmZQh{K!-LuAaRBe;&gw&EgiC53a^cOey7L*+YM!ufA{zTB1A>NV0MjTg~$A+=w^~
Y{$MBUO~~^*Mcx|oZ(NkrbD9$X0Dzc8