[
  {
    "path": ".editorconfig",
    "content": "[*.js]\nindent_style = space\nindent_size = 2\ncontinuation_indent_size = 2\ninsert_final_newline = true\nquote_type = single\nspace_after_anonymous_functions = true\nspace_after_control_statements = true\nspaces_around_operators = true\ntrim_trailing_whitespace = true\nspaces_in_brackets = false\ncurly_bracket_next_line = true\nindent_brace_style = 1TBS\nend_of_line = lf\ncharset = utf-8\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"env\": {\n    \"es6\": true\n  },\n  \"rules\": {\n    \"indent\": [2, 2, {\"SwitchCase\": 1, \"VariableDeclarator\": 2}],\n    \"curly\": [2, \"all\"],\n    \"operator-linebreak\": [2, \"after\"],\n    \"camelcase\": [2, {\"properties\": \"never\"}],\n    \"quotes\": [2, \"single\"],\n    \"no-multi-str\": 2,\n    \"no-mixed-spaces-and-tabs\": 2,\n    \"no-trailing-spaces\": 2,\n    \"space-unary-ops\": [2,\n      {\n        \"nonwords\": false,\n        \"overrides\": {}\n      }\n    ],\n    \"brace-style\": [2, \"1tbs\", {\"allowSingleLine\": true}],\n    \"keyword-spacing\": [2, {}],\n    \"space-infix-ops\": 2,\n    \"space-before-blocks\": [2, \"always\"],\n    \"eol-last\": 2,\n    \"space-before-function-paren\": [2, \"always\"],\n    \"array-bracket-spacing\": [2, \"never\", {\"singleValue\": false}],\n    \"space-in-parens\": [2, \"never\"],\n    \"no-multiple-empty-lines\": 2\n  }\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Exports for git archive\n/test export-ignore\n.editorconfig export-ignore\n.gitattributes export-ignore\n.gitignore export-ignore\n.eslintrc.json export-ignore\n.jshintignore export-ignore\n.jshintrc export-ignore\n.travis.yml export-ignore\n.appveyor.yml export-ignore\nbower.json\nGruntfile.js export-ignore\nperformance.* export-ignore\n\n# Line endings control\nCHANGELOG.md text\nCONTRIBUTING.md text\nCREDITS.md text\nlicense.txt text\n\n# Force LF on js files\n*.js text eol=lf\n\n# Force binary mode on bin dir and dist fir\nbin/* binary\ndist/* binary\n"
  },
  {
    "path": ".github/workflows/browserstack.yml",
    "content": "name: 'BrowserStack Test'\n\non:\n  push:\n    branches: [ master, develop ]\n  pull_request:\n    branches: [ master, develop ]\n\njobs:\n  ubuntu-job:\n    name: 'BrowserStack Test on Ubuntu'\n    runs-on: ubuntu-latest\n    steps:\n      - name: set up env vars\n        # Only the first line of commit msg\n        run: echo \"COMMIT_MSG=$(printf \"%s\" \"${{ github.event.head_commit.message }}\" | head -n 1)\" >> $GITHUB_ENV\n\n      - name: '📦 Checkout the repository'\n        uses: actions/checkout@v2\n\n      - name: '🚚 Upgrade NPM'\n        run: npm install -g npm\n\n      - name: '⚙ Setup Node.js v17.x'\n        uses: actions/setup-node@v2\n        with:\n          node-version: 17.x\n          cache: 'npm'\n\n      - name: '📖 Get current package version'\n        id: package-version\n        uses: martinbeentjes/npm-get-version-action@v1.2.3\n\n      - name: '📝 Print build version and commit msg'\n        run: 'printf \"version: %s\\n build:%s\\n message:%s\\n\" \"${{ steps.package-version.outputs.current-version}}\" \"${{ github.run_id }}\" \"$COMMIT_MSG\"'\n\n      - name: '📱 BrowserStack Env Setup'  # Invokes the setup-env action\n        uses: browserstack/github-actions/setup-env@master\n        with:\n          username:  ${{ secrets.BROWSERSTACK_USERNAME }}\n          access-key: ${{ secrets.BROWSERSTACK_ACCESSKEY }}\n          project-name: 'showdown'\n          build-name: ${{ steps.package-version.outputs.current-version}}-${{ github.run_id }}\n\n      - name: '🚇 BrowserStack Local Tunnel Setup'  # Invokes the setup-local action\n        uses: browserstack/github-actions/setup-local@master\n        with:\n          local-testing: start\n          local-identifier: random\n\n      - name: '🚚 Install dependencies for CI'\n        run: npm ci\n\n      - name: '🏗 Building src files for testing'\n        run: npx grunt concat:test\n\n      - name: '✅ Running test on BrowserStack with Karma'\n        run: npx karma start karma.browserstack.js\n\n      - name: '🛑 BrowserStackLocal Stop'  # Terminating the BrowserStackLocal tunnel connection\n        uses: browserstack/github-actions/setup-local@master\n        with:\n          local-testing: stop\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ master, develop ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ master, develop ]\n  schedule:\n    - cron: '39 3 * * 0'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'javascript' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]\n        # Learn more about CodeQL language support at https://git.io/codeql-language-support\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v2\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v1\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n        # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v1\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 https://git.io/JvXDl\n\n    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines\n    #    and modify them (or add more) to build your code if your project\n    #    uses a compiled language\n\n    #- run: |\n    #   make bootstrap\n    #   make release\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v1\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: documentation\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'mkdocs.yml'\n      - 'docs/**'\n      - '.github/workflows/docs.yml'\n\njobs:\n  build_docs:\n    name: Build documentation\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Trigger external build\n        env:\n          TOKEN: ${{ secrets.DOCS_DEPLOY_KEY }}\n          COMMIT: ${{ github.event.head_commit.id }}\n          COMMITTER: ${{ github.event.head_commit.author.username }}\n          OWNER: showdownjs\n          REPO: showdownjs.github.io\n        run: |\n          curl -X POST \\\n          -H \"Authorization: token ${TOKEN}\" \\\n          -H \"Accept: application/vnd.github.v3+json\" \\\n          https://api.github.com/repos/${OWNER}/${REPO}/dispatches \\\n          -d '{ \"event_type\": \"e: \\\"'\"${COMMIT}\"'\\\" by '\"${COMMITTER}\"'\", \"client_payload\": { \"source\": \"showdown\" } }'\n"
  },
  {
    "path": ".github/workflows/node.linux.yml",
    "content": "# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Node Linux CI\n\non:\n  push:\n    branches: [ master, develop ]\n  pull_request:\n    branches: [ master, develop ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    \n    strategy:\n      matrix:\n        node-version: [12.x, 14.x, 16.x, 17.x]\n        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/\n\n    steps: \n      - uses: actions/checkout@v2\n\n      - name: 🚚 Upgrade NPM\n        run: npm install -g npm\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v2\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'npm'\n      - run: npm ci\n      - run: npm test\n"
  },
  {
    "path": ".github/workflows/node.win.yml",
    "content": "# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Node Windows CI\n\non:\n  push:\n    branches: [ master, develop ]\n  pull_request:\n    branches: [ master, develop ]\n\njobs:\n  build:\n\n    runs-on: windows-latest\n\n    strategy:\n      matrix:\n        node-version: [12.x, 14.x, 16.x, 17.x]\n        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v2\n      with:\n        node-version: ${{ matrix.node-version }}\n        cache: 'npm'\n    - run: npm ci\n    - run: npm test\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea/\n.build/\n.DS_Store\nnode_modules\nnpm-debug.log\n/*.test.*\n*.log\n"
  },
  {
    "path": ".jshintignore",
    "content": "Gruntfile.js\ndist/**/*.js\nbuild/**/*.js\nsrc/options.js\nbin/*\n/karma.browserstack.js\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"node\": true,\n  \"browser\": true,\n  \"esnext\": true,\n  \"bitwise\": true,\n  \"camelcase\": true,\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"immed\": true,\n  \"indent\": 2,\n  \"latedef\": \"nofunc\",\n  \"newcap\": true,\n  \"noarg\": true,\n  \"quotmark\": \"single\",\n  \"undef\": false,\n  \"unused\": true,\n  \"strict\": false,\n  \"trailing\": true,\n  \"smarttabs\": true,\n  \"onevar\": true,\n  \"globals\": {\n    \"module\": true,\n    \"define\": true,\n    \"window\": true,\n    \"document\": true,\n    \"showdown\": true\n  }\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## [2.1.0](https://github.com/showdownjs/showdown/compare/2.0.0...2.1.0) (2022-04-21)\n\n* refactor(cli)!: Remove support for \"extra options\" and add -c flag, closes [#916](https://github.com/showdownjs/showdown/issues/916)\n\n\n### Bug Fixes\n\n* **cli:** cli displays the correct version number ([8b48882](https://github.com/showdownjs/showdown/commit/8b48882))\n\n\n### BREAKING CHANGES\n\n* the CLI no longer accepts \"extra options\". Instead you should pass the `-c` flag. To update:\n\nbefore:\n```\nshowdown makehtml -i foo.md -o bar.html --strikethrough --emoji\n```\n\nafter:\n```\nshowdown makehtml -i foo.md -o bar.html -c strikethrough -c emoji\n```\n\n<a name=\"2.0.0\"></a>\n# [2.0.0](https://github.com/showdownjs/showdown/compare/1.9.1...2.0.0) (2022-02-15)\n\n### Breaking Changes\n* Supported Node Versions were set to match the [node release schedule](https://nodejs.org/en/about/releases/) which at the time of writing includes Node 12.x, 14.x, 16.x and 17.x\n* The `yargs` dependecy was updated to `^17.2.1` to mitigate a security issue.\n* The Showdown Licesnse has been changed from  BSD-3-Clause to MIT\n\n### Bug Fixes\n\n* allow escaping of colons ([25c4420](https://github.com/showdownjs/showdown/commit/25c4420))\n* reduce npm package size  ([35730b7](https://github.com/showdownjs/showdown/commit/35730b7)), closes [#619](https://github.com/showdownjs/showdown/issues/619)\n\n### Features\n\n* Added `ellipsis` option to configure if the ellipsis unicode character is used or not. ( Thanks @VladimirV99 )\n* Added a default security policy. Please report security issues to the issues tab on GitHub.\n\n\n<a name=\"1.9.1\"></a>\n## [1.9.1](https://github.com/showdownjs/showdown/compare/1.9.0...1.9.1) (2019-11-02)\n\n\n### Bug Fixes\n\n* **openLinksInNewWindow:** add rel=\"noopener noreferrer\" to links ([1cd281f](https://github.com/showdownjs/showdown/commit/1cd281f)), closes [#670](https://github.com/showdownjs/showdown/issues/670)\n\n<a name=\"1.0.0\"></a>\n# [1.9.0](https://github.com/showdownjs/showdown/compare/1.8.7...1.9.0) (2018-11-10)\n\nVersion 1.9.0 introduces a new feature, the Markdown to HTML converter. This feature is still experimental and is a partial backport of the new Reverse Converter planned for version 2.0.\n### Bug Fixes\n\n* **italicsAndBold:** fix issue with consecutive spans ([#608](https://github.com/showdownjs/showdown/issues/608)) ([5c0d67e](https://github.com/showdownjs/showdown/commit/5c0d67e)), closes [#544](https://github.com/showdownjs/showdown/issues/544)\n* **underline:** fix issue with consecutive spans ([81edc70](https://github.com/showdownjs/showdown/commit/81edc70))\n\n### Features\n\n* **converter.makeMarkdown:** [EXPERIMENTAL] add an HTML to MD converter ([e4b0e69](https://github.com/showdownjs/showdown/commit/e4b0e69)), closes [#388](https://github.com/showdownjs/showdown/issues/388) [#233](https://github.com/showdownjs/showdown/issues/233)\n\n<a name=\"1.8.7\"></a>\n# [1.8.7](https://github.com/showdownjs/showdown/compare/1.8.6...1.8.7) (2018-10-16)\n\n### Bug Fixes\n\n* **emojis:** fix emoji excessive size ([4aca41c](https://github.com/showdownjs/showdown/commit/4aca41c))\n* **gfm-codeblocks:** add support for spaces before language declaration ([24bf7b1](https://github.com/showdownjs/showdown/commit/24bf7b1)), closes [#569](https://github.com/showdownjs/showdown/issues/569)\nleading space no longer breaks gfm codeblocks ([828c32f](https://github.com/showdownjs/showdown/commit/828c32f)), closes [#523](https://github.com/showdownjs/showdown/issues/523)\n\n* **images:** fix js error when using image references ([980e702](https://github.com/showdownjs/showdown/commit/980e702)), closes [#585](https://github.com/showdownjs/showdown/issues/585)\n* **literalMidWordAsterisks:** now parses single characters enclosed by * correctly ([fe70e45](https://github.com/showdownjs/showdown/commit/fe70e45)), closes [#478](https://github.com/showdownjs/showdown/issues/478)\n* **mentions:** allow for usernames with dot, underscore and dash ([dfeb1e2](https://github.com/showdownjs/showdown/commit/dfeb1e2)), closes [#574](https://github.com/showdownjs/showdown/issues/574)\n* **nbsp:** fix replacing of nbsp with regular spaces ([8bc1f42](https://github.com/showdownjs/showdown/commit/8bc1f42))\n\n<a name=\"1.8.6\"></a>\n# [1.8.6](https://github.com/showdownjs/showdown/compare/1.8.5...1.8.6) (2017-12-22)\n\n### Features\n\n* **splitAdjacentBlockquotes:** add option to split adjacent blockquote blocks ([da328f2](https://github.com/showdownjs/showdown/commit/da328f2)), closes [#477](https://github.com/showdownjs/showdown/issues/477)\n\n\n\n<a name=\"1.8.5\"></a>\n# [1.8.5](https://github.com/showdownjs/showdown/compare/1.8.4...1.8.5) (2017-12-10)\n\n\n### Features\n\n* **completeHTMLDocument:** add option to output a complete HTML document ([a8427c9](https://github.com/showdownjs/showdown/commit/a8427c9))\n* **metadata:** add support for embedded metadata ([63d949f](https://github.com/showdownjs/showdown/commit/63d949f)), closes [#260](https://github.com/showdownjs/showdown/issues/260)\n\n\n\n<a name=\"1.8.4\"></a>\n## [1.8.4](https://github.com/showdownjs/showdown/compare/1.8.3...1.8.4) (2017-12-05)\n\n\n### Bug Fixes\n\n* **tables:** raw html inside code tags in tables no longer breaks tables ([4ef4c5e](https://github.com/showdownjs/showdown/commit/4ef4c5e)), closes [#471](https://github.com/showdownjs/showdown/issues/471)\n\n\n\n<a name=\"1.8.3\"></a>\n## [1.8.3](https://github.com/showdownjs/showdown/compare/1.8.2...1.8.3) (2017-11-28)\n\n\n### Bug Fixes\n\n* **literalMidWordAsterisks:** no longer treats colon as alphanumeric char ([21194c8](https://github.com/showdownjs/showdown/commit/21194c8)), closes [#461](https://github.com/showdownjs/showdown/issues/461)\n* **spanGamut:** code spans are hashed after parsing ([f4f63c5](https://github.com/showdownjs/showdown/commit/f4f63c5)), closes [#464](https://github.com/showdownjs/showdown/issues/464)\n* **tables:** pipe character in code spans no longer breaks table ([0c933a0](https://github.com/showdownjs/showdown/commit/0c933a0)), closes [#465](https://github.com/showdownjs/showdown/issues/465)\n\n\n\n<a name=\"1.8.2\"></a>\n## [1.8.2](https://github.com/showdownjs/showdown/compare/1.8.1...1.8.2) (2017-11-11)\n\n\n### Bug Fixes\n\n* **fenced codeblocks:** add tilde as fenced code block delimiter ([c956ede](https://github.com/showdownjs/showdown/commit/c956ede)), closes [#456](https://github.com/showdownjs/showdown/issues/456)\n* **openLinksInNewWindow:** hash links are not affected by the option ([11936ec](https://github.com/showdownjs/showdown/commit/11936ec)), closes [#457](https://github.com/showdownjs/showdown/issues/457)\n\n\n\n<a name=\"1.8.1\"></a>\n## [1.8.1](https://github.com/showdownjs/showdown/compare/1.8.0...1.8.1) (2017-11-01)\n\n\n### Dependencies update\n\n* **package:** update yargs to version 10.0.3 ([#447](https://github.com/showdownjs/showdown/issues/447)) ([906b26d](https://github.com/showdownjs/showdown/commit/906b26d))\n\n### Bug Fixes\n\n* **CDNjs:** bump version to fix version mismatch with CDNjs ([#452](https://github.com/showdownjs/showdown/issues/452))\n\n\n<a name=\"1.8.0\"></a>\n# [1.8.0](https://github.com/showdownjs/showdown/compare/1.7.6...1.8.0) (2017-10-24)\n\n### NOTICE\n\nDon't use the CDNjs version of this release. See issue [#452](https://github.com/showdownjs/showdown/issues/452) for more details.\n\n\n### Bug Fixes\n\n* **autolinks:** prevent _ and * to be parsed in links ([61929bb](https://github.com/showdownjs/showdown/commit/61929bb)), closes [#444](https://github.com/showdownjs/showdown/issues/444)\n\n\n### Features\n\n* **ellipsis:** add auto-ellipsis support ([25f1978](https://github.com/showdownjs/showdown/commit/25f1978))\n\n  - *Example:*\n    \n      input\n    \n      ```md\n      this is an ellipsis...\n      ```\n        \n      output\n    \n      ```html\n      <p>this is an ellipsis…</p>\n      ```\n\n* **emoji:** add emoji support through option `emoji`([5b8f1d3](https://github.com/showdownjs/showdown/commit/5b8f1d3)), closes [#448](https://github.com/showdownjs/showdown/issues/448)\n\n  - *Usage:*\n    \n      ```js\n      var conv = new showdown.Converter({emoji: true});\n      ```      \n    \n  - *Example:*\n    \n      input\n    \n      ```md\n      this is a smile :smile: emoji\n      ```\n        \n      output\n    \n      ```html\n      <p>this is a smile 😄 emoji</p>\n      ```\n    \n* **start ordered lists at an arbitrary number:** add support for defining the first item number of ordered lists ([9cdc35e](https://github.com/showdownjs/showdown/commit/9cdc35e)), closes [#377](https://github.com/showdownjs/showdown/issues/377)\n\n  - *Example:*\n    \n      input\n\n       ```md\n       3. foo\n       4. bar\n       5. baz\n       ```\n\n      output\n    \n      ```html\n      <ol start=\"3\">\n        <li>foo</li>\n        <li>bar</li>\n        <li>baz</li>\n      </ol>\n      ```\n\n* **underline:** add EXPERIMENTAL support for underline ([084b819](https://github.com/showdownjs/showdown/commit/084b819)), closes [#450](https://github.com/showdownjs/showdown/issues/450)\n\n  - *Usage:*\n    \n      ```js\n      var conv = new showdown.Converter({underline: true});\n      ```\n    \n  - *Example:*\n    \n      input\n    \n      ```md\n      this is __underlined__ and this is ___also underlined___\n      ```\n        \n      output\n    \n      ```html\n      <p>this is <u>underlined</u> and this is <u>also underlined</u></p>\n      ```\n\t\n  - *Note:*\tWith this option enabled, underscore no longer parses as `<em>` or `<strong>`\t  \n\t\t\t\n### BREAKING CHANGES\n\n* start ordered lists at an arbitrary number: Since showdown now supports starting ordered lists at an arbitrary number, \nlist output may differ.\n\n\n\n<a name=\"1.7.6\"></a>\n## [1.7.6](https://github.com/showdownjs/showdown/compare/1.7.5...1.7.6) (2017-10-06)\n\n\n### Bug Fixes\n\n* **tables:** tables are properly rendered when followed by a single linebreak and a list ([d88b095](https://github.com/showdownjs/showdown/commit/d88b095)), closes [#443](https://github.com/showdownjs/showdown/issues/443)\n* **tables:** trailing spaces no longer prevent table parsing ([66bdd21](https://github.com/showdownjs/showdown/commit/66bdd21)), closes [#442](https://github.com/showdownjs/showdown/issues/442)\n\n\n\n<a name=\"1.7.5\"></a>\n## [1.7.5](https://github.com/showdownjs/showdown/compare/1.7.4...1.7.5) (2017-10-02)\n\n\n### Bug Fixes\n\n* **html-comments:** changed regex to prevent malformed long comment to freeze showdown ([3efcd10](https://github.com/showdownjs/showdown/commit/3efcd10)), closes [#439](https://github.com/showdownjs/showdown/issues/439)\n\n\n\n<a name=\"1.7.4\"></a>\n## [1.7.4](https://github.com/showdownjs/showdown/compare/1.7.3...1.7.4) (2017-09-08)\n\n\n### Bug Fixes\n\n* **helper.isArray:** replace a.constructor === Array with Array.isArray ([466a2eb](https://github.com/showdownjs/showdown/commit/466a2eb)), closes [#425](https://github.com/showdownjs/showdown/issues/425)\n* **loader:** allow AMD loader to be used within Node env  ([ff24bdb](https://github.com/showdownjs/showdown/commit/ff24bdb))\n\n\n### Features\n\n* **base64-wrapping:** support for wrapping base64 strings ([8c593a4](https://github.com/showdownjs/showdown/commit/8c593a4)), closes [#429](https://github.com/showdownjs/showdown/issues/429)\n\n\n\n<a name=\"1.7.3\"></a>\n## [1.7.3](https://github.com/showdownjs/showdown/compare/1.7.2...1.7.3) (2017-08-23)\n\n\n### Bug Fixes\n\n* **github flavor:** add backslashEscapesHTMLTags to GFM flavor ([5284439](https://github.com/showdownjs/showdown/commit/5284439))\n* **literalMidWordAsterisks:** option no longer treats punctuation as word character ([8f05be7](https://github.com/showdownjs/showdown/commit/8f05be7)), closes [#398](https://github.com/showdownjs/showdown/issues/398)\n* **tables:** allow for one column table ([fef110c](https://github.com/showdownjs/showdown/commit/fef110cccb2d02b218183398d9baa0ae256a7283)), closes [#406](https://github.com/showdownjs/showdown/issues/406)\n\n### Features\n\n* **rawHeaderId:** Remove only spaces, ' and \" from generated header ids ([1791cf0](https://github.com/showdownjs/showdown/commit/1791cf0)), closes [#409](https://github.com/showdownjs/showdown/issues/409)\n* **rawPrefixHeaderId:** add option to prevent showdown from modifying the prefix ([ff26c08](https://github.com/showdownjs/showdown/commit/ff26c08)), closes [#409](https://github.com/showdownjs/showdown/issues/409)\n\n\n\n<a name=\"1.7.2\"></a>\n## [1.7.2](https://github.com/showdownjs/showdown/compare/1.7.1...1.7.2) (2017-08-05)\n\n\n### Bug Fixes\n\n* **githubMentions:** githubMentions now works with openLinksInNewWindow options ([1194d88](https://github.com/showdownjs/showdown/commit/1194d88)), closes [#403](https://github.com/showdownjs/showdown/issues/403)\n* **lists:** fix multi paragraph lists with sublists ([a2259c0](https://github.com/showdownjs/showdown/commit/a2259c0)), closes [#397](https://github.com/showdownjs/showdown/issues/397)\n* **tablesHeaderId:** fix mismatch of option name ([51e4693](https://github.com/showdownjs/showdown/commit/51e4693)), closes [#412](https://github.com/showdownjs/showdown/issues/412)\n\n\n### Features\n\n* **backslashEscapesHTMLTags:** backslash escapes HTML tags ([5a5aff6](https://github.com/showdownjs/showdown/commit/5a5aff6)), closes [#374](https://github.com/showdownjs/showdown/issues/374)\n\n\n\n<a name=\"1.7.1\"></a>\n## [1.7.1](https://github.com/showdownjs/showdown/compare/1.7.0...1.7.1) (2017-06-02)\n\nImportant HOTFIX\n\n### Bug Fixes\n\n* **HTML Parser:** fix nasty bug where malformed HTML would hang showdown ([6566c72](https://github.com/showdownjs/showdown/commit/6566c72)), closes [#393](https://github.com/showdownjs/showdown/issues/393)\n\n\n\n<a name=\"1.7.0\"></a>\n## [1.7.0](https://github.com/showdownjs/showdown/compare/1.6.4...1.7.0) (2017-06-01)\n\n(DEPRECATED)\n\n### Bug Fixes\n\n* **anchors:** fix issue with brackets in link URL ([7ba18dd](https://github.com/showdownjs/showdown/commit/7ba18dd)), closes [#390](https://github.com/showdownjs/showdown/issues/390)\n* **excludeTrailingPunctuationFromURL:** add comma to punctuation list ([fa35fd5](https://github.com/showdownjs/showdown/commit/fa35fd5)), closes [#354](https://github.com/showdownjs/showdown/issues/354)\n* **excludeTrailingPunctuationFromURLs:** fix weird character when this option with simplifiedAutoLinks ([71acff5](https://github.com/showdownjs/showdown/commit/71acff5)), closes [#378](https://github.com/showdownjs/showdown/issues/378)\n* **HTML parsing:** fix HTML parsing issues with nested tags ([6fbc072](https://github.com/showdownjs/showdown/commit/6fbc072)), closes [#357](https://github.com/showdownjs/showdown/issues/357) [#387](https://github.com/showdownjs/showdown/issues/387)\n* **openLinksInNewWindow:** encode _ to prevent clash with em ([813f832](https://github.com/showdownjs/showdown/commit/813f832)), closes [#379](https://github.com/showdownjs/showdown/issues/379)\n* **package:** update yargs to version 7.0.1 ([#349](https://github.com/showdownjs/showdown/issues/349)) ([9308d7b](https://github.com/showdownjs/showdown/commit/9308d7b))\n* **package:** update yargs to version 8.0.1 ([#385](https://github.com/showdownjs/showdown/issues/385)) ([5fd847b](https://github.com/showdownjs/showdown/commit/5fd847b))\n* **simpleAutoLinks:** URLs with emphasis/strikethrough are parsed ([5c50675](https://github.com/showdownjs/showdown/commit/5c50675)), closes [#347](https://github.com/showdownjs/showdown/issues/347)\n* **tables:** pipe char can now be escaped ([1ebc195](https://github.com/showdownjs/showdown/commit/1ebc195)), closes [#345](https://github.com/showdownjs/showdown/issues/345)\n* **url parsing:** fix url edge case parsing in images and links ([30aa18c](https://github.com/showdownjs/showdown/commit/30aa18c))\n\n\n### Features\n\n* **customizeHeaderId:** add option for customizing header ids ([94c570a](https://github.com/showdownjs/showdown/commit/94c570a)), closes [#383](https://github.com/showdownjs/showdown/issues/383)\n* **images:** add support for image's implicit reference syntax ([0c6c07b](https://github.com/showdownjs/showdown/commit/0c6c07b)), closes [#366](https://github.com/showdownjs/showdown/issues/366)\n* **literalMidWordAsterisks:** add option for mid word asterisks ([5bec8f9](https://github.com/showdownjs/showdown/commit/5bec8f9))\n* **openLinksInNewWindow:** add option to open all links in a new window ([50235d6](https://github.com/showdownjs/showdown/commit/50235d6)), closes [#362](https://github.com/showdownjs/showdown/issues/362) [#337](https://github.com/showdownjs/showdown/issues/337) [#249](https://github.com/showdownjs/showdown/issues/249) [#247](https://github.com/showdownjs/showdown/issues/247) [#222](https://github.com/showdownjs/showdown/issues/222)\n\n\n\n<a name=\"1.6.4\"></a>\n## [1.6.4](https://github.com/showdownjs/showdown/compare/1.6.3...1.6.4) (2017-02-06)\n\n\n### Bug Fixes\n\n* **encodeAmpsAndAngles:** fix > and < encoding ([7f43b79](https://github.com/showdownjs/showdown/commit/7f43b79)), closes [#236](https://github.com/showdownjs/showdown/issues/236)\n* **encodeEmail:** now produces valid emails ([605d8b7](https://github.com/showdownjs/showdown/commit/605d8b7)), closes [#340](https://github.com/showdownjs/showdown/issues/340)\n* **flavor: github:** new version of github does not use prefix 'user-content' in headers ([368f0b6](https://github.com/showdownjs/showdown/commit/368f0b6))\n* **hashCodeTags:** escape code tags ([41cb3f6](https://github.com/showdownjs/showdown/commit/41cb3f6)), closes [#339](https://github.com/showdownjs/showdown/issues/339)\n* **italicsAndBold:** fix double emphasis edge case ([1832b7f](https://github.com/showdownjs/showdown/commit/1832b7f))\n* **paragraph:** workaround QML bug ([f7a429e](https://github.com/showdownjs/showdown/commit/f7a429e)), closes [#246](https://github.com/showdownjs/showdown/issues/246) [#338](https://github.com/showdownjs/showdown/issues/338)\n* **prefixHeaderId:** make `prefixHeaderId` string be parsed along the generated id ([f641a7d](https://github.com/showdownjs/showdown/commit/f641a7d))\n\n\n### Features\n\n* **flavor: ghost:** add Ghost flavor ([6374b5b](https://github.com/showdownjs/showdown/commit/6374b5b))\n* **flavor: original:** add John Gruber's markdown flavor ([6374b5b](https://github.com/showdownjs/showdown/commit/6374b5b))\n\n\n\n<a name=\"1.6.3\"></a>\n## [1.6.3](https://github.com/showdownjs/showdown/compare/1.6.2...1.6.3) (2017-01-30)\n\n\n### Bug Fixes\n\n* **codeSpans:** add - and = to escaped chars inside code spans ([4243a31](https://github.com/showdownjs/showdown/commit/4243a31))\n* **italicsAndBold:** fix inconsistency in italicsAndBold parsing ([a4f05d4](https://github.com/showdownjs/showdown/commit/a4f05d4)), closes [#332](https://github.com/showdownjs/showdown/issues/332)\n* **literalMidWordUnderscores:** fix inconsistent behavior of emphasis and strong with literalMidWordUndescores ([0292ae0](https://github.com/showdownjs/showdown/commit/0292ae0)), closes [#333](https://github.com/showdownjs/showdown/issues/333)\n* **paragraphs:** fix empty lines generating empty paragraphs ([54bf744](https://github.com/showdownjs/showdown/commit/54bf744)), closes [#334](https://github.com/showdownjs/showdown/issues/334)\n* **strikethrough:** fix strikethrough being wrongly parsed inside codeSpans ([169cbe8](https://github.com/showdownjs/showdown/commit/169cbe8))\n\n### Features\n\n* **events:** add events to all subparsers ([7d63a3e](https://github.com/showdownjs/showdown/commit/7d63a3e))\n\n\n\n<a name=\"1.6.2\"></a>\n## [1.6.2](https://github.com/showdownjs/showdown/compare/1.6.1...1.6.2) (2017-01-29)\n\n\n### Bug Fixes\n\n* **escapeSpecialCharsWithinTagAttributes:** add ~ and = to escaped chars ([bfcc0e4](https://github.com/showdownjs/showdown/commit/bfcc0e4))\n* **strikethrough:** allow escaping tilde char ([24d47d7](https://github.com/showdownjs/showdown/commit/24d47d7)), closes [#331](https://github.com/showdownjs/showdown/issues/331)\n\n### Features\n\n* **ghMentionsLink:** add ability to define the generated url in @mentions ([a4c24c9](https://github.com/showdownjs/showdown/commit/a4c24c9))\n\n\n\n<a name=\"1.6.1\"></a>\n## [1.6.1](https://github.com/showdownjs/showdown/compare/1.6.0...1.6.1) (2017-01-28)\n\n\n### Bug Fixes\n\n* **simplifiedAutoLink:** fix missing spaces before and after email addresses ([5190b6a](https://github.com/showdownjs/showdown/commit/5190b6a)), closes [#330](https://github.com/showdownjs/showdown/issues/330)\n\n### Features\n\n* **encodeEmail:** add option to enable/disable mail obfuscation ([90c52b8](https://github.com/showdownjs/showdown/commit/90c52b8))\n\n### Notes\n\nThis release also improves performance a bit (around 8%)\n\n\n\n<a name=\"1.6.0\"></a>\n## [1.6.0](https://github.com/showdownjs/showdown/compare/1.5.5...1.6.0) (2017-01-09)\n\n\n### Bug Fixes\n\n* **ghCompatibleHeaderId:** improve the number of removed chars ([d499feb](https://github.com/showdownjs/showdown/commit/d499feb))\n* **IE8:** fix for IE8 error on using isUndefined function ([561dc5f](https://github.com/showdownjs/showdown/commit/561dc5f)), closes [#280](https://github.com/showdownjs/showdown/issues/280)\n* **options:** fix ghCompatibleHeaderId that was set as string instead of boolean ([de7c37e](https://github.com/showdownjs/showdown/commit/de7c37e))\n* **simpleLineBreaks:** fix simpleLineBreaks option not working with non-ASCII chars and markdown delimiters ([b1c458a](https://github.com/showdownjs/showdown/commit/b1c458a)), closes [#318](https://github.com/showdownjs/showdown/issues/318) [#323](https://github.com/showdownjs/showdown/issues/323)\n\n### Features\n\n* **CLI:** add -q (quiet) and -m (mute) mode to CLI ([f3b86f0](https://github.com/showdownjs/showdown/commit/f3b86f0))\n* **CLI:flavor:** add flavor option to CLI ([2d6cd1e](https://github.com/showdownjs/showdown/commit/2d6cd1e))\n* **getFlavor:** add getFlavor method to showdown and Converter ([0eaf105](https://github.com/showdownjs/showdown/commit/0eaf105))\n* **ghMentions:** add support for github's @mentions ([f2671c0](https://github.com/showdownjs/showdown/commit/f2671c0)), closes [#51](https://github.com/showdownjs/showdown/issues/51)\n\n### BREAKING CHANGES:\n\n* CLI tool now uses the same option defaults as showdown main library. This mean\n  the default flavor is vanilla and ghCodeBlocks options is enabled by default.\n    \n    To update, add `--ghCodeBlocks=\"false\"` to the command.\n\n\n<a name=\"1.5.5\"></a>\n## [1.5.5](https://github.com/showdownjs/showdown/compare/1.5.4...1.5.5) (2016-12-30)\n\n### Features\n\n* **ghCompatibleHeaderId:** generate header ids compatible with github ([db97a90](https://github.com/showdownjs/showdown/commit/db97a90)), closes [#320](https://github.com/showdownjs/showdown/issues/320) [#321](https://github.com/showdownjs/showdown/issues/321)\n\n\n\n<a name=\"1.5.4\"></a>\n## [1.5.4](https://github.com/showdownjs/showdown/compare/1.5.3...1.5.4) (2016-12-21)\n\n\n### Bug Fixes\n\n* **horizontal rule:** revert backwards incompatibility change ([113f5f6](https://github.com/showdownjs/showdown/commit/113f5f6)), closes [#317](https://github.com/showdownjs/showdown/issues/317)\n* **simpleLineBreaks:** fix simpleLineBreak option breaking lists html ([ed4c33f](https://github.com/showdownjs/showdown/commit/ed4c33f)), closes [#316](https://github.com/showdownjs/showdown/issues/316)\n\n\n\n<a name=\"1.5.3\"></a>\n## [1.5.3](https://github.com/showdownjs/showdown/compare/1.5.2...1.5.3) (2016-12-19)\n\n\n### Bug Fixes\n\n* parser slowness with certain inputs ([da8fb53](https://github.com/showdownjs/showdown/commit/da8fb53)), closes [#315](https://github.com/showdownjs/showdown/issues/315)\n\n### Features\n\n* **requireSpaceBeforeHeadingText:** option to make space between `#` and header text mandatory ([5d19877](https://github.com/showdownjs/showdown/commit/5d19877)), closes [#277](https://github.com/showdownjs/showdown/issues/277)\n\n\n\n<a name=\"1.5.2\"></a>\n## [1.5.2](https://github.com/showdownjs/showdown/compare/1.5.1...1.5.2) (2016-12-17)\n\n\n### Bug Fixes\n\n* **listeners:** fix listeners typo ([f0d25b7](https://github.com/showdownjs/showdown/commit/f0d25b7)), closes [#290](https://github.com/showdownjs/showdown/issues/290)\n* **lists:** lines with multiple dashes being parsed as multilists ([10b3410](https://github.com/showdownjs/showdown/commit/10b3410)), closes [#312](https://github.com/showdownjs/showdown/issues/312)\n* **nbsp:** nbsp are replaced with simple spaces ([6e90f7c](https://github.com/showdownjs/showdown/commit/6e90f7c))\n\n\n\n<a name=\"1.5.1\"></a>\n## [1.5.1](https://github.com/showdownjs/showdown/compare/1.5.0...1.5.1) (2016-12-01)\n\n\n### Features\n\n* **simpleLineBreaks:** option that parses linebreaks as <br />. This option enables linebreaks to always be treated as `<br />` tags \n  without needing to add spaces in front of the line, the same way GitHub does. ([0942b5e](https://github.com/showdownjs/showdown/commit/0942b5e)), closes [#206](https://github.com/showdownjs/showdown/issues/206)\n* **excludeTrailingPunctuationFromURLs:** option that excludes trailing punctuation from auto linked URLs. ([d2fc2a0](https://github.com/showdownjs/showdown/commit/d2fc2a0)), closes [#266](https://github.com/showdownjs/showdown/issues/266) [#308](https://github.com/showdownjs/showdown/issues/308)\n\n\n\n<a name=\"1.5.0\"></a>\n## [1.5.0](https://github.com/showdownjs/showdown/compare/1.4.4...1.5.0) (2016-11-11)\n\n\n### Bug Fixes\n\n* **lists:** enforce 4 space indentation in sublists ([d51be6e](https://github.com/showdownjs/showdown/commit/d51be6e))\n* **lists:** fix sublists inconsistent behavior ([9cfe8b1](https://github.com/showdownjs/showdown/commit/9cfe8b1)), closes [#299](https://github.com/showdownjs/showdown/issues/299)\n\n### Features\n\n* **disableForced4SpacesIndentedSublists:** option that disables the requirement of indenting nested sublists by 4 spaces. The option is disabled by default ([0be39bc](https://github.com/showdownjs/showdown/commit/0be39bc))\n\n\n### BREAKING CHANGES\n\n* syntax for sublists is now more restrictive. Before, sublists SHOULD be indented by 4 spaces, but indenting at least 2 spaces would work. \n  Now, sublists MUST be indented 4 spaces or they won't work.\n\n    With this input:\n    ```md\n    * one\n      * two\n        * three\n    ```\n    \n    Before (output):\n    ```html\n    <ul>\n      <li>one\n        <ul>\n          <li>two\n            <ul><li>three</li></ul>\n          <li>\n        </ul>\n      </li>\n    <ul>\n    ```\n    \n    After (output):\n    ```html\n    <ul>\n      <li>one</li>\n      <li>two\n        <ul><li>three</li></ul>\n      </li>\n    </ul>\n    ```\n    \n    To migrate either fix source md files or activate the option `disableForced4SpacesIndentedSublists`:\n    ```md\n    showdown.setOption('disableForced4SpacesIndentedSublists', true);\n    ```\n\n\n<a name=\"1.4.4\"></a>\n## [1.4.4](https://github.com/showdownjs/showdown/compare/1.4.3...1.4.4) (2016-11-02)\n\n\n### Bug Fixes\n\n* make some regexes a bit faster and make tab char equivalent to 4 spaces ([b7e7560](https://github.com/showdownjs/showdown/commit/b7e7560))\n* **double linebreaks:** fix double linebreaks in html output ([f97e072](https://github.com/showdownjs/showdown/commit/f97e072)), closes [#291](https://github.com/showdownjs/showdown/issues/291)\n* **lists linebreaks:** fix lists linebreaks in html output ([2b813cd](https://github.com/showdownjs/showdown/commit/2b813cd)), closes [#291](https://github.com/showdownjs/showdown/issues/291)\n* **parser:** fix issue with comments inside nested code blocks ([799abea](https://github.com/showdownjs/showdown/commit/799abea)), closes [#288](https://github.com/showdownjs/showdown/issues/288)\n\n\n\n<a name=\"1.4.3\"></a>\n## [1.4.3](https://github.com/showdownjs/showdown/compare/1.4.2...1.4.3) (2016-08-19)\n\n\n### Bug Fixes\n\n* **bower:** fix sourceMappingURL errors in bower by including source ([9b5a233](https://github.com/showdownjs/showdown/commit/9b5a233)), closes [#200](https://github.com/showdownjs/showdown/issues/200)\n* **comments:** Fix html comment parser ([238726c](https://github.com/showdownjs/showdown/commit/238726c)), closes [#276](https://github.com/showdownjs/showdown/issues/276)\n* **ie8 compatibility:** Improve ie8 compatibility ([984942e](https://github.com/showdownjs/showdown/commit/984942e)), closes [#275](https://github.com/showdownjs/showdown/issues/275) [#271](https://github.com/showdownjs/showdown/issues/271)\n* **simplifiedAutoLink:** fix simplified autolink to match GFM behavior ([0cc55b0](https://github.com/showdownjs/showdown/commit/0cc55b0)), closes [#284](https://github.com/showdownjs/showdown/issues/284) [#285](https://github.com/showdownjs/showdown/issues/285)\n\n\n\n<a name=\"1.4.2\"></a>\n## [1.4.2](https://github.com/showdownjs/showdown/compare/1.4.1...1.4.2) (2016-06-21)\n\n\n### Bug Fixes\n\n* **image-parser:** fix ref style imgs after inline style imgs not parsing correctly ([73206b0](https://github.com/showdownjs/showdown/commit/73206b0)), closes [#261](https://github.com/showdownjs/showdown/issues/261)\n* **tables:** add check for undefined on text due to failing to parse tables ([6e30a48](https://github.com/showdownjs/showdown/commit/6e30a48)), author [stewartmckee](https://github.com/stewartmckee), closes [#257](https://github.com/showdownjs/showdown/pull/247)\n\n### Features\n\n* **smart-indent-fix:** fix for es6 indentation problems ([261f127](https://github.com/showdownjs/showdown/commit/261f127)), closes [#259](https://github.com/showdownjs/showdown/issues/259)\n\n\n\n<a name=\"1.4.1\"></a>\n## [1.4.1](https://github.com/showdownjs/showdown/compare/1.4.0...1.4.1) (2016-05-17)\n\n\n### Bug Fixes\n\n* **tables:** fix table heading separators requiring 3 dashes instead of 2 ([ddaacfc](https://github.com/showdownjs/showdown/commit/ddaacfc)), closes [#256](https://github.com/showdownjs/showdown/issues/256)\n\n\n\n<a name=\"1.4.0\"></a>\n## [1.4.0](https://github.com/showdownjs/showdown/compare/1.3.0...1.4.0) (2016-05-13)\n\n\n### Bug Fixes\n\n* **hashHTMLBlock:** fix issue with html breaking markdown parsing ([2746949](https://github.com/showdownjs/showdown/commit/2746949)), closes [#220](https://github.com/showdownjs/showdown/issues/220)\n* **HTMLParser:** fix code tags parsing ([71a5873](https://github.com/showdownjs/showdown/commit/71a5873)), closes [#231](https://github.com/showdownjs/showdown/issues/231)\n* **HTMLParser:** fix ghCodeBlocks being parsed inside code tags ([7d0436d](https://github.com/showdownjs/showdown/commit/7d0436d)), closes [#229](https://github.com/showdownjs/showdown/issues/229)\n* **strikethrough:** Fix strikethrough issue with escaped chars ([5669317](https://github.com/showdownjs/showdown/commit/5669317)), closes [#214](https://github.com/showdownjs/showdown/issues/214)\n* **tables:** fix tables to match github's md spec ([f58f014](https://github.com/showdownjs/showdown/commit/f58f014)), closes [#230](https://github.com/showdownjs/showdown/issues/230)\n\n### Features\n\n* **markdown=\"1\":** enable parsing markdown inside HTML blocks ([c97f1dc](https://github.com/showdownjs/showdown/commit/c97f1dc)), closes [#178](https://github.com/showdownjs/showdown/issues/178)\n\n\n\n<a name=\"1.3.0\"></a>\n## [1.3.0](https://github.com/showdownjs/showdown/compare/1.2.3...1.3.0) (2015-10-19)\n\n\n### Bug Fixes\n\n* **literalMidWordUnderscores:** fix different behavior with asterisks ([e86aea8](https://github.com/showdownjs/showdown/commit/e86aea8)), closes [#198](https://github.com/showdownjs/showdown/issues/198)\n* **simpleautolink:** fix mail simpleAutoLink to ignore urls with @ symbol ([8ebb25e](https://github.com/showdownjs/showdown/commit/8ebb25e)), closes [#204](https://github.com/showdownjs/showdown/issues/204)\n\n### Features\n\n* **eventDispatcher:** add an event dispatcher to converter ([2734326](https://github.com/showdownjs/showdown/commit/2734326))\n* **hashHTMLSpans:** add support for hashing span elements ([3097bd4](https://github.com/showdownjs/showdown/commit/3097bd4)), closes [#196](https://github.com/showdownjs/showdown/issues/196) [#175](https://github.com/showdownjs/showdown/issues/175)\n\n\n<a name\"1.2.3\"></a>\n## [1.2.3](https://github.com/showdownjs/showdown/compare/1.2.2...1.2.3) (2015-08-27)\n\n\n### Bug Fixes\n\n* **blockGamut:** fix for headings inside blockquotes ([3df70624](http://github.com/showdownjs/showdown/commit/3df70624), closes [#191](http://github.com/showdownjs/showdown/issues/191))\n* **blockQuote:** fix 'github style codeblocks' not being parsed inside 'blockquote' ([ed2cf595](http://github.com/showdownjs/showdown/commit/ed2cf595), closes [#192](http://github.com/showdownjs/showdown/issues/192))\n* **simpleAutoLinks:** fix emails being treated as simple urls ([7dc3fb1d](http://github.com/showdownjs/showdown/commit/7dc3fb1d), closes [#187](http://github.com/showdownjs/showdown/issues/187))\n* **tables:** fix md tables being parsed inside indented code blocks. ([50256233](http://github.com/showdownjs/showdown/commit/50256233), closes [#193](http://github.com/showdownjs/showdown/issues/193))\n\n\n<a name\"1.2.2\"></a>\n## [1.2.2](https://github.com/showdownjs/showdown/compare/1.2.1...1.2.2) (2015-08-02)\n\n\n### Bug Fixes\n\n* **lists:** fix github code blocks not being parsed inside lists ([7720c88b](http://github.com/showdownjs/showdown/commit/7720c88b), closes [#142](http://github.com/showdownjs/showdown/issues/142), [#183](http://github.com/showdownjs/showdown/issues/183), [#184](http://github.com/showdownjs/showdown/issues/184))\n\n\n<a name\"1.2.1\"></a>\n## [1.2.1](https://github.com/showdownjs/showdown/compare/1.2.0...1.2.1) (2015-07-22)\n\n\n### Features\n\n* **smoothLivePreview:** fix weird effects due to parsing incomplete input ([62ba3733](http://github.com/showdownjs/showdown/commit/62ba3733))\n* **subParsers/githubCodeBlock:** add extra language class to conform to html5 spec ([b7f5e32](http://github.com/showdownjs/showdown/commit/b7f5e32))\n\n\n### Bug Fixes\n\n* **tables:** \n\n  * fix undefined error in malformed tables ([6176977](http://github.com/showdownjs/showdown/commit/6176977))\n  * add support for md span elements in table headers ([789dc18](http://github.com/showdownjs/showdown/commit/789dc18)), closes [#179](http://github.com/showdownjs/showdown/issues/179)\n    \n* **italicsAndBold:** \n\n    * fix broken em/strong tags when used with literalMidWordUnderscores ([7ee2017](http://github.com/showdownjs/showdown/commit/7ee2017)), closes [#179](http://github.com/showdownjs/showdown/issues/179)\n    * fix underscores not being correctly parsed when used in conjunction with literalMidWordsUnderscores option ([c9e85f1](http://github.com/showdownjs/showdown/commit/c9e85f1))\n    \n* **codeSpans:** Fix issue with code html tags not being correctly escaped ([5f043ca](http://github.com/showdownjs/showdown/commit/5f043ca))\n\n* **images:** fix alt attribute not being escaped correctly ([542194e](http://github.com/showdownjs/showdown/commit/542194e))\n\n\n<a name\"1.2.0\"></a>\n## [1.2.0](https://github.com/showdownjs/showdown/compare/1.1.0...1.2.0) (2015-07-13)\n\nThis release moves some of the most popular extensions (such as table-extension and github-extension) to core.\nAlso introduces a simple cli tool that you can use to quickly convert markdown files into html. \n\n\n### Bug Fixes\n\n* **headerLevelStart:** fix for NaN error when specifying a non number as headerLevelStart param ([be72b487](http://github.com/showdownjs/showdown/commit/be72b487))\n\n\n### Features\n\n* **CLI:** simple cli tool (ALPHA) ([f6a33e40](http://github.com/showdownjs/showdown/commit/f6a33e40))\n* **flavours:** add markdown presets/flavors ([7e55bceb](http://github.com/showdownjs/showdown/commit/7e55bceb), closes [#164](http://github.com/showdownjs/showdown/issues/164))\n* **ghCodeBlocks:** add option to disable GH codeblocks ([c33f9888](http://github.com/showdownjs/showdown/commit/c33f9888))\n* **literalMidWordUnderscores:**  add support for GFM literal midword underscores ([0c0cd7db](http://github.com/showdownjs/showdown/commit/0c0cd7db))\n* **simplifiedAutoLink:** add support for GFM autolinks ([cff02372](http://github.com/showdownjs/showdown/commit/cff02372))\n* **strikethrough:**  add support for GFM strikethrough ([43e9448d](http://github.com/showdownjs/showdown/commit/43e9448d))\n* **tables:**  add support for GFM tables ([3a924e3c](http://github.com/showdownjs/showdown/commit/3a924e3c))\n* **tasklists:** add support for GFM tasklists ([dc72403a](http://github.com/showdownjs/showdown/commit/dc72403a))\n\n\n<a name\"1.1.0\"></a>\n## [1.1.0](https://github.com/showdownjs/showdown/compare/1.0.2...1.1.0) (2015-06-18)\n\n\n### Bug Fixes\n\n* **converter.js:** add error if the passed constructor argument is not an object ([d86ed450](http://github.com/showdownjs/showdown/commit/d86ed450))\n* **output modifiers:** fix for output modifiers running twice ([dcbdc61e](http://github.com/showdownjs/showdown/commit/dcbdc61e))\n\n\n### Features\n\n* **headerLevelStart:** add support for setting the header starting level ([b84ac67d](http://github.com/showdownjs/showdown/commit/b84ac67d), closes [#69](http://github.com/showdownjs/showdown/issues/69))\n* **image dimensions:** add support for setting image dimensions within markdown syntax ([af82c2b6](http://github.com/showdownjs/showdown/commit/af82c2b6), closes [#143](http://github.com/showdownjs/showdown/issues/143))\n* **noHeaderId:** add option to suppress automatic generation of ids in headers ([7ac893e9](http://github.com/showdownjs/showdown/commit/7ac893e9))\n* **showdown.getDefaultOptions:** add method to retrieve default global options keypairs ([2de53a7d](http://github.com/showdownjs/showdown/commit/2de53a7d))\n\n\n### Breaking Changes\n\n* Deprecates `showdown.extensions` property. To migrate, extensions should use the new method `showdown.extension(<ext name>, <extension>)` to register.\n  For more information on the new extension loading mechanism, please check the wiki pages.\n  ([4ebd0caa](http://github.com/showdownjs/showdown/commit/4ebd0caa))\n\n\n<a name\"1.0.2\"></a>\n## [1.0.2](https://github.com/showdownjs/showdown/compare/1.0.1...1.0.2) (2015-05-28)\n\n### Bug Fixes\n\n* **Gruntfile.js** add missing comma in footer. This bug prevented concatenating other js scripts and libraries\n  with showdown([5315508](http://github.com/showdownjs/showdown/commit/5315508). Credits to Alexandre Courtiol.\n\n\n<a name\"1.0.1\"></a>\n## [1.0.1](https://github.com/showdownjs/showdown/compare/1.0.0...1.0.1) (2015-05-27)\n\n\n### Bug Fixes\n\n* **bower.json:** update bower.json main attribute to point to dist directory ([bc3a092f](http://github.com/showdownjs/showdown/commit/bc3a092f))\n\n\n<a name\"1.0.0\"></a>\n## [1.0.0](https://github.com/showdownjs/showdown/compare/0.3.4...1.0.0) (2015-05-27)\n\n### Release Information\nThis is a major code refactor with some big changes such as:\n  - showdown.js file was split in several files, called sub-parsers. This should improve code maintainability.\n  - angular integration was removed from core and move to its own repository, similar to what was done with extensions\n  - A new extension registering system is on the \"cooks\" that should reduce errors when using extensions. The old mechanism\n  is kept so old extensions should be compatible.\n\n### Bug Fixes\n\n* **extensions:** support for old extension loading mechanism ([95ed7c68](http://github.com/showdownjs/showdown/commit/95ed7c68))\n* **helpers:** fix wrong function call 'escapeCharacters' due to old strayed code ([18ba4e75](http://github.com/showdownjs/showdown/commit/18ba4e75))\n* **showdown.js:**\n  - fix showdown extension loader ([a38c76d2](http://github.com/showdownjs/showdown/commit/a38c76d2)),\n  closes [#50](http://github.com/showdownjs/showdown/issues/50),[#56](http://github.com/showdownjs/showdown/issues/56),\n  [#104](http://github.com/showdownjs/showdown/issues/104), [#108](http://github.com/showdownjs/showdown/issues/108),\n  [#109](http://github.com/showdownjs/showdown/issues/109), [#111](http://github.com/showdownjs/showdown/issues/111),\n  [#118](http://github.com/showdownjs/showdown/issues/118), [#122](http://github.com/showdownjs/showdown/issues/122)\n  - add unique id prefix and suffix to headers ([c367a4b9](http://github.com/showdownjs/showdown/commit/c367a4b9), closes [#81](http://github.com/showdownjs/showdown/issues/81), [#82](http://github.com/showdownjs/showdown/issues/82))\n* **options.omitExtraWLInCodeBlocks:** fix for options.omitExtraWLInCodeBlocks only applying in gitHub flavoured code b ([e6f40e19](http://github.com/showdownjs/showdown/commit/e6f40e19))\n* **showdown:** fix for options merging into globalOptions ([ddd6011d](http://github.com/showdownjs/showdown/commit/ddd6011d), closes [#153](http://github.com/showdownjs/showdown/issues/153))\n\n### Features\n\n* **registerExtension():** new extension loading mechanism. Now extensions can be registered using this function.\n  The system, however, is not final and will probably be changed until the final version([0fd10cb] (http://github.com/showdownjs/showdown/commit/0fd10cb))\n* **allowBlockIndents:** indented inline block elements can now be parsed as markdown ([f6326b84](http://github.com/showdownjs/showdown/commit/f6326b84))\n* **omitExtraWLInCodeBlocks:**  add option to omit extra newline at the end of codeblocks ([141e3f5](http://github.com/showdownjs/showdown/commit/141e3f5))\n* **prefixHeaderId:** add options to prefix header ids to prevent id clash ([141e3f5](http://github.com/showdownjs/showdown/commit/141e3f5))\n* **Converter.options:** add getOption(), setOption() and getOptions() to Converter object ([db6f79b0](http://github.com/showdownjs/showdown/commit/db6f79b0))\n\n### Breaking Changes\n* **NAMESPACE:** showdown's namespace changed.\n\n   To migrate your code you should update all references to `Showdown` with `showdown`.\n\n* **Converter:** converter reference changed from `converter` to `Converter`.\n\n   To migrate you should update all references to `Showdown.converter` with `showdown.Converter`\n\n* **angular:** angular integration was removed from core and now lives in it's own [repository](http://github.com/showdownjs/angular/).\n\n   If you're using angular integration, you should install ng-showdown. Ex: `bower install ng-showdown`\n\n* **extensions:** showdown extensions were removed from core package and now live in their own repository. See the [project's github page](https://github.com/showdownjs) for available extensions\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Contributing\n============\n\nIf you wish to contribute please read the following quick guide.\n\n# Issues (bug reporting)\nGenerally, bug reports should be in the following format:\n\n 1. Description (Brief description of the problem)\n 2. Input (input that is causing problems)\n 3. Expected Output (Output that is expected)\n 4. Actual Output (Actual showdown output)\n\nex:\n\n**Description:**\nDouble asterisks do not parse as bold\n\n**Input:**\n    \n    hello **world**!\n     \n**Expected output:**\n\n    <p>hello <b>world</b>!\n\n**Actual Output:**\n\n    <p>hello **world**!</p>\n\n\n\n# Want a Feature?\nYou can request a new feature by submitting an issue. If you would like to implement a new feature feel free to issue a\nPull Request.\n\n\n# Pull requests (PRs)\nPRs are awesome. However, before you submit your pull request consider the following guidelines:\n\n - Search GitHub for an open or closed Pull Request that relates to your submission. You don't want to duplicate effort.\n - When issuing PRs that change code, make your changes in a new git branch based on develop:\n\n   ```bash\n   git checkout -b my-fix-branch develop\n   ```\n\n - Run the full test suite before submitting and make sure all tests pass (obviously =P).\n - Try to follow our [**coding style rules**](https://github.com/showdownjs/code-style/blob/master/README.md).\n   Breaking them prevents the PR to pass the tests.\n - Refrain from fixing multiple issues in the same pull request. It's preferable to open multiple small PRs instead of one\n   hard to review big one. Also, don't reuse old forks (or PRs) to fix new issues.\n - If the PR introduces a new feature or fixes an issue, please add the appropriate test case.\n - We use commit notes to generate the changelog. It's extremely helpful if your commit messages adhere to the\n [**AngularJS Git Commit Guidelines**](https://github.com/showdownjs/code-style/blob/master/README.md#commit-message-convention).\n - If we suggest changes then:\n   - Make the required updates.\n   - Re-run the Angular test suite to ensure tests are still passing.\n   - Rebase your branch and force push to your GitHub repository (this will update your Pull Request):\n\n   ```bash\n   git rebase develop -i\n   git push origin my-fix-branch -f\n   ```\n - After your pull request is merged, you can safely delete your branch.\n\nIf you have time to contribute to this project, we feel obliged that you get credit for it.\nThese rules enable us to review your PR faster and will give you appropriate credit in your GitHub profile.\nWe thank you in advance for your contribution!\n\n\n# Joining the team\nWe're looking for members to help maintaining Showdown.\nPlease see [this issue](https://github.com/showdownjs/showdown/issues/114) to express interest or comment on this note.\n"
  },
  {
    "path": "CREDITS.md",
    "content": "Credits\n=======\n  \n  - Showdown v2\n    * [Estevão Santos](https://github.com/tivie)\n    * [SyntaxRules](https://github.com/SyntaxRules)\n\n  - Showdown v1\n    * [Estevão Santos](https://github.com/tivie)\n    * [Pascal Deschênes](https://github.com/pdeschen)\n\n  - Showdown v0\n    * [Corey Innis](http://github.com/coreyti):<br/>\n      Original GitHub project maintainer\n    * [Remy Sharp](https://github.com/remy/):<br/>\n      CommonJS-compatibility and more\n    * [Konstantin Käfer](https://github.com/kkaefer/):<br/>\n      CommonJS packaging\n    * [Roger Braun](https://github.com/rogerbraun):<br/>\n      Github-style code blocks\n    * [Dominic Tarr](https://github.com/dominictarr):<br/>\n      Documentation\n    * [Cat Chen](https://github.com/CatChen):<br/>\n      Export fix\n    * [Titus Stone](https://github.com/tstone):<br/>\n      Mocha tests, extension mechanism, and bug fixes\n    * [Rob Sutherland](https://github.com/roberocity):<br/>\n      The idea that lead to extensions\n    * [Pavel Lang](https://github.com/langpavel):<br/>\n      Code cleanup\n    * [Ben Combee](https://github.com/unwiredben):<br/>\n      Regex optimization\n    * [Adam Backstrom](https://github.com/abackstrom):<br/>\n      WebKit bugfix\n    * [Pascal Deschênes](https://github.com/pdeschen):<br/>\n      Grunt support, extension fixes + additions, packaging improvements, documentation\n    * [Estevão Santos](https://github.com/tivie)<br/>\n      Bug fixing and late maintainer\n    * [Hannah Wolfe](https://github.com/ErisDS)<br/>\n      Bug fixes\n    * [Alexandre Courtiol](https://github.com/acourtiol)<br/>\n      Bug fixes and build optimization\n    * [Karthik Balakrishnan](https://github.com/torcellite)<br/>\n      Support for table alignment\n    * [rheber](https://github.com/rheber)<br/>\n      Cli\n      \n\n  - Original Project\n    * [John Gruber](http://daringfireball.net/projects/markdown/)<br/>\n      Author of Markdown\n    * [John Fraser](http://attacklab.net/)<br/>\n      Author of Showdown\n"
  },
  {
    "path": "DONATIONS.md",
    "content": "We would like to thank everyone that contributed to this library. If you find our library useful and wish to donate as well, you can do so [through patreon](https://www.patreon.com/showdownjs) or directly [through paypal](https://www.paypal.me/tiviesantos)!! Your contribution will be greatly appreciated.\n\n# Sponsors\n\n## Platinum Supporters\n\n## Gold Supporters\n\n## Silver Supporters\n\n\n# Patron Supporters\n\n## Awesome Supporter\n\n## Cool Supporter\n\n## Supporter\n\n - Ricardo Jordão\n \n - Tiago Silva\n\n\n---\n\n# One Time Donors\n\n- [**Learn on demand Systems**](http://www.learnondemandsystems.com/) (1000$)\n\n- **Nothing AG** (25€)\n\n    > Thank you for developing Showdown :)\n\n- **Sam Huffman** (15$)\n\n    > Thanks for the great work on showdown.js! I've been looking for a good solution to serve wiki-like text to a browser and render as\n    HTML but nearly gave up after mixed success with wikitext. Your library gets me very close to where I want to be.\n\n- **Maya Lekova** (10$)\n\n    > Great work with the showdown library! I just used it and it worked exactly the way I expected \n      (given a complex inline HTML inside the Markdown, which renders fine with other viewers). \n      The other libraries I've tried (markdown-it and marked) produced a lot of bogus output. Y\n      our library saved me at least half a day, thanks! Good luck :)\n\n- **Lin Wang** (10$)\n\n- **Walter Schnell** (10$)\n\n- **ivanhjc** (5$)\n\n- **Asbjørn Ulsberg** (5$)\n\n    > Thanks for the ShowdownJS support!\n\n- **Juan Marcelo Russo** (1$)\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "/**\n * Created by Tivie on 12-11-2014.\n */\n\nmodule.exports = function (grunt) {\n\n  if (grunt.option('q') || grunt.option('quiet')) {\n    require('quiet-grunt');\n  }\n\n  /**\n   * Load common tasks for legacy and normal tests\n   */\n  grunt.loadNpmTasks('grunt-contrib-clean');\n  grunt.loadNpmTasks('grunt-contrib-concat');\n  grunt.loadNpmTasks('grunt-contrib-uglify');\n  grunt.loadNpmTasks('grunt-mocha-test');\n  grunt.loadNpmTasks('grunt-endline');\n  grunt.loadNpmTasks('grunt-contrib-jshint');\n\n  // Project configuration.\n  var config = {\n    pkg: grunt.file.readJSON('package.json'),\n\n    concat: {\n      dist: {\n        options: {\n          sourceMap: true,\n          banner: ';/*! <%= pkg.name %> v <%= pkg.version %> - <%= grunt.template.today(\"dd-mm-yyyy\") %> */\\n(function(){\\n',\n          footer: '}).call(this);\\n'\n        },\n        src: [\n          'src/options.js',\n          'src/showdown.js',\n          'src/helpers.js',\n          'src/subParsers/makehtml/*.js',\n          'src/subParsers/makemarkdown/*.js',\n          'src/converter.js',\n          'src/loader.js'\n        ],\n        dest: 'dist/<%= pkg.name %>.js'\n      },\n      cli: {\n        src: [\n          'src/cli/cli.js'\n        ],\n        dest: 'bin/showdown.js'\n      },\n      test: {\n        src: '<%= concat.dist.src %>',\n        dest: '.build/<%= pkg.name %>.js',\n        options: {\n          sourceMap: false\n        }\n      }\n    },\n\n    clean: ['.build/'],\n\n    uglify: {\n      dist: {\n        options: {\n          sourceMap: true,\n          banner: '/*! <%= pkg.name %> v <%= pkg.version %> - <%= grunt.template.today(\"dd-mm-yyyy\") %> */'\n        },\n        files: {\n          'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']\n        }\n      },\n      cli: {\n        options: {\n          sourceMap: false,\n          banner: '#!/usr/bin/env node'\n        },\n        files: {\n          'bin/showdown.js': ['<%= concat.cli.dest %>']\n        }\n      }\n    },\n\n    endline: {\n      dist: {\n        files: {\n          'dist/<%= pkg.name %>.js': 'dist/<%= pkg.name %>.js',\n          'dist/<%= pkg.name %>.min.js': 'dist/<%= pkg.name %>.min.js'\n        }\n      }\n    },\n\n    jshint: {\n      options: {\n        jshintrc: '.jshintrc'\n      },\n      files: [\n        'Gruntfile.js',\n        'src/**/*.js',\n        'test/**/*.js'\n      ]\n    },\n\n    eslint: {\n      options: {\n        overrideConfigFile: '.eslintrc.json'\n      },\n      target: [\n        'Gruntfile.js',\n        'src/**/*.js',\n        'test/**/*.js'\n      ]\n    },\n\n    conventionalChangelog: {\n      options: {\n        changelogOpts: {\n          preset: 'angular'\n        }\n      },\n      release: {\n        src: 'CHANGELOG.md'\n      }\n    },\n\n    conventionalGithubReleaser: {\n      release: {\n        options: {\n          auth: {\n            type: 'oauth',\n            token: process.env.GH_TOEKN\n          },\n          changelogOpts: {\n            preset: 'angular'\n          }\n        }\n      }\n    },\n\n    mochaTest: {\n      functional: {\n        src: 'test/functional/**/*.js',\n        options: {\n          timeout: 3000,\n          ignoreLeaks: true,\n          reporter: 'spec',\n          require: ['test/bootstrap.js']\n        }\n      },\n      unit: {\n        src: 'test/unit/**/*.js',\n        options: {\n          timeout: 3000,\n          ignoreLeaks: true,\n          reporter: 'spec',\n          require: ['test/bootstrap.js']\n        }\n      },\n      single: {\n        options: {\n          timeout: 3000,\n          ignoreLeaks: false,\n          reporter: 'spec',\n          require: ['test/bootstrap.js']\n        }\n      },\n      cli: {\n        src: 'test/unit/cli.js',\n        options: {\n          timeout: 3000,\n          ignoreLeaks: false,\n          reporter: 'spec',\n          require: ['test/bootstrap.js']\n        }\n      }\n    }\n  };\n\n  grunt.initConfig(config);\n\n  /**\n   * Generate Changelog\n   */\n  grunt.registerTask('generate-changelog', function () {\n    'use strict';\n    grunt.loadNpmTasks('grunt-conventional-changelog');\n    grunt.loadNpmTasks('grunt-conventional-github-releaser');\n    grunt.task.run('conventionalChangelog');\n  });\n\n  /**\n   * Lint tasks\n   */\n  grunt.registerTask('lint', function () {\n    'use strict';\n    grunt.loadNpmTasks('grunt-eslint');\n    grunt.task.run('jshint', 'eslint');\n  });\n\n  /**\n   * Performance task\n   */\n  grunt.registerTask('performancejs', function () {\n    'use strict';\n    var perf = require('./test/performance/performance.js');\n    perf.runTests();\n    perf.generateLogs();\n  });\n\n  /**\n   * Run a single test\n   */\n  grunt.registerTask('single-test', function (file) {\n    'use strict';\n    grunt.config.merge({\n      mochaTest: {\n        single: {\n          src: file\n        }\n      }\n    });\n\n    grunt.task.run(['lint', 'concat:test', 'mochaTest:single', 'clean']);\n  });\n\n  /**\n   * Tasks\n   */\n  grunt.registerTask('test', ['clean', 'lint', 'concat:test', 'mochaTest:unit', 'mochaTest:functional', 'clean']);\n  grunt.registerTask('test-functional', ['concat:test', 'mochaTest:functional', 'clean']);\n  grunt.registerTask('test-unit', ['concat:test', 'mochaTest:unit', 'clean']);\n  grunt.registerTask('test-cli', ['clean', 'lint', 'concat:test', 'mochaTest:cli', 'clean']);\n\n  grunt.registerTask('performance', ['concat:test', 'performancejs', 'clean']);\n  grunt.registerTask('build', ['test', 'concat:dist', 'concat:cli', 'uglify:dist', 'uglify:cli', 'endline']);\n  grunt.registerTask('build-without-test', ['concat:dist', 'uglify', 'endline']);\n  grunt.registerTask('prep-release', ['build', 'performance', 'generate-changelog']);\n\n  // Default task(s).\n  grunt.registerTask('default', ['test']);\n};\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018,2021 ShowdownJS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "![Showdown][sd-logo]\n\n![Build Status: Linux](https://github.com/showdownjs/showdown/actions/workflows/node.linux.yml/badge.svg)\n![Build Status: Windows](https://github.com/showdownjs/showdown/actions/workflows/node.win.yml/badge.svg)\n[![Browserstack Tests](https://automate.browserstack.com/badge.svg?badge_key=VTIvTDNqWVdaTHljbS9RNmYrcTBiL0Uxc3dkRDhaN1dPaXpPb2VOc1B2VT0tLU1Ib09kVjVzMjhFcHExbWFSWlJEV3c9PQ==--1fb92e1730e4a00630d17d533822de6403ca65ec)](https://automate.browserstack.com/public-build/VTIvTDNqWVdaTHljbS9RNmYrcTBiL0Uxc3dkRDhaN1dPaXpPb2VOc1B2VT0tLU1Ib09kVjVzMjhFcHExbWFSWlJEV3c9PQ==--1fb92e1730e4a00630d17d533822de6403ca65ec)\n[![npm version](https://badge.fury.io/js/showdown.svg)](http://badge.fury.io/js/showdown)\n[![Bower version](https://badge.fury.io/bo/showdown.svg)](http://badge.fury.io/bo/showdown)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/tiviesantos)\n\n------\n\nShowdown is a JavaScript Markdown to HTML converter, based on the original works by John Gruber.\nShowdown can be used client side (in the browser) or server side (with Node.js).\n\n## Live DEMO\n\n\n\nAs you know, ShowdownJS is a free library and it will remain free forever. However, maintaining and improving the library costs time and money.\n\nIf you like our work and find our library useful, please donate through [PayPal](https://www.paypal.me/tiviesantos)! Your contribution will be greatly appreciated and help me continue to develop this awesome library.\n\n## License\n\nShowdownJS v 2.0 is released under the MIT license.\nPrevious versions are released under BSD.\n\n## Who uses Showdown (or a fork)\n\n - [GoogleCloudPlatform](https://github.com/GoogleCloudPlatform)\n - [Meteor](https://www.meteor.com/)\n - [Stackexchange](http://stackexchange.com/) - forked as [PageDown](https://code.google.com/p/pagedown/)\n - [docular](https://github.com/Vertafore/docular)\n - [md-page](https://github.com/oscarmorrison/md-page)\n - [QCObjects](https://qcobjects.dev)\n - [and some others...](https://www.npmjs.com/browse/depended/showdown)\n\n## Installation\n\n### Download tarball\n\nYou can download the latest release tarball directly from [releases][releases].\n\n### Bower\n\n    bower install showdown\n\n### npm (server-side)\n\n    npm install showdown\n\n### NuGet package\n\n    PM> Install-Package showdownjs\n\nThe NuGet Packages can be found [here](https://www.nuget.org/packages/showdownjs/).\n\n### CDN\n\nYou can also use one of several CDNs available: \n\n* jsDelivr\n\n        https://cdn.jsdelivr.net/npm/showdown@<version tag>/dist/showdown.min.js\n\n* cdnjs\n\n        https://cdnjs.cloudflare.com/ajax/libs/showdown/<version tag>/showdown.min.js\n\n* unpkg\n       \n        https://unpkg.com/showdown/dist/showdown.min.js\n\n*Note*: replace `<version tag>` with an actual full length version you're interested in e.g. `1.9.0`\n## Browser Compatibility\n\nShowdown has been tested successfully with:\n\n  * Firefox 1.5 and 2.0\n  * Chrome 12.0\n  * Internet Explorer 6 and 7\n  * Safari 2.0.4\n  * Opera 8.54 and 9.10\n  * Netscape 8.1.2\n  * Konqueror 3.5.4\n\nIn theory, Showdown will work in any browser that supports ECMA 262 3rd Edition (JavaScript 1.5).\nThe converter itself might even work in things that aren't web browsers, like Acrobat.  No promises.\n\n\n## Node compatibility\n\nShowdown is intended to work on any supported Node.js version (see the [Node.js releases schedule](https://nodejs.org/en/about/releases/). The code may work with previous versions of Node.js, but no accomidations are made to ensure it does. \n\n\n## Legacy version\n\nIf you're looking for showdown v<1.0.0, you can find it in the [**legacy branch**][legacy-branch].\n\n## Changelog\n\nYou can check the full [changelog][changelog]\n\n## Extended documentation\nCheck our [wiki pages][wiki] for examples and a more in-depth documentation.\n\n\n## Quick Example\n\n### Node\n\n```js\nvar showdown  = require('showdown'),\n    converter = new showdown.Converter(),\n    text      = '# hello, markdown!',\n    html      = converter.makeHtml(text);\n```\n\n### Browser\n\n```js\nvar converter = new showdown.Converter(),\n    text      = '# hello, markdown!',\n    html      = converter.makeHtml(text);\n```\n\n### Output \n\nBoth examples should output...\n\n```html\n    <h1 id=\"hellomarkdown\">hello, markdown!</h1>\n```\n\n## Options\n\nYou can change some of showdown's default behavior through options. \n\n### Setting options\n\nOptions can be set:\n\n#### Globally\n\nSetting a \"global\" option affects all instances of showdown\n\n```js\nshowdown.setOption('optionKey', 'value');\n```\n\n#### Locally\nSetting a \"local\" option only affects the specified Converter object. \nLocal options can be set:\n\n * **through the constructor**\n    ```js\n    var converter = new showdown.Converter({optionKey: 'value'});\n    ```\n\n * **through the setOption() method**\n    ```js\n    var converter = new showdown.Converter();\n    converter.setOption('optionKey', 'value');\n    ```\n\n### Getting an option\n\nShowdown provides 2 methods (both local and global) to retrieve previous set options.\n\n#### getOption()\n\n```js\n// Global\nvar myOption = showdown.getOption('optionKey');\n\n//Local\nvar myOption = converter.getOption('optionKey');\n```\n\n#### getOptions()\n\n```js\n// Global\nvar showdownGlobalOptions = showdown.getOptions();\n\n//Local\nvar thisConverterSpecificOptions = converter.getOptions();\n```\n\n### Retrieve the default options\n\nYou can get showdown's default options with:\n```js\nvar defaultOptions = showdown.getDefaultOptions();\n```\n\n### Valid Options\n\n * **omitExtraWLInCodeBlocks**: (boolean) [default false] Omit the trailing newline in a code block. Ex:\n   \n    This:\n    ```html\n    <code><pre>var foo = 'bar';\n    </pre></code>\n    ```\n    Becomes this:\n    ```html\n    <code><pre>var foo = 'bar';</pre></code>\n    ```\n\n * **noHeaderId**: (boolean) [default false] Disable the automatic generation of header ids.\n   Setting to true overrides **prefixHeaderId**\n\n * **customizedHeaderId**: (boolean) [default false] Use text in curly braces as header id. **(since v1.7.0)**\n   Example:\n   ```\n   ## Sample header {real-id}     will use real-id as id\n   ```\n\n * **ghCompatibleHeaderId**: (boolean) [default false] Generate header ids compatible with github style\n   (spaces are replaced with dashes and a bunch of non alphanumeric chars are removed) **(since v1.5.5)**\n\n * **prefixHeaderId**: (string/boolean) [default false] Add a prefix to the generated header ids.\n   Passing a string will prefix that string to the header id. Setting to `true` will add a generic 'section' prefix.\n\n * **rawPrefixHeaderId**: (boolean) [default false] Setting this option to true will prevent showdown from modifying the prefix.\n   This might result in malformed IDs (if, for instance, the \" char is used in the prefix).\n   Has no effect if prefixHeaderId is set to false. **(since v 1.7.3)**\n\n * **rawHeaderId**: (boolean) [default false] Remove only spaces, ' and \" from generated header ids (including prefixes),\n    replacing them with dashes (-). WARNING: This might result in malformed ids **(since v1.7.3)**\n \n * **headerLevelStart**: (integer) [default 1] Set the header starting level. For instance, setting this to 3 means that\n\n    ```md\n    # foo\n    ```\n    will be parsed as \n    \n    ```html\n    <h3>foo</h3>\n    ```\n\n * **parseImgDimensions**: (boolean) [default false] Enable support for setting image dimensions from within markdown syntax.\n   Examples:\n   ```\n   ![foo](foo.jpg =100x80)     simple, assumes units are in px\n   ![bar](bar.jpg =100x*)      sets the height to \"auto\"\n   ![baz](baz.jpg =80%x5em)  Image with width of 80% and height of 5em\n   ```\n\n * **simplifiedAutoLink**: (boolean) [default false] Turning this option on will enable automatic linking to urls.\n   This means that:\n\n   ```md\n   some text www.google.com\n   ```\n   will be parsed as \n   ```html\n   <p>some text <a href=\"www.google.com\">www.google.com</a>\n   ```\n \n * ~~**excludeTrailingPunctuationFromURLs**: (boolean) [default false] This option excludes trailing punctuation from autolinking urls.\n   Punctuation excluded: `. !  ? ( )`. Only applies if **simplifiedAutoLink** option is set to `true`.~~\n   \n * **literalMidWordUnderscores**: (boolean) [default false] Turning this on will stop showdown from interpreting\n   underscores in the middle of words as `<em>` and `<strong>` and instead treat them as literal underscores.\n\n   Example:\n   \n   ```md\n   some text with__underscores__in middle\n   ```\n   will be parsed as\n   ```html\n   <p>some text with__underscores__in middle</p>\n   ```\n\n * ~~**literalMidWordAsterisks**: (boolean) [default false] Turning this on will stop showdown from interpreting asterisks\n   in the middle of words as `<em>` and `<strong>` and instead treat them as literal asterisks.~~\n   \n * **strikethrough**: (boolean) [default false] Enable support for strikethrough syntax.\n   `~~strikethrough~~` as `<del>strikethrough</del>`\n   \n * **tables**: (boolean) [default false] Enable support for tables syntax. Example:\n    \n   ```md\n   | h1    |    h2   |      h3 |\n   |:------|:-------:|--------:|\n   | 100   | [a][1]  | ![b][2] |\n   | *foo* | **bar** | ~~baz~~ |\n   ```\n   \n   See the wiki for more info\n\n * **tablesHeaderId**: (boolean) [default false] If enabled adds an id property to table headers tags.\n\n * **ghCodeBlocks**: (boolean) [default true] Enable support for GFM code block style.\n\n * **tasklists**: (boolean) [default false] Enable support for GFM tasklists. Example:\n \n   ```md\n    - [x] This task is done\n    - [ ] This is still pending\n   ```\n * **smoothLivePreview**: (boolean) [default false] Prevents weird effects in live previews due to incomplete input\n \n * **smartIndentationFix**: (boolean) [default false] Tries to smartly fix indentation problems related to es6 template\n   strings in the midst of indented code.\n\n * **disableForced4SpacesIndentedSublists**: (boolean) [default false] Disables the requirement of indenting sublists\n   by 4 spaces for them to be nested, effectively reverting to the old behavior where 2 or 3 spaces were enough.\n   **(since v1.5.0)**\n \n * **simpleLineBreaks**: (boolean) [default false] Parses line breaks as `<br>`, without\n   needing 2 spaces at the end of the line **(since v1.5.1)**\n \n   ```md\n   a line  \n   wrapped in two\n   ```\n    \n   turns into:\n    \n   ```html\n   <p>a line<br>\n   wrapped in two</p>\n   ```\n\n * **requireSpaceBeforeHeadingText**: (boolean) [default false] Makes adding a space between `#` and the header text mandatory **(since v1.5.3)**\n \n * **ghMentions**: (boolean) [default false] Enables github @mentions, which link to the username mentioned **(since v1.6.0)**\n \n * **ghMentionsLink**: (string) [default `https://github.com/{u}`] Changes the link generated by @mentions.\n   Showdown will replace `{u}` with the username. Only applies if ghMentions option is enabled.\n   Example: `@tivie` with ghMentionsOption set to `//mysite.com/{u}/profile` will result in `<a href=\"//mysite.com/tivie/profile\">@tivie</a>`\n \n * **encodeEmails**: (boolean) [default true] Enable e-mail addresses encoding through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities. (since v1.6.1)\n\n   NOTE: Prior to version 1.6.1, emails would always be obfuscated through dec and hex encoding.\n\n * **openLinksInNewWindow**: (boolean) [default false] Open all links in new windows\n   (by adding the attribute `target=\"_blank\"` to `<a>` tags) **(since v1.7.0)**\n\n * **backslashEscapesHTMLTags**: (boolean) [default false] Support for HTML Tag escaping. ex: `\\<div>foo\\</div>` **(since v1.7.2)**\n\n * **emoji**: (boolean) [default false] Enable emoji support. Ex: `this is a :smile: emoji`\n   For more info on available emojis, see https://github.com/showdownjs/showdown/wiki/Emojis **(since v.1.8.0)**\n\n * **underline**: (boolean) [default false] ***EXPERIMENTAL FEATURE*** Enable support for underline.\n   Syntax is **double** or **triple** **underscores** ex: `__underlined word__`. With this option enabled, underscores are no longer parses into `<em>` and `<strong>`.\n\n * **ellipsis**: (boolean) [default true] Replaces three dots with the ellipsis unicode character.\n\n * **completeHTMLDocument**: (boolean) [default false] Outputs a complete html document,\n   including `<html>`, `<head>` and `<body>` tags' instead of an HTML fragment. (since v.1.8.5)\n\n * **metadata**: (boolean) [default false] Enable support for document metadata (defined at the top of the document\n   between `«««` and `»»»` or between `---` and `---`).  (since v.1.8.5)\n   \n   ```js\n   var conv = new showdown.Converter({metadata: true});\n   var html = conv.makeHtml(someMd);\n   var metadata = conv.getMetadata(); // returns an object with the document metadata\n   ```\n\n * **splitAdjacentBlockquotes**: (boolean) [default false] Split adjacent blockquote blocks.(since v.1.8.6)\n\n * **moreStyling**: (boolean) [default false] Adds some useful classes for css styling. (since v2.0.1)\n    \n    - Tasklists: Adds the class `task-list-item-complete` to completed tasks items in GFM tasklists.\n\n**NOTE**: Please note that until **version 1.6.0**, all of these options are ***DISABLED*** by default in the cli tool.\n\n\n## Flavors\n\nYou can also use flavors or presets to set the correct options automatically, so that showdown behaves like popular markdown flavors.\n\nCurrently, the following flavors are available:\n\n * original - original markdown flavor as in [John Gruber's spec](https://daringfireball.net/projects/markdown/)\n * vanilla  - showdown base flavor (as from v1.3.1)\n * github   - GFM (GitHub Flavored Markdown)\n\n\n### Global\n```javascript\nshowdown.setFlavor('github');\n```\n\n### Instance\n```javascript\nconverter.setFlavor('github');\n```\n\n\n## CLI Tool\n\nShowdown also comes bundled with a Command Line Interface tool. You can check the [CLI wiki page][cli-wiki] for more info\n\n## Integration with AngularJS\n\nShowdownJS project also provides seamlessly integration with AngularJS via a \"plugin\".\nPlease visit https://github.com/showdownjs/ngShowdown for more information.\n\n## Integration with TypeScript\n\nIf you're using TypeScript you maybe want to use the types from [DefinitelyTyped][definitely-typed]\n\n## Integration with SystemJS/JSPM\n\nIntegration with SystemJS can be obtained via the third party [\"system-md\" plugin](https://github.com/guybedford/system-md).\n\n## Integration with VueJS\n\nTo use ShowdownJS as a Vue component quickly, you can check [vue-showdown](https://vue-showdown.js.org/).\n\n## XSS vulnerability\n\nShowdown doesn't sanitize the input. This is by design since markdown relies on it to allow certain features to be correctly parsed into HTML.\nThis, however, means XSS injection is quite possible.\n\nPlease refer to the wiki article [Markdown's XSS Vulnerability (and how to mitigate it)][xss-wiki]\nfor more information.\n\n## Extensions\n\nShowdown allows additional functionality to be loaded via extensions. (you can find a list of known showdown extensions [here][ext-wiki])\nYou can also find a boilerplate, to create your own extensions in [this repository][boilerplate-repo]\n\n### Client-side Extension Usage\n\n```js\n<script src=\"showdown.js\" />\n<script src=\"twitter-extension.js\" />\n\nvar converter = new showdown.Converter({ extensions: ['twitter'] });\n```\n\n### Server-side Extension Usage\n\n```js\nvar showdown    = require('showdown'),\n    myExtension = require('myExtension'),\n    converter = new showdown.Converter({ extensions: ['myExtension'] });\n```\n\n## Building\n\nBuilding your clone of the repository is easy.\n> Prerequesites: [Node.js](https://nodejs.org/) v12, [npm](https://www.npmjs.com/package/npm) and [npx](https://www.npmjs.com/package/npx) must be installed.\n\n1. run `npm install`.\n2. run `npx grunt build` (see [`Gruntfile.js`](/Gruntfile.js)). This command:\n\n    1. Cleans the repo.\n    2. Checks code quality ([JSHint](https://jshint.com/) and [ESLint](https://eslint.org/)).\n    3. Runs tests.\n    4. Creates the [distributable](/showdown.js) and [minified](/showdown.min.js) files in the [`dist`](/dist) folder.\n\n## Tests\n\nA suite of tests is available which require Node.js.  Once Node is installed, run the following command from\nthe project root to install the dependencies:\n\n    npm install\n\nOnce installed the tests can be run from the project root using:\n\n    npm test\n\nNew test cases can easily be added.  Create a markdown file (ending in `.md`) which contains the markdown to test.\nCreate a `.html` file of the exact same name.  It will automatically be tested when the tests are executed with `mocha`.\n\n## Contributing\n\nIf you wish to contribute please read the following quick guide.\n\n### Want a Feature?\nYou can request a new feature by submitting an issue. If you would like to implement a new feature feel free to issue a\nPull Request.\n\n\n### Pull requests (PRs)\nPRs are awesome. However, before you submit your pull request consider the following guidelines:\n\n - Search GitHub for an open or closed Pull Request that relates to your submission. You don't want to duplicate effort.\n - When issuing PRs that change code, make your changes in a new git branch based on **develop**:\n\n   ```bash\n   git checkout -b my-fix-branch develop\n   ```\n\n - Run the full test suite before submitting and make sure all tests pass (obviously =P).\n - Try to follow our [**coding style rules**][coding-rules]. Breaking them prevents the PR to pass the tests.\n - Refrain from fixing multiple issues in the same pull request. It's preferable to open multiple small PRs instead of one\n   hard to review big one.\n - If the PR introduces a new feature or fixes an issue, **please add the appropriate test case**.\n - We use [conventional commit][conventional-commits] notes to generate the changelog that follow the conventional changelog spec. It's extremely helpful if your commit messages adhere to these [Commit Guidelines][conventional-commits].\n - Don't forget to add your name to the [CREDITS.md](https://github.com/showdownjs/showdown/blob/master/CREDITS.md) file. We like to give credit were it's due.\n - If we suggest changes then:\n     - Make the required updates.\n     - Re-run the test suite to ensure tests are still passing.\n     - Rebase your branch and force push to your GitHub repository (this will update your Pull Request):\n\n     ```bash\n     git rebase develop -i\n     git push origin my-fix-branch -f\n     ```\n - After your pull request is merged, you can safely delete your branch.\n\nIf you have time to contribute to this project, we feel obliged that you get credit for it.\nThese rules enable us to review your PR faster and will give you appropriate credit in your GitHub profile.\nWe thank you in advance for your contribution!\n\n### Joining the team\nWe're looking for members to help maintaining Showdown.\nPlease see [this issue](https://github.com/showdownjs/showdown/issues/114) to express interest or comment on this note.\n\n## Credits\nFull credit list at https://github.com/showdownjs/showdown/blob/master/CREDITS.md\n\nShowdown is powered by:<br/>\n[![webstorm](https://www.jetbrains.com/webstorm/documentation/docs/logo_webstorm.png)](https://www.jetbrains.com/webstorm/)\n\n\n\n[sd-logo]: https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\n[legacy-branch]: https://github.com/showdownjs/showdown/tree/legacy\n[releases]: https://github.com/showdownjs/showdown/releases\n[changelog]: https://github.com/showdownjs/showdown/blob/master/CHANGELOG.md\n[wiki]: https://github.com/showdownjs/showdown/wiki\n[cli-wiki]: https://github.com/showdownjs/showdown/wiki/CLI-tool\n[definitely-typed]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/showdown\n[xss-wiki]: https://github.com/showdownjs/showdown/wiki/Markdown's-XSS-Vulnerability-(and-how-to-mitigate-it)\n[ext-wiki]: https://github.com/showdownjs/showdown/wiki/extensions\n[coding-rules]: https://github.com/showdownjs/code-style/blob/master/README.md\n[conventional-commits]: https://www.conventionalcommits.org/\n[boilerplate-repo]: https://github.com/showdownjs/extension-boilerplate\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nSecurity fixes are addressed for the following versions of Showdown.\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 2.0.x   | :white_check_mark: |\n| 1.x.x   | :x: (Known security issue with yargs dependecy) |\n\nShowdown targets the node.js versions targeted in the [node.js release schedule](https://nodejs.org/en/about/releases/). Our test suite follows this release schedule. Consequently, older versions of node may become unusable.\n\n## Reporting a Vulnerability\n\nTo report a vulnerability, please add an issue to our main github page: https://github.com/showdownjs/showdown/issues\n"
  },
  {
    "path": "TASKS.TODO.md",
    "content": "# ROADMAP TO VERSION 3.0\n\n\n## Options\n\n- [ ] **ghCompatibleHeaderId** (removal)\n\n    Will be removed and **will become the default behavior**.\n    \n- [ ] **customizedHeaderId** (removal)\n\n    This option introduced non compliant syntax so it really belongs in an extension.\n    The new **listener extension system** allows users to directly modify and customize\n    the HTML and add any attributes they wish. \n\n- [ ] **rawPrefixHeaderId** (removal)\n\n    This option will be superseeded by the option `rawHeaderId`. So basically activating `rawHeaderId` will make\n    showdown only to replace spaces, ', \", > and < with dashes (-) from generated header ids, including prefixes.\n\n- [X] **literalMidWordAsterisks** (removal)\n\n    This option is weird, hard to maintain and really... makes little sense.\n\n- [X] **excludeTrailingPunctuationFromURLs** (removal)\n\n    This option will be removed and will be the default behavior from now on.\n\n- [ ] **strikethrough** (change)\n\n    Will be enabled by default\n\n- [ ] **disableForced4SpacesIndentedSublists** (to think/postpone)\n\n    This was only a temporary option for backwards compatibility reason. However, most flavours support lists indented\n    with 2 spaces, so it puts us in a tight spot, specially since some markdown beautifiers out there insist in\n    indenting lists with 2 spaces, probably in a misguided try to follow the CommonMark spec.\n    \n    The CommonMark spec is, IMHO, a bit confusing for users regarding this, since list sub-blocks (and lists) \n    are determined by the spaces from the start of the line and the first character after the list mark. And the proof\n    are the MD beautifiers out there, which misinterpreted the spec and made a mess \n    \n    Showdown syntax is actually easier (and fully compliant with the original spec): if you indent something 4 spaces,\n    it becomes a sub-block. Since lists are blocks, you must indent it 4 spaces for it to become a sub-block.\n    \n    Regardless, we kinda have 2 solutions:\n    \n    - Drop support for 2 space indentation (and make a lot of users confused since GFM, CommonMark and others allow this)\n    - Create a new list subparser that can be turned on with an option, like gfmListStyle\n      (but postpones even more the alpha 3.0 release since the list subparser is probably the hardest thing to rewrite)\n    \n    Tough choices...\n\n- [ ] **simpleLineBreaks** (change)\n\n    Will be removed from Github Flavor since github only does this in comments (which is weird...)\n\n- [ ] **openLinksInNewWindow** (removal)\n\n    Will be removed in favor of the new listener extension, which will allow users to manipulate HTML tags attributes\n    directly.\n    \n- [ ] Revamp the option system\n\n    Revamp the option system so that it becomes more simple. Right now, it's really confusing. And option names are weird\n    too. The idea is to pass options to the constructor under an option object, that can have hierarchical structure.\n    Ex:\n    \n    ```js\n    var conv = new showdown.Converter({ \n      options: { \n        links: {\n          autoLinks: true\n        },\n        headings: {\n          startLevel: 2\n        }\n      }\n    });\n    ``` \n\n## Legacy Code Removal\n- [ ] Legacy extension support\n        \n    Old extensions that inject directly into extensions object property will no longer be supported\n    \n- [ ] HTML and OUTPUT extensions\n    \n    HTML and OTP extensions will be dropped in favor of Listener Extensions. We might even give them a new name\n    \n## Subparsers\n- [X] **Anchors**: Revamp the anchors subparser so it calls strikethrough, bold, italic and underline directly\n- [X] **autoLinks**: Fix some lingering bugs and issues with autolinks\n\n## Priority Bugs\n- [X] **#355**: *simplifiedAutoLink URLs inside parenthesis followed by another character are not parsed correctly*\n- [X] **#534**: *Multiple parentheses () in url link is not parsed correctly*\n- [ ] **#367**: *sublists rendering with 2 spaces* - related to disableForced4SpacesIndentedSublists option...\n- [ ] **#537**: *master branch doesn't work in a web worker*\n\n## CLI\n- [ ] Refactor the CLI\n- [ ] **#381**: *Support for src and dst directories in showdown cli*\n- [X] **#584**: *Fails to read from stdin*\n- [X] **#554**: *CLI not working with jsdom v10*\n\n## Other stuff\n- [X] Regexp rewrite for more performance oompf\n- [X] Full unit testing\n- [ ] Better error reporting\n\n## Stuff that probably won't make it to v2.0\n- [ ] **#486**: *A backslash at the end of the line is a hard line break*\n- [ ] **#548**: *anchors and images of subParser are errors when they are specific strings*\n- [ ] **#549**: *Strange parsing issue with `<pre><code>`*\n- [ ] Rethink the global variable\n\n## NEW Features\n\n### Event system\n- [X] Listener system revamp\n- [ ] Standardize events for all event types\n- [ ] Unit testing\n- [ ] Functional testing\n\nThis should address:\n- **#567**: Allow not making header ids lowercase\n- **#540**: Add complete class to the tasklist list element\n\n### MD to HTML conversion\n- [X] Basic support\n- [X] Basic functional testcase\n- [ ] Advanced support for all showdown MD features\n- [ ] Advanced functional testcase\n- [ ] Unit testing\n\n## Documentation (for v2.0)\n- [ ] Options\n- [ ] Extensions (and the new event system)\n- [ ] Cookbook (with stuff for backwards compatibility, specially regarding removed options)\n\n## Browser Testing\n\n- [X] Implement unit tests in Karma\n- [ ] Implement functional tests in Karma\n- [ ] Integrate with browserstack\n"
  },
  {
    "path": "bin/showdown.js",
    "content": "#!/usr/bin/env node\nvar showdown,version,fs=require(\"fs\"),path=require(\"path\"),Command=require(\"commander\").Command,program=new Command,path1=path.resolve(__dirname+\"/../dist/showdown.js\"),path2=path.resolve(__dirname+\"/../../.build/showdown.js\");function Messenger(o,t,e){\"use strict\";t=!!t||!!e,e=!!e,this._print=\"stdout\"===(o=o||\"stderr\")?console.log:console.error,this.errorExit=function(o){e||(console.error(\"ERROR: \"+o.message),console.error(\"Run 'showdown <command> -h' for help\")),process.exit(1)},this.okExit=function(){e||(this._print(\"\\n\"),this._print(\"DONE!\")),process.exit(0)},this.printMsg=function(o){t||e||!o||this._print(o)},this.printError=function(o){e||console.error(o)}}function showShowdownOptions(){\"use strict\";var o,t=showdown.getDefaultOptions(!1);for(o in console.log(\"\\nshowdown makehtml config options:\"),t)t.hasOwnProperty(o)&&console.log(\"  \"+o+\":\",\"[default=\"+t[o].defaultValue+\"]\",t[o].describe);console.log('\\n\\nExample: showdown makehtml -c openLinksInNewWindow ghMentions ghMentionsLink=\"https://google.com\"')}function parseShowdownOptions(o,t){\"use strict\";var e=t;if(o)for(var n=0;n<o.length;++n){var r=o[n],i=o[n],s=!0;/=/.test(r)&&(i=r.split(\"=\")[0],s=r.split(\"=\")[1]),e[i]=s}return e}function readFromStdIn(o){\"use strict\";o=o||\"utf8\";try{return fs.readFileSync(process.stdin.fd,o).toString()}catch(o){throw new Error(\"Could not read from stdin, reason: \"+o.message)}}function readFromFile(t,o){\"use strict\";try{return fs.readFileSync(t,o)}catch(o){throw new Error(\"Could not read from file \"+t+\", reason: \"+o.message)}}function writeToStdOut(o){\"use strict\";if(!process.stdout.write(o))throw new Error(\"Could not write to StdOut\")}function writeToFile(o,t,e){\"use strict\";e=e?fs.appendFileSync:fs.writeFileSync;try{e(t,o)}catch(o){throw new Error(\"Could not write to file \"+t+\", readon: \"+o.message)}}function makehtmlCommand(t,o){\"use strict\";if(t.configHelp)showShowdownOptions();else{var e,n,r,i=!!o.parent._optionValues.quiet,o=!!o.parent._optionValues.mute,s=t.input&&\"\"!==t.input&&!0!==t.input?\"file\":\"stdin\",a=t.output&&\"\"!==t.output&&!0!==t.output?\"file\":\"stdout\",d=new Messenger(\"file\"==a?\"stdout\":\"stderr\",i,o),i=showdown.getDefaultOptions(!0);if(t.flavor){if(d.printMsg(\"Enabling flavor \"+t.flavor+\"...\"),!(i=showdown.getFlavorOptions(t.flavor)))return void d.errorExit(new Error(\"Flavor \"+t.flavor+\" is not recognised\"));d.printMsg(\"OK!\")}for(n in t.config=parseShowdownOptions(t.config,i),t.config)t.config.hasOwnProperty(n)&&!0===t.config[n]&&d.printMsg(\"Enabling option \"+n);d.printMsg(\"\\nInitializing converter...\");try{r=new showdown.Converter(t.config)}catch(o){return void d.errorExit(o)}if(d.printMsg(\"OK!\"),t.extensions){d.printMsg(\"\\nLoading extensions...\");for(var p=0;p<t.extensions.length;++p)try{d.printMsg(t.extensions[p]);var u=require(t.extensions[p]);r.addExtension(u,t.extensions[p]),d.printMsg(t.extensions[p]+\" loaded...\")}catch(o){d.printError(\"ERROR: Could not load extension \"+t.extensions[p]+\". Reason:\"),d.errorExit(o)}}if(d.printMsg(\"...\"),d.printMsg(\"Reading data from \"+s+\"...\"),\"stdin\"==s)try{e=readFromStdIn(t.encoding)}catch(o){return void d.errorExit(o)}else try{e=readFromFile(t.input,t.encoding)}catch(o){return void d.errorExit(o)}if(d.printMsg(\"Parsing markdown...\"),o=r.makeHtml(e),d.printMsg(\"Writing data to \"+a+\"...\"),\"stdout\"==a)try{writeToStdOut(o)}catch(o){return void d.errorExit(o)}else try{writeToFile(o,t.output,t.append)}catch(o){return void d.errorExit(o)}d.okExit()}}version=fs.existsSync(path1)?(showdown=require(path1),require(path.resolve(__dirname+\"/../package.json\")).version):fs.existsSync(path2)?(showdown=require(path2),require(path.resolve(__dirname+\"/../../package.json\")).version):(showdown=require(\"../../dist/showdown\"),require(\"../../package.json\")),program.name(\"showdown\").description(\"CLI to Showdownjs markdown parser v\"+version).version(version).usage(\"<command> [options]\").option(\"-q, --quiet\",\"Quiet mode. Only print errors\").option(\"-m, --mute\",\"Mute mode. Does not print anything\"),program.command(\"makehtml\").description(\"Converts markdown into html\").addHelpText(\"after\",\"\\n\\nExamples:\").addHelpText(\"after\",\"  showdown makehtml -i                     Reads from stdin and outputs to stdout\").addHelpText(\"after\",\"  showdown makehtml -i foo.md -o bar.html  Reads 'foo.md' and writes to 'bar.html'\").addHelpText(\"after\",'  showdown makehtml -i --flavor=\"github\"   Parses stdin using GFM style').addHelpText(\"after\",\"\\nNote for windows users:\").addHelpText(\"after\",\"When reading from stdin, use option -u to set the proper encoding or run `chcp 65001` prior to calling showdown cli to set the command line to utf-8\").option(\"-i, --input [file]\",\"Input source. Usually a md file. If omitted or empty, reads from stdin. Windows users see note below.\",!0).option(\"-o, --output [file]\",\"Output target. Usually a html file. If omitted or empty, writes to stdout\",!0).option(\"-u, --encoding <encoding>\",\"Sets the input encoding\",\"utf8\").option(\"-y, --output-encoding <encoding>\",\"Sets the output encoding\",\"utf8\").option(\"-a, --append\",\"Append data to output instead of overwriting. Ignored if writing to stdout\",!1).option(\"-e, --extensions <extensions...>\",\"Load the specified extensions. Should be valid paths to node compatible extensions\").option(\"-p, --flavor <flavor>\",\"Run with a predetermined flavor of options. Default is vanilla\",\"vanilla\").option(\"-c, --config <config...>\",\"Enables showdown makehtml parser config options. Overrides flavor\").option(\"--config-help\",\"Shows configuration options for showdown parser\").action(makehtmlCommand),program.parse();"
  },
  {
    "path": "bower.json",
    "content": "{\n    \"name\": \"showdown\",\n    \"description\": \"A Markdown to HTML converter written in Javascript\",\n    \"homepage\": \"https://github.com/showdownjs/showdown\",\n    \"authors\": [\n      \"Estevão Santos (https://github.com/tivie)\",\n      \"Pascal Deschênes (https://github.com/pdeschen)\"\n    ],\n    \"main\": [\"dist/showdown.js\"],\n    \"ignore\": [\n      \".editorconfig\",\n      \".gitattributes\",\n      \".gitignore\",\n      \".jscs.json\",\n      \".jshintignore\",\n      \".jshintrc\",\n      \".travis.yml\",\n      \"Gruntfile.js\",\n      \"package.json\",\n      \"test/*\"\n    ],\n    \"repository\": {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/showdownjs/showdown.git\"\n    },\n    \"keywords\": [\n      \"markdown\",\n      \"md\",\n      \"mdown\"\n    ],\n    \"license\": \"https://github.com/showdownjs/showdown/blob/master/license.txt\"\n}\n"
  },
  {
    "path": "dist/showdown.js",
    "content": ";/*! showdown v 2.0.0 - 10-03-2022 */\n(function(){\n/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts (simple) {\n  'use strict';\n\n  var defaultOptions = {\n    omitExtraWLInCodeBlocks: {\n      defaultValue: false,\n      describe: 'Omit the default extra whiteline added to code blocks',\n      type: 'boolean'\n    },\n    noHeaderId: {\n      defaultValue: false,\n      describe: 'Turn on/off generated header id',\n      type: 'boolean'\n    },\n    prefixHeaderId: {\n      defaultValue: false,\n      describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \\'section-\\' prefix',\n      type: 'string'\n    },\n    rawPrefixHeaderId: {\n      defaultValue: false,\n      describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the \" char is used in the prefix)',\n      type: 'boolean'\n    },\n    ghCompatibleHeaderId: {\n      defaultValue: false,\n      describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',\n      type: 'boolean'\n    },\n    rawHeaderId: {\n      defaultValue: false,\n      describe: 'Remove only spaces, \\' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',\n      type: 'boolean'\n    },\n    headerLevelStart: {\n      defaultValue: false,\n      describe: 'The header blocks level start',\n      type: 'integer'\n    },\n    parseImgDimensions: {\n      defaultValue: false,\n      describe: 'Turn on/off image dimension parsing',\n      type: 'boolean'\n    },\n    simplifiedAutoLink: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM autolink style',\n      type: 'boolean'\n    },\n    literalMidWordUnderscores: {\n      defaultValue: false,\n      describe: 'Parse midword underscores as literal underscores',\n      type: 'boolean'\n    },\n    literalMidWordAsterisks: {\n      defaultValue: false,\n      describe: 'Parse midword asterisks as literal asterisks',\n      type: 'boolean'\n    },\n    strikethrough: {\n      defaultValue: false,\n      describe: 'Turn on/off strikethrough support',\n      type: 'boolean'\n    },\n    tables: {\n      defaultValue: false,\n      describe: 'Turn on/off tables support',\n      type: 'boolean'\n    },\n    tablesHeaderId: {\n      defaultValue: false,\n      describe: 'Add an id to table headers',\n      type: 'boolean'\n    },\n    ghCodeBlocks: {\n      defaultValue: true,\n      describe: 'Turn on/off GFM fenced code blocks support',\n      type: 'boolean'\n    },\n    tasklists: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM tasklist support',\n      type: 'boolean'\n    },\n    smoothLivePreview: {\n      defaultValue: false,\n      describe: 'Prevents weird effects in live previews due to incomplete input',\n      type: 'boolean'\n    },\n    smartIndentationFix: {\n      defaultValue: false,\n      describe: 'Tries to smartly fix indentation in es6 strings',\n      type: 'boolean'\n    },\n    disableForced4SpacesIndentedSublists: {\n      defaultValue: false,\n      describe: 'Disables the requirement of indenting nested sublists by 4 spaces',\n      type: 'boolean'\n    },\n    simpleLineBreaks: {\n      defaultValue: false,\n      describe: 'Parses simple line breaks as <br> (GFM Style)',\n      type: 'boolean'\n    },\n    requireSpaceBeforeHeadingText: {\n      defaultValue: false,\n      describe: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n      type: 'boolean'\n    },\n    ghMentions: {\n      defaultValue: false,\n      describe: 'Enables github @mentions',\n      type: 'boolean'\n    },\n    ghMentionsLink: {\n      defaultValue: 'https://github.com/{u}',\n      describe: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',\n      type: 'string'\n    },\n    encodeEmails: {\n      defaultValue: true,\n      describe: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',\n      type: 'boolean'\n    },\n    openLinksInNewWindow: {\n      defaultValue: false,\n      describe: 'Open all links in new windows',\n      type: 'boolean'\n    },\n    backslashEscapesHTMLTags: {\n      defaultValue: false,\n      describe: 'Support for HTML Tag escaping. ex: \\<div>foo\\</div>',\n      type: 'boolean'\n    },\n    emoji: {\n      defaultValue: false,\n      describe: 'Enable emoji support. Ex: `this is a :smile: emoji`',\n      type: 'boolean'\n    },\n    underline: {\n      defaultValue: false,\n      describe: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`',\n      type: 'boolean'\n    },\n    ellipsis: {\n      defaultValue: true,\n      describe: 'Replaces three dots with the ellipsis unicode character',\n      type: 'boolean'\n    },\n    completeHTMLDocument: {\n      defaultValue: false,\n      describe: 'Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags',\n      type: 'boolean'\n    },\n    metadata: {\n      defaultValue: false,\n      describe: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',\n      type: 'boolean'\n    },\n    splitAdjacentBlockquotes: {\n      defaultValue: false,\n      describe: 'Split adjacent blockquote blocks',\n      type: 'boolean'\n    },\n    moreStyling: {\n      defaultValue: false,\n      describe: 'Adds some useful styling css classes in the generated html',\n      type: 'boolean'\n    },\n    relativePathBaseUrl: {\n      defaultValue: false,\n      describe: 'Prepends a base URL to relative paths',\n      type: 'string'\n    },\n  };\n  if (simple === false) {\n    return JSON.parse(JSON.stringify(defaultOptions));\n  }\n  var ret = {};\n  for (var opt in defaultOptions) {\n    if (defaultOptions.hasOwnProperty(opt)) {\n      ret[opt] = defaultOptions[opt].defaultValue;\n    }\n  }\n  return ret;\n}\n\nfunction allOptionsOn () {\n  'use strict';\n  var options = getDefaultOpts(true),\n      ret = {};\n  for (var opt in options) {\n    if (options.hasOwnProperty(opt)) {\n      ret[opt] = true;\n    }\n  }\n  return ret;\n}\n\n/**\n * Created by Tivie on 06-01-2015.\n */\n// Private properties\nvar showdown = {},\n    parsers = {},\n    extensions = {},\n    globalOptions = getDefaultOpts(true),\n    setFlavor = 'vanilla',\n    flavor = {\n      github: {\n        omitExtraWLInCodeBlocks:              true,\n        simplifiedAutoLink:                   true,\n        literalMidWordUnderscores:            true,\n        strikethrough:                        true,\n        tables:                               true,\n        tablesHeaderId:                       true,\n        ghCodeBlocks:                         true,\n        tasklists:                            true,\n        disableForced4SpacesIndentedSublists: true,\n        simpleLineBreaks:                     true,\n        requireSpaceBeforeHeadingText:        true,\n        ghCompatibleHeaderId:                 true,\n        ghMentions:                           true,\n        backslashEscapesHTMLTags:             true,\n        emoji:                                true,\n        splitAdjacentBlockquotes:             true\n      },\n      original: {\n        noHeaderId:                           true,\n        ghCodeBlocks:                         false\n      },\n      ghost: {\n        omitExtraWLInCodeBlocks:              true,\n        parseImgDimensions:                   true,\n        simplifiedAutoLink:                   true,\n        literalMidWordUnderscores:            true,\n        strikethrough:                        true,\n        tables:                               true,\n        tablesHeaderId:                       true,\n        ghCodeBlocks:                         true,\n        tasklists:                            true,\n        smoothLivePreview:                    true,\n        simpleLineBreaks:                     true,\n        requireSpaceBeforeHeadingText:        true,\n        ghMentions:                           false,\n        encodeEmails:                         true\n      },\n      vanilla: getDefaultOpts(true),\n      allOn: allOptionsOn()\n    };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n  'use strict';\n  globalOptions[key] = value;\n  return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n  'use strict';\n  return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n  'use strict';\n  return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n  'use strict';\n  globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n  'use strict';\n  if (!flavor.hasOwnProperty(name)) {\n    throw Error(name + ' flavor was not found');\n  }\n  showdown.resetOptions();\n  var preset = flavor[name];\n  setFlavor = name;\n  for (var option in preset) {\n    if (preset.hasOwnProperty(option)) {\n      globalOptions[option] = preset[option];\n    }\n  }\n};\n\n/**\n * Get the currently set flavor\n * @returns {string}\n */\nshowdown.getFlavor = function () {\n  'use strict';\n  return setFlavor;\n};\n\n/**\n * Get the options of a specified flavor. Returns undefined if the flavor was not found\n * @param {string} name Name of the flavor\n * @returns {{}|undefined}\n */\nshowdown.getFlavorOptions = function (name) {\n  'use strict';\n  if (flavor.hasOwnProperty(name)) {\n    return flavor[name];\n  }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n  'use strict';\n  return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name)       - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n  'use strict';\n  if (showdown.helper.isString(name)) {\n    if (typeof func !== 'undefined') {\n      parsers[name] = func;\n    } else {\n      if (parsers.hasOwnProperty(name)) {\n        return parsers[name];\n      } else {\n        throw Error('SubParser named ' + name + ' not registered!');\n      }\n    }\n  } else {\n    throw Error('showdown.subParser function first argument must be a string (the name of the subparser)');\n  }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|object[]|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n  'use strict';\n\n  if (!showdown.helper.isString(name)) {\n    throw Error('Extension \\'name\\' must be a string');\n  }\n\n  name = showdown.helper.stdExtName(name);\n\n  // Getter\n  if (showdown.helper.isUndefined(ext)) {\n    if (!extensions.hasOwnProperty(name)) {\n      throw Error('Extension named ' + name + ' is not registered!');\n    }\n    return extensions[name];\n\n    // Setter\n  } else {\n    // Expand extension if it's wrapped in a function\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    // Ensure extension is an array\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExtension = validate(ext, name);\n\n    if (validExtension.valid) {\n      extensions[name] = ext;\n    } else {\n      throw Error(validExtension.error);\n    }\n  }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n  'use strict';\n  return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n  'use strict';\n  delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n  'use strict';\n  extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate (extension, name) {\n  'use strict';\n\n  var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n      ret = {\n        valid: true,\n        error: ''\n      };\n\n  if (!showdown.helper.isArray(extension)) {\n    extension = [extension];\n  }\n\n  for (var i = 0; i < extension.length; ++i) {\n    var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n        ext = extension[i];\n    if (typeof ext !== 'object') {\n      ret.valid = false;\n      ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n      return ret;\n    }\n\n    if (!showdown.helper.isString(ext.type)) {\n      ret.valid = false;\n      ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n      return ret;\n    }\n\n    var type = ext.type = ext.type.toLowerCase();\n\n    // normalize extension type\n    if (type === 'language') {\n      type = ext.type = 'lang';\n    }\n\n    if (type === 'html') {\n      type = ext.type = 'output';\n    }\n\n    if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n      ret.valid = false;\n      ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n      return ret;\n    }\n\n    if (type === 'listener') {\n      if (showdown.helper.isUndefined(ext.listeners)) {\n        ret.valid = false;\n        ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n        return ret;\n      }\n    } else {\n      if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n        ret.valid = false;\n        ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n        return ret;\n      }\n    }\n\n    if (ext.listeners) {\n      if (typeof ext.listeners !== 'object') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n        return ret;\n      }\n      for (var ln in ext.listeners) {\n        if (ext.listeners.hasOwnProperty(ln)) {\n          if (typeof ext.listeners[ln] !== 'function') {\n            ret.valid = false;\n            ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n              ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n            return ret;\n          }\n        }\n      }\n    }\n\n    if (ext.filter) {\n      if (typeof ext.filter !== 'function') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n        return ret;\n      }\n    } else if (ext.regex) {\n      if (showdown.helper.isString(ext.regex)) {\n        ext.regex = new RegExp(ext.regex, 'g');\n      }\n      if (!(ext.regex instanceof RegExp)) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n        return ret;\n      }\n      if (showdown.helper.isUndefined(ext.replace)) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n        return ret;\n      }\n    }\n  }\n  return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n  'use strict';\n\n  var validateExtension = validate(ext, null);\n  if (!validateExtension.valid) {\n    console.warn(validateExtension.error);\n    return false;\n  }\n  return true;\n};\n\n/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n  showdown.helper = {};\n}\n\nif (typeof this === 'undefined' && typeof window !== 'undefined') {\n  showdown.helper.document = window.document;\n} else {\n  if (typeof this.document === 'undefined' && typeof this.window === 'undefined') {\n    var jsdom = require('jsdom');\n    this.window = new jsdom.JSDOM('', {}).window; // jshint ignore:line\n  }\n  showdown.helper.document = this.window.document;\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function (a) {\n  'use strict';\n  return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function (a) {\n  'use strict';\n  var getType = {};\n  return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function (a) {\n  'use strict';\n  return Array.isArray(a);\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function (value) {\n  'use strict';\n  return typeof value === 'undefined';\n};\n\n/**\n * ForEach helper function\n * Iterates over Arrays and Objects (own properties only)\n * @static\n * @param {*} obj\n * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object\n */\nshowdown.helper.forEach = function (obj, callback) {\n  'use strict';\n  // check if obj is defined\n  if (showdown.helper.isUndefined(obj)) {\n    throw new Error('obj param is required');\n  }\n\n  if (showdown.helper.isUndefined(callback)) {\n    throw new Error('callback param is required');\n  }\n\n  if (!showdown.helper.isFunction(callback)) {\n    throw new Error('callback param must be a function/closure');\n  }\n\n  if (typeof obj.forEach === 'function') {\n    obj.forEach(callback);\n  } else if (showdown.helper.isArray(obj)) {\n    for (var i = 0; i < obj.length; i++) {\n      callback(obj[i], i, obj);\n    }\n  } else if (typeof (obj) === 'object') {\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        callback(obj[prop], prop, obj);\n      }\n    }\n  } else {\n    throw new Error('obj does not seem to be an array or an iterable object');\n  }\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n  'use strict';\n  return s.replace(/[_?*+\\/\\\\.^-]/g, '').replace(/\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback (wholeMatch, m1) {\n  'use strict';\n  var charCodeToEscape = m1.charCodeAt(0);\n  return '¨E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {string|void|*}\n */\nshowdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {\n  'use strict';\n  // First we have to escape the escape characters so that\n  // we can build a character class out of them\n  var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n  if (afterBackslash) {\n    regexString = '\\\\\\\\' + regexString;\n  }\n\n  var regex = new RegExp(regexString, 'g');\n  text = text.replace(regex, escapeCharactersCallback);\n\n  return text;\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n  'use strict';\n  var f = flags || '',\n      g = f.indexOf('g') > -1,\n      x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n      l = new RegExp(left, f.replace(/g/g, '')),\n      pos = [],\n      t, s, m, start, end;\n\n  do {\n    t = 0;\n    while ((m = x.exec(str))) {\n      if (l.test(m[0])) {\n        if (!(t++)) {\n          s = x.lastIndex;\n          start = s - m[0].length;\n        }\n      } else if (t) {\n        if (!--t) {\n          end = m.index + m[0].length;\n          var obj = {\n            left: {start: start, end: s},\n            match: {start: s, end: m.index},\n            right: {start: m.index, end: end},\n            wholeMatch: {start: start, end: end}\n          };\n          pos.push(obj);\n          if (!g) {\n            return pos;\n          }\n        }\n      }\n    }\n  } while (t && (x.lastIndex = s));\n\n  return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan <stevenlevithan.com>\n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<<x>\" and \"<x>>\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"<x>\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\"<t<<e>><s>>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<<e>><s>\", \"\"]\n * matchRecursiveRegExp(\"<div id=\\\"x\\\">test</div>\", \"<div\\\\b[^>]*>\", \"</div>\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n  'use strict';\n\n  var matchPos = rgxFindMatchPos (str, left, right, flags),\n      results = [];\n\n  for (var i = 0; i < matchPos.length; ++i) {\n    results.push([\n      str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n      str.slice(matchPos[i].match.start, matchPos[i].match.end),\n      str.slice(matchPos[i].left.start, matchPos[i].left.end),\n      str.slice(matchPos[i].right.start, matchPos[i].right.end)\n    ]);\n  }\n  return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n  'use strict';\n\n  if (!showdown.helper.isFunction(replacement)) {\n    var repStr = replacement;\n    replacement = function () {\n      return repStr;\n    };\n  }\n\n  var matchPos = rgxFindMatchPos(str, left, right, flags),\n      finalStr = str,\n      lng = matchPos.length;\n\n  if (lng > 0) {\n    var bits = [];\n    if (matchPos[0].wholeMatch.start !== 0) {\n      bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n    }\n    for (var i = 0; i < lng; ++i) {\n      bits.push(\n        replacement(\n          str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n          str.slice(matchPos[i].match.start, matchPos[i].match.end),\n          str.slice(matchPos[i].left.start, matchPos[i].left.end),\n          str.slice(matchPos[i].right.start, matchPos[i].right.end)\n        )\n      );\n      if (i < lng - 1) {\n        bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n      }\n    }\n    if (matchPos[lng - 1].wholeMatch.end < str.length) {\n      bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n    }\n    finalStr = bits.join('');\n  }\n  return finalStr;\n};\n\n/**\n * Returns the index within the passed String object of the first occurrence of the specified regex,\n * starting the search at fromIndex. Returns -1 if the value is not found.\n *\n * @param {string} str string to search\n * @param {RegExp} regex Regular expression to search\n * @param {int} [fromIndex = 0] Index to start the search\n * @returns {Number}\n * @throws InvalidArgumentError\n */\nshowdown.helper.regexIndexOf = function (str, regex, fromIndex) {\n  'use strict';\n  if (!showdown.helper.isString(str)) {\n    throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n  }\n  if (!(regex instanceof RegExp)) {\n    throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';\n  }\n  var indexOf = str.substring(fromIndex || 0).search(regex);\n  return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;\n};\n\n/**\n * Splits the passed string object at the defined index, and returns an array composed of the two substrings\n * @param {string} str string to split\n * @param {int} index index to split string at\n * @returns {[string,string]}\n * @throws InvalidArgumentError\n */\nshowdown.helper.splitAtIndex = function (str, index) {\n  'use strict';\n  if (!showdown.helper.isString(str)) {\n    throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n  }\n  return [str.substring(0, index), str.substring(index)];\n};\n\n/**\n * Obfuscate an e-mail address through the use of Character Entities,\n * transforming ASCII characters into their equivalent decimal or hex entities.\n *\n * Since it has a random component, subsequent calls to this function produce different results\n *\n * @param {string} mail\n * @param {string} seed\n * @returns {string}\n */\nshowdown.helper.encodeEmailAddress = function (mail, seed) {\n  'use strict';\n  var encode = [\n    function (ch) {\n      return '&#' + ch.charCodeAt(0) + ';';\n    },\n    function (ch) {\n      return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n    },\n    function (ch) {\n      return ch;\n    }\n  ];\n\n  mail = mail.replace(/./g, function (ch) {\n    if (ch === '@') {\n      // this *must* be encoded. I insist.\n      ch = encode[Math.floor(Math.random() * 2)](ch);\n    } else {\n      var r = Math.random();\n      // roughly 10% raw, 45% hex, 45% dec\n      ch = (\n        r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n      );\n    }\n    return ch;\n  });\n\n  return mail;\n};\n\n/**\n * String.prototype.repeat polyfill\n *\n * @param {string} str\n * @param {int} count\n * @returns {string}\n */\nshowdown.helper.repeat = function (str, count) {\n  'use strict';\n  // use built-in method if it's available\n  if (!showdown.helper.isUndefined(String.prototype.repeat)) {\n    return str.repeat(count);\n  }\n  str = '' + str;\n  if (count < 0) {\n    throw new RangeError('repeat count must be non-negative');\n  }\n  if (count === Infinity) {\n    throw new RangeError('repeat count must be less than infinity');\n  }\n  count = Math.floor(count);\n  if (str.length === 0 || count === 0) {\n    return '';\n  }\n  // Ensuring count is a 31-bit integer allows us to heavily optimize the\n  // main part. But anyway, most current (August 2014) browsers can't handle\n  // strings 1 << 28 chars or longer, so:\n  /*jshint bitwise: false*/\n  if (str.length * count >= 1 << 28) {\n    throw new RangeError('repeat count must not overflow maximum string size');\n  }\n  /*jshint bitwise: true*/\n  var maxCount = str.length * count;\n  count = Math.floor(Math.log(count) / Math.log(2));\n  while (count) {\n    str += str;\n    count--;\n  }\n  str += str.substring(0, maxCount - str.length);\n  return str;\n};\n\n/**\n * String.prototype.padEnd polyfill\n *\n * @param str\n * @param targetLength\n * @param padString\n * @returns {string}\n */\nshowdown.helper.padEnd = function padEnd (str, targetLength, padString) {\n  'use strict';\n  /*jshint bitwise: false*/\n  // eslint-disable-next-line space-infix-ops\n  targetLength = targetLength>>0; //floor if number or convert non-number to 0;\n  /*jshint bitwise: true*/\n  padString = String(padString || ' ');\n  if (str.length > targetLength) {\n    return String(str);\n  } else {\n    targetLength = targetLength - str.length;\n    if (targetLength > padString.length) {\n      padString += showdown.helper.repeat(padString, targetLength / padString.length); //append to original to ensure we are longer than needed\n    }\n    return String(str) + padString.slice(0,targetLength);\n  }\n};\n\n/**\n * Unescape HTML entities\n * @param txt\n * @returns {string}\n */\nshowdown.helper.unescapeHTMLEntities = function (txt) {\n  'use strict';\n\n  return txt\n    .replace(/&quot;/g, '\"')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&amp;/g, '&');\n};\n\nshowdown.helper._hashHTMLSpan = function (html, globals) {\n  return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';\n};\n\n/**\n * Prepends a base URL to relative paths.\n *\n * @param {string} baseUrl the base URL to prepend to a relative path\n * @param {string} url the path to modify, which may be relative\n * @returns {string} the full URL\n */\nshowdown.helper.applyBaseUrl = function (baseUrl, url) {\n  // Only prepend if given a base URL and the path is not absolute.\n  if (baseUrl && !this.isAbsolutePath(url)) {\n    var urlResolve = require('url').resolve;\n    url = urlResolve(baseUrl, url);\n  }\n\n  return url;\n};\n\n/**\n * Checks if the given path is absolute.\n *\n * @param {string} path the path to test for absolution\n * @returns {boolean} `true` if the given path is absolute, else `false`\n */\nshowdown.helper.isAbsolutePath = function (path) {\n  // Absolute paths begin with '[protocol:]//' or '#' (anchors)\n  return /(^([a-z]+:)?\\/\\/)|(^#)/i.test(path);\n};\n\n/**\n * Showdown's Event Object\n * @param {string} name Name of the event\n * @param {string} text Text\n * @param {{}} params optional. params of the event\n * @constructor\n */\nshowdown.helper.Event = function (name, text, params) {\n  'use strict';\n\n  var regexp = params.regexp || null;\n  var matches = params.matches || {};\n  var options = params.options || {};\n  var converter = params.converter || null;\n  var globals = params.globals || {};\n\n  /**\n   * Get the name of the event\n   * @returns {string}\n   */\n  this.getName = function () {\n    return name;\n  };\n\n  this.getEventName = function () {\n    return name;\n  };\n\n  this._stopExecution = false;\n\n  this.parsedText = params.parsedText || null;\n\n  this.getRegexp = function () {\n    return regexp;\n  };\n\n  this.getOptions = function () {\n    return options;\n  };\n\n  this.getConverter = function () {\n    return converter;\n  };\n\n  this.getGlobals = function () {\n    return globals;\n  };\n\n  this.getCapturedText = function () {\n    return text;\n  };\n\n  this.getText = function () {\n    return text;\n  };\n\n  this.setText = function (newText) {\n    text = newText;\n  };\n\n  this.getMatches = function () {\n    return matches;\n  };\n\n  this.setMatches = function (newMatches) {\n    matches = newMatches;\n  };\n\n  this.preventDefault = function (bool) {\n    this._stopExecution = !bool;\n  };\n};\n\n/**\n * POLYFILLS\n */\n// use this instead of builtin is undefined for IE8 compatibility\nif (typeof (console) === 'undefined') {\n  console = {\n    warn: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    log: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    error: function (msg) {\n      'use strict';\n      throw msg;\n    }\n  };\n}\n\n/**\n * Common regexes.\n * We declare some common regexes to improve performance\n */\nshowdown.helper.regexes = {\n  asteriskDashTildeAndColon: /([*_:~])/g,\n  asteriskDashAndTilde:      /([*_~])/g\n};\n\n/**\n * EMOJIS LIST\n */\nshowdown.helper.emojis = {\n  '100': '\\ud83d\\udcaf',\n  '1234': '\\ud83d\\udd22',\n  '+1': '\\ud83d\\udc4d',\n  '-1': '\\ud83d\\udc4e',\n  '1st_place_medal': '\\ud83e\\udd47',\n  '2nd_place_medal': '\\ud83e\\udd48',\n  '3rd_place_medal': '\\ud83e\\udd49',\n  '8ball': '\\ud83c\\udfb1',\n  'a': '\\ud83c\\udd70\\ufe0f',\n  'ab': '\\ud83c\\udd8e',\n  'abacus': '\\ud83e\\uddee',\n  'abc': '\\ud83d\\udd24',\n  'abcd': '\\ud83d\\udd21',\n  'accept': '\\ud83c\\ude51',\n  'adhesive_bandage': '\\ud83e\\ude79',\n  'adult': '\\ud83e\\uddd1',\n  'aerial_tramway': '\\ud83d\\udea1',\n  'afghanistan': '\\ud83c\\udde6\\ud83c\\uddeb',\n  'airplane': '\\u2708\\ufe0f',\n  'aland_islands': '\\ud83c\\udde6\\ud83c\\uddfd',\n  'alarm_clock': '\\u23f0',\n  'albania': '\\ud83c\\udde6\\ud83c\\uddf1',\n  'alembic': '\\u2697\\ufe0f',\n  'algeria': '\\ud83c\\udde9\\ud83c\\uddff',\n  'alien': '\\ud83d\\udc7d',\n  'ambulance': '\\ud83d\\ude91',\n  'american_samoa': '\\ud83c\\udde6\\ud83c\\uddf8',\n  'amphora': '\\ud83c\\udffa',\n  'anchor': '\\u2693',\n  'andorra': '\\ud83c\\udde6\\ud83c\\udde9',\n  'angel': '\\ud83d\\udc7c',\n  'anger': '\\ud83d\\udca2',\n  'angola': '\\ud83c\\udde6\\ud83c\\uddf4',\n  'angry': '\\ud83d\\ude20',\n  'anguilla': '\\ud83c\\udde6\\ud83c\\uddee',\n  'anguished': '\\ud83d\\ude27',\n  'ant': '\\ud83d\\udc1c',\n  'antarctica': '\\ud83c\\udde6\\ud83c\\uddf6',\n  'antigua_barbuda': '\\ud83c\\udde6\\ud83c\\uddec',\n  'apple': '\\ud83c\\udf4e',\n  'aquarius': '\\u2652',\n  'argentina': '\\ud83c\\udde6\\ud83c\\uddf7',\n  'aries': '\\u2648',\n  'armenia': '\\ud83c\\udde6\\ud83c\\uddf2',\n  'arrow_backward': '\\u25c0\\ufe0f',\n  'arrow_double_down': '\\u23ec',\n  'arrow_double_up': '\\u23eb',\n  'arrow_down': '\\u2b07\\ufe0f',\n  'arrow_down_small': '\\ud83d\\udd3d',\n  'arrow_forward': '\\u25b6\\ufe0f',\n  'arrow_heading_down': '\\u2935\\ufe0f',\n  'arrow_heading_up': '\\u2934\\ufe0f',\n  'arrow_left': '\\u2b05\\ufe0f',\n  'arrow_lower_left': '\\u2199\\ufe0f',\n  'arrow_lower_right': '\\u2198\\ufe0f',\n  'arrow_right': '\\u27a1\\ufe0f',\n  'arrow_right_hook': '\\u21aa\\ufe0f',\n  'arrow_up': '\\u2b06\\ufe0f',\n  'arrow_up_down': '\\u2195\\ufe0f',\n  'arrow_up_small': '\\ud83d\\udd3c',\n  'arrow_upper_left': '\\u2196\\ufe0f',\n  'arrow_upper_right': '\\u2197\\ufe0f',\n  'arrows_clockwise': '\\ud83d\\udd03',\n  'arrows_counterclockwise': '\\ud83d\\udd04',\n  'art': '\\ud83c\\udfa8',\n  'articulated_lorry': '\\ud83d\\ude9b',\n  'artificial_satellite': '\\ud83d\\udef0\\ufe0f',\n  'artist': '\\ud83e\\uddd1\\u200d\\ud83c\\udfa8',\n  'aruba': '\\ud83c\\udde6\\ud83c\\uddfc',\n  'ascension_island': '\\ud83c\\udde6\\ud83c\\udde8',\n  'asterisk': '*\\ufe0f\\u20e3',\n  'astonished': '\\ud83d\\ude32',\n  'astronaut': '\\ud83e\\uddd1\\u200d\\ud83d\\ude80',\n  'athletic_shoe': '\\ud83d\\udc5f',\n  'atm': '\\ud83c\\udfe7',\n  'atom_symbol': '\\u269b\\ufe0f',\n  'australia': '\\ud83c\\udde6\\ud83c\\uddfa',\n  'austria': '\\ud83c\\udde6\\ud83c\\uddf9',\n  'auto_rickshaw': '\\ud83d\\udefa',\n  'avocado': '\\ud83e\\udd51',\n  'axe': '\\ud83e\\ude93',\n  'azerbaijan': '\\ud83c\\udde6\\ud83c\\uddff',\n  'b': '\\ud83c\\udd71\\ufe0f',\n  'baby': '\\ud83d\\udc76',\n  'baby_bottle': '\\ud83c\\udf7c',\n  'baby_chick': '\\ud83d\\udc24',\n  'baby_symbol': '\\ud83d\\udebc',\n  'back': '\\ud83d\\udd19',\n  'bacon': '\\ud83e\\udd53',\n  'badger': '\\ud83e\\udda1',\n  'badminton': '\\ud83c\\udff8',\n  'bagel': '\\ud83e\\udd6f',\n  'baggage_claim': '\\ud83d\\udec4',\n  'baguette_bread': '\\ud83e\\udd56',\n  'bahamas': '\\ud83c\\udde7\\ud83c\\uddf8',\n  'bahrain': '\\ud83c\\udde7\\ud83c\\udded',\n  'balance_scale': '\\u2696\\ufe0f',\n  'bald_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb2',\n  'bald_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb2',\n  'ballet_shoes': '\\ud83e\\ude70',\n  'balloon': '\\ud83c\\udf88',\n  'ballot_box': '\\ud83d\\uddf3\\ufe0f',\n  'ballot_box_with_check': '\\u2611\\ufe0f',\n  'bamboo': '\\ud83c\\udf8d',\n  'banana': '\\ud83c\\udf4c',\n  'bangbang': '\\u203c\\ufe0f',\n  'bangladesh': '\\ud83c\\udde7\\ud83c\\udde9',\n  'banjo': '\\ud83e\\ude95',\n  'bank': '\\ud83c\\udfe6',\n  'bar_chart': '\\ud83d\\udcca',\n  'barbados': '\\ud83c\\udde7\\ud83c\\udde7',\n  'barber': '\\ud83d\\udc88',\n  'baseball': '\\u26be',\n  'basket': '\\ud83e\\uddfa',\n  'basketball': '\\ud83c\\udfc0',\n  'basketball_man': '\\u26f9\\ufe0f\\u200d\\u2642\\ufe0f',\n  'basketball_woman': '\\u26f9\\ufe0f\\u200d\\u2640\\ufe0f',\n  'bat': '\\ud83e\\udd87',\n  'bath': '\\ud83d\\udec0',\n  'bathtub': '\\ud83d\\udec1',\n  'battery': '\\ud83d\\udd0b',\n  'beach_umbrella': '\\ud83c\\udfd6\\ufe0f',\n  'bear': '\\ud83d\\udc3b',\n  'bearded_person': '\\ud83e\\uddd4',\n  'bed': '\\ud83d\\udecf\\ufe0f',\n  'bee': '\\ud83d\\udc1d',\n  'beer': '\\ud83c\\udf7a',\n  'beers': '\\ud83c\\udf7b',\n  'beetle': '\\ud83d\\udc1e',\n  'beginner': '\\ud83d\\udd30',\n  'belarus': '\\ud83c\\udde7\\ud83c\\uddfe',\n  'belgium': '\\ud83c\\udde7\\ud83c\\uddea',\n  'belize': '\\ud83c\\udde7\\ud83c\\uddff',\n  'bell': '\\ud83d\\udd14',\n  'bellhop_bell': '\\ud83d\\udece\\ufe0f',\n  'benin': '\\ud83c\\udde7\\ud83c\\uddef',\n  'bento': '\\ud83c\\udf71',\n  'bermuda': '\\ud83c\\udde7\\ud83c\\uddf2',\n  'beverage_box': '\\ud83e\\uddc3',\n  'bhutan': '\\ud83c\\udde7\\ud83c\\uddf9',\n  'bicyclist': '\\ud83d\\udeb4',\n  'bike': '\\ud83d\\udeb2',\n  'biking_man': '\\ud83d\\udeb4\\u200d\\u2642\\ufe0f',\n  'biking_woman': '\\ud83d\\udeb4\\u200d\\u2640\\ufe0f',\n  'bikini': '\\ud83d\\udc59',\n  'billed_cap': '\\ud83e\\udde2',\n  'biohazard': '\\u2623\\ufe0f',\n  'bird': '\\ud83d\\udc26',\n  'birthday': '\\ud83c\\udf82',\n  'black_circle': '\\u26ab',\n  'black_flag': '\\ud83c\\udff4',\n  'black_heart': '\\ud83d\\udda4',\n  'black_joker': '\\ud83c\\udccf',\n  'black_large_square': '\\u2b1b',\n  'black_medium_small_square': '\\u25fe',\n  'black_medium_square': '\\u25fc\\ufe0f',\n  'black_nib': '\\u2712\\ufe0f',\n  'black_small_square': '\\u25aa\\ufe0f',\n  'black_square_button': '\\ud83d\\udd32',\n  'blond_haired_man': '\\ud83d\\udc71\\u200d\\u2642\\ufe0f',\n  'blond_haired_person': '\\ud83d\\udc71',\n  'blond_haired_woman': '\\ud83d\\udc71\\u200d\\u2640\\ufe0f',\n  'blonde_woman': '\\ud83d\\udc71\\u200d\\u2640\\ufe0f',\n  'blossom': '\\ud83c\\udf3c',\n  'blowfish': '\\ud83d\\udc21',\n  'blue_book': '\\ud83d\\udcd8',\n  'blue_car': '\\ud83d\\ude99',\n  'blue_heart': '\\ud83d\\udc99',\n  'blue_square': '\\ud83d\\udfe6',\n  'blush': '\\ud83d\\ude0a',\n  'boar': '\\ud83d\\udc17',\n  'boat': '\\u26f5',\n  'bolivia': '\\ud83c\\udde7\\ud83c\\uddf4',\n  'bomb': '\\ud83d\\udca3',\n  'bone': '\\ud83e\\uddb4',\n  'book': '\\ud83d\\udcd6',\n  'bookmark': '\\ud83d\\udd16',\n  'bookmark_tabs': '\\ud83d\\udcd1',\n  'books': '\\ud83d\\udcda',\n  'boom': '\\ud83d\\udca5',\n  'boot': '\\ud83d\\udc62',\n  'bosnia_herzegovina': '\\ud83c\\udde7\\ud83c\\udde6',\n  'botswana': '\\ud83c\\udde7\\ud83c\\uddfc',\n  'bouncing_ball_man': '\\u26f9\\ufe0f\\u200d\\u2642\\ufe0f',\n  'bouncing_ball_person': '\\u26f9\\ufe0f',\n  'bouncing_ball_woman': '\\u26f9\\ufe0f\\u200d\\u2640\\ufe0f',\n  'bouquet': '\\ud83d\\udc90',\n  'bouvet_island': '\\ud83c\\udde7\\ud83c\\uddfb',\n  'bow': '\\ud83d\\ude47',\n  'bow_and_arrow': '\\ud83c\\udff9',\n  'bowing_man': '\\ud83d\\ude47\\u200d\\u2642\\ufe0f',\n  'bowing_woman': '\\ud83d\\ude47\\u200d\\u2640\\ufe0f',\n  'bowl_with_spoon': '\\ud83e\\udd63',\n  'bowling': '\\ud83c\\udfb3',\n  'boxing_glove': '\\ud83e\\udd4a',\n  'boy': '\\ud83d\\udc66',\n  'brain': '\\ud83e\\udde0',\n  'brazil': '\\ud83c\\udde7\\ud83c\\uddf7',\n  'bread': '\\ud83c\\udf5e',\n  'breast_feeding': '\\ud83e\\udd31',\n  'bricks': '\\ud83e\\uddf1',\n  'bride_with_veil': '\\ud83d\\udc70',\n  'bridge_at_night': '\\ud83c\\udf09',\n  'briefcase': '\\ud83d\\udcbc',\n  'british_indian_ocean_territory': '\\ud83c\\uddee\\ud83c\\uddf4',\n  'british_virgin_islands': '\\ud83c\\uddfb\\ud83c\\uddec',\n  'broccoli': '\\ud83e\\udd66',\n  'broken_heart': '\\ud83d\\udc94',\n  'broom': '\\ud83e\\uddf9',\n  'brown_circle': '\\ud83d\\udfe4',\n  'brown_heart': '\\ud83e\\udd0e',\n  'brown_square': '\\ud83d\\udfeb',\n  'brunei': '\\ud83c\\udde7\\ud83c\\uddf3',\n  'bug': '\\ud83d\\udc1b',\n  'building_construction': '\\ud83c\\udfd7\\ufe0f',\n  'bulb': '\\ud83d\\udca1',\n  'bulgaria': '\\ud83c\\udde7\\ud83c\\uddec',\n  'bullettrain_front': '\\ud83d\\ude85',\n  'bullettrain_side': '\\ud83d\\ude84',\n  'burkina_faso': '\\ud83c\\udde7\\ud83c\\uddeb',\n  'burrito': '\\ud83c\\udf2f',\n  'burundi': '\\ud83c\\udde7\\ud83c\\uddee',\n  'bus': '\\ud83d\\ude8c',\n  'business_suit_levitating': '\\ud83d\\udd74\\ufe0f',\n  'busstop': '\\ud83d\\ude8f',\n  'bust_in_silhouette': '\\ud83d\\udc64',\n  'busts_in_silhouette': '\\ud83d\\udc65',\n  'butter': '\\ud83e\\uddc8',\n  'butterfly': '\\ud83e\\udd8b',\n  'cactus': '\\ud83c\\udf35',\n  'cake': '\\ud83c\\udf70',\n  'calendar': '\\ud83d\\udcc6',\n  'call_me_hand': '\\ud83e\\udd19',\n  'calling': '\\ud83d\\udcf2',\n  'cambodia': '\\ud83c\\uddf0\\ud83c\\udded',\n  'camel': '\\ud83d\\udc2b',\n  'camera': '\\ud83d\\udcf7',\n  'camera_flash': '\\ud83d\\udcf8',\n  'cameroon': '\\ud83c\\udde8\\ud83c\\uddf2',\n  'camping': '\\ud83c\\udfd5\\ufe0f',\n  'canada': '\\ud83c\\udde8\\ud83c\\udde6',\n  'canary_islands': '\\ud83c\\uddee\\ud83c\\udde8',\n  'cancer': '\\u264b',\n  'candle': '\\ud83d\\udd6f\\ufe0f',\n  'candy': '\\ud83c\\udf6c',\n  'canned_food': '\\ud83e\\udd6b',\n  'canoe': '\\ud83d\\udef6',\n  'cape_verde': '\\ud83c\\udde8\\ud83c\\uddfb',\n  'capital_abcd': '\\ud83d\\udd20',\n  'capricorn': '\\u2651',\n  'car': '\\ud83d\\ude97',\n  'card_file_box': '\\ud83d\\uddc3\\ufe0f',\n  'card_index': '\\ud83d\\udcc7',\n  'card_index_dividers': '\\ud83d\\uddc2\\ufe0f',\n  'caribbean_netherlands': '\\ud83c\\udde7\\ud83c\\uddf6',\n  'carousel_horse': '\\ud83c\\udfa0',\n  'carrot': '\\ud83e\\udd55',\n  'cartwheeling': '\\ud83e\\udd38',\n  'cat': '\\ud83d\\udc31',\n  'cat2': '\\ud83d\\udc08',\n  'cayman_islands': '\\ud83c\\uddf0\\ud83c\\uddfe',\n  'cd': '\\ud83d\\udcbf',\n  'central_african_republic': '\\ud83c\\udde8\\ud83c\\uddeb',\n  'ceuta_melilla': '\\ud83c\\uddea\\ud83c\\udde6',\n  'chad': '\\ud83c\\uddf9\\ud83c\\udde9',\n  'chains': '\\u26d3\\ufe0f',\n  'chair': '\\ud83e\\ude91',\n  'champagne': '\\ud83c\\udf7e',\n  'chart': '\\ud83d\\udcb9',\n  'chart_with_downwards_trend': '\\ud83d\\udcc9',\n  'chart_with_upwards_trend': '\\ud83d\\udcc8',\n  'checkered_flag': '\\ud83c\\udfc1',\n  'cheese': '\\ud83e\\uddc0',\n  'cherries': '\\ud83c\\udf52',\n  'cherry_blossom': '\\ud83c\\udf38',\n  'chess_pawn': '\\u265f\\ufe0f',\n  'chestnut': '\\ud83c\\udf30',\n  'chicken': '\\ud83d\\udc14',\n  'child': '\\ud83e\\uddd2',\n  'children_crossing': '\\ud83d\\udeb8',\n  'chile': '\\ud83c\\udde8\\ud83c\\uddf1',\n  'chipmunk': '\\ud83d\\udc3f\\ufe0f',\n  'chocolate_bar': '\\ud83c\\udf6b',\n  'chopsticks': '\\ud83e\\udd62',\n  'christmas_island': '\\ud83c\\udde8\\ud83c\\uddfd',\n  'christmas_tree': '\\ud83c\\udf84',\n  'church': '\\u26ea',\n  'cinema': '\\ud83c\\udfa6',\n  'circus_tent': '\\ud83c\\udfaa',\n  'city_sunrise': '\\ud83c\\udf07',\n  'city_sunset': '\\ud83c\\udf06',\n  'cityscape': '\\ud83c\\udfd9\\ufe0f',\n  'cl': '\\ud83c\\udd91',\n  'clamp': '\\ud83d\\udddc\\ufe0f',\n  'clap': '\\ud83d\\udc4f',\n  'clapper': '\\ud83c\\udfac',\n  'classical_building': '\\ud83c\\udfdb\\ufe0f',\n  'climbing': '\\ud83e\\uddd7',\n  'climbing_man': '\\ud83e\\uddd7\\u200d\\u2642\\ufe0f',\n  'climbing_woman': '\\ud83e\\uddd7\\u200d\\u2640\\ufe0f',\n  'clinking_glasses': '\\ud83e\\udd42',\n  'clipboard': '\\ud83d\\udccb',\n  'clipperton_island': '\\ud83c\\udde8\\ud83c\\uddf5',\n  'clock1': '\\ud83d\\udd50',\n  'clock10': '\\ud83d\\udd59',\n  'clock1030': '\\ud83d\\udd65',\n  'clock11': '\\ud83d\\udd5a',\n  'clock1130': '\\ud83d\\udd66',\n  'clock12': '\\ud83d\\udd5b',\n  'clock1230': '\\ud83d\\udd67',\n  'clock130': '\\ud83d\\udd5c',\n  'clock2': '\\ud83d\\udd51',\n  'clock230': '\\ud83d\\udd5d',\n  'clock3': '\\ud83d\\udd52',\n  'clock330': '\\ud83d\\udd5e',\n  'clock4': '\\ud83d\\udd53',\n  'clock430': '\\ud83d\\udd5f',\n  'clock5': '\\ud83d\\udd54',\n  'clock530': '\\ud83d\\udd60',\n  'clock6': '\\ud83d\\udd55',\n  'clock630': '\\ud83d\\udd61',\n  'clock7': '\\ud83d\\udd56',\n  'clock730': '\\ud83d\\udd62',\n  'clock8': '\\ud83d\\udd57',\n  'clock830': '\\ud83d\\udd63',\n  'clock9': '\\ud83d\\udd58',\n  'clock930': '\\ud83d\\udd64',\n  'closed_book': '\\ud83d\\udcd5',\n  'closed_lock_with_key': '\\ud83d\\udd10',\n  'closed_umbrella': '\\ud83c\\udf02',\n  'cloud': '\\u2601\\ufe0f',\n  'cloud_with_lightning': '\\ud83c\\udf29\\ufe0f',\n  'cloud_with_lightning_and_rain': '\\u26c8\\ufe0f',\n  'cloud_with_rain': '\\ud83c\\udf27\\ufe0f',\n  'cloud_with_snow': '\\ud83c\\udf28\\ufe0f',\n  'clown_face': '\\ud83e\\udd21',\n  'clubs': '\\u2663\\ufe0f',\n  'cn': '\\ud83c\\udde8\\ud83c\\uddf3',\n  'coat': '\\ud83e\\udde5',\n  'cocktail': '\\ud83c\\udf78',\n  'coconut': '\\ud83e\\udd65',\n  'cocos_islands': '\\ud83c\\udde8\\ud83c\\udde8',\n  'coffee': '\\u2615',\n  'coffin': '\\u26b0\\ufe0f',\n  'cold_face': '\\ud83e\\udd76',\n  'cold_sweat': '\\ud83d\\ude30',\n  'collision': '\\ud83d\\udca5',\n  'colombia': '\\ud83c\\udde8\\ud83c\\uddf4',\n  'comet': '\\u2604\\ufe0f',\n  'comoros': '\\ud83c\\uddf0\\ud83c\\uddf2',\n  'compass': '\\ud83e\\udded',\n  'computer': '\\ud83d\\udcbb',\n  'computer_mouse': '\\ud83d\\uddb1\\ufe0f',\n  'confetti_ball': '\\ud83c\\udf8a',\n  'confounded': '\\ud83d\\ude16',\n  'confused': '\\ud83d\\ude15',\n  'congo_brazzaville': '\\ud83c\\udde8\\ud83c\\uddec',\n  'congo_kinshasa': '\\ud83c\\udde8\\ud83c\\udde9',\n  'congratulations': '\\u3297\\ufe0f',\n  'construction': '\\ud83d\\udea7',\n  'construction_worker': '\\ud83d\\udc77',\n  'construction_worker_man': '\\ud83d\\udc77\\u200d\\u2642\\ufe0f',\n  'construction_worker_woman': '\\ud83d\\udc77\\u200d\\u2640\\ufe0f',\n  'control_knobs': '\\ud83c\\udf9b\\ufe0f',\n  'convenience_store': '\\ud83c\\udfea',\n  'cook': '\\ud83e\\uddd1\\u200d\\ud83c\\udf73',\n  'cook_islands': '\\ud83c\\udde8\\ud83c\\uddf0',\n  'cookie': '\\ud83c\\udf6a',\n  'cool': '\\ud83c\\udd92',\n  'cop': '\\ud83d\\udc6e',\n  'copyright': '\\u00a9\\ufe0f',\n  'corn': '\\ud83c\\udf3d',\n  'costa_rica': '\\ud83c\\udde8\\ud83c\\uddf7',\n  'cote_divoire': '\\ud83c\\udde8\\ud83c\\uddee',\n  'couch_and_lamp': '\\ud83d\\udecb\\ufe0f',\n  'couple': '\\ud83d\\udc6b',\n  'couple_with_heart': '\\ud83d\\udc91',\n  'couple_with_heart_man_man': '\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68',\n  'couple_with_heart_woman_man': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68',\n  'couple_with_heart_woman_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69',\n  'couplekiss': '\\ud83d\\udc8f',\n  'couplekiss_man_man': '\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68',\n  'couplekiss_man_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68',\n  'couplekiss_woman_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69',\n  'cow': '\\ud83d\\udc2e',\n  'cow2': '\\ud83d\\udc04',\n  'cowboy_hat_face': '\\ud83e\\udd20',\n  'crab': '\\ud83e\\udd80',\n  'crayon': '\\ud83d\\udd8d\\ufe0f',\n  'credit_card': '\\ud83d\\udcb3',\n  'crescent_moon': '\\ud83c\\udf19',\n  'cricket': '\\ud83e\\udd97',\n  'cricket_game': '\\ud83c\\udfcf',\n  'croatia': '\\ud83c\\udded\\ud83c\\uddf7',\n  'crocodile': '\\ud83d\\udc0a',\n  'croissant': '\\ud83e\\udd50',\n  'crossed_fingers': '\\ud83e\\udd1e',\n  'crossed_flags': '\\ud83c\\udf8c',\n  'crossed_swords': '\\u2694\\ufe0f',\n  'crown': '\\ud83d\\udc51',\n  'cry': '\\ud83d\\ude22',\n  'crying_cat_face': '\\ud83d\\ude3f',\n  'crystal_ball': '\\ud83d\\udd2e',\n  'cuba': '\\ud83c\\udde8\\ud83c\\uddfa',\n  'cucumber': '\\ud83e\\udd52',\n  'cup_with_straw': '\\ud83e\\udd64',\n  'cupcake': '\\ud83e\\uddc1',\n  'cupid': '\\ud83d\\udc98',\n  'curacao': '\\ud83c\\udde8\\ud83c\\uddfc',\n  'curling_stone': '\\ud83e\\udd4c',\n  'curly_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb1',\n  'curly_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb1',\n  'curly_loop': '\\u27b0',\n  'currency_exchange': '\\ud83d\\udcb1',\n  'curry': '\\ud83c\\udf5b',\n  'cursing_face': '\\ud83e\\udd2c',\n  'custard': '\\ud83c\\udf6e',\n  'customs': '\\ud83d\\udec3',\n  'cut_of_meat': '\\ud83e\\udd69',\n  'cyclone': '\\ud83c\\udf00',\n  'cyprus': '\\ud83c\\udde8\\ud83c\\uddfe',\n  'czech_republic': '\\ud83c\\udde8\\ud83c\\uddff',\n  'dagger': '\\ud83d\\udde1\\ufe0f',\n  'dancer': '\\ud83d\\udc83',\n  'dancers': '\\ud83d\\udc6f',\n  'dancing_men': '\\ud83d\\udc6f\\u200d\\u2642\\ufe0f',\n  'dancing_women': '\\ud83d\\udc6f\\u200d\\u2640\\ufe0f',\n  'dango': '\\ud83c\\udf61',\n  'dark_sunglasses': '\\ud83d\\udd76\\ufe0f',\n  'dart': '\\ud83c\\udfaf',\n  'dash': '\\ud83d\\udca8',\n  'date': '\\ud83d\\udcc5',\n  'de': '\\ud83c\\udde9\\ud83c\\uddea',\n  'deaf_man': '\\ud83e\\uddcf\\u200d\\u2642\\ufe0f',\n  'deaf_person': '\\ud83e\\uddcf',\n  'deaf_woman': '\\ud83e\\uddcf\\u200d\\u2640\\ufe0f',\n  'deciduous_tree': '\\ud83c\\udf33',\n  'deer': '\\ud83e\\udd8c',\n  'denmark': '\\ud83c\\udde9\\ud83c\\uddf0',\n  'department_store': '\\ud83c\\udfec',\n  'derelict_house': '\\ud83c\\udfda\\ufe0f',\n  'desert': '\\ud83c\\udfdc\\ufe0f',\n  'desert_island': '\\ud83c\\udfdd\\ufe0f',\n  'desktop_computer': '\\ud83d\\udda5\\ufe0f',\n  'detective': '\\ud83d\\udd75\\ufe0f',\n  'diamond_shape_with_a_dot_inside': '\\ud83d\\udca0',\n  'diamonds': '\\u2666\\ufe0f',\n  'diego_garcia': '\\ud83c\\udde9\\ud83c\\uddec',\n  'disappointed': '\\ud83d\\ude1e',\n  'disappointed_relieved': '\\ud83d\\ude25',\n  'diving_mask': '\\ud83e\\udd3f',\n  'diya_lamp': '\\ud83e\\ude94',\n  'dizzy': '\\ud83d\\udcab',\n  'dizzy_face': '\\ud83d\\ude35',\n  'djibouti': '\\ud83c\\udde9\\ud83c\\uddef',\n  'dna': '\\ud83e\\uddec',\n  'do_not_litter': '\\ud83d\\udeaf',\n  'dog': '\\ud83d\\udc36',\n  'dog2': '\\ud83d\\udc15',\n  'dollar': '\\ud83d\\udcb5',\n  'dolls': '\\ud83c\\udf8e',\n  'dolphin': '\\ud83d\\udc2c',\n  'dominica': '\\ud83c\\udde9\\ud83c\\uddf2',\n  'dominican_republic': '\\ud83c\\udde9\\ud83c\\uddf4',\n  'door': '\\ud83d\\udeaa',\n  'doughnut': '\\ud83c\\udf69',\n  'dove': '\\ud83d\\udd4a\\ufe0f',\n  'dragon': '\\ud83d\\udc09',\n  'dragon_face': '\\ud83d\\udc32',\n  'dress': '\\ud83d\\udc57',\n  'dromedary_camel': '\\ud83d\\udc2a',\n  'drooling_face': '\\ud83e\\udd24',\n  'drop_of_blood': '\\ud83e\\ude78',\n  'droplet': '\\ud83d\\udca7',\n  'drum': '\\ud83e\\udd41',\n  'duck': '\\ud83e\\udd86',\n  'dumpling': '\\ud83e\\udd5f',\n  'dvd': '\\ud83d\\udcc0',\n  'e-mail': '\\ud83d\\udce7',\n  'eagle': '\\ud83e\\udd85',\n  'ear': '\\ud83d\\udc42',\n  'ear_of_rice': '\\ud83c\\udf3e',\n  'ear_with_hearing_aid': '\\ud83e\\uddbb',\n  'earth_africa': '\\ud83c\\udf0d',\n  'earth_americas': '\\ud83c\\udf0e',\n  'earth_asia': '\\ud83c\\udf0f',\n  'ecuador': '\\ud83c\\uddea\\ud83c\\udde8',\n  'egg': '\\ud83e\\udd5a',\n  'eggplant': '\\ud83c\\udf46',\n  'egypt': '\\ud83c\\uddea\\ud83c\\uddec',\n  'eight': '8\\ufe0f\\u20e3',\n  'eight_pointed_black_star': '\\u2734\\ufe0f',\n  'eight_spoked_asterisk': '\\u2733\\ufe0f',\n  'eject_button': '\\u23cf\\ufe0f',\n  'el_salvador': '\\ud83c\\uddf8\\ud83c\\uddfb',\n  'electric_plug': '\\ud83d\\udd0c',\n  'elephant': '\\ud83d\\udc18',\n  'elf': '\\ud83e\\udddd',\n  'elf_man': '\\ud83e\\udddd\\u200d\\u2642\\ufe0f',\n  'elf_woman': '\\ud83e\\udddd\\u200d\\u2640\\ufe0f',\n  'email': '\\u2709\\ufe0f',\n  'end': '\\ud83d\\udd1a',\n  'england': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f',\n  'envelope': '\\u2709\\ufe0f',\n  'envelope_with_arrow': '\\ud83d\\udce9',\n  'equatorial_guinea': '\\ud83c\\uddec\\ud83c\\uddf6',\n  'eritrea': '\\ud83c\\uddea\\ud83c\\uddf7',\n  'es': '\\ud83c\\uddea\\ud83c\\uddf8',\n  'estonia': '\\ud83c\\uddea\\ud83c\\uddea',\n  'ethiopia': '\\ud83c\\uddea\\ud83c\\uddf9',\n  'eu': '\\ud83c\\uddea\\ud83c\\uddfa',\n  'euro': '\\ud83d\\udcb6',\n  'european_castle': '\\ud83c\\udff0',\n  'european_post_office': '\\ud83c\\udfe4',\n  'european_union': '\\ud83c\\uddea\\ud83c\\uddfa',\n  'evergreen_tree': '\\ud83c\\udf32',\n  'exclamation': '\\u2757',\n  'exploding_head': '\\ud83e\\udd2f',\n  'expressionless': '\\ud83d\\ude11',\n  'eye': '\\ud83d\\udc41\\ufe0f',\n  'eye_speech_bubble': '\\ud83d\\udc41\\ufe0f\\u200d\\ud83d\\udde8\\ufe0f',\n  'eyeglasses': '\\ud83d\\udc53',\n  'eyes': '\\ud83d\\udc40',\n  'face_with_head_bandage': '\\ud83e\\udd15',\n  'face_with_thermometer': '\\ud83e\\udd12',\n  'facepalm': '\\ud83e\\udd26',\n  'facepunch': '\\ud83d\\udc4a',\n  'factory': '\\ud83c\\udfed',\n  'factory_worker': '\\ud83e\\uddd1\\u200d\\ud83c\\udfed',\n  'fairy': '\\ud83e\\uddda',\n  'fairy_man': '\\ud83e\\uddda\\u200d\\u2642\\ufe0f',\n  'fairy_woman': '\\ud83e\\uddda\\u200d\\u2640\\ufe0f',\n  'falafel': '\\ud83e\\uddc6',\n  'falkland_islands': '\\ud83c\\uddeb\\ud83c\\uddf0',\n  'fallen_leaf': '\\ud83c\\udf42',\n  'family': '\\ud83d\\udc6a',\n  'family_man_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc66',\n  'family_man_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc67',\n  'family_man_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_man_man_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66',\n  'family_man_man_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_man_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67',\n  'family_man_man_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_man_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_man_woman_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_man_woman_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_woman_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_man_woman_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_woman_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_woman_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_woman_boy_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_woman_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_woman_girl_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_woman_girl_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_woman_woman_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_woman_woman_boy_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_woman_woman_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_woman_woman_girl_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_woman_woman_girl_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'farmer': '\\ud83e\\uddd1\\u200d\\ud83c\\udf3e',\n  'faroe_islands': '\\ud83c\\uddeb\\ud83c\\uddf4',\n  'fast_forward': '\\u23e9',\n  'fax': '\\ud83d\\udce0',\n  'fearful': '\\ud83d\\ude28',\n  'feet': '\\ud83d\\udc3e',\n  'female_detective': '\\ud83d\\udd75\\ufe0f\\u200d\\u2640\\ufe0f',\n  'female_sign': '\\u2640\\ufe0f',\n  'ferris_wheel': '\\ud83c\\udfa1',\n  'ferry': '\\u26f4\\ufe0f',\n  'field_hockey': '\\ud83c\\udfd1',\n  'fiji': '\\ud83c\\uddeb\\ud83c\\uddef',\n  'file_cabinet': '\\ud83d\\uddc4\\ufe0f',\n  'file_folder': '\\ud83d\\udcc1',\n  'film_projector': '\\ud83d\\udcfd\\ufe0f',\n  'film_strip': '\\ud83c\\udf9e\\ufe0f',\n  'finland': '\\ud83c\\uddeb\\ud83c\\uddee',\n  'fire': '\\ud83d\\udd25',\n  'fire_engine': '\\ud83d\\ude92',\n  'fire_extinguisher': '\\ud83e\\uddef',\n  'firecracker': '\\ud83e\\udde8',\n  'firefighter': '\\ud83e\\uddd1\\u200d\\ud83d\\ude92',\n  'fireworks': '\\ud83c\\udf86',\n  'first_quarter_moon': '\\ud83c\\udf13',\n  'first_quarter_moon_with_face': '\\ud83c\\udf1b',\n  'fish': '\\ud83d\\udc1f',\n  'fish_cake': '\\ud83c\\udf65',\n  'fishing_pole_and_fish': '\\ud83c\\udfa3',\n  'fist': '\\u270a',\n  'fist_left': '\\ud83e\\udd1b',\n  'fist_oncoming': '\\ud83d\\udc4a',\n  'fist_raised': '\\u270a',\n  'fist_right': '\\ud83e\\udd1c',\n  'five': '5\\ufe0f\\u20e3',\n  'flags': '\\ud83c\\udf8f',\n  'flamingo': '\\ud83e\\udda9',\n  'flashlight': '\\ud83d\\udd26',\n  'flat_shoe': '\\ud83e\\udd7f',\n  'fleur_de_lis': '\\u269c\\ufe0f',\n  'flight_arrival': '\\ud83d\\udeec',\n  'flight_departure': '\\ud83d\\udeeb',\n  'flipper': '\\ud83d\\udc2c',\n  'floppy_disk': '\\ud83d\\udcbe',\n  'flower_playing_cards': '\\ud83c\\udfb4',\n  'flushed': '\\ud83d\\ude33',\n  'flying_disc': '\\ud83e\\udd4f',\n  'flying_saucer': '\\ud83d\\udef8',\n  'fog': '\\ud83c\\udf2b\\ufe0f',\n  'foggy': '\\ud83c\\udf01',\n  'foot': '\\ud83e\\uddb6',\n  'football': '\\ud83c\\udfc8',\n  'footprints': '\\ud83d\\udc63',\n  'fork_and_knife': '\\ud83c\\udf74',\n  'fortune_cookie': '\\ud83e\\udd60',\n  'fountain': '\\u26f2',\n  'fountain_pen': '\\ud83d\\udd8b\\ufe0f',\n  'four': '4\\ufe0f\\u20e3',\n  'four_leaf_clover': '\\ud83c\\udf40',\n  'fox_face': '\\ud83e\\udd8a',\n  'fr': '\\ud83c\\uddeb\\ud83c\\uddf7',\n  'framed_picture': '\\ud83d\\uddbc\\ufe0f',\n  'free': '\\ud83c\\udd93',\n  'french_guiana': '\\ud83c\\uddec\\ud83c\\uddeb',\n  'french_polynesia': '\\ud83c\\uddf5\\ud83c\\uddeb',\n  'french_southern_territories': '\\ud83c\\uddf9\\ud83c\\uddeb',\n  'fried_egg': '\\ud83c\\udf73',\n  'fried_shrimp': '\\ud83c\\udf64',\n  'fries': '\\ud83c\\udf5f',\n  'frog': '\\ud83d\\udc38',\n  'frowning': '\\ud83d\\ude26',\n  'frowning_face': '\\u2639\\ufe0f',\n  'frowning_man': '\\ud83d\\ude4d\\u200d\\u2642\\ufe0f',\n  'frowning_person': '\\ud83d\\ude4d',\n  'frowning_woman': '\\ud83d\\ude4d\\u200d\\u2640\\ufe0f',\n  'fu': '\\ud83d\\udd95',\n  'fuelpump': '\\u26fd',\n  'full_moon': '\\ud83c\\udf15',\n  'full_moon_with_face': '\\ud83c\\udf1d',\n  'funeral_urn': '\\u26b1\\ufe0f',\n  'gabon': '\\ud83c\\uddec\\ud83c\\udde6',\n  'gambia': '\\ud83c\\uddec\\ud83c\\uddf2',\n  'game_die': '\\ud83c\\udfb2',\n  'garlic': '\\ud83e\\uddc4',\n  'gb': '\\ud83c\\uddec\\ud83c\\udde7',\n  'gear': '\\u2699\\ufe0f',\n  'gem': '\\ud83d\\udc8e',\n  'gemini': '\\u264a',\n  'genie': '\\ud83e\\uddde',\n  'genie_man': '\\ud83e\\uddde\\u200d\\u2642\\ufe0f',\n  'genie_woman': '\\ud83e\\uddde\\u200d\\u2640\\ufe0f',\n  'georgia': '\\ud83c\\uddec\\ud83c\\uddea',\n  'ghana': '\\ud83c\\uddec\\ud83c\\udded',\n  'ghost': '\\ud83d\\udc7b',\n  'gibraltar': '\\ud83c\\uddec\\ud83c\\uddee',\n  'gift': '\\ud83c\\udf81',\n  'gift_heart': '\\ud83d\\udc9d',\n  'giraffe': '\\ud83e\\udd92',\n  'girl': '\\ud83d\\udc67',\n  'globe_with_meridians': '\\ud83c\\udf10',\n  'gloves': '\\ud83e\\udde4',\n  'goal_net': '\\ud83e\\udd45',\n  'goat': '\\ud83d\\udc10',\n  'goggles': '\\ud83e\\udd7d',\n  'golf': '\\u26f3',\n  'golfing': '\\ud83c\\udfcc\\ufe0f',\n  'golfing_man': '\\ud83c\\udfcc\\ufe0f\\u200d\\u2642\\ufe0f',\n  'golfing_woman': '\\ud83c\\udfcc\\ufe0f\\u200d\\u2640\\ufe0f',\n  'gorilla': '\\ud83e\\udd8d',\n  'grapes': '\\ud83c\\udf47',\n  'greece': '\\ud83c\\uddec\\ud83c\\uddf7',\n  'green_apple': '\\ud83c\\udf4f',\n  'green_book': '\\ud83d\\udcd7',\n  'green_circle': '\\ud83d\\udfe2',\n  'green_heart': '\\ud83d\\udc9a',\n  'green_salad': '\\ud83e\\udd57',\n  'green_square': '\\ud83d\\udfe9',\n  'greenland': '\\ud83c\\uddec\\ud83c\\uddf1',\n  'grenada': '\\ud83c\\uddec\\ud83c\\udde9',\n  'grey_exclamation': '\\u2755',\n  'grey_question': '\\u2754',\n  'grimacing': '\\ud83d\\ude2c',\n  'grin': '\\ud83d\\ude01',\n  'grinning': '\\ud83d\\ude00',\n  'guadeloupe': '\\ud83c\\uddec\\ud83c\\uddf5',\n  'guam': '\\ud83c\\uddec\\ud83c\\uddfa',\n  'guard': '\\ud83d\\udc82',\n  'guardsman': '\\ud83d\\udc82\\u200d\\u2642\\ufe0f',\n  'guardswoman': '\\ud83d\\udc82\\u200d\\u2640\\ufe0f',\n  'guatemala': '\\ud83c\\uddec\\ud83c\\uddf9',\n  'guernsey': '\\ud83c\\uddec\\ud83c\\uddec',\n  'guide_dog': '\\ud83e\\uddae',\n  'guinea': '\\ud83c\\uddec\\ud83c\\uddf3',\n  'guinea_bissau': '\\ud83c\\uddec\\ud83c\\uddfc',\n  'guitar': '\\ud83c\\udfb8',\n  'gun': '\\ud83d\\udd2b',\n  'guyana': '\\ud83c\\uddec\\ud83c\\uddfe',\n  'haircut': '\\ud83d\\udc87',\n  'haircut_man': '\\ud83d\\udc87\\u200d\\u2642\\ufe0f',\n  'haircut_woman': '\\ud83d\\udc87\\u200d\\u2640\\ufe0f',\n  'haiti': '\\ud83c\\udded\\ud83c\\uddf9',\n  'hamburger': '\\ud83c\\udf54',\n  'hammer': '\\ud83d\\udd28',\n  'hammer_and_pick': '\\u2692\\ufe0f',\n  'hammer_and_wrench': '\\ud83d\\udee0\\ufe0f',\n  'hamster': '\\ud83d\\udc39',\n  'hand': '\\u270b',\n  'hand_over_mouth': '\\ud83e\\udd2d',\n  'handbag': '\\ud83d\\udc5c',\n  'handball_person': '\\ud83e\\udd3e',\n  'handshake': '\\ud83e\\udd1d',\n  'hankey': '\\ud83d\\udca9',\n  'hash': '#\\ufe0f\\u20e3',\n  'hatched_chick': '\\ud83d\\udc25',\n  'hatching_chick': '\\ud83d\\udc23',\n  'headphones': '\\ud83c\\udfa7',\n  'health_worker': '\\ud83e\\uddd1\\u200d\\u2695\\ufe0f',\n  'hear_no_evil': '\\ud83d\\ude49',\n  'heard_mcdonald_islands': '\\ud83c\\udded\\ud83c\\uddf2',\n  'heart': '\\u2764\\ufe0f',\n  'heart_decoration': '\\ud83d\\udc9f',\n  'heart_eyes': '\\ud83d\\ude0d',\n  'heart_eyes_cat': '\\ud83d\\ude3b',\n  'heartbeat': '\\ud83d\\udc93',\n  'heartpulse': '\\ud83d\\udc97',\n  'hearts': '\\u2665\\ufe0f',\n  'heavy_check_mark': '\\u2714\\ufe0f',\n  'heavy_division_sign': '\\u2797',\n  'heavy_dollar_sign': '\\ud83d\\udcb2',\n  'heavy_exclamation_mark': '\\u2757',\n  'heavy_heart_exclamation': '\\u2763\\ufe0f',\n  'heavy_minus_sign': '\\u2796',\n  'heavy_multiplication_x': '\\u2716\\ufe0f',\n  'heavy_plus_sign': '\\u2795',\n  'hedgehog': '\\ud83e\\udd94',\n  'helicopter': '\\ud83d\\ude81',\n  'herb': '\\ud83c\\udf3f',\n  'hibiscus': '\\ud83c\\udf3a',\n  'high_brightness': '\\ud83d\\udd06',\n  'high_heel': '\\ud83d\\udc60',\n  'hiking_boot': '\\ud83e\\udd7e',\n  'hindu_temple': '\\ud83d\\uded5',\n  'hippopotamus': '\\ud83e\\udd9b',\n  'hocho': '\\ud83d\\udd2a',\n  'hole': '\\ud83d\\udd73\\ufe0f',\n  'honduras': '\\ud83c\\udded\\ud83c\\uddf3',\n  'honey_pot': '\\ud83c\\udf6f',\n  'honeybee': '\\ud83d\\udc1d',\n  'hong_kong': '\\ud83c\\udded\\ud83c\\uddf0',\n  'horse': '\\ud83d\\udc34',\n  'horse_racing': '\\ud83c\\udfc7',\n  'hospital': '\\ud83c\\udfe5',\n  'hot_face': '\\ud83e\\udd75',\n  'hot_pepper': '\\ud83c\\udf36\\ufe0f',\n  'hotdog': '\\ud83c\\udf2d',\n  'hotel': '\\ud83c\\udfe8',\n  'hotsprings': '\\u2668\\ufe0f',\n  'hourglass': '\\u231b',\n  'hourglass_flowing_sand': '\\u23f3',\n  'house': '\\ud83c\\udfe0',\n  'house_with_garden': '\\ud83c\\udfe1',\n  'houses': '\\ud83c\\udfd8\\ufe0f',\n  'hugs': '\\ud83e\\udd17',\n  'hungary': '\\ud83c\\udded\\ud83c\\uddfa',\n  'hushed': '\\ud83d\\ude2f',\n  'ice_cream': '\\ud83c\\udf68',\n  'ice_cube': '\\ud83e\\uddca',\n  'ice_hockey': '\\ud83c\\udfd2',\n  'ice_skate': '\\u26f8\\ufe0f',\n  'icecream': '\\ud83c\\udf66',\n  'iceland': '\\ud83c\\uddee\\ud83c\\uddf8',\n  'id': '\\ud83c\\udd94',\n  'ideograph_advantage': '\\ud83c\\ude50',\n  'imp': '\\ud83d\\udc7f',\n  'inbox_tray': '\\ud83d\\udce5',\n  'incoming_envelope': '\\ud83d\\udce8',\n  'india': '\\ud83c\\uddee\\ud83c\\uddf3',\n  'indonesia': '\\ud83c\\uddee\\ud83c\\udde9',\n  'infinity': '\\u267e\\ufe0f',\n  'information_desk_person': '\\ud83d\\udc81',\n  'information_source': '\\u2139\\ufe0f',\n  'innocent': '\\ud83d\\ude07',\n  'interrobang': '\\u2049\\ufe0f',\n  'iphone': '\\ud83d\\udcf1',\n  'iran': '\\ud83c\\uddee\\ud83c\\uddf7',\n  'iraq': '\\ud83c\\uddee\\ud83c\\uddf6',\n  'ireland': '\\ud83c\\uddee\\ud83c\\uddea',\n  'isle_of_man': '\\ud83c\\uddee\\ud83c\\uddf2',\n  'israel': '\\ud83c\\uddee\\ud83c\\uddf1',\n  'it': '\\ud83c\\uddee\\ud83c\\uddf9',\n  'izakaya_lantern': '\\ud83c\\udfee',\n  'jack_o_lantern': '\\ud83c\\udf83',\n  'jamaica': '\\ud83c\\uddef\\ud83c\\uddf2',\n  'japan': '\\ud83d\\uddfe',\n  'japanese_castle': '\\ud83c\\udfef',\n  'japanese_goblin': '\\ud83d\\udc7a',\n  'japanese_ogre': '\\ud83d\\udc79',\n  'jeans': '\\ud83d\\udc56',\n  'jersey': '\\ud83c\\uddef\\ud83c\\uddea',\n  'jigsaw': '\\ud83e\\udde9',\n  'jordan': '\\ud83c\\uddef\\ud83c\\uddf4',\n  'joy': '\\ud83d\\ude02',\n  'joy_cat': '\\ud83d\\ude39',\n  'joystick': '\\ud83d\\udd79\\ufe0f',\n  'jp': '\\ud83c\\uddef\\ud83c\\uddf5',\n  'judge': '\\ud83e\\uddd1\\u200d\\u2696\\ufe0f',\n  'juggling_person': '\\ud83e\\udd39',\n  'kaaba': '\\ud83d\\udd4b',\n  'kangaroo': '\\ud83e\\udd98',\n  'kazakhstan': '\\ud83c\\uddf0\\ud83c\\uddff',\n  'kenya': '\\ud83c\\uddf0\\ud83c\\uddea',\n  'key': '\\ud83d\\udd11',\n  'keyboard': '\\u2328\\ufe0f',\n  'keycap_ten': '\\ud83d\\udd1f',\n  'kick_scooter': '\\ud83d\\udef4',\n  'kimono': '\\ud83d\\udc58',\n  'kiribati': '\\ud83c\\uddf0\\ud83c\\uddee',\n  'kiss': '\\ud83d\\udc8b',\n  'kissing': '\\ud83d\\ude17',\n  'kissing_cat': '\\ud83d\\ude3d',\n  'kissing_closed_eyes': '\\ud83d\\ude1a',\n  'kissing_heart': '\\ud83d\\ude18',\n  'kissing_smiling_eyes': '\\ud83d\\ude19',\n  'kite': '\\ud83e\\ude81',\n  'kiwi_fruit': '\\ud83e\\udd5d',\n  'kneeling_man': '\\ud83e\\uddce\\u200d\\u2642\\ufe0f',\n  'kneeling_person': '\\ud83e\\uddce',\n  'kneeling_woman': '\\ud83e\\uddce\\u200d\\u2640\\ufe0f',\n  'knife': '\\ud83d\\udd2a',\n  'koala': '\\ud83d\\udc28',\n  'koko': '\\ud83c\\ude01',\n  'kosovo': '\\ud83c\\uddfd\\ud83c\\uddf0',\n  'kr': '\\ud83c\\uddf0\\ud83c\\uddf7',\n  'kuwait': '\\ud83c\\uddf0\\ud83c\\uddfc',\n  'kyrgyzstan': '\\ud83c\\uddf0\\ud83c\\uddec',\n  'lab_coat': '\\ud83e\\udd7c',\n  'label': '\\ud83c\\udff7\\ufe0f',\n  'lacrosse': '\\ud83e\\udd4d',\n  'lantern': '\\ud83c\\udfee',\n  'laos': '\\ud83c\\uddf1\\ud83c\\udde6',\n  'large_blue_circle': '\\ud83d\\udd35',\n  'large_blue_diamond': '\\ud83d\\udd37',\n  'large_orange_diamond': '\\ud83d\\udd36',\n  'last_quarter_moon': '\\ud83c\\udf17',\n  'last_quarter_moon_with_face': '\\ud83c\\udf1c',\n  'latin_cross': '\\u271d\\ufe0f',\n  'latvia': '\\ud83c\\uddf1\\ud83c\\uddfb',\n  'laughing': '\\ud83d\\ude06',\n  'leafy_green': '\\ud83e\\udd6c',\n  'leaves': '\\ud83c\\udf43',\n  'lebanon': '\\ud83c\\uddf1\\ud83c\\udde7',\n  'ledger': '\\ud83d\\udcd2',\n  'left_luggage': '\\ud83d\\udec5',\n  'left_right_arrow': '\\u2194\\ufe0f',\n  'left_speech_bubble': '\\ud83d\\udde8\\ufe0f',\n  'leftwards_arrow_with_hook': '\\u21a9\\ufe0f',\n  'leg': '\\ud83e\\uddb5',\n  'lemon': '\\ud83c\\udf4b',\n  'leo': '\\u264c',\n  'leopard': '\\ud83d\\udc06',\n  'lesotho': '\\ud83c\\uddf1\\ud83c\\uddf8',\n  'level_slider': '\\ud83c\\udf9a\\ufe0f',\n  'liberia': '\\ud83c\\uddf1\\ud83c\\uddf7',\n  'libra': '\\u264e',\n  'libya': '\\ud83c\\uddf1\\ud83c\\uddfe',\n  'liechtenstein': '\\ud83c\\uddf1\\ud83c\\uddee',\n  'light_rail': '\\ud83d\\ude88',\n  'link': '\\ud83d\\udd17',\n  'lion': '\\ud83e\\udd81',\n  'lips': '\\ud83d\\udc44',\n  'lipstick': '\\ud83d\\udc84',\n  'lithuania': '\\ud83c\\uddf1\\ud83c\\uddf9',\n  'lizard': '\\ud83e\\udd8e',\n  'llama': '\\ud83e\\udd99',\n  'lobster': '\\ud83e\\udd9e',\n  'lock': '\\ud83d\\udd12',\n  'lock_with_ink_pen': '\\ud83d\\udd0f',\n  'lollipop': '\\ud83c\\udf6d',\n  'loop': '\\u27bf',\n  'lotion_bottle': '\\ud83e\\uddf4',\n  'lotus_position': '\\ud83e\\uddd8',\n  'lotus_position_man': '\\ud83e\\uddd8\\u200d\\u2642\\ufe0f',\n  'lotus_position_woman': '\\ud83e\\uddd8\\u200d\\u2640\\ufe0f',\n  'loud_sound': '\\ud83d\\udd0a',\n  'loudspeaker': '\\ud83d\\udce2',\n  'love_hotel': '\\ud83c\\udfe9',\n  'love_letter': '\\ud83d\\udc8c',\n  'love_you_gesture': '\\ud83e\\udd1f',\n  'low_brightness': '\\ud83d\\udd05',\n  'luggage': '\\ud83e\\uddf3',\n  'luxembourg': '\\ud83c\\uddf1\\ud83c\\uddfa',\n  'lying_face': '\\ud83e\\udd25',\n  'm': '\\u24c2\\ufe0f',\n  'macau': '\\ud83c\\uddf2\\ud83c\\uddf4',\n  'macedonia': '\\ud83c\\uddf2\\ud83c\\uddf0',\n  'madagascar': '\\ud83c\\uddf2\\ud83c\\uddec',\n  'mag': '\\ud83d\\udd0d',\n  'mag_right': '\\ud83d\\udd0e',\n  'mage': '\\ud83e\\uddd9',\n  'mage_man': '\\ud83e\\uddd9\\u200d\\u2642\\ufe0f',\n  'mage_woman': '\\ud83e\\uddd9\\u200d\\u2640\\ufe0f',\n  'magnet': '\\ud83e\\uddf2',\n  'mahjong': '\\ud83c\\udc04',\n  'mailbox': '\\ud83d\\udceb',\n  'mailbox_closed': '\\ud83d\\udcea',\n  'mailbox_with_mail': '\\ud83d\\udcec',\n  'mailbox_with_no_mail': '\\ud83d\\udced',\n  'malawi': '\\ud83c\\uddf2\\ud83c\\uddfc',\n  'malaysia': '\\ud83c\\uddf2\\ud83c\\uddfe',\n  'maldives': '\\ud83c\\uddf2\\ud83c\\uddfb',\n  'male_detective': '\\ud83d\\udd75\\ufe0f\\u200d\\u2642\\ufe0f',\n  'male_sign': '\\u2642\\ufe0f',\n  'mali': '\\ud83c\\uddf2\\ud83c\\uddf1',\n  'malta': '\\ud83c\\uddf2\\ud83c\\uddf9',\n  'man': '\\ud83d\\udc68',\n  'man_artist': '\\ud83d\\udc68\\u200d\\ud83c\\udfa8',\n  'man_astronaut': '\\ud83d\\udc68\\u200d\\ud83d\\ude80',\n  'man_cartwheeling': '\\ud83e\\udd38\\u200d\\u2642\\ufe0f',\n  'man_cook': '\\ud83d\\udc68\\u200d\\ud83c\\udf73',\n  'man_dancing': '\\ud83d\\udd7a',\n  'man_facepalming': '\\ud83e\\udd26\\u200d\\u2642\\ufe0f',\n  'man_factory_worker': '\\ud83d\\udc68\\u200d\\ud83c\\udfed',\n  'man_farmer': '\\ud83d\\udc68\\u200d\\ud83c\\udf3e',\n  'man_firefighter': '\\ud83d\\udc68\\u200d\\ud83d\\ude92',\n  'man_health_worker': '\\ud83d\\udc68\\u200d\\u2695\\ufe0f',\n  'man_in_manual_wheelchair': '\\ud83d\\udc68\\u200d\\ud83e\\uddbd',\n  'man_in_motorized_wheelchair': '\\ud83d\\udc68\\u200d\\ud83e\\uddbc',\n  'man_in_tuxedo': '\\ud83e\\udd35',\n  'man_judge': '\\ud83d\\udc68\\u200d\\u2696\\ufe0f',\n  'man_juggling': '\\ud83e\\udd39\\u200d\\u2642\\ufe0f',\n  'man_mechanic': '\\ud83d\\udc68\\u200d\\ud83d\\udd27',\n  'man_office_worker': '\\ud83d\\udc68\\u200d\\ud83d\\udcbc',\n  'man_pilot': '\\ud83d\\udc68\\u200d\\u2708\\ufe0f',\n  'man_playing_handball': '\\ud83e\\udd3e\\u200d\\u2642\\ufe0f',\n  'man_playing_water_polo': '\\ud83e\\udd3d\\u200d\\u2642\\ufe0f',\n  'man_scientist': '\\ud83d\\udc68\\u200d\\ud83d\\udd2c',\n  'man_shrugging': '\\ud83e\\udd37\\u200d\\u2642\\ufe0f',\n  'man_singer': '\\ud83d\\udc68\\u200d\\ud83c\\udfa4',\n  'man_student': '\\ud83d\\udc68\\u200d\\ud83c\\udf93',\n  'man_teacher': '\\ud83d\\udc68\\u200d\\ud83c\\udfeb',\n  'man_technologist': '\\ud83d\\udc68\\u200d\\ud83d\\udcbb',\n  'man_with_gua_pi_mao': '\\ud83d\\udc72',\n  'man_with_probing_cane': '\\ud83d\\udc68\\u200d\\ud83e\\uddaf',\n  'man_with_turban': '\\ud83d\\udc73\\u200d\\u2642\\ufe0f',\n  'mandarin': '\\ud83c\\udf4a',\n  'mango': '\\ud83e\\udd6d',\n  'mans_shoe': '\\ud83d\\udc5e',\n  'mantelpiece_clock': '\\ud83d\\udd70\\ufe0f',\n  'manual_wheelchair': '\\ud83e\\uddbd',\n  'maple_leaf': '\\ud83c\\udf41',\n  'marshall_islands': '\\ud83c\\uddf2\\ud83c\\udded',\n  'martial_arts_uniform': '\\ud83e\\udd4b',\n  'martinique': '\\ud83c\\uddf2\\ud83c\\uddf6',\n  'mask': '\\ud83d\\ude37',\n  'massage': '\\ud83d\\udc86',\n  'massage_man': '\\ud83d\\udc86\\u200d\\u2642\\ufe0f',\n  'massage_woman': '\\ud83d\\udc86\\u200d\\u2640\\ufe0f',\n  'mate': '\\ud83e\\uddc9',\n  'mauritania': '\\ud83c\\uddf2\\ud83c\\uddf7',\n  'mauritius': '\\ud83c\\uddf2\\ud83c\\uddfa',\n  'mayotte': '\\ud83c\\uddfe\\ud83c\\uddf9',\n  'meat_on_bone': '\\ud83c\\udf56',\n  'mechanic': '\\ud83e\\uddd1\\u200d\\ud83d\\udd27',\n  'mechanical_arm': '\\ud83e\\uddbe',\n  'mechanical_leg': '\\ud83e\\uddbf',\n  'medal_military': '\\ud83c\\udf96\\ufe0f',\n  'medal_sports': '\\ud83c\\udfc5',\n  'medical_symbol': '\\u2695\\ufe0f',\n  'mega': '\\ud83d\\udce3',\n  'melon': '\\ud83c\\udf48',\n  'memo': '\\ud83d\\udcdd',\n  'men_wrestling': '\\ud83e\\udd3c\\u200d\\u2642\\ufe0f',\n  'menorah': '\\ud83d\\udd4e',\n  'mens': '\\ud83d\\udeb9',\n  'mermaid': '\\ud83e\\udddc\\u200d\\u2640\\ufe0f',\n  'merman': '\\ud83e\\udddc\\u200d\\u2642\\ufe0f',\n  'merperson': '\\ud83e\\udddc',\n  'metal': '\\ud83e\\udd18',\n  'metro': '\\ud83d\\ude87',\n  'mexico': '\\ud83c\\uddf2\\ud83c\\uddfd',\n  'microbe': '\\ud83e\\udda0',\n  'micronesia': '\\ud83c\\uddeb\\ud83c\\uddf2',\n  'microphone': '\\ud83c\\udfa4',\n  'microscope': '\\ud83d\\udd2c',\n  'middle_finger': '\\ud83d\\udd95',\n  'milk_glass': '\\ud83e\\udd5b',\n  'milky_way': '\\ud83c\\udf0c',\n  'minibus': '\\ud83d\\ude90',\n  'minidisc': '\\ud83d\\udcbd',\n  'mobile_phone_off': '\\ud83d\\udcf4',\n  'moldova': '\\ud83c\\uddf2\\ud83c\\udde9',\n  'monaco': '\\ud83c\\uddf2\\ud83c\\udde8',\n  'money_mouth_face': '\\ud83e\\udd11',\n  'money_with_wings': '\\ud83d\\udcb8',\n  'moneybag': '\\ud83d\\udcb0',\n  'mongolia': '\\ud83c\\uddf2\\ud83c\\uddf3',\n  'monkey': '\\ud83d\\udc12',\n  'monkey_face': '\\ud83d\\udc35',\n  'monocle_face': '\\ud83e\\uddd0',\n  'monorail': '\\ud83d\\ude9d',\n  'montenegro': '\\ud83c\\uddf2\\ud83c\\uddea',\n  'montserrat': '\\ud83c\\uddf2\\ud83c\\uddf8',\n  'moon': '\\ud83c\\udf14',\n  'moon_cake': '\\ud83e\\udd6e',\n  'morocco': '\\ud83c\\uddf2\\ud83c\\udde6',\n  'mortar_board': '\\ud83c\\udf93',\n  'mosque': '\\ud83d\\udd4c',\n  'mosquito': '\\ud83e\\udd9f',\n  'motor_boat': '\\ud83d\\udee5\\ufe0f',\n  'motor_scooter': '\\ud83d\\udef5',\n  'motorcycle': '\\ud83c\\udfcd\\ufe0f',\n  'motorized_wheelchair': '\\ud83e\\uddbc',\n  'motorway': '\\ud83d\\udee3\\ufe0f',\n  'mount_fuji': '\\ud83d\\uddfb',\n  'mountain': '\\u26f0\\ufe0f',\n  'mountain_bicyclist': '\\ud83d\\udeb5',\n  'mountain_biking_man': '\\ud83d\\udeb5\\u200d\\u2642\\ufe0f',\n  'mountain_biking_woman': '\\ud83d\\udeb5\\u200d\\u2640\\ufe0f',\n  'mountain_cableway': '\\ud83d\\udea0',\n  'mountain_railway': '\\ud83d\\ude9e',\n  'mountain_snow': '\\ud83c\\udfd4\\ufe0f',\n  'mouse': '\\ud83d\\udc2d',\n  'mouse2': '\\ud83d\\udc01',\n  'movie_camera': '\\ud83c\\udfa5',\n  'moyai': '\\ud83d\\uddff',\n  'mozambique': '\\ud83c\\uddf2\\ud83c\\uddff',\n  'mrs_claus': '\\ud83e\\udd36',\n  'muscle': '\\ud83d\\udcaa',\n  'mushroom': '\\ud83c\\udf44',\n  'musical_keyboard': '\\ud83c\\udfb9',\n  'musical_note': '\\ud83c\\udfb5',\n  'musical_score': '\\ud83c\\udfbc',\n  'mute': '\\ud83d\\udd07',\n  'myanmar': '\\ud83c\\uddf2\\ud83c\\uddf2',\n  'nail_care': '\\ud83d\\udc85',\n  'name_badge': '\\ud83d\\udcdb',\n  'namibia': '\\ud83c\\uddf3\\ud83c\\udde6',\n  'national_park': '\\ud83c\\udfde\\ufe0f',\n  'nauru': '\\ud83c\\uddf3\\ud83c\\uddf7',\n  'nauseated_face': '\\ud83e\\udd22',\n  'nazar_amulet': '\\ud83e\\uddff',\n  'necktie': '\\ud83d\\udc54',\n  'negative_squared_cross_mark': '\\u274e',\n  'nepal': '\\ud83c\\uddf3\\ud83c\\uddf5',\n  'nerd_face': '\\ud83e\\udd13',\n  'netherlands': '\\ud83c\\uddf3\\ud83c\\uddf1',\n  'neutral_face': '\\ud83d\\ude10',\n  'new': '\\ud83c\\udd95',\n  'new_caledonia': '\\ud83c\\uddf3\\ud83c\\udde8',\n  'new_moon': '\\ud83c\\udf11',\n  'new_moon_with_face': '\\ud83c\\udf1a',\n  'new_zealand': '\\ud83c\\uddf3\\ud83c\\uddff',\n  'newspaper': '\\ud83d\\udcf0',\n  'newspaper_roll': '\\ud83d\\uddde\\ufe0f',\n  'next_track_button': '\\u23ed\\ufe0f',\n  'ng': '\\ud83c\\udd96',\n  'ng_man': '\\ud83d\\ude45\\u200d\\u2642\\ufe0f',\n  'ng_woman': '\\ud83d\\ude45\\u200d\\u2640\\ufe0f',\n  'nicaragua': '\\ud83c\\uddf3\\ud83c\\uddee',\n  'niger': '\\ud83c\\uddf3\\ud83c\\uddea',\n  'nigeria': '\\ud83c\\uddf3\\ud83c\\uddec',\n  'night_with_stars': '\\ud83c\\udf03',\n  'nine': '9\\ufe0f\\u20e3',\n  'niue': '\\ud83c\\uddf3\\ud83c\\uddfa',\n  'no_bell': '\\ud83d\\udd15',\n  'no_bicycles': '\\ud83d\\udeb3',\n  'no_entry': '\\u26d4',\n  'no_entry_sign': '\\ud83d\\udeab',\n  'no_good': '\\ud83d\\ude45',\n  'no_good_man': '\\ud83d\\ude45\\u200d\\u2642\\ufe0f',\n  'no_good_woman': '\\ud83d\\ude45\\u200d\\u2640\\ufe0f',\n  'no_mobile_phones': '\\ud83d\\udcf5',\n  'no_mouth': '\\ud83d\\ude36',\n  'no_pedestrians': '\\ud83d\\udeb7',\n  'no_smoking': '\\ud83d\\udead',\n  'non-potable_water': '\\ud83d\\udeb1',\n  'norfolk_island': '\\ud83c\\uddf3\\ud83c\\uddeb',\n  'north_korea': '\\ud83c\\uddf0\\ud83c\\uddf5',\n  'northern_mariana_islands': '\\ud83c\\uddf2\\ud83c\\uddf5',\n  'norway': '\\ud83c\\uddf3\\ud83c\\uddf4',\n  'nose': '\\ud83d\\udc43',\n  'notebook': '\\ud83d\\udcd3',\n  'notebook_with_decorative_cover': '\\ud83d\\udcd4',\n  'notes': '\\ud83c\\udfb6',\n  'nut_and_bolt': '\\ud83d\\udd29',\n  'o': '\\u2b55',\n  'o2': '\\ud83c\\udd7e\\ufe0f',\n  'ocean': '\\ud83c\\udf0a',\n  'octopus': '\\ud83d\\udc19',\n  'oden': '\\ud83c\\udf62',\n  'office': '\\ud83c\\udfe2',\n  'office_worker': '\\ud83e\\uddd1\\u200d\\ud83d\\udcbc',\n  'oil_drum': '\\ud83d\\udee2\\ufe0f',\n  'ok': '\\ud83c\\udd97',\n  'ok_hand': '\\ud83d\\udc4c',\n  'ok_man': '\\ud83d\\ude46\\u200d\\u2642\\ufe0f',\n  'ok_person': '\\ud83d\\ude46',\n  'ok_woman': '\\ud83d\\ude46\\u200d\\u2640\\ufe0f',\n  'old_key': '\\ud83d\\udddd\\ufe0f',\n  'older_adult': '\\ud83e\\uddd3',\n  'older_man': '\\ud83d\\udc74',\n  'older_woman': '\\ud83d\\udc75',\n  'om': '\\ud83d\\udd49\\ufe0f',\n  'oman': '\\ud83c\\uddf4\\ud83c\\uddf2',\n  'on': '\\ud83d\\udd1b',\n  'oncoming_automobile': '\\ud83d\\ude98',\n  'oncoming_bus': '\\ud83d\\ude8d',\n  'oncoming_police_car': '\\ud83d\\ude94',\n  'oncoming_taxi': '\\ud83d\\ude96',\n  'one': '1\\ufe0f\\u20e3',\n  'one_piece_swimsuit': '\\ud83e\\ude71',\n  'onion': '\\ud83e\\uddc5',\n  'open_book': '\\ud83d\\udcd6',\n  'open_file_folder': '\\ud83d\\udcc2',\n  'open_hands': '\\ud83d\\udc50',\n  'open_mouth': '\\ud83d\\ude2e',\n  'open_umbrella': '\\u2602\\ufe0f',\n  'ophiuchus': '\\u26ce',\n  'orange': '\\ud83c\\udf4a',\n  'orange_book': '\\ud83d\\udcd9',\n  'orange_circle': '\\ud83d\\udfe0',\n  'orange_heart': '\\ud83e\\udde1',\n  'orange_square': '\\ud83d\\udfe7',\n  'orangutan': '\\ud83e\\udda7',\n  'orthodox_cross': '\\u2626\\ufe0f',\n  'otter': '\\ud83e\\udda6',\n  'outbox_tray': '\\ud83d\\udce4',\n  'owl': '\\ud83e\\udd89',\n  'ox': '\\ud83d\\udc02',\n  'oyster': '\\ud83e\\uddaa',\n  'package': '\\ud83d\\udce6',\n  'page_facing_up': '\\ud83d\\udcc4',\n  'page_with_curl': '\\ud83d\\udcc3',\n  'pager': '\\ud83d\\udcdf',\n  'paintbrush': '\\ud83d\\udd8c\\ufe0f',\n  'pakistan': '\\ud83c\\uddf5\\ud83c\\uddf0',\n  'palau': '\\ud83c\\uddf5\\ud83c\\uddfc',\n  'palestinian_territories': '\\ud83c\\uddf5\\ud83c\\uddf8',\n  'palm_tree': '\\ud83c\\udf34',\n  'palms_up_together': '\\ud83e\\udd32',\n  'panama': '\\ud83c\\uddf5\\ud83c\\udde6',\n  'pancakes': '\\ud83e\\udd5e',\n  'panda_face': '\\ud83d\\udc3c',\n  'paperclip': '\\ud83d\\udcce',\n  'paperclips': '\\ud83d\\udd87\\ufe0f',\n  'papua_new_guinea': '\\ud83c\\uddf5\\ud83c\\uddec',\n  'parachute': '\\ud83e\\ude82',\n  'paraguay': '\\ud83c\\uddf5\\ud83c\\uddfe',\n  'parasol_on_ground': '\\u26f1\\ufe0f',\n  'parking': '\\ud83c\\udd7f\\ufe0f',\n  'parrot': '\\ud83e\\udd9c',\n  'part_alternation_mark': '\\u303d\\ufe0f',\n  'partly_sunny': '\\u26c5',\n  'partying_face': '\\ud83e\\udd73',\n  'passenger_ship': '\\ud83d\\udef3\\ufe0f',\n  'passport_control': '\\ud83d\\udec2',\n  'pause_button': '\\u23f8\\ufe0f',\n  'paw_prints': '\\ud83d\\udc3e',\n  'peace_symbol': '\\u262e\\ufe0f',\n  'peach': '\\ud83c\\udf51',\n  'peacock': '\\ud83e\\udd9a',\n  'peanuts': '\\ud83e\\udd5c',\n  'pear': '\\ud83c\\udf50',\n  'pen': '\\ud83d\\udd8a\\ufe0f',\n  'pencil': '\\ud83d\\udcdd',\n  'pencil2': '\\u270f\\ufe0f',\n  'penguin': '\\ud83d\\udc27',\n  'pensive': '\\ud83d\\ude14',\n  'people_holding_hands': '\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1',\n  'performing_arts': '\\ud83c\\udfad',\n  'persevere': '\\ud83d\\ude23',\n  'person_bald': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb2',\n  'person_curly_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb1',\n  'person_fencing': '\\ud83e\\udd3a',\n  'person_in_manual_wheelchair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddbd',\n  'person_in_motorized_wheelchair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddbc',\n  'person_red_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb0',\n  'person_white_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb3',\n  'person_with_probing_cane': '\\ud83e\\uddd1\\u200d\\ud83e\\uddaf',\n  'person_with_turban': '\\ud83d\\udc73',\n  'peru': '\\ud83c\\uddf5\\ud83c\\uddea',\n  'petri_dish': '\\ud83e\\uddeb',\n  'philippines': '\\ud83c\\uddf5\\ud83c\\udded',\n  'phone': '\\u260e\\ufe0f',\n  'pick': '\\u26cf\\ufe0f',\n  'pie': '\\ud83e\\udd67',\n  'pig': '\\ud83d\\udc37',\n  'pig2': '\\ud83d\\udc16',\n  'pig_nose': '\\ud83d\\udc3d',\n  'pill': '\\ud83d\\udc8a',\n  'pilot': '\\ud83e\\uddd1\\u200d\\u2708\\ufe0f',\n  'pinching_hand': '\\ud83e\\udd0f',\n  'pineapple': '\\ud83c\\udf4d',\n  'ping_pong': '\\ud83c\\udfd3',\n  'pirate_flag': '\\ud83c\\udff4\\u200d\\u2620\\ufe0f',\n  'pisces': '\\u2653',\n  'pitcairn_islands': '\\ud83c\\uddf5\\ud83c\\uddf3',\n  'pizza': '\\ud83c\\udf55',\n  'place_of_worship': '\\ud83d\\uded0',\n  'plate_with_cutlery': '\\ud83c\\udf7d\\ufe0f',\n  'play_or_pause_button': '\\u23ef\\ufe0f',\n  'pleading_face': '\\ud83e\\udd7a',\n  'point_down': '\\ud83d\\udc47',\n  'point_left': '\\ud83d\\udc48',\n  'point_right': '\\ud83d\\udc49',\n  'point_up': '\\u261d\\ufe0f',\n  'point_up_2': '\\ud83d\\udc46',\n  'poland': '\\ud83c\\uddf5\\ud83c\\uddf1',\n  'police_car': '\\ud83d\\ude93',\n  'police_officer': '\\ud83d\\udc6e',\n  'policeman': '\\ud83d\\udc6e\\u200d\\u2642\\ufe0f',\n  'policewoman': '\\ud83d\\udc6e\\u200d\\u2640\\ufe0f',\n  'poodle': '\\ud83d\\udc29',\n  'poop': '\\ud83d\\udca9',\n  'popcorn': '\\ud83c\\udf7f',\n  'portugal': '\\ud83c\\uddf5\\ud83c\\uddf9',\n  'post_office': '\\ud83c\\udfe3',\n  'postal_horn': '\\ud83d\\udcef',\n  'postbox': '\\ud83d\\udcee',\n  'potable_water': '\\ud83d\\udeb0',\n  'potato': '\\ud83e\\udd54',\n  'pouch': '\\ud83d\\udc5d',\n  'poultry_leg': '\\ud83c\\udf57',\n  'pound': '\\ud83d\\udcb7',\n  'pout': '\\ud83d\\ude21',\n  'pouting_cat': '\\ud83d\\ude3e',\n  'pouting_face': '\\ud83d\\ude4e',\n  'pouting_man': '\\ud83d\\ude4e\\u200d\\u2642\\ufe0f',\n  'pouting_woman': '\\ud83d\\ude4e\\u200d\\u2640\\ufe0f',\n  'pray': '\\ud83d\\ude4f',\n  'prayer_beads': '\\ud83d\\udcff',\n  'pregnant_woman': '\\ud83e\\udd30',\n  'pretzel': '\\ud83e\\udd68',\n  'previous_track_button': '\\u23ee\\ufe0f',\n  'prince': '\\ud83e\\udd34',\n  'princess': '\\ud83d\\udc78',\n  'printer': '\\ud83d\\udda8\\ufe0f',\n  'probing_cane': '\\ud83e\\uddaf',\n  'puerto_rico': '\\ud83c\\uddf5\\ud83c\\uddf7',\n  'punch': '\\ud83d\\udc4a',\n  'purple_circle': '\\ud83d\\udfe3',\n  'purple_heart': '\\ud83d\\udc9c',\n  'purple_square': '\\ud83d\\udfea',\n  'purse': '\\ud83d\\udc5b',\n  'pushpin': '\\ud83d\\udccc',\n  'put_litter_in_its_place': '\\ud83d\\udeae',\n  'qatar': '\\ud83c\\uddf6\\ud83c\\udde6',\n  'question': '\\u2753',\n  'rabbit': '\\ud83d\\udc30',\n  'rabbit2': '\\ud83d\\udc07',\n  'raccoon': '\\ud83e\\udd9d',\n  'racehorse': '\\ud83d\\udc0e',\n  'racing_car': '\\ud83c\\udfce\\ufe0f',\n  'radio': '\\ud83d\\udcfb',\n  'radio_button': '\\ud83d\\udd18',\n  'radioactive': '\\u2622\\ufe0f',\n  'rage': '\\ud83d\\ude21',\n  'railway_car': '\\ud83d\\ude83',\n  'railway_track': '\\ud83d\\udee4\\ufe0f',\n  'rainbow': '\\ud83c\\udf08',\n  'rainbow_flag': '\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08',\n  'raised_back_of_hand': '\\ud83e\\udd1a',\n  'raised_eyebrow': '\\ud83e\\udd28',\n  'raised_hand': '\\u270b',\n  'raised_hand_with_fingers_splayed': '\\ud83d\\udd90\\ufe0f',\n  'raised_hands': '\\ud83d\\ude4c',\n  'raising_hand': '\\ud83d\\ude4b',\n  'raising_hand_man': '\\ud83d\\ude4b\\u200d\\u2642\\ufe0f',\n  'raising_hand_woman': '\\ud83d\\ude4b\\u200d\\u2640\\ufe0f',\n  'ram': '\\ud83d\\udc0f',\n  'ramen': '\\ud83c\\udf5c',\n  'rat': '\\ud83d\\udc00',\n  'razor': '\\ud83e\\ude92',\n  'receipt': '\\ud83e\\uddfe',\n  'record_button': '\\u23fa\\ufe0f',\n  'recycle': '\\u267b\\ufe0f',\n  'red_car': '\\ud83d\\ude97',\n  'red_circle': '\\ud83d\\udd34',\n  'red_envelope': '\\ud83e\\udde7',\n  'red_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb0',\n  'red_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb0',\n  'red_square': '\\ud83d\\udfe5',\n  'registered': '\\u00ae\\ufe0f',\n  'relaxed': '\\u263a\\ufe0f',\n  'relieved': '\\ud83d\\ude0c',\n  'reminder_ribbon': '\\ud83c\\udf97\\ufe0f',\n  'repeat': '\\ud83d\\udd01',\n  'repeat_one': '\\ud83d\\udd02',\n  'rescue_worker_helmet': '\\u26d1\\ufe0f',\n  'restroom': '\\ud83d\\udebb',\n  'reunion': '\\ud83c\\uddf7\\ud83c\\uddea',\n  'revolving_hearts': '\\ud83d\\udc9e',\n  'rewind': '\\u23ea',\n  'rhinoceros': '\\ud83e\\udd8f',\n  'ribbon': '\\ud83c\\udf80',\n  'rice': '\\ud83c\\udf5a',\n  'rice_ball': '\\ud83c\\udf59',\n  'rice_cracker': '\\ud83c\\udf58',\n  'rice_scene': '\\ud83c\\udf91',\n  'right_anger_bubble': '\\ud83d\\uddef\\ufe0f',\n  'ring': '\\ud83d\\udc8d',\n  'ringed_planet': '\\ud83e\\ude90',\n  'robot': '\\ud83e\\udd16',\n  'rocket': '\\ud83d\\ude80',\n  'rofl': '\\ud83e\\udd23',\n  'roll_eyes': '\\ud83d\\ude44',\n  'roll_of_paper': '\\ud83e\\uddfb',\n  'roller_coaster': '\\ud83c\\udfa2',\n  'romania': '\\ud83c\\uddf7\\ud83c\\uddf4',\n  'rooster': '\\ud83d\\udc13',\n  'rose': '\\ud83c\\udf39',\n  'rosette': '\\ud83c\\udff5\\ufe0f',\n  'rotating_light': '\\ud83d\\udea8',\n  'round_pushpin': '\\ud83d\\udccd',\n  'rowboat': '\\ud83d\\udea3',\n  'rowing_man': '\\ud83d\\udea3\\u200d\\u2642\\ufe0f',\n  'rowing_woman': '\\ud83d\\udea3\\u200d\\u2640\\ufe0f',\n  'ru': '\\ud83c\\uddf7\\ud83c\\uddfa',\n  'rugby_football': '\\ud83c\\udfc9',\n  'runner': '\\ud83c\\udfc3',\n  'running': '\\ud83c\\udfc3',\n  'running_man': '\\ud83c\\udfc3\\u200d\\u2642\\ufe0f',\n  'running_shirt_with_sash': '\\ud83c\\udfbd',\n  'running_woman': '\\ud83c\\udfc3\\u200d\\u2640\\ufe0f',\n  'rwanda': '\\ud83c\\uddf7\\ud83c\\uddfc',\n  'sa': '\\ud83c\\ude02\\ufe0f',\n  'safety_pin': '\\ud83e\\uddf7',\n  'safety_vest': '\\ud83e\\uddba',\n  'sagittarius': '\\u2650',\n  'sailboat': '\\u26f5',\n  'sake': '\\ud83c\\udf76',\n  'salt': '\\ud83e\\uddc2',\n  'samoa': '\\ud83c\\uddfc\\ud83c\\uddf8',\n  'san_marino': '\\ud83c\\uddf8\\ud83c\\uddf2',\n  'sandal': '\\ud83d\\udc61',\n  'sandwich': '\\ud83e\\udd6a',\n  'santa': '\\ud83c\\udf85',\n  'sao_tome_principe': '\\ud83c\\uddf8\\ud83c\\uddf9',\n  'sari': '\\ud83e\\udd7b',\n  'sassy_man': '\\ud83d\\udc81\\u200d\\u2642\\ufe0f',\n  'sassy_woman': '\\ud83d\\udc81\\u200d\\u2640\\ufe0f',\n  'satellite': '\\ud83d\\udce1',\n  'satisfied': '\\ud83d\\ude06',\n  'saudi_arabia': '\\ud83c\\uddf8\\ud83c\\udde6',\n  'sauna_man': '\\ud83e\\uddd6\\u200d\\u2642\\ufe0f',\n  'sauna_person': '\\ud83e\\uddd6',\n  'sauna_woman': '\\ud83e\\uddd6\\u200d\\u2640\\ufe0f',\n  'sauropod': '\\ud83e\\udd95',\n  'saxophone': '\\ud83c\\udfb7',\n  'scarf': '\\ud83e\\udde3',\n  'school': '\\ud83c\\udfeb',\n  'school_satchel': '\\ud83c\\udf92',\n  'scientist': '\\ud83e\\uddd1\\u200d\\ud83d\\udd2c',\n  'scissors': '\\u2702\\ufe0f',\n  'scorpion': '\\ud83e\\udd82',\n  'scorpius': '\\u264f',\n  'scotland': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f',\n  'scream': '\\ud83d\\ude31',\n  'scream_cat': '\\ud83d\\ude40',\n  'scroll': '\\ud83d\\udcdc',\n  'seat': '\\ud83d\\udcba',\n  'secret': '\\u3299\\ufe0f',\n  'see_no_evil': '\\ud83d\\ude48',\n  'seedling': '\\ud83c\\udf31',\n  'selfie': '\\ud83e\\udd33',\n  'senegal': '\\ud83c\\uddf8\\ud83c\\uddf3',\n  'serbia': '\\ud83c\\uddf7\\ud83c\\uddf8',\n  'service_dog': '\\ud83d\\udc15\\u200d\\ud83e\\uddba',\n  'seven': '7\\ufe0f\\u20e3',\n  'seychelles': '\\ud83c\\uddf8\\ud83c\\udde8',\n  'shallow_pan_of_food': '\\ud83e\\udd58',\n  'shamrock': '\\u2618\\ufe0f',\n  'shark': '\\ud83e\\udd88',\n  'shaved_ice': '\\ud83c\\udf67',\n  'sheep': '\\ud83d\\udc11',\n  'shell': '\\ud83d\\udc1a',\n  'shield': '\\ud83d\\udee1\\ufe0f',\n  'shinto_shrine': '\\u26e9\\ufe0f',\n  'ship': '\\ud83d\\udea2',\n  'shirt': '\\ud83d\\udc55',\n  'shit': '\\ud83d\\udca9',\n  'shoe': '\\ud83d\\udc5e',\n  'shopping': '\\ud83d\\udecd\\ufe0f',\n  'shopping_cart': '\\ud83d\\uded2',\n  'shorts': '\\ud83e\\ude73',\n  'shower': '\\ud83d\\udebf',\n  'shrimp': '\\ud83e\\udd90',\n  'shrug': '\\ud83e\\udd37',\n  'shushing_face': '\\ud83e\\udd2b',\n  'sierra_leone': '\\ud83c\\uddf8\\ud83c\\uddf1',\n  'signal_strength': '\\ud83d\\udcf6',\n  'singapore': '\\ud83c\\uddf8\\ud83c\\uddec',\n  'singer': '\\ud83e\\uddd1\\u200d\\ud83c\\udfa4',\n  'sint_maarten': '\\ud83c\\uddf8\\ud83c\\uddfd',\n  'six': '6\\ufe0f\\u20e3',\n  'six_pointed_star': '\\ud83d\\udd2f',\n  'skateboard': '\\ud83d\\udef9',\n  'ski': '\\ud83c\\udfbf',\n  'skier': '\\u26f7\\ufe0f',\n  'skull': '\\ud83d\\udc80',\n  'skull_and_crossbones': '\\u2620\\ufe0f',\n  'skunk': '\\ud83e\\udda8',\n  'sled': '\\ud83d\\udef7',\n  'sleeping': '\\ud83d\\ude34',\n  'sleeping_bed': '\\ud83d\\udecc',\n  'sleepy': '\\ud83d\\ude2a',\n  'slightly_frowning_face': '\\ud83d\\ude41',\n  'slightly_smiling_face': '\\ud83d\\ude42',\n  'slot_machine': '\\ud83c\\udfb0',\n  'sloth': '\\ud83e\\udda5',\n  'slovakia': '\\ud83c\\uddf8\\ud83c\\uddf0',\n  'slovenia': '\\ud83c\\uddf8\\ud83c\\uddee',\n  'small_airplane': '\\ud83d\\udee9\\ufe0f',\n  'small_blue_diamond': '\\ud83d\\udd39',\n  'small_orange_diamond': '\\ud83d\\udd38',\n  'small_red_triangle': '\\ud83d\\udd3a',\n  'small_red_triangle_down': '\\ud83d\\udd3b',\n  'smile': '\\ud83d\\ude04',\n  'smile_cat': '\\ud83d\\ude38',\n  'smiley': '\\ud83d\\ude03',\n  'smiley_cat': '\\ud83d\\ude3a',\n  'smiling_face_with_three_hearts': '\\ud83e\\udd70',\n  'smiling_imp': '\\ud83d\\ude08',\n  'smirk': '\\ud83d\\ude0f',\n  'smirk_cat': '\\ud83d\\ude3c',\n  'smoking': '\\ud83d\\udeac',\n  'snail': '\\ud83d\\udc0c',\n  'snake': '\\ud83d\\udc0d',\n  'sneezing_face': '\\ud83e\\udd27',\n  'snowboarder': '\\ud83c\\udfc2',\n  'snowflake': '\\u2744\\ufe0f',\n  'snowman': '\\u26c4',\n  'snowman_with_snow': '\\u2603\\ufe0f',\n  'soap': '\\ud83e\\uddfc',\n  'sob': '\\ud83d\\ude2d',\n  'soccer': '\\u26bd',\n  'socks': '\\ud83e\\udde6',\n  'softball': '\\ud83e\\udd4e',\n  'solomon_islands': '\\ud83c\\uddf8\\ud83c\\udde7',\n  'somalia': '\\ud83c\\uddf8\\ud83c\\uddf4',\n  'soon': '\\ud83d\\udd1c',\n  'sos': '\\ud83c\\udd98',\n  'sound': '\\ud83d\\udd09',\n  'south_africa': '\\ud83c\\uddff\\ud83c\\udde6',\n  'south_georgia_south_sandwich_islands': '\\ud83c\\uddec\\ud83c\\uddf8',\n  'south_sudan': '\\ud83c\\uddf8\\ud83c\\uddf8',\n  'space_invader': '\\ud83d\\udc7e',\n  'spades': '\\u2660\\ufe0f',\n  'spaghetti': '\\ud83c\\udf5d',\n  'sparkle': '\\u2747\\ufe0f',\n  'sparkler': '\\ud83c\\udf87',\n  'sparkles': '\\u2728',\n  'sparkling_heart': '\\ud83d\\udc96',\n  'speak_no_evil': '\\ud83d\\ude4a',\n  'speaker': '\\ud83d\\udd08',\n  'speaking_head': '\\ud83d\\udde3\\ufe0f',\n  'speech_balloon': '\\ud83d\\udcac',\n  'speedboat': '\\ud83d\\udea4',\n  'spider': '\\ud83d\\udd77\\ufe0f',\n  'spider_web': '\\ud83d\\udd78\\ufe0f',\n  'spiral_calendar': '\\ud83d\\uddd3\\ufe0f',\n  'spiral_notepad': '\\ud83d\\uddd2\\ufe0f',\n  'sponge': '\\ud83e\\uddfd',\n  'spoon': '\\ud83e\\udd44',\n  'squid': '\\ud83e\\udd91',\n  'sri_lanka': '\\ud83c\\uddf1\\ud83c\\uddf0',\n  'st_barthelemy': '\\ud83c\\udde7\\ud83c\\uddf1',\n  'st_helena': '\\ud83c\\uddf8\\ud83c\\udded',\n  'st_kitts_nevis': '\\ud83c\\uddf0\\ud83c\\uddf3',\n  'st_lucia': '\\ud83c\\uddf1\\ud83c\\udde8',\n  'st_martin': '\\ud83c\\uddf2\\ud83c\\uddeb',\n  'st_pierre_miquelon': '\\ud83c\\uddf5\\ud83c\\uddf2',\n  'st_vincent_grenadines': '\\ud83c\\uddfb\\ud83c\\udde8',\n  'stadium': '\\ud83c\\udfdf\\ufe0f',\n  'standing_man': '\\ud83e\\uddcd\\u200d\\u2642\\ufe0f',\n  'standing_person': '\\ud83e\\uddcd',\n  'standing_woman': '\\ud83e\\uddcd\\u200d\\u2640\\ufe0f',\n  'star': '\\u2b50',\n  'star2': '\\ud83c\\udf1f',\n  'star_and_crescent': '\\u262a\\ufe0f',\n  'star_of_david': '\\u2721\\ufe0f',\n  'star_struck': '\\ud83e\\udd29',\n  'stars': '\\ud83c\\udf20',\n  'station': '\\ud83d\\ude89',\n  'statue_of_liberty': '\\ud83d\\uddfd',\n  'steam_locomotive': '\\ud83d\\ude82',\n  'stethoscope': '\\ud83e\\ude7a',\n  'stew': '\\ud83c\\udf72',\n  'stop_button': '\\u23f9\\ufe0f',\n  'stop_sign': '\\ud83d\\uded1',\n  'stopwatch': '\\u23f1\\ufe0f',\n  'straight_ruler': '\\ud83d\\udccf',\n  'strawberry': '\\ud83c\\udf53',\n  'stuck_out_tongue': '\\ud83d\\ude1b',\n  'stuck_out_tongue_closed_eyes': '\\ud83d\\ude1d',\n  'stuck_out_tongue_winking_eye': '\\ud83d\\ude1c',\n  'student': '\\ud83e\\uddd1\\u200d\\ud83c\\udf93',\n  'studio_microphone': '\\ud83c\\udf99\\ufe0f',\n  'stuffed_flatbread': '\\ud83e\\udd59',\n  'sudan': '\\ud83c\\uddf8\\ud83c\\udde9',\n  'sun_behind_large_cloud': '\\ud83c\\udf25\\ufe0f',\n  'sun_behind_rain_cloud': '\\ud83c\\udf26\\ufe0f',\n  'sun_behind_small_cloud': '\\ud83c\\udf24\\ufe0f',\n  'sun_with_face': '\\ud83c\\udf1e',\n  'sunflower': '\\ud83c\\udf3b',\n  'sunglasses': '\\ud83d\\ude0e',\n  'sunny': '\\u2600\\ufe0f',\n  'sunrise': '\\ud83c\\udf05',\n  'sunrise_over_mountains': '\\ud83c\\udf04',\n  'superhero': '\\ud83e\\uddb8',\n  'superhero_man': '\\ud83e\\uddb8\\u200d\\u2642\\ufe0f',\n  'superhero_woman': '\\ud83e\\uddb8\\u200d\\u2640\\ufe0f',\n  'supervillain': '\\ud83e\\uddb9',\n  'supervillain_man': '\\ud83e\\uddb9\\u200d\\u2642\\ufe0f',\n  'supervillain_woman': '\\ud83e\\uddb9\\u200d\\u2640\\ufe0f',\n  'surfer': '\\ud83c\\udfc4',\n  'surfing_man': '\\ud83c\\udfc4\\u200d\\u2642\\ufe0f',\n  'surfing_woman': '\\ud83c\\udfc4\\u200d\\u2640\\ufe0f',\n  'suriname': '\\ud83c\\uddf8\\ud83c\\uddf7',\n  'sushi': '\\ud83c\\udf63',\n  'suspension_railway': '\\ud83d\\ude9f',\n  'svalbard_jan_mayen': '\\ud83c\\uddf8\\ud83c\\uddef',\n  'swan': '\\ud83e\\udda2',\n  'swaziland': '\\ud83c\\uddf8\\ud83c\\uddff',\n  'sweat': '\\ud83d\\ude13',\n  'sweat_drops': '\\ud83d\\udca6',\n  'sweat_smile': '\\ud83d\\ude05',\n  'sweden': '\\ud83c\\uddf8\\ud83c\\uddea',\n  'sweet_potato': '\\ud83c\\udf60',\n  'swim_brief': '\\ud83e\\ude72',\n  'swimmer': '\\ud83c\\udfca',\n  'swimming_man': '\\ud83c\\udfca\\u200d\\u2642\\ufe0f',\n  'swimming_woman': '\\ud83c\\udfca\\u200d\\u2640\\ufe0f',\n  'switzerland': '\\ud83c\\udde8\\ud83c\\udded',\n  'symbols': '\\ud83d\\udd23',\n  'synagogue': '\\ud83d\\udd4d',\n  'syria': '\\ud83c\\uddf8\\ud83c\\uddfe',\n  'syringe': '\\ud83d\\udc89',\n  't-rex': '\\ud83e\\udd96',\n  'taco': '\\ud83c\\udf2e',\n  'tada': '\\ud83c\\udf89',\n  'taiwan': '\\ud83c\\uddf9\\ud83c\\uddfc',\n  'tajikistan': '\\ud83c\\uddf9\\ud83c\\uddef',\n  'takeout_box': '\\ud83e\\udd61',\n  'tanabata_tree': '\\ud83c\\udf8b',\n  'tangerine': '\\ud83c\\udf4a',\n  'tanzania': '\\ud83c\\uddf9\\ud83c\\uddff',\n  'taurus': '\\u2649',\n  'taxi': '\\ud83d\\ude95',\n  'tea': '\\ud83c\\udf75',\n  'teacher': '\\ud83e\\uddd1\\u200d\\ud83c\\udfeb',\n  'technologist': '\\ud83e\\uddd1\\u200d\\ud83d\\udcbb',\n  'teddy_bear': '\\ud83e\\uddf8',\n  'telephone': '\\u260e\\ufe0f',\n  'telephone_receiver': '\\ud83d\\udcde',\n  'telescope': '\\ud83d\\udd2d',\n  'tennis': '\\ud83c\\udfbe',\n  'tent': '\\u26fa',\n  'test_tube': '\\ud83e\\uddea',\n  'thailand': '\\ud83c\\uddf9\\ud83c\\udded',\n  'thermometer': '\\ud83c\\udf21\\ufe0f',\n  'thinking': '\\ud83e\\udd14',\n  'thought_balloon': '\\ud83d\\udcad',\n  'thread': '\\ud83e\\uddf5',\n  'three': '3\\ufe0f\\u20e3',\n  'thumbsdown': '\\ud83d\\udc4e',\n  'thumbsup': '\\ud83d\\udc4d',\n  'ticket': '\\ud83c\\udfab',\n  'tickets': '\\ud83c\\udf9f\\ufe0f',\n  'tiger': '\\ud83d\\udc2f',\n  'tiger2': '\\ud83d\\udc05',\n  'timer_clock': '\\u23f2\\ufe0f',\n  'timor_leste': '\\ud83c\\uddf9\\ud83c\\uddf1',\n  'tipping_hand_man': '\\ud83d\\udc81\\u200d\\u2642\\ufe0f',\n  'tipping_hand_person': '\\ud83d\\udc81',\n  'tipping_hand_woman': '\\ud83d\\udc81\\u200d\\u2640\\ufe0f',\n  'tired_face': '\\ud83d\\ude2b',\n  'tm': '\\u2122\\ufe0f',\n  'togo': '\\ud83c\\uddf9\\ud83c\\uddec',\n  'toilet': '\\ud83d\\udebd',\n  'tokelau': '\\ud83c\\uddf9\\ud83c\\uddf0',\n  'tokyo_tower': '\\ud83d\\uddfc',\n  'tomato': '\\ud83c\\udf45',\n  'tonga': '\\ud83c\\uddf9\\ud83c\\uddf4',\n  'tongue': '\\ud83d\\udc45',\n  'toolbox': '\\ud83e\\uddf0',\n  'tooth': '\\ud83e\\uddb7',\n  'top': '\\ud83d\\udd1d',\n  'tophat': '\\ud83c\\udfa9',\n  'tornado': '\\ud83c\\udf2a\\ufe0f',\n  'tr': '\\ud83c\\uddf9\\ud83c\\uddf7',\n  'trackball': '\\ud83d\\uddb2\\ufe0f',\n  'tractor': '\\ud83d\\ude9c',\n  'traffic_light': '\\ud83d\\udea5',\n  'train': '\\ud83d\\ude8b',\n  'train2': '\\ud83d\\ude86',\n  'tram': '\\ud83d\\ude8a',\n  'triangular_flag_on_post': '\\ud83d\\udea9',\n  'triangular_ruler': '\\ud83d\\udcd0',\n  'trident': '\\ud83d\\udd31',\n  'trinidad_tobago': '\\ud83c\\uddf9\\ud83c\\uddf9',\n  'tristan_da_cunha': '\\ud83c\\uddf9\\ud83c\\udde6',\n  'triumph': '\\ud83d\\ude24',\n  'trolleybus': '\\ud83d\\ude8e',\n  'trophy': '\\ud83c\\udfc6',\n  'tropical_drink': '\\ud83c\\udf79',\n  'tropical_fish': '\\ud83d\\udc20',\n  'truck': '\\ud83d\\ude9a',\n  'trumpet': '\\ud83c\\udfba',\n  'tshirt': '\\ud83d\\udc55',\n  'tulip': '\\ud83c\\udf37',\n  'tumbler_glass': '\\ud83e\\udd43',\n  'tunisia': '\\ud83c\\uddf9\\ud83c\\uddf3',\n  'turkey': '\\ud83e\\udd83',\n  'turkmenistan': '\\ud83c\\uddf9\\ud83c\\uddf2',\n  'turks_caicos_islands': '\\ud83c\\uddf9\\ud83c\\udde8',\n  'turtle': '\\ud83d\\udc22',\n  'tuvalu': '\\ud83c\\uddf9\\ud83c\\uddfb',\n  'tv': '\\ud83d\\udcfa',\n  'twisted_rightwards_arrows': '\\ud83d\\udd00',\n  'two': '2\\ufe0f\\u20e3',\n  'two_hearts': '\\ud83d\\udc95',\n  'two_men_holding_hands': '\\ud83d\\udc6c',\n  'two_women_holding_hands': '\\ud83d\\udc6d',\n  'u5272': '\\ud83c\\ude39',\n  'u5408': '\\ud83c\\ude34',\n  'u55b6': '\\ud83c\\ude3a',\n  'u6307': '\\ud83c\\ude2f',\n  'u6708': '\\ud83c\\ude37\\ufe0f',\n  'u6709': '\\ud83c\\ude36',\n  'u6e80': '\\ud83c\\ude35',\n  'u7121': '\\ud83c\\ude1a',\n  'u7533': '\\ud83c\\ude38',\n  'u7981': '\\ud83c\\ude32',\n  'u7a7a': '\\ud83c\\ude33',\n  'uganda': '\\ud83c\\uddfa\\ud83c\\uddec',\n  'uk': '\\ud83c\\uddec\\ud83c\\udde7',\n  'ukraine': '\\ud83c\\uddfa\\ud83c\\udde6',\n  'umbrella': '\\u2614',\n  'unamused': '\\ud83d\\ude12',\n  'underage': '\\ud83d\\udd1e',\n  'unicorn': '\\ud83e\\udd84',\n  'united_arab_emirates': '\\ud83c\\udde6\\ud83c\\uddea',\n  'united_nations': '\\ud83c\\uddfa\\ud83c\\uddf3',\n  'unlock': '\\ud83d\\udd13',\n  'up': '\\ud83c\\udd99',\n  'upside_down_face': '\\ud83d\\ude43',\n  'uruguay': '\\ud83c\\uddfa\\ud83c\\uddfe',\n  'us': '\\ud83c\\uddfa\\ud83c\\uddf8',\n  'us_outlying_islands': '\\ud83c\\uddfa\\ud83c\\uddf2',\n  'us_virgin_islands': '\\ud83c\\uddfb\\ud83c\\uddee',\n  'uzbekistan': '\\ud83c\\uddfa\\ud83c\\uddff',\n  'v': '\\u270c\\ufe0f',\n  'vampire': '\\ud83e\\udddb',\n  'vampire_man': '\\ud83e\\udddb\\u200d\\u2642\\ufe0f',\n  'vampire_woman': '\\ud83e\\udddb\\u200d\\u2640\\ufe0f',\n  'vanuatu': '\\ud83c\\uddfb\\ud83c\\uddfa',\n  'vatican_city': '\\ud83c\\uddfb\\ud83c\\udde6',\n  'venezuela': '\\ud83c\\uddfb\\ud83c\\uddea',\n  'vertical_traffic_light': '\\ud83d\\udea6',\n  'vhs': '\\ud83d\\udcfc',\n  'vibration_mode': '\\ud83d\\udcf3',\n  'video_camera': '\\ud83d\\udcf9',\n  'video_game': '\\ud83c\\udfae',\n  'vietnam': '\\ud83c\\uddfb\\ud83c\\uddf3',\n  'violin': '\\ud83c\\udfbb',\n  'virgo': '\\u264d',\n  'volcano': '\\ud83c\\udf0b',\n  'volleyball': '\\ud83c\\udfd0',\n  'vomiting_face': '\\ud83e\\udd2e',\n  'vs': '\\ud83c\\udd9a',\n  'vulcan_salute': '\\ud83d\\udd96',\n  'waffle': '\\ud83e\\uddc7',\n  'wales': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f',\n  'walking': '\\ud83d\\udeb6',\n  'walking_man': '\\ud83d\\udeb6\\u200d\\u2642\\ufe0f',\n  'walking_woman': '\\ud83d\\udeb6\\u200d\\u2640\\ufe0f',\n  'wallis_futuna': '\\ud83c\\uddfc\\ud83c\\uddeb',\n  'waning_crescent_moon': '\\ud83c\\udf18',\n  'waning_gibbous_moon': '\\ud83c\\udf16',\n  'warning': '\\u26a0\\ufe0f',\n  'wastebasket': '\\ud83d\\uddd1\\ufe0f',\n  'watch': '\\u231a',\n  'water_buffalo': '\\ud83d\\udc03',\n  'water_polo': '\\ud83e\\udd3d',\n  'watermelon': '\\ud83c\\udf49',\n  'wave': '\\ud83d\\udc4b',\n  'wavy_dash': '\\u3030\\ufe0f',\n  'waxing_crescent_moon': '\\ud83c\\udf12',\n  'waxing_gibbous_moon': '\\ud83c\\udf14',\n  'wc': '\\ud83d\\udebe',\n  'weary': '\\ud83d\\ude29',\n  'wedding': '\\ud83d\\udc92',\n  'weight_lifting': '\\ud83c\\udfcb\\ufe0f',\n  'weight_lifting_man': '\\ud83c\\udfcb\\ufe0f\\u200d\\u2642\\ufe0f',\n  'weight_lifting_woman': '\\ud83c\\udfcb\\ufe0f\\u200d\\u2640\\ufe0f',\n  'western_sahara': '\\ud83c\\uddea\\ud83c\\udded',\n  'whale': '\\ud83d\\udc33',\n  'whale2': '\\ud83d\\udc0b',\n  'wheel_of_dharma': '\\u2638\\ufe0f',\n  'wheelchair': '\\u267f',\n  'white_check_mark': '\\u2705',\n  'white_circle': '\\u26aa',\n  'white_flag': '\\ud83c\\udff3\\ufe0f',\n  'white_flower': '\\ud83d\\udcae',\n  'white_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb3',\n  'white_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb3',\n  'white_heart': '\\ud83e\\udd0d',\n  'white_large_square': '\\u2b1c',\n  'white_medium_small_square': '\\u25fd',\n  'white_medium_square': '\\u25fb\\ufe0f',\n  'white_small_square': '\\u25ab\\ufe0f',\n  'white_square_button': '\\ud83d\\udd33',\n  'wilted_flower': '\\ud83e\\udd40',\n  'wind_chime': '\\ud83c\\udf90',\n  'wind_face': '\\ud83c\\udf2c\\ufe0f',\n  'wine_glass': '\\ud83c\\udf77',\n  'wink': '\\ud83d\\ude09',\n  'wolf': '\\ud83d\\udc3a',\n  'woman': '\\ud83d\\udc69',\n  'woman_artist': '\\ud83d\\udc69\\u200d\\ud83c\\udfa8',\n  'woman_astronaut': '\\ud83d\\udc69\\u200d\\ud83d\\ude80',\n  'woman_cartwheeling': '\\ud83e\\udd38\\u200d\\u2640\\ufe0f',\n  'woman_cook': '\\ud83d\\udc69\\u200d\\ud83c\\udf73',\n  'woman_dancing': '\\ud83d\\udc83',\n  'woman_facepalming': '\\ud83e\\udd26\\u200d\\u2640\\ufe0f',\n  'woman_factory_worker': '\\ud83d\\udc69\\u200d\\ud83c\\udfed',\n  'woman_farmer': '\\ud83d\\udc69\\u200d\\ud83c\\udf3e',\n  'woman_firefighter': '\\ud83d\\udc69\\u200d\\ud83d\\ude92',\n  'woman_health_worker': '\\ud83d\\udc69\\u200d\\u2695\\ufe0f',\n  'woman_in_manual_wheelchair': '\\ud83d\\udc69\\u200d\\ud83e\\uddbd',\n  'woman_in_motorized_wheelchair': '\\ud83d\\udc69\\u200d\\ud83e\\uddbc',\n  'woman_judge': '\\ud83d\\udc69\\u200d\\u2696\\ufe0f',\n  'woman_juggling': '\\ud83e\\udd39\\u200d\\u2640\\ufe0f',\n  'woman_mechanic': '\\ud83d\\udc69\\u200d\\ud83d\\udd27',\n  'woman_office_worker': '\\ud83d\\udc69\\u200d\\ud83d\\udcbc',\n  'woman_pilot': '\\ud83d\\udc69\\u200d\\u2708\\ufe0f',\n  'woman_playing_handball': '\\ud83e\\udd3e\\u200d\\u2640\\ufe0f',\n  'woman_playing_water_polo': '\\ud83e\\udd3d\\u200d\\u2640\\ufe0f',\n  'woman_scientist': '\\ud83d\\udc69\\u200d\\ud83d\\udd2c',\n  'woman_shrugging': '\\ud83e\\udd37\\u200d\\u2640\\ufe0f',\n  'woman_singer': '\\ud83d\\udc69\\u200d\\ud83c\\udfa4',\n  'woman_student': '\\ud83d\\udc69\\u200d\\ud83c\\udf93',\n  'woman_teacher': '\\ud83d\\udc69\\u200d\\ud83c\\udfeb',\n  'woman_technologist': '\\ud83d\\udc69\\u200d\\ud83d\\udcbb',\n  'woman_with_headscarf': '\\ud83e\\uddd5',\n  'woman_with_probing_cane': '\\ud83d\\udc69\\u200d\\ud83e\\uddaf',\n  'woman_with_turban': '\\ud83d\\udc73\\u200d\\u2640\\ufe0f',\n  'womans_clothes': '\\ud83d\\udc5a',\n  'womans_hat': '\\ud83d\\udc52',\n  'women_wrestling': '\\ud83e\\udd3c\\u200d\\u2640\\ufe0f',\n  'womens': '\\ud83d\\udeba',\n  'woozy_face': '\\ud83e\\udd74',\n  'world_map': '\\ud83d\\uddfa\\ufe0f',\n  'worried': '\\ud83d\\ude1f',\n  'wrench': '\\ud83d\\udd27',\n  'wrestling': '\\ud83e\\udd3c',\n  'writing_hand': '\\u270d\\ufe0f',\n  'x': '\\u274c',\n  'yarn': '\\ud83e\\uddf6',\n  'yawning_face': '\\ud83e\\udd71',\n  'yellow_circle': '\\ud83d\\udfe1',\n  'yellow_heart': '\\ud83d\\udc9b',\n  'yellow_square': '\\ud83d\\udfe8',\n  'yemen': '\\ud83c\\uddfe\\ud83c\\uddea',\n  'yen': '\\ud83d\\udcb4',\n  'yin_yang': '\\u262f\\ufe0f',\n  'yo_yo': '\\ud83e\\ude80',\n  'yum': '\\ud83d\\ude0b',\n  'zambia': '\\ud83c\\uddff\\ud83c\\uddf2',\n  'zany_face': '\\ud83e\\udd2a',\n  'zap': '\\u26a1',\n  'zebra': '\\ud83e\\udd93',\n  'zero': '0\\ufe0f\\u20e3',\n  'zimbabwe': '\\ud83c\\uddff\\ud83c\\uddfc',\n  'zipper_mouth_face': '\\ud83e\\udd10',\n  'zombie': '\\ud83e\\udddf',\n  'zombie_man': '\\ud83e\\udddf\\u200d\\u2642\\ufe0f',\n  'zombie_woman': '\\ud83e\\udddf\\u200d\\u2640\\ufe0f',\n  'zzz': '\\ud83d\\udca4',\n\n  /* special emojis :P */\n  'atom': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/atom.png?v8\">',\n  'basecamp': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/basecamp.png?v8\">',\n  'basecampy': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/basecampy.png?v8\">',\n  'bowtie': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/bowtie.png?v8\">',\n  'electron': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/electron.png?v8\">',\n  'feelsgood': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/feelsgood.png?v8\">',\n  'finnadie': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/finnadie.png?v8\">',\n  'goberserk': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/goberserk.png?v8\">',\n  'godmode': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/godmode.png?v8\">',\n  'hurtrealbad': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/hurtrealbad.png?v8\">',\n  'neckbeard': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/neckbeard.png?v8\">',\n  'octocat': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/octocat.png?v8\">',\n  'rage1': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage1.png?v8\">',\n  'rage2': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage2.png?v8\">',\n  'rage3': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage3.png?v8\">',\n  'rage4': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage4.png?v8\">',\n  'shipit': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/shipit.png?v8\">',\n  'suspect': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/suspect.png?v8\">',\n  'trollface': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/trollface.png?v8\">',\n  'showdown': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAS1BMVEX///8jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS3b1q3b1q3b1q3b1q3b1q3b1q3b1q3b1q0565CIAAAAGXRSTlMAQHCAYCCw/+DQwPCQUBAwoHCAEP+wwFBgS2fvBgAAAUZJREFUeAHs1cGy7BAUheFFsEDw/k97VTq3T6ge2EmdM+pvrP6Iwd74XV9Kb52xuMU4/uc1YNgZLFOeV8FGdhGrNk5SEgUyPxAEdj4LlMRDyhVAMVEa2M7TBSeVZAFPdqHgzSZJwPKgcLFLAooHDJo4EDCw4gAtBoJA5UFj4Ng5LOGLwVXZuoIlji/jeQHFk7+baHxrCjeUwB9+s88KndvlhcyBN5BSkYNQIVVb4pV+Npm7hhuKDs/uMP5KxT3WzSNNLIuuoDpMmuAVMruMSeDyQBi24DTr43LAY7ILA1QYaWkgfHzFthYYzg67SQsCbB8GhJUEGCtO9n0rSaCLxgJQjS/JSgMTg2eBDEHAJ+H350AsjYNYscrErgI2e/l+mdR967TCX/v6N0EhPECYCP0i+IAoYQOE8BogNhQMEMdrgAQWHaMAAGi5I5euoY9NAAAAAElFTkSuQmCC\">'\n};\n\n/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('makehtml.blockGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.blockGamut.before', text, options, globals).getText();\n\n  // we parse blockquotes first so that we can have headings and hrs\n  // inside blockquotes\n  text = showdown.subParser('makehtml.blockQuotes')(text, options, globals);\n  text = showdown.subParser('makehtml.headers')(text, options, globals);\n\n  // Do Horizontal Rules:\n  text = showdown.subParser('makehtml.horizontalRule')(text, options, globals);\n\n  text = showdown.subParser('makehtml.lists')(text, options, globals);\n  text = showdown.subParser('makehtml.codeBlocks')(text, options, globals);\n  text = showdown.subParser('makehtml.tables')(text, options, globals);\n\n  // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n  // was to escape raw HTML in the original Markdown source. This time,\n  // we're escaping the markup we've just created, so that we don't wrap\n  // <p> tags around block-level tags.\n  text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);\n  text = showdown.subParser('makehtml.paragraphs')(text, options, globals);\n\n  text = globals.converter._dispatch('makehtml.blockGamut.after', text, options, globals).getText();\n\n  return text;\n});\n\nshowdown.subParser('makehtml.blockQuotes', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.blockQuotes.before', text, options, globals).getText();\n\n  // add a couple extra lines after the text and endtext mark\n  text = text + '\\n\\n';\n\n  var rgx = /(^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+/gm;\n\n  if (options.splitAdjacentBlockquotes) {\n    rgx = /^ {0,3}>[\\s\\S]*?(?:\\n\\n)/gm;\n  }\n\n  text = text.replace(rgx, function (bq) {\n    // attacklab: hack around Konqueror 3.5.4 bug:\n    // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n    bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, ''); // trim one level of quoting\n\n    // attacklab: clean up hack\n    bq = bq.replace(/¨0/g, '');\n\n    bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n    bq = showdown.subParser('makehtml.githubCodeBlocks')(bq, options, globals);\n    bq = showdown.subParser('makehtml.blockGamut')(bq, options, globals); // recurse\n\n    bq = bq.replace(/(^|\\n)/g, '$1  ');\n    // These leading spaces screw with <pre> content, so we need to fix that:\n    bq = bq.replace(/(\\s*<pre>[^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '¨0');\n      pre = pre.replace(/¨0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('makehtml.hashBlock')('<blockquote>\\n' + bq + '\\n</blockquote>', options, globals);\n  });\n\n  text = globals.converter._dispatch('makehtml.blockQuotes.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Process Markdown `<pre><code>` blocks.\n */\nshowdown.subParser('makehtml.codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.codeBlocks.before', text, options, globals).getText();\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=¨0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('makehtml.outdent')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '<pre><code>' + codeblock + end + '</code></pre>';\n\n    return showdown.subParser('makehtml.hashBlock')(codeblock, options, globals) + nextChar;\n  });\n\n  // strip sentinel\n  text = text.replace(/¨0/, '');\n\n  text = globals.converter._dispatch('makehtml.codeBlocks.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n *\n *   *  Backtick quotes are used for <code></code> spans.\n *\n *   *  You can use multiple backticks as the delimiters if you want to\n *     include literal backticks in the code span. So, this input:\n *\n *         Just type ``foo `bar` baz`` at the prompt.\n *\n *       Will translate to:\n *\n *         <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\n *\n *    There's no arbitrary limit to the number of backticks you\n *    can use as delimters. If you need three consecutive backticks\n *    in your code, use four for delimiters, etc.\n *\n *  *  You can use spaces to get literal backticks at the edges:\n *\n *         ... type `` `bar` `` ...\n *\n *       Turns to:\n *\n *         ... type <code>`bar`</code> ...\n */\nshowdown.subParser('makehtml.codeSpans', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.codeSpans.before', text, options, globals).getText();\n\n  if (typeof (text) === 'undefined') {\n    text = '';\n  }\n  text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n    function (wholeMatch, m1, m2, m3) {\n      var c = m3;\n      c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n      c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n      c = showdown.subParser('makehtml.encodeCode')(c, options, globals);\n      c = m1 + '<code>' + c + '</code>';\n      c = showdown.subParser('makehtml.hashHTMLSpans')(c, options, globals);\n      return c;\n    }\n  );\n\n  text = globals.converter._dispatch('makehtml.codeSpans.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Create a full HTML document from the processed markdown\n */\nshowdown.subParser('makehtml.completeHTMLDocument', function (text, options, globals) {\n  'use strict';\n\n  if (!options.completeHTMLDocument) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.completeHTMLDocument.before', text, options, globals).getText();\n\n  var doctype = 'html',\n      doctypeParsed = '<!DOCTYPE HTML>\\n',\n      title = '',\n      charset = '<meta charset=\"utf-8\">\\n',\n      lang = '',\n      metadata = '';\n\n  if (typeof globals.metadata.parsed.doctype !== 'undefined') {\n    doctypeParsed = '<!DOCTYPE ' +  globals.metadata.parsed.doctype + '>\\n';\n    doctype = globals.metadata.parsed.doctype.toString().toLowerCase();\n    if (doctype === 'html' || doctype === 'html5') {\n      charset = '<meta charset=\"utf-8\">';\n    }\n  }\n\n  for (var meta in globals.metadata.parsed) {\n    if (globals.metadata.parsed.hasOwnProperty(meta)) {\n      switch (meta.toLowerCase()) {\n        case 'doctype':\n          break;\n\n        case 'title':\n          title = '<title>' +  globals.metadata.parsed.title + '</title>\\n';\n          break;\n\n        case 'charset':\n          if (doctype === 'html' || doctype === 'html5') {\n            charset = '<meta charset=\"' + globals.metadata.parsed.charset + '\">\\n';\n          } else {\n            charset = '<meta name=\"charset\" content=\"' + globals.metadata.parsed.charset + '\">\\n';\n          }\n          break;\n\n        case 'language':\n        case 'lang':\n          lang = ' lang=\"' + globals.metadata.parsed[meta] + '\"';\n          metadata += '<meta name=\"' + meta + '\" content=\"' + globals.metadata.parsed[meta] + '\">\\n';\n          break;\n\n        default:\n          metadata += '<meta name=\"' + meta + '\" content=\"' + globals.metadata.parsed[meta] + '\">\\n';\n      }\n    }\n  }\n\n  text = doctypeParsed + '<html' + lang + '>\\n<head>\\n' + title + charset + metadata + '</head>\\n<body>\\n' + text.trim() + '\\n</body>\\n</html>';\n\n  text = globals.converter._dispatch('makehtml.completeHTMLDocument.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('makehtml.detab', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.detab.before', text, options, globals).getText();\n\n  // expand first n-1 tabs\n  text = text.replace(/\\t(?=\\t)/g, '    '); // g_tab_width\n\n  // replace the nth with two sentinels\n  text = text.replace(/\\t/g, '¨A¨B');\n\n  // use the sentinel to anchor our regex so it doesn't explode\n  text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {\n    var leadingText = m1,\n        numSpaces = 4 - leadingText.length % 4;  // g_tab_width\n\n    // there *must* be a better way to do this:\n    for (var i = 0; i < numSpaces; i++) {\n      leadingText += ' ';\n    }\n\n    return leadingText;\n  });\n\n  // clean up sentinels\n  text = text.replace(/¨A/g, '    ');  // g_tab_width\n  text = text.replace(/¨B/g, '');\n\n  text = globals.converter._dispatch('makehtml.detab.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makehtml.ellipsis', function (text, options, globals) {\n  'use strict';\n\n  if (!options.ellipsis) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.ellipsis.before', text, options, globals).getText();\n\n  text = text.replace(/\\.\\.\\./g, '…');\n\n  text = globals.converter._dispatch('makehtml.ellipsis.after', text, options, globals).getText();\n\n  return text;\n});\n\n/**\n * Turn emoji codes into emojis\n *\n * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis\n */\nshowdown.subParser('makehtml.emoji', function (text, options, globals) {\n  'use strict';\n\n  if (!options.emoji) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.emoji.before', text, options, globals).getText();\n\n  var emojiRgx = /:([\\S]+?):/g;\n\n  text = text.replace(emojiRgx, function (wm, emojiCode) {\n    if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {\n      return showdown.helper.emojis[emojiCode];\n    }\n    return wm;\n  });\n\n  text = globals.converter._dispatch('makehtml.emoji.after', text, options, globals).getText();\n\n  return text;\n});\n\n/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('makehtml.encodeAmpsAndAngles', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.before', text, options, globals).getText();\n\n  // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n  // http://bumppo.net/projects/amputator/\n  text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&amp;');\n\n  // Encode naked <'s\n  text = text.replace(/<(?![a-z\\/?$!])/gi, '&lt;');\n\n  // Encode <\n  text = text.replace(/</g, '&lt;');\n\n  // Encode >\n  text = text.replace(/>/g, '&gt;');\n\n  text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n *    text = escapeCharacters(text,\"\\\\\",true);\n *    text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox.  This function gets called a LOT.\n */\nshowdown.subParser('makehtml.encodeBackslashEscapes', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.before', text, options, globals).getText();\n\n  text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n  text = text.replace(/\\\\([`*_{}\\[\\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('makehtml.encodeCode', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.encodeCode.before', text, options, globals).getText();\n\n  // Encode all ampersands; HTML entities are not\n  // entities within a Markdown code span.\n  text = text\n    .replace(/&/g, '&amp;')\n  // Do the angle bracket song and dance:\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n  // Now, escape characters that are magic in Markdown:\n    .replace(/([*_{}\\[\\]\\\\=~-])/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.encodeCode.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _ ~ =] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.before', text, options, globals).getText();\n\n  // Build a regex to find HTML tags.\n  var tags     = /<\\/?[a-z\\d_:-]+(?:[\\s]+[\\s\\S]+?)?>/gi,\n      comments = /<!(--(?:(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;\n\n  text = text.replace(tags, function (wholeMatch) {\n    return wholeMatch\n      .replace(/(.)<\\/?code>(?=.)/g, '$1`')\n      .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n  });\n\n  text = text.replace(comments, function (wholeMatch) {\n    return wholeMatch\n      .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n  });\n\n  text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n *     def hello_world(x)\n *       puts \"Hello, #{x}\"\n *     end\n * ```\n */\nshowdown.subParser('makehtml.githubCodeBlocks', function (text, options, globals) {\n  'use strict';\n\n  // early exit if option is not enabled\n  if (!options.ghCodeBlocks) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.githubCodeBlocks.before', text, options, globals).getText();\n\n  text += '¨0';\n\n  text = text.replace(/(?:^|\\n) {0,3}(```+|~~~+) *([^\\n\\t`~]*)\\n([\\s\\S]*?)\\n {0,3}\\1/g, function (wholeMatch, delim, language, codeblock) {\n    var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n    // if the language has spaces followed by some other chars, according to the spec we should just ignore everything\n    // after the first space\n    language = language.trim().split(' ')[0];\n\n    // First parse the github code block\n    codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n    codeblock = '<pre><code' + (language ? ' class=\"' + language + ' language-' + language + '\"' : '') + '>' + codeblock + end + '</code></pre>';\n\n    codeblock = showdown.subParser('makehtml.hashBlock')(codeblock, options, globals);\n\n    // Since GHCodeblocks can be false positives, we need to\n    // store the primitive text and the parsed text in a global var,\n    // and then return a token\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  });\n\n  // attacklab: strip sentinel\n  text = text.replace(/¨0/, '');\n\n  return globals.converter._dispatch('makehtml.githubCodeBlocks.after', text, options, globals).getText();\n});\n\nshowdown.subParser('makehtml.hashBlock', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashBlock.before', text, options, globals).getText();\n  text = text.replace(/(^\\n+|\\n+$)/g, '');\n  text = '\\n\\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n  text = globals.converter._dispatch('makehtml.hashBlock.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Hash and escape <code> elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashCodeTags.before', text, options, globals).getText();\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;\n    return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';\n  };\n\n  // Hash naked <code>\n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '<code\\\\b[^>]*>', '</code>', 'gim');\n\n  text = globals.converter._dispatch('makehtml.hashCodeTags.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makehtml.hashElement', function (text, options, globals) {\n  'use strict';\n\n  return function (wholeMatch, m1) {\n    var blockText = m1;\n\n    // Undo double lines\n    blockText = blockText.replace(/\\n\\n/g, '\\n');\n    blockText = blockText.replace(/^\\n/, '');\n\n    // strip trailing blank lines\n    blockText = blockText.replace(/\\n+$/g, '');\n\n    // Replace the element text with a marker (\"¨KxK\" where x is its key)\n    blockText = '\\n\\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n    return blockText;\n  };\n});\n\nshowdown.subParser('makehtml.hashHTMLBlocks', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashHTMLBlocks.before', text, options, globals).getText();\n\n  var blockTags = [\n        'pre',\n        'div',\n        'h1',\n        'h2',\n        'h3',\n        'h4',\n        'h5',\n        'h6',\n        'blockquote',\n        'table',\n        'dl',\n        'ol',\n        'ul',\n        'script',\n        'noscript',\n        'form',\n        'fieldset',\n        'iframe',\n        'math',\n        'style',\n        'section',\n        'header',\n        'footer',\n        'nav',\n        'article',\n        'aside',\n        'address',\n        'audio',\n        'canvas',\n        'figure',\n        'hgroup',\n        'output',\n        'video',\n        'details',\n        'p'\n      ],\n      repFunc = function (wholeMatch, match, left, right) {\n        var txt = wholeMatch;\n        // check if this html element is marked as markdown\n        // if so, it's contents should be parsed as markdown\n        if (left.search(/\\bmarkdown\\b/) !== -1) {\n          txt = left + globals.converter.makeHtml(match) + right;\n        }\n        return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n      };\n\n  if (options.backslashEscapesHTMLTags) {\n    // encode backslash escaped HTML tags\n    text = text.replace(/\\\\<(\\/?[^>]+?)>/g, function (wm, inside) {\n      return '&lt;' + inside + '&gt;';\n    });\n  }\n\n  // hash HTML Blocks\n  for (var i = 0; i < blockTags.length; ++i) {\n\n    var opTagPos,\n        rgx1     = new RegExp('^ {0,3}(<' + blockTags[i] + '\\\\b[^>]*>)', 'im'),\n        patLeft  = '<' + blockTags[i] + '\\\\b[^>]*>',\n        patRight = '</' + blockTags[i] + '>';\n    // 1. Look for the first position of the first opening HTML tag in the text\n    while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {\n\n      // if the HTML tag is \\ escaped, we need to escape it and break\n\n\n      //2. Split the text in that position\n      var subTexts = showdown.helper.splitAtIndex(text, opTagPos),\n          //3. Match recursively\n          newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');\n\n      // prevent an infinite loop\n      if (newSubText1 === subTexts[1]) {\n        break;\n      }\n      text = subTexts[0].concat(newSubText1);\n    }\n  }\n  // HR SPECIAL CASE\n  text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('makehtml.hashElement')(text, options, globals));\n\n  // Special case for standalone HTML comments\n  text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n    return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n  }, '^ {0,3}<!--', '-->', 'gm');\n\n  // PHP and ASP-style processor instructions (<?...?> and <%...%>)\n  text = text.replace(/\\n\\n( {0,3}<([?%])[^\\r]*?\\2>[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('makehtml.hashElement')(text, options, globals));\n\n  text = globals.converter._dispatch('makehtml.hashHTMLBlocks.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashHTMLSpans', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashHTMLSpans.before', text, options, globals).getText();\n\n  // Hash Self Closing tags\n  text = text.replace(/<[^>]+?\\/>/gi, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash tags without properties\n  text = text.replace(/<([^>]+?)>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash tags with properties\n  text = text.replace(/<([^>]+?)\\s[^>]+?>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash self closing tags without />\n  text = text.replace(/<[^>]+?>/gi, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  text = globals.converter._dispatch('makehtml.hashHTMLSpans.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('makehtml.unhashHTMLSpans', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.unhashHTMLSpans.before', text, options, globals).getText();\n\n  for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n    var repText = globals.gHtmlSpans[i],\n        // limiter to prevent infinite loop (assume 10 as limit for recurse)\n        limit = 0;\n\n    while (/¨C(\\d+)C/.test(repText)) {\n      var num = RegExp.$1;\n      repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);\n      if (limit === 10) {\n        console.error('maximum nesting of 10 spans reached!!!');\n        break;\n      }\n      ++limit;\n    }\n    text = text.replace('¨C' + i + 'C', repText);\n  }\n\n  text = globals.converter._dispatch('makehtml.unhashHTMLSpans.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Hash and escape <pre><code> elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashPreCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashPreCodeTags.before', text, options, globals).getText();\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  // Hash <pre><code>\n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<pre\\\\b[^>]*>\\\\s*<code\\\\b[^>]*>', '^ {0,3}</code>\\\\s*</pre>', 'gim');\n\n  text = globals.converter._dispatch('makehtml.hashPreCodeTags.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makehtml.headers', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.headers.before', text, options, globals).getText();\n\n  var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n      // Set text-style headers:\n      //\tHeader 1\n      //\t========\n      //\n      //\tHeader 2\n      //\t--------\n      //\n      setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n      setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n  text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n    var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart,\n        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);\n  });\n\n  text = text.replace(setextRegexH2, function (matchFound, m1) {\n    var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart + 1,\n        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);\n  });\n\n  // atx-style headers:\n  //  # Header 1\n  //  ## Header 2\n  //  ## Header 2 with closing hashes ##\n  //  ...\n  //  ###### Header 6\n  //\n  var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n  text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n    var hText = m2;\n    if (options.customizedHeaderId) {\n      hText = m2.replace(/\\s?{([^{]+?)}\\s*$/, '');\n    }\n\n    var span = showdown.subParser('makehtml.spanGamut')(hText, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n        hLevel = headerLevelStart - 1 + m1.length,\n        header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';\n\n    return showdown.subParser('makehtml.hashBlock')(header, options, globals);\n  });\n\n  function headerId (m) {\n    var title,\n        prefix;\n\n    // It is separate from other options to allow combining prefix and customized\n    if (options.customizedHeaderId) {\n      var match = m.match(/{([^{]+?)}\\s*$/);\n      if (match && match[1]) {\n        m = match[1];\n      }\n    }\n\n    title = m;\n\n    // Prefix id to prevent causing inadvertent pre-existing style matches.\n    if (showdown.helper.isString(options.prefixHeaderId)) {\n      prefix = options.prefixHeaderId;\n    } else if (options.prefixHeaderId === true) {\n      prefix = 'section-';\n    } else {\n      prefix = '';\n    }\n\n    if (!options.rawPrefixHeaderId) {\n      title = prefix + title;\n    }\n\n    if (options.ghCompatibleHeaderId) {\n      title = title\n        .replace(/ /g, '-')\n        // replace previously escaped chars (&, ¨ and $)\n        .replace(/&amp;/g, '')\n        .replace(/¨T/g, '')\n        .replace(/¨D/g, '')\n        // replace rest of the chars (&~$ are repeated as they might have been escaped)\n        // borrowed from github's redcarpet (some they should produce similar results)\n        .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, '')\n        .toLowerCase();\n    } else if (options.rawHeaderId) {\n      title = title\n        .replace(/ /g, '-')\n        // replace previously escaped chars (&, ¨ and $)\n        .replace(/&amp;/g, '&')\n        .replace(/¨T/g, '¨')\n        .replace(/¨D/g, '$')\n        // replace \" and '\n        .replace(/[\"']/g, '-')\n        .toLowerCase();\n    } else {\n      title = title\n        .replace(/[^\\w]/g, '')\n        .toLowerCase();\n    }\n\n    if (options.rawPrefixHeaderId) {\n      title = prefix + title;\n    }\n\n    if (globals.hashLinkCounts[title]) {\n      title = title + '-' + (globals.hashLinkCounts[title]++);\n    } else {\n      globals.hashLinkCounts[title] = 1;\n    }\n    return title;\n  }\n\n  text = globals.converter._dispatch('makehtml.headers.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Turn Markdown horizontal rule shortcuts into <hr /> tags.\n *\n * Any 3 or more unindented consecutive hyphens, asterisks or underscores with or without a space beetween them\n * in a single line is considered a horizontal rule\n */\nshowdown.subParser('makehtml.horizontalRule', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.horizontalRule.before', text, options, globals).getText();\n\n  var key = showdown.subParser('makehtml.hashBlock')('<hr />', options, globals);\n  text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n  text = globals.converter._dispatch('makehtml.horizontalRule.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Turn Markdown image shortcuts into <img> tags.\n */\nshowdown.subParser('makehtml.images', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.images.before', text, options, globals).getText();\n\n  var inlineRegExp      = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<?([\\S]+?(?:\\([\\S]*?\\)[\\S]*?)?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n      crazyRegExp       = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<([^>]*)>(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(?:([\"'])([^\"]*?)\\6))?[ \\t]?\\)/g,\n      base64RegExp      = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<?(data:.+?\\/.+?;base64,[A-Za-z0-9+/=\\n]+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n      referenceRegExp   = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[([\\s\\S]*?)]()()()()()/g,\n      refShortcutRegExp = /!\\[([^\\[\\]]+)]()()()()()/g;\n\n  function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {\n    url = url.replace(/\\s/g, '');\n    return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n  }\n\n  function writeImageTagBaseUrl (wholeMatch, altText, linkId, url, width, height, m5, title) {\n    url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n    return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n  }\n\n  function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n    var gUrls   = globals.gUrls,\n        gTitles = globals.gTitles,\n        gDims   = globals.gDimensions;\n\n    linkId = linkId.toLowerCase();\n\n    if (!title) {\n      title = '';\n    }\n    // Special case for explicit empty url\n    if (wholeMatch.search(/\\(<?\\s*>? ?(['\"].*['\"])?\\)$/m) > -1) {\n      url = '';\n\n    } else if (url === '' || url === null) {\n      if (linkId === '' || linkId === null) {\n        // lower-case and turn embedded newlines into spaces\n        linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + linkId;\n\n      if (!showdown.helper.isUndefined(gUrls[linkId])) {\n        url = gUrls[linkId];\n        if (!showdown.helper.isUndefined(gTitles[linkId])) {\n          title = gTitles[linkId];\n        }\n        if (!showdown.helper.isUndefined(gDims[linkId])) {\n          width = gDims[linkId].width;\n          height = gDims[linkId].height;\n        }\n      } else {\n        return wholeMatch;\n      }\n    }\n\n    altText = altText\n      .replace(/\"/g, '&quot;')\n    //altText = showdown.helper.escapeCharacters(altText, '*_', false);\n      .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n    //url = showdown.helper.escapeCharacters(url, '*_', false);\n    url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n    var result = '<img src=\"' + url + '\" alt=\"' + altText + '\"';\n\n    if (title && showdown.helper.isString(title)) {\n      title = title\n        .replace(/\"/g, '&quot;')\n      //title = showdown.helper.escapeCharacters(title, '*_', false);\n        .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n      result += ' title=\"' + title + '\"';\n    }\n\n    if (width && height) {\n      width  = (width === '*') ? 'auto' : width;\n      height = (height === '*') ? 'auto' : height;\n\n      result += ' width=\"' + width + '\"';\n      result += ' height=\"' + height + '\"';\n    }\n\n    result += ' />';\n\n    return result;\n  }\n\n  // First, handle reference-style labeled images: ![alt text][id]\n  text = text.replace(referenceRegExp, writeImageTag);\n\n  // Next, handle inline images:  ![alt text](url =<width>x<height> \"optional title\")\n\n  // base64 encoded images\n  text = text.replace(base64RegExp, writeImageTagBase64);\n\n  // cases with crazy urls like ./image/cat1).png\n  text = text.replace(crazyRegExp, writeImageTagBaseUrl);\n\n  // normal cases\n  text = text.replace(inlineRegExp, writeImageTagBaseUrl);\n\n  // handle reference-style shortcuts: ![img text]\n  text = text.replace(refShortcutRegExp, writeImageTag);\n\n  text = globals.converter._dispatch('makehtml.images.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makehtml.italicsAndBold', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.italicsAndBold.before', text, options, globals).getText();\n\n  // it's faster to have 3 separate regexes for each case than have just one\n  // because of backtracing, in some cases, it could lead to an exponential effect\n  // called \"catastrophic backtrace\". Ominous!\n\n  function parseInside (txt, left, right) {\n    return left + txt + right;\n  }\n\n  // Parse underscores\n  if (options.literalMidWordUnderscores) {\n    text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n      return parseInside (txt, '<strong><em>', '</em></strong>');\n    });\n    text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n      return parseInside (txt, '<strong>', '</strong>');\n    });\n    text = text.replace(/\\b_(\\S[\\s\\S]*?)_\\b/g, function (wm, txt) {\n      return parseInside (txt, '<em>', '</em>');\n    });\n  } else {\n    text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;\n    });\n    text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;\n    });\n    text = text.replace(/_([^\\s_][\\s\\S]*?)_/g, function (wm, m) {\n      // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)\n      return (/\\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;\n    });\n  }\n\n  // Now parse asterisks\n  /*\n  if (options.literalMidWordAsterisks) {\n    text = text.replace(/([^*]|^)\\B\\*\\*\\*(\\S[\\s\\S]+?)\\*\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<strong><em>', '</em></strong>');\n    });\n    text = text.replace(/([^*]|^)\\B\\*\\*(\\S[\\s\\S]+?)\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<strong>', '</strong>');\n    });\n    text = text.replace(/([^*]|^)\\B\\*(\\S[\\s\\S]+?)\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<em>', '</em>');\n    });\n  } else {\n  */\n  text = text.replace(/\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*/g, function (wm, m) {\n    return (/\\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;\n  });\n  text = text.replace(/\\*\\*(\\S[\\s\\S]*?)\\*\\*/g, function (wm, m) {\n    return (/\\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;\n  });\n  text = text.replace(/\\*([^\\s*][\\s\\S]*?)\\*/g, function (wm, m) {\n    // !/^\\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)\n    return (/\\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;\n  });\n  //}\n\n  text = globals.converter._dispatch('makehtml.italicsAndBold.after', text, options, globals).getText();\n  return text;\n});\n\n////\n// makehtml/links.js\n// Copyright (c) 2018 ShowdownJS\n//\n// Transforms MD links into `<a>` html anchors\n//\n// A link contains link text (the visible text), a link destination (the URI that is the link destination), and\n// optionally a link title. There are two basic kinds of links in Markdown.\n// In inline links the destination and title are given immediately after the link text.\n// In reference links the destination and title are defined elsewhere in the document.\n//\n// ***Author:***\n// - Estevão Soares dos Santos (Tivie) <https://github.com/tivie>\n////\n\n(function () {\n  /**\n   * Helper function: Wrapper function to pass as second replace parameter\n   *\n   * @param {RegExp} rgx\n   * @param {string} evtRootName\n   * @param {{}} options\n   * @param {{}} globals\n   * @returns {Function}\n   */\n  function replaceAnchorTagReference (rgx, evtRootName, options, globals, emptyCase) {\n    emptyCase = !!emptyCase;\n    return function (wholeMatch, text, id, url, m5, m6, title) {\n      // bail we we find 2 newlines somewhere\n      if (/\\n\\n/.test(wholeMatch)) {\n        return wholeMatch;\n      }\n\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);\n      return writeAnchorTag(evt, options, globals, emptyCase);\n    };\n  }\n\n  function replaceAnchorTagBaseUrl (rgx, evtRootName, options, globals, emptyCase) {\n    return function (wholeMatch, text, id, url, m5, m6, title) {\n      url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);\n      return writeAnchorTag(evt, options, globals, emptyCase);\n    };\n  }\n\n  /**\n   * TODO Normalize this\n   * Helper function: Create a capture event\n   * @param {RegExp} rgx\n   * @param {String} evtName Event name\n   * @param {String} wholeMatch\n   * @param {String} text\n   * @param {String} id\n   * @param {String} url\n   * @param {String} title\n   * @param {{}} options\n   * @param {{}} globals\n   * @returns {showdown.helper.Event|*}\n   */\n  function createEvent (rgx, evtName, wholeMatch, text, id, url, title, options, globals) {\n    return globals.converter._dispatch(evtName, wholeMatch, options, globals, {\n      regexp: rgx,\n      matches: {\n        wholeMatch: wholeMatch,\n        text: text,\n        id: id,\n        url: url,\n        title: title\n      }\n    });\n  }\n\n  /**\n   * Helper Function: Normalize and write an anchor tag based on passed parameters\n   * @param evt\n   * @param options\n   * @param globals\n   * @param {boolean} emptyCase\n   * @returns {string}\n   */\n  function writeAnchorTag (evt, options, globals, emptyCase) {\n\n    var wholeMatch = evt.getMatches().wholeMatch;\n    var text = evt.getMatches().text;\n    var id = evt.getMatches().id;\n    var url = evt.getMatches().url;\n    var title = evt.getMatches().title;\n    var target = '';\n\n    if (!title) {\n      title = '';\n    }\n    id = (id) ? id.toLowerCase() : '';\n\n    if (emptyCase) {\n      url = '';\n    } else if (!url) {\n      if (!id) {\n        // lower-case and turn embedded newlines into spaces\n        id = text.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + id;\n\n      if (!showdown.helper.isUndefined(globals.gUrls[id])) {\n        url = globals.gUrls[id];\n        if (!showdown.helper.isUndefined(globals.gTitles[id])) {\n          title = globals.gTitles[id];\n        }\n      } else {\n        return wholeMatch;\n      }\n    }\n    //url = showdown.helper.escapeCharacters(url, '*_:~', false); // replaced line to improve performance\n    url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n\n    if (title !== '' && title !== null) {\n      title = title.replace(/\"/g, '&quot;');\n      //title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance\n      title = title.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n      title = ' title=\"' + title + '\"';\n    }\n\n    // optionLinksInNewWindow only applies\n    // to external links. Hash links (#) open in same page\n    if (options.openLinksInNewWindow && !/^#/.test(url)) {\n      // escaped _\n      target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n    }\n\n    // Text can be a markdown element, so we run through the appropriate parsers\n    text = showdown.subParser('makehtml.codeSpans')(text, options, globals);\n    text = showdown.subParser('makehtml.emoji')(text, options, globals);\n    text = showdown.subParser('makehtml.underline')(text, options, globals);\n    text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);\n    text = showdown.subParser('makehtml.strikethrough')(text, options, globals);\n    text = showdown.subParser('makehtml.ellipsis')(text, options, globals);\n    text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);\n\n    //evt = createEvent(rgx, evtRootName + '.captureEnd', wholeMatch, text, id, url, title, options, globals);\n\n    var result = '<a href=\"' + url + '\"' + title + target + '>' + text + '</a>';\n\n    //evt = createEvent(rgx, evtRootName + '.beforeHash', wholeMatch, text, id, url, title, options, globals);\n\n    result = showdown.subParser('makehtml.hashHTMLSpans')(result, options, globals);\n\n    return result;\n  }\n\n  var evtRootName = 'makehtml.links';\n\n  /**\n   * Turn Markdown link shortcuts into XHTML <a> tags.\n   */\n  showdown.subParser('makehtml.links', function (text, options, globals) {\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Handle reference-style links: [link text] [id]\n    text = showdown.subParser('makehtml.links.reference')(text, options, globals);\n\n    // 2. Handle inline-style links: [link text](url \"optional title\")\n    text = showdown.subParser('makehtml.links.inline')(text, options, globals);\n\n    // 3. Handle reference-style shortcuts: [link text]\n    // These must come last in case there's a [link text][1] or [link text](/foo)\n    text = showdown.subParser('makehtml.links.referenceShortcut')(text, options, globals);\n\n    // 4. Handle angle brackets links -> `<http://example.com/>`\n    // Must come after links, because you can use < and > delimiters in inline links like [this](<url>).\n    text = showdown.subParser('makehtml.links.angleBrackets')(text, options, globals);\n\n    // 5. Handle GithubMentions (if option is enabled)\n    text = showdown.subParser('makehtml.links.ghMentions')(text, options, globals);\n\n    // 6. Handle <a> tags and img tags\n    text = text.replace(/<a\\s[^>]*>[\\s\\S]*<\\/a>/g, function (wholeMatch) {\n      return showdown.helper._hashHTMLSpan(wholeMatch, globals);\n    });\n\n    text = text.replace(/<img\\s[^>]*\\/?>/g, function (wholeMatch) {\n      return showdown.helper._hashHTMLSpan(wholeMatch, globals);\n    });\n\n    // 7. Handle naked links (if option is enabled)\n    text = showdown.subParser('makehtml.links.naked')(text, options, globals);\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.inline', function (text, options, globals) {\n    var evtRootName = evtRootName + '.inline';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Look for empty cases: []() and [empty]() and [](\"title\")\n    var rgxEmpty = /\\[(.*?)]()()()()\\(<? ?>? ?(?:[\"'](.*)[\"'])?\\)/g;\n    text = text.replace(rgxEmpty, replaceAnchorTagBaseUrl(rgxEmpty, evtRootName, options, globals, true));\n\n    // 2. Look for cases with crazy urls like ./image/cat1).png\n    var rgxCrazy = /\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()\\s?\\([ \\t]?<([^>]*)>(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g;\n    text = text.replace(rgxCrazy, replaceAnchorTagBaseUrl(rgxCrazy, evtRootName, options, globals));\n\n    // 3. inline links with no title or titles wrapped in ' or \":\n    // [text](url.com) || [text](<url.com>) || [text](url.com \"title\") || [text](<url.com> \"title\")\n    //var rgx2 = /\\[[ ]*[\\s]?[ ]*([^\\n\\[\\]]*?)[ ]*[\\s]?[ ]*] ?()\\(<?[ ]*[\\s]?[ ]*([^\\s'\"]*)>?(?:[ ]*[\\n]?[ ]*()(['\"])(.*?)\\5)?[ ]*[\\s]?[ ]*\\)/; // this regex is too slow!!!\n    var rgx2 = /\\[([\\S ]*?)]\\s?()\\( *<?([^\\s'\"]*?(?:\\([\\S]*?\\)[\\S]*?)?)>?\\s*(?:()(['\"])(.*?)\\5)? *\\)/g;\n    text = text.replace(rgx2, replaceAnchorTagBaseUrl(rgx2, evtRootName, options, globals));\n\n    // 4. inline links with titles wrapped in (): [foo](bar.com (title))\n    var rgx3 = /\\[([\\S ]*?)]\\s?()\\( *<?([^\\s'\"]*?(?:\\([\\S]*?\\)[\\S]*?)?)>?\\s+()()\\((.*?)\\) *\\)/g;\n    text = text.replace(rgx3, replaceAnchorTagBaseUrl(rgx3, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.reference', function (text, options, globals) {\n    var evtRootName = evtRootName + '.reference';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /\\[((?:\\[[^\\]]*]|[^\\[\\]])*)] ?(?:\\n *)?\\[(.*?)]()()()()/g;\n    text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.referenceShortcut', function (text, options, globals) {\n    var evtRootName = evtRootName + '.referenceShortcut';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /\\[([^\\[\\]]+)]()()()()()/g;\n    text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.ghMentions', function (text, options, globals) {\n    var evtRootName = evtRootName + 'ghMentions';\n\n    if (!options.ghMentions) {\n      return text;\n    }\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /(^|\\s)(\\\\)?(@([a-z\\d]+(?:[a-z\\d._-]+?[a-z\\d]+)*))/gi;\n\n    text = text.replace(rgx, function (wholeMatch, st, escape, mentions, username) {\n      // bail if the mentions was escaped\n      if (escape === '\\\\') {\n        return st + mentions;\n      }\n\n      // check if options.ghMentionsLink is a string\n      // TODO Validation should be done at initialization not at runtime\n      if (!showdown.helper.isString(options.ghMentionsLink)) {\n        throw new Error('ghMentionsLink option must be a string');\n      }\n      var url = options.ghMentionsLink.replace(/{u}/g, username);\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, mentions, null, url, null, options, globals);\n      // captureEnd Event is triggered inside writeAnchorTag function\n      return st + writeAnchorTag(evt, options, globals);\n    });\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.angleBrackets', function (text, options, globals) {\n    var evtRootName = 'makehtml.links.angleBrackets';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Parse links first\n    var urlRgx  = /<(((?:https?|ftp):\\/\\/|www\\.)[^'\">\\s]+)>/gi;\n    text = text.replace(urlRgx, function (wholeMatch, url, urlStart) {\n      var text = url;\n      url = (urlStart === 'www.') ? 'http://' + url : url;\n      var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);\n      return writeAnchorTag(evt, options, globals);\n    });\n\n    // 2. Then Mail Addresses\n    var mailRgx = /<(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi;\n    text = text.replace(mailRgx, function (wholeMatch, mail) {\n      var url = 'mailto:';\n      mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);\n      if (options.encodeEmails) {\n        url = showdown.helper.encodeEmailAddress(url + mail);\n        mail = showdown.helper.encodeEmailAddress(mail);\n      } else {\n        url = url + mail;\n      }\n      var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);\n      return writeAnchorTag(evt, options, globals);\n    });\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n\n  /**\n   * TODO MAKE THIS WORK (IT'S NOT ACTIVATED)\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.naked', function (text, options, globals) {\n    if (!options.simplifiedAutoLink) {\n      return text;\n    }\n\n    var evtRootName = 'makehtml.links.naked';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 2. Now we check for\n    // we also include leading markdown magic chars [_*~] for cases like __https://www.google.com/foobar__\n    var urlRgx = /([_*~]*?)(((?:https?|ftp):\\/\\/|www\\.)[^\\s<>\"'`´.-][^\\s<>\"'`´]*?\\.[a-z\\d.]+[^\\s<>\"']*)\\1/gi;\n    text = text.replace(urlRgx, function (wholeMatch, leadingMDChars, url, urlPrefix) {\n\n      // we now will start traversing the url from the front to back, looking for punctuation chars [_*~,;:.!?\\)\\]]\n      var len = url.length;\n      var suffix = '';\n      for (var i = len - 1; i >= 0; --i) {\n        var char = url.charAt(i);\n\n        if (/[_*~,;:.!?]/.test(char)) {\n          // it's a punctuation char\n          // we remove it from the url\n          url = url.slice(0, -1);\n          // and prepend it to the suffix\n          suffix = char + suffix;\n        } else if (/\\)/.test(char)) {\n          var opPar = url.match(/\\(/g) || [];\n          var clPar = url.match(/\\)/g);\n\n          // it's a curved parenthesis so we need to check for \"balance\" (kinda)\n          if (opPar.length < clPar.length) {\n            // there are more closing Parenthesis than opening so chop it!!!!!\n            url = url.slice(0, -1);\n            // and prepend it to the suffix\n            suffix = char + suffix;\n          } else {\n            // it's (kinda) balanced so our work is done\n            break;\n          }\n        } else if (/]/.test(char)) {\n          var opPar2 = url.match(/\\[/g) || [];\n          var clPar2 = url.match(/\\]/g);\n          // it's a squared parenthesis so we need to check for \"balance\" (kinda)\n          if (opPar2.length < clPar2.length) {\n            // there are more closing Parenthesis than opening so chop it!!!!!\n            url = url.slice(0, -1);\n            // and prepend it to the suffix\n            suffix = char + suffix;\n          } else {\n            // it's (kinda) balanced so our work is done\n            break;\n          }\n        } else {\n          // it's not a punctuation or a parenthesis so our work is done\n          break;\n        }\n      }\n\n      // we copy the treated url to the text variable\n      var text = url;\n      // finally, if it's a www shortcut, we prepend http\n      url = (urlPrefix === 'www.') ? 'http://' + url : url;\n\n      // url part is done so let's take care of text now\n      // we need to escape the text (because of links such as www.example.com/foo__bar__baz)\n      text = text.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n\n      // finally we dispatch the event\n      var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);\n\n      // and return the link tag, with the leadingMDChars and  suffix. The leadingMDChars are added at the end too because\n      // we consumed those characters in the regexp\n      return leadingMDChars + writeAnchorTag(evt, options, globals) + suffix + leadingMDChars;\n    });\n\n    // 2. Then mails\n    var mailRgx = /(^|\\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?=$|\\s)/gmi;\n    text = text.replace(mailRgx, function (wholeMatch, leadingChar, mail) {\n      var url = 'mailto:';\n      mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);\n      if (options.encodeEmails) {\n        url = showdown.helper.encodeEmailAddress(url + mail);\n        mail = showdown.helper.encodeEmailAddress(mail);\n      } else {\n        url = url + mail;\n      }\n      var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);\n      return leadingChar + writeAnchorTag(evt, options, globals);\n    });\n\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n})();\n\n/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('makehtml.lists', function (text, options, globals) {\n  'use strict';\n\n  /**\n   * Process the contents of a single ordered or unordered list, splitting it\n   * into individual list items.\n   * @param {string} listStr\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function processListItems (listStr, trimTrailing) {\n    // The $g_list_level global keeps track of when we're inside a list.\n    // Each time we enter a list, we increment it; when we leave a list,\n    // we decrement. If it's zero, we're not in a list anymore.\n    //\n    // We do this because when we're not inside a list, we want to treat\n    // something like this:\n    //\n    //    I recommend upgrading to version\n    //    8. Oops, now this line is treated\n    //    as a sub-list.\n    //\n    // As a single paragraph, despite the fact that the second line starts\n    // with a digit-period-space sequence.\n    //\n    // Whereas when we're inside a list (or sub-list), that line will be\n    // treated as the start of a sub-list. What a kludge, huh? This is\n    // an aspect of Markdown's syntax that's hard to parse perfectly\n    // without resorting to mind-reading. Perhaps the solution is to\n    // change the syntax rules such that sub-lists must start with a\n    // starting cardinal number; e.g. \"1.\" or \"a.\".\n    globals.gListLevel++;\n\n    // trim trailing blank lines:\n    listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n    // attacklab: add sentinel to emulate \\z\n    listStr += '¨0';\n\n    var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[([xX ])])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n        isParagraphed = (/\\n[ \\t]*\\n(?!¨0)/.test(listStr));\n\n    // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n    // which is a syntax breaking change\n    // activating this option reverts to old behavior\n    // This will be removed in version 2.0\n    if (options.disableForced4SpacesIndentedSublists) {\n      rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[([xX ])])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n    }\n\n    listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n      checked = (checked && checked.trim() !== '');\n\n      var item = showdown.subParser('makehtml.outdent')(m4, options, globals),\n          bulletStyle = '';\n\n      // Support for github tasklists\n      if (taskbtn && options.tasklists) {\n\n        // Style used for tasklist bullets\n        bulletStyle = ' class=\"task-list-item';\n        if (options.moreStyling) {bulletStyle +=  checked ? ' task-list-item-complete' : '';}\n        bulletStyle += '\" style=\"list-style-type: none;\"';\n\n        item = item.replace(/^[ \\t]*\\[([xX ])?]/m, function () {\n          var otp = '<input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"';\n          if (checked) {\n            otp += ' checked';\n          }\n          otp += '>';\n          return otp;\n        });\n      }\n\n      // ISSUE #312\n      // This input: - - - a\n      // causes trouble to the parser, since it interprets it as:\n      // <ul><li><li><li>a</li></li></li></ul>\n      // instead of:\n      // <ul><li>- - a</li></ul>\n      // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n      // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n      item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n        return '¨A' + wm2;\n      });\n\n      // SPECIAL CASE: a heading followed by a paragraph of text that is not separated by a double newline\n      // or/nor indented. ex:\n      //\n      // - # foo\n      // bar is great\n      //\n      // While this does now follow the spec per se, not allowing for this might cause confusion since\n      // header blocks don't need double-newlines after\n      if (/^#+.+\\n.+/.test(item)) {\n        item = item.replace(/^(#+.+)$/m, '$1\\n');\n      }\n\n      // m1 - Leading line or\n      // Has a double return (multi paragraph)\n      if (m1 || (item.search(/\\n{2,}/) > -1)) {\n        item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals);\n        item = showdown.subParser('makehtml.blockQuotes')(item, options, globals);\n        item = showdown.subParser('makehtml.headers')(item, options, globals);\n        item = showdown.subParser('makehtml.lists')(item, options, globals);\n        item = showdown.subParser('makehtml.codeBlocks')(item, options, globals);\n        item = showdown.subParser('makehtml.tables')(item, options, globals);\n        item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals);\n        //item = showdown.subParser('makehtml.paragraphs')(item, options, globals);\n\n        // TODO: This is a copy of the paragraph parser\n        // This is a provisory fix for issue #494\n        // For a permanente fix we need to rewrite the paragraph parser, passing the unhashify logic outside\n        // so that we can call the paragraph parser without accidently unashifying previously parsed blocks\n\n        // Strip leading and trailing lines:\n        item = item.replace(/^\\n+/g, '');\n        item = item.replace(/\\n+$/g, '');\n\n        var grafs = item.split(/\\n{2,}/g),\n            grafsOut = [],\n            end = grafs.length; // Wrap <p> tags\n\n        for (var i = 0; i < end; i++) {\n          var str = grafs[i];\n          // if this is an HTML marker, copy it\n          if (str.search(/¨([KG])(\\d+)\\1/g) >= 0) {\n            grafsOut.push(str);\n\n            // test for presence of characters to prevent empty lines being parsed\n            // as paragraphs (resulting in undesired extra empty paragraphs)\n          } else if (str.search(/\\S/) >= 0) {\n            str = showdown.subParser('makehtml.spanGamut')(str, options, globals);\n            str = str.replace(/^([ \\t]*)/g, '<p>');\n            str += '</p>';\n            grafsOut.push(str);\n          }\n        }\n        item = grafsOut.join('\\n');\n        // Strip leading and trailing lines:\n        item = item.replace(/^\\n+/g, '');\n        item = item.replace(/\\n+$/g, '');\n\n      } else {\n\n        // Recursion for sub-lists:\n        item = showdown.subParser('makehtml.lists')(item, options, globals);\n        item = item.replace(/\\n$/, ''); // chomp(item)\n        item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals);\n\n        // Colapse double linebreaks\n        item = item.replace(/\\n\\n+/g, '\\n\\n');\n\n        if (isParagraphed) {\n          item = showdown.subParser('makehtml.paragraphs')(item, options, globals);\n        } else {\n          item = showdown.subParser('makehtml.spanGamut')(item, options, globals);\n        }\n      }\n\n      // now we need to remove the marker (¨A)\n      item = item.replace('¨A', '');\n      // we can finally wrap the line in list item tags\n      item =  '<li' + bulletStyle + '>' + item + '</li>\\n';\n\n      return item;\n    });\n\n    // attacklab: strip sentinel\n    listStr = listStr.replace(/¨0/g, '');\n\n    globals.gListLevel--;\n\n    if (trimTrailing) {\n      listStr = listStr.replace(/\\s+$/, '');\n    }\n\n    return listStr;\n  }\n\n  function styleStartNumber (list, listType) {\n    // check if ol and starts by a number different than 1\n    if (listType === 'ol') {\n      var res = list.match(/^ *(\\d+)\\./);\n      if (res && res[1] !== '1') {\n        return ' start=\"' + res[1] + '\"';\n      }\n    }\n    return '';\n  }\n\n  /**\n   * Check and parse consecutive lists (better fix for issue #142)\n   * @param {string} list\n   * @param {string} listType\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function parseConsecutiveLists (list, listType, trimTrailing) {\n    // check if we caught 2 or more consecutive lists by mistake\n    // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n    var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n        ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n        counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n        result = '';\n\n    if (list.search(counterRxg) !== -1) {\n      (function parseCL (txt) {\n        var pos = txt.search(counterRxg),\n            style = styleStartNumber(list, listType);\n        if (pos !== -1) {\n          // slice\n          result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\\n';\n\n          // invert counterType and listType\n          listType = (listType === 'ul') ? 'ol' : 'ul';\n          counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n          //recurse\n          parseCL(txt.slice(pos));\n        } else {\n          result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\\n';\n        }\n      })(list);\n    } else {\n      var style = styleStartNumber(list, listType);\n      result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\\n';\n    }\n\n    return result;\n  }\n\n  // Start of list parsing\n  var subListRgx = /^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n  var mainListRgx = /(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n\n  text = globals.converter._dispatch('lists.before', text, options, globals).getText();\n  // add sentinel to hack around khtml/safari bug:\n  // http://bugs.webkit.org/show_bug.cgi?id=11231\n  text += '¨0';\n\n  if (globals.gListLevel) {\n    text = text.replace(subListRgx, function (wholeMatch, list, m2) {\n      var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n      return parseConsecutiveLists(list, listType, true);\n    });\n  } else {\n    text = text.replace(mainListRgx, function (wholeMatch, m1, list, m3) {\n      var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n      return parseConsecutiveLists(list, listType, false);\n    });\n  }\n\n  // strip sentinel\n  text = text.replace(/¨0/, '');\n  text = globals.converter._dispatch('makehtml.lists.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('makehtml.metadata', function (text, options, globals) {\n  'use strict';\n\n  if (!options.metadata) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.metadata.before', text, options, globals).getText();\n\n  function parseMetadataContents (content) {\n    // raw is raw so it's not changed in any way\n    globals.metadata.raw = content;\n\n    // escape chars forbidden in html attributes\n    // double quotes\n    content = content\n      // ampersand first\n      .replace(/&/g, '&amp;')\n      // double quotes\n      .replace(/\"/g, '&quot;');\n\n    // Restore dollar signs and tremas\n    content = content\n      .replace(/¨D/g, '$$')\n      .replace(/¨T/g, '¨');\n\n    content = content.replace(/\\n {4}/g, ' ');\n    content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n      globals.metadata.parsed[key] = value;\n      return '';\n    });\n  }\n\n  text = text.replace(/^\\s*«««+(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\n/, function (wholematch, format, content) {\n    parseMetadataContents(content);\n    return '¨M';\n  });\n\n  text = text.replace(/^\\s*---+(\\S*?)\\n([\\s\\S]+?)\\n---+\\n/, function (wholematch, format, content) {\n    if (format) {\n      globals.metadata.format = format;\n    }\n    parseMetadataContents(content);\n    return '¨M';\n  });\n\n  text = text.replace(/¨M/g, '');\n\n  text = globals.converter._dispatch('makehtml.metadata.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('makehtml.outdent', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.outdent.before', text, options, globals).getText();\n\n  // attacklab: hack around Konqueror 3.5.4 bug:\n  // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n  text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n  // attacklab: clean up hack\n  text = text.replace(/¨0/g, '');\n\n  text = globals.converter._dispatch('makehtml.outdent.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n *\n */\nshowdown.subParser('makehtml.paragraphs', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.paragraphs.before', text, options, globals).getText();\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n\n  var grafs = text.split(/\\n{2,}/g),\n      grafsOut = [],\n      end = grafs.length; // Wrap <p> tags\n\n  for (var i = 0; i < end; i++) {\n    var str = grafs[i];\n    // if this is an HTML marker, copy it\n    if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n      grafsOut.push(str);\n\n    // test for presence of characters to prevent empty lines being parsed\n    // as paragraphs (resulting in undesired extra empty paragraphs)\n    } else if (str.search(/\\S/) >= 0) {\n      str = showdown.subParser('makehtml.spanGamut')(str, options, globals);\n      str = str.replace(/^([ \\t]*)/g, '<p>');\n      str += '</p>';\n      grafsOut.push(str);\n    }\n  }\n\n  /** Unhashify HTML blocks */\n  end = grafsOut.length;\n  for (i = 0; i < end; i++) {\n    var blockText = '',\n        grafsOutIt = grafsOut[i],\n        codeFlag = false;\n    // if this is a marker for an html block...\n    // use RegExp.test instead of string.search because of QML bug\n    while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n      var delim = RegExp.$1,\n          num   = RegExp.$2;\n\n      if (delim === 'K') {\n        blockText = globals.gHtmlBlocks[num];\n      } else {\n        // we need to check if ghBlock is a false positive\n        if (codeFlag) {\n          // use encoded version of all text\n          blockText = showdown.subParser('makehtml.encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n        } else {\n          blockText = globals.ghCodeBlocks[num].codeblock;\n        }\n      }\n      blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n      grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n      // Check if grafsOutIt is a pre->code\n      if (/^<pre\\b[^>]*>\\s*<code\\b[^>]*>/.test(grafsOutIt)) {\n        codeFlag = true;\n      }\n    }\n    grafsOut[i] = grafsOutIt;\n  }\n  text = grafsOut.join('\\n');\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n  return globals.converter._dispatch('makehtml.paragraphs.after', text, options, globals).getText();\n});\n\n/**\n * Run extension\n */\nshowdown.subParser('makehtml.runExtension', function (ext, text, options, globals) {\n  'use strict';\n\n  if (ext.filter) {\n    text = ext.filter(text, globals.converter, options);\n\n  } else if (ext.regex) {\n    // TODO remove this when old extension loading mechanism is deprecated\n    var re = ext.regex;\n    if (!(re instanceof RegExp)) {\n      re = new RegExp(re, 'g');\n    }\n    text = text.replace(re, ext.replace);\n  }\n\n  return text;\n});\n\n/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('makehtml.spanGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.span.before', text, options, globals).getText();\n\n  text = showdown.subParser('makehtml.codeSpans')(text, options, globals);\n  text = showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n  text = showdown.subParser('makehtml.encodeBackslashEscapes')(text, options, globals);\n\n  // Process link and image tags. Images must come first,\n  // because ![foo][f] looks like a link.\n  text = showdown.subParser('makehtml.images')(text, options, globals);\n\n  text = globals.converter._dispatch('smakehtml.links.before', text, options, globals).getText();\n  text = showdown.subParser('makehtml.links')(text, options, globals);\n  text = globals.converter._dispatch('smakehtml.links.after', text, options, globals).getText();\n\n  //text = showdown.subParser('makehtml.autoLinks')(text, options, globals);\n  //text = showdown.subParser('makehtml.simplifiedAutoLinks')(text, options, globals);\n  text = showdown.subParser('makehtml.emoji')(text, options, globals);\n  text = showdown.subParser('makehtml.underline')(text, options, globals);\n  text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);\n  text = showdown.subParser('makehtml.strikethrough')(text, options, globals);\n  text = showdown.subParser('makehtml.ellipsis')(text, options, globals);\n\n  // we need to hash HTML tags inside spans\n  text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);\n\n  // now we encode amps and angles\n  text = showdown.subParser('makehtml.encodeAmpsAndAngles')(text, options, globals);\n\n  // Do hard breaks\n  if (options.simpleLineBreaks) {\n    // GFM style hard breaks\n    // only add line breaks if the text does not contain a block (special case for lists)\n    if (!/\\n\\n¨K/.test(text)) {\n      text = text.replace(/\\n+/g, '<br />\\n');\n    }\n  } else {\n    // Vanilla hard breaks\n    text = text.replace(/  +\\n/g, '<br />\\n');\n  }\n\n  text = globals.converter._dispatch('makehtml.spanGamut.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makehtml.strikethrough', function (text, options, globals) {\n  'use strict';\n\n  if (options.strikethrough) {\n    text = globals.converter._dispatch('makehtml.strikethrough.before', text, options, globals).getText();\n    text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return '<del>' + txt + '</del>'; });\n    text = globals.converter._dispatch('makehtml.strikethrough.after', text, options, globals).getText();\n  }\n\n  return text;\n});\n\n/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('makehtml.stripLinkDefinitions', function (text, options, globals) {\n  'use strict';\n\n  var regex       = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*<?([^>\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n      base64Regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*<?(data:.+?\\/.+?;base64,[A-Za-z0-9+/=\\n]+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n  // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n\n    // if there aren't two instances of linkId it must not be a reference link so back out\n    linkId = linkId.toLowerCase();\n    if (text.toLowerCase().split(linkId).length - 1 < 2) {\n      return wholeMatch;\n    }\n    if (url.match(/^data:.+?\\/.+?;base64,/)) {\n      // remove newlines\n      globals.gUrls[linkId] = url.replace(/\\s/g, '');\n    } else {\n      url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n      globals.gUrls[linkId] = showdown.subParser('makehtml.encodeAmpsAndAngles')(url, options, globals);  // Link IDs are case-insensitive\n    }\n\n    if (blankLines) {\n      // Oops, found blank lines, so it's not a title.\n      // Put back the parenthetical statement we stole.\n      return blankLines + title;\n\n    } else {\n      if (title) {\n        globals.gTitles[linkId] = title.replace(/\"|'/g, '&quot;');\n      }\n      if (options.parseImgDimensions && width && height) {\n        globals.gDimensions[linkId] = {\n          width:  width,\n          height: height\n        };\n      }\n    }\n    // Completely remove the definition from the text\n    return '';\n  };\n\n  // first we try to find base64 link references\n  text = text.replace(base64Regex, replaceFunc);\n\n  text = text.replace(regex, replaceFunc);\n\n  // attacklab: strip sentinel\n  text = text.replace(/¨0/, '');\n\n  return text;\n});\n\nshowdown.subParser('makehtml.tables', function (text, options, globals) {\n  'use strict';\n\n  if (!options.tables) {\n    return text;\n  }\n\n  var tableRgx       = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*[-=]{2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*[-=]{2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n      //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n      singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*[-=]{2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n  function parseStyles (sLine) {\n    if (/^:[ \\t]*--*$/.test(sLine)) {\n      return ' style=\"text-align:left;\"';\n    } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n      return ' style=\"text-align:right;\"';\n    } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n      return ' style=\"text-align:center;\"';\n    } else {\n      return '';\n    }\n  }\n\n  function parseHeaders (header, style) {\n    var id = '';\n    header = header.trim();\n    // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n    if (options.tablesHeaderId || options.tableHeaderId) {\n      id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n    }\n    header = showdown.subParser('makehtml.spanGamut')(header, options, globals);\n\n    return '<th' + id + style + '>' + header + '</th>\\n';\n  }\n\n  function parseCells (cell, style) {\n    var subText = showdown.subParser('makehtml.spanGamut')(cell, options, globals);\n    return '<td' + style + '>' + subText + '</td>\\n';\n  }\n\n  function buildTable (headers, cells) {\n    var tb = '<table>\\n<thead>\\n<tr>\\n',\n        tblLgn = headers.length;\n\n    for (var i = 0; i < tblLgn; ++i) {\n      tb += headers[i];\n    }\n    tb += '</tr>\\n</thead>\\n<tbody>\\n';\n\n    for (i = 0; i < cells.length; ++i) {\n      tb += '<tr>\\n';\n      for (var ii = 0; ii < tblLgn; ++ii) {\n        tb += cells[i][ii];\n      }\n      tb += '</tr>\\n';\n    }\n    tb += '</tbody>\\n</table>\\n';\n    return tb;\n  }\n\n  function parseTable (rawTable) {\n    var i, tableLines = rawTable.split('\\n');\n\n    for (i = 0; i < tableLines.length; ++i) {\n      // strip wrong first and last column if wrapped tables are used\n      if (/^ {0,3}\\|/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n      }\n      if (/\\|[ \\t]*$/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n      }\n      // parse code spans first, but we only support one line code spans\n\n      tableLines[i] = showdown.subParser('makehtml.codeSpans')(tableLines[i], options, globals);\n    }\n\n    var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n        rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n        rawCells = [],\n        headers = [],\n        styles = [],\n        cells = [];\n\n    tableLines.shift();\n    tableLines.shift();\n\n    for (i = 0; i < tableLines.length; ++i) {\n      if (tableLines[i].trim() === '') {\n        continue;\n      }\n      rawCells.push(\n        tableLines[i]\n          .split('|')\n          .map(function (s) {\n            return s.trim();\n          })\n      );\n    }\n\n    if (rawHeaders.length < rawStyles.length) {\n      return rawTable;\n    }\n\n    for (i = 0; i < rawStyles.length; ++i) {\n      styles.push(parseStyles(rawStyles[i]));\n    }\n\n    for (i = 0; i < rawHeaders.length; ++i) {\n      if (showdown.helper.isUndefined(styles[i])) {\n        styles[i] = '';\n      }\n      headers.push(parseHeaders(rawHeaders[i], styles[i]));\n    }\n\n    for (i = 0; i < rawCells.length; ++i) {\n      var row = [];\n      for (var ii = 0; ii < headers.length; ++ii) {\n        if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n        }\n        row.push(parseCells(rawCells[i][ii], styles[ii]));\n      }\n      cells.push(row);\n    }\n\n    return buildTable(headers, cells);\n  }\n\n  text = globals.converter._dispatch('makehtml.tables.before', text, options, globals).getText();\n\n  // find escaped pipe characters\n  text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n  // parse multi column tables\n  text = text.replace(tableRgx, parseTable);\n\n  // parse one column tables\n  text = text.replace(singeColTblRgx, parseTable);\n\n  text = globals.converter._dispatch('makehtml.tables.after', text, options, globals).getText();\n\n  return text;\n});\n\nshowdown.subParser('makehtml.underline', function (text, options, globals) {\n  'use strict';\n\n  if (!options.underline) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.underline.before', text, options, globals).getText();\n\n  if (options.literalMidWordUnderscores) {\n    text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n      return '<u>' + txt + '</u>';\n    });\n    text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n      return '<u>' + txt + '</u>';\n    });\n  } else {\n    text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? '<u>' + m + '</u>' : wm;\n    });\n    text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? '<u>' + m + '</u>' : wm;\n    });\n  }\n\n  // escape remaining underscores to prevent them being parsed by italic and bold\n  text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.underline.after', text, options, globals).getText();\n\n  return text;\n});\n\n/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('makehtml.unescapeSpecialChars', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.unescapeSpecialChars.before', text, options, globals).getText();\n\n  text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n    var charCodeToReplace = parseInt(m1);\n    return String.fromCharCode(charCodeToReplace);\n  });\n\n  text = globals.converter._dispatch('makehtml.unescapeSpecialChars.after', text, options, globals).getText();\n  return text;\n});\n\nshowdown.subParser('makeMarkdown.blockquote', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n\n    for (var i = 0; i < childrenLength; ++i) {\n      var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);\n\n      if (innerTxt === '') {\n        continue;\n      }\n      txt += innerTxt;\n    }\n  }\n  // cleanup\n  txt = txt.trim();\n  txt = '> ' + txt.split('\\n').join('\\n> ');\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.break', function () {\n  'use strict';\n\n  return '  \\n';\n});\n\nshowdown.subParser('makeMarkdown.codeBlock', function (node, globals) {\n  'use strict';\n\n  var lang = node.getAttribute('language'),\n      num  = node.getAttribute('precodenum');\n  return '```' + lang + '\\n' + globals.preList[num] + '\\n```';\n});\n\nshowdown.subParser('makeMarkdown.codeSpan', function (node) {\n  'use strict';\n\n  return '`' + node.innerHTML + '`';\n});\n\nshowdown.subParser('makeMarkdown.emphasis', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '*';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n    txt += '*';\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {\n  'use strict';\n\n  var headerMark = new Array(headerLevel + 1).join('#'),\n      txt = '';\n\n  if (node.hasChildNodes()) {\n    txt = headerMark + ' ';\n    var children = node.childNodes,\n        childrenLength = children.length;\n\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.hr', function () {\n  'use strict';\n\n  return '---';\n});\n\nshowdown.subParser('makeMarkdown.image', function (node) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasAttribute('src')) {\n    txt += '![' + node.getAttribute('alt') + '](';\n    txt += '<' + node.getAttribute('src') + '>';\n    if (node.hasAttribute('width') && node.hasAttribute('height')) {\n      txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');\n    }\n\n    if (node.hasAttribute('title')) {\n      txt += ' \"' + node.getAttribute('title') + '\"';\n    }\n    txt += ')';\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.input', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.getAttribute('checked') !== null) {\n    txt += '[x]';\n  } else {\n    txt += '[ ]';\n  }\n  var children = node.childNodes,\n      childrenLength = children.length;\n  for (var i = 0; i < childrenLength; ++i) {\n    txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.links', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes() && node.hasAttribute('href')) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n    txt = '[';\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n    txt += '](';\n    txt += '<' + node.getAttribute('href') + '>';\n    if (node.hasAttribute('title')) {\n      txt += ' \"' + node.getAttribute('title') + '\"';\n    }\n    txt += ')';\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.list', function (node, globals, type) {\n  'use strict';\n\n  var txt = '';\n  if (!node.hasChildNodes()) {\n    return '';\n  }\n  var listItems       = node.childNodes,\n      listItemsLenght = listItems.length,\n      listNum = node.getAttribute('start') || 1;\n\n  for (var i = 0; i < listItemsLenght; ++i) {\n    if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {\n      continue;\n    }\n\n    // define the bullet to use in list\n    var bullet = '';\n    if (type === 'ol') {\n      bullet = listNum.toString() + '. ';\n    } else {\n      bullet = '- ';\n    }\n\n    // parse list item\n    txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);\n    ++listNum;\n  }\n\n  return txt.trim();\n});\n\nshowdown.subParser('makeMarkdown.listItem', function (node, globals) {\n  'use strict';\n\n  var listItemTxt = '';\n\n  var children = node.childNodes,\n      childrenLenght = children.length;\n\n  for (var i = 0; i < childrenLenght; ++i) {\n    listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n  }\n  // if it's only one liner, we need to add a newline at the end\n  if (!/\\n$/.test(listItemTxt)) {\n    listItemTxt += '\\n';\n  } else {\n    // it's multiparagraph, so we need to indent\n    listItemTxt = listItemTxt\n      .split('\\n')\n      .join('\\n    ')\n      .replace(/^ {4}$/gm, '')\n      .replace(/\\n\\n+/g, '\\n\\n');\n  }\n\n  return listItemTxt;\n});\n\n\n\nshowdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {\n  'use strict';\n\n  spansOnly = spansOnly || false;\n\n  var txt = '';\n\n  // edge case of text without wrapper paragraph\n  if (node.nodeType === 3) {\n    return showdown.subParser('makeMarkdown.txt')(node, globals);\n  }\n\n  // HTML comment\n  if (node.nodeType === 8) {\n    return '<!--' + node.data + '-->\\n\\n';\n  }\n\n  // process only node elements\n  if (node.nodeType !== 1) {\n    return '';\n  }\n\n  var tagName = node.tagName.toLowerCase();\n\n  switch (tagName) {\n\n    //\n    // BLOCKS\n    //\n    case 'h1':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\\n\\n'; }\n      break;\n    case 'h2':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\\n\\n'; }\n      break;\n    case 'h3':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\\n\\n'; }\n      break;\n    case 'h4':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\\n\\n'; }\n      break;\n    case 'h5':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\\n\\n'; }\n      break;\n    case 'h6':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\\n\\n'; }\n      break;\n\n    case 'p':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\\n\\n'; }\n      break;\n\n    case 'blockquote':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\\n\\n'; }\n      break;\n\n    case 'hr':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\\n\\n'; }\n      break;\n\n    case 'ol':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\\n\\n'; }\n      break;\n\n    case 'ul':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\\n\\n'; }\n      break;\n\n    case 'precode':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\\n\\n'; }\n      break;\n\n    case 'pre':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\\n\\n'; }\n      break;\n\n    case 'table':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\\n\\n'; }\n      break;\n\n    //\n    // SPANS\n    //\n    case 'code':\n      txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);\n      break;\n\n    case 'em':\n    case 'i':\n      txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);\n      break;\n\n    case 'strong':\n    case 'b':\n      txt = showdown.subParser('makeMarkdown.strong')(node, globals);\n      break;\n\n    case 'del':\n      txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);\n      break;\n\n    case 'a':\n      txt = showdown.subParser('makeMarkdown.links')(node, globals);\n      break;\n\n    case 'img':\n      txt = showdown.subParser('makeMarkdown.image')(node, globals);\n      break;\n\n    case 'br':\n      txt = showdown.subParser('makeMarkdown.break')(node, globals);\n      break;\n\n    case 'input':\n      txt = showdown.subParser('makeMarkdown.input')(node, globals);\n      break;\n\n    default:\n      txt = node.outerHTML + '\\n\\n';\n  }\n\n  // common normalization\n  // TODO eventually\n\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.paragraph', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n  }\n\n  // some text normalization\n  txt = txt.trim();\n\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.pre', function (node, globals) {\n  'use strict';\n\n  var num  = node.getAttribute('prenum');\n  return '<pre>' + globals.preList[num] + '</pre>';\n});\n\nshowdown.subParser('makeMarkdown.strikethrough', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '~~';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n    txt += '~~';\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.strong', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '**';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n    }\n    txt += '**';\n  }\n  return txt;\n});\n\nshowdown.subParser('makeMarkdown.table', function (node, globals) {\n  'use strict';\n\n  var txt = '',\n      tableArray = [[], []],\n      headings   = node.querySelectorAll('thead>tr>th'),\n      rows       = node.querySelectorAll('tbody>tr'),\n      i, ii;\n  for (i = 0; i < headings.length; ++i) {\n    var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),\n        allign = '---';\n\n    if (headings[i].hasAttribute('style')) {\n      var style = headings[i].getAttribute('style').toLowerCase().replace(/\\s/g, '');\n      switch (style) {\n        case 'text-align:left;':\n          allign = ':---';\n          break;\n        case 'text-align:right;':\n          allign = '---:';\n          break;\n        case 'text-align:center;':\n          allign = ':---:';\n          break;\n      }\n    }\n    tableArray[0][i] = headContent.trim();\n    tableArray[1][i] = allign;\n  }\n\n  for (i = 0; i < rows.length; ++i) {\n    var r = tableArray.push([]) - 1,\n        cols = rows[i].getElementsByTagName('td');\n\n    for (ii = 0; ii < headings.length; ++ii) {\n      var cellContent = ' ';\n      if (typeof cols[ii] !== 'undefined') {\n        cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);\n      }\n      tableArray[r].push(cellContent);\n    }\n  }\n\n  var cellSpacesCount = 3;\n  for (i = 0; i < tableArray.length; ++i) {\n    for (ii = 0; ii < tableArray[i].length; ++ii) {\n      var strLen = tableArray[i][ii].length;\n      if (strLen > cellSpacesCount) {\n        cellSpacesCount = strLen;\n      }\n    }\n  }\n\n  for (i = 0; i < tableArray.length; ++i) {\n    for (ii = 0; ii < tableArray[i].length; ++ii) {\n      if (i === 1) {\n        if (tableArray[i][ii].slice(-1) === ':') {\n          tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(0, -1), cellSpacesCount - 1, '-') + ':';\n        } else {\n          tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');\n        }\n      } else {\n        tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);\n      }\n    }\n    txt += '| ' + tableArray[i].join(' | ') + ' |\\n';\n  }\n\n  return txt.trim();\n});\n\nshowdown.subParser('makeMarkdown.tableCell', function (node, globals) {\n  'use strict';\n\n  var txt = '';\n  if (!node.hasChildNodes()) {\n    return '';\n  }\n  var children = node.childNodes,\n      childrenLength = children.length;\n\n  for (var i = 0; i < childrenLength; ++i) {\n    txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);\n  }\n  return txt.trim();\n});\n\nshowdown.subParser('makeMarkdown.txt', function (node) {\n  'use strict';\n\n  var txt = node.nodeValue;\n\n  // multiple spaces are collapsed\n  txt = txt.replace(/ +/g, ' ');\n\n  // replace the custom ¨NBSP; with a space\n  txt = txt.replace(/¨NBSP;/g, ' ');\n\n  // \", <, > and & should replace escaped html entities\n  txt = showdown.helper.unescapeHTMLEntities(txt);\n\n  // escape markdown magic characters\n  // emphasis, strong and strikethrough - can appear everywhere\n  // we also escape pipe (|) because of tables\n  // and escape ` because of code blocks and spans\n  txt = txt.replace(/([*_~|`])/g, '\\\\$1');\n\n  // escape > because of blockquotes\n  txt = txt.replace(/^(\\s*)>/g, '\\\\$1>');\n\n  // hash character, only troublesome at the beginning of a line because of headers\n  txt = txt.replace(/^#/gm, '\\\\#');\n\n  // horizontal rules\n  txt = txt.replace(/^(\\s*)([-=]{3,})(\\s*)$/, '$1\\\\$2$3');\n\n  // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer\n  txt = txt.replace(/^( {0,3}\\d+)\\./gm, '$1\\\\.');\n\n  // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)\n  txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\\\$2');\n\n  // images and links, ] followed by ( is problematic, so we escape it\n  txt = txt.replace(/]([\\s]*)\\(/g, '\\\\]$1\\\\(');\n\n  // reference URIs must also be escaped\n  txt = txt.replace(/^ {0,3}\\[([\\S \\t]*?)]:/gm, '\\\\[$1]:');\n\n  return txt;\n});\n\n/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n  'use strict';\n\n  var\n      /**\n       * Options used by this converter\n       * @private\n       * @type {{}}\n       */\n      options = {},\n\n      /**\n       * Language extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      langExtensions = [],\n\n      /**\n       * Output modifiers extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      outputModifiers = [],\n\n      /**\n       * Event listeners\n       * @private\n       * @type {{}}\n       */\n      listeners = {},\n\n      /**\n       * The flavor set in this converter\n       */\n      setConvFlavor = setFlavor,\n\n      /**\n       * Metadata of the document\n       * @type {{parsed: {}, raw: string, format: string}}\n       */\n      metadata = {\n        parsed: {},\n        raw: '',\n        format: ''\n      };\n\n  _constructor();\n\n  /**\n   * Converter constructor\n   * @private\n   */\n  function _constructor () {\n    converterOptions = converterOptions || {};\n\n    for (var gOpt in globalOptions) {\n      if (globalOptions.hasOwnProperty(gOpt)) {\n        options[gOpt] = globalOptions[gOpt];\n      }\n    }\n\n    // Merge options\n    if (typeof converterOptions === 'object') {\n      for (var opt in converterOptions) {\n        if (converterOptions.hasOwnProperty(opt)) {\n          options[opt] = converterOptions[opt];\n        }\n      }\n    } else {\n      throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n      ' was passed instead.');\n    }\n\n    if (options.extensions) {\n      showdown.helper.forEach(options.extensions, _parseExtension);\n    }\n  }\n\n  /**\n   * Parse extension\n   * @param {*} ext\n   * @param {string} [name='']\n   * @private\n   */\n  function _parseExtension (ext, name) {\n\n    name = name || null;\n    // If it's a string, the extension was previously loaded\n    if (showdown.helper.isString(ext)) {\n      ext = showdown.helper.stdExtName(ext);\n      name = ext;\n\n      // LEGACY_SUPPORT CODE\n      if (showdown.extensions[ext]) {\n        console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n          'Please inform the developer that the extension should be updated!');\n        legacyExtensionLoading(showdown.extensions[ext], ext);\n        return;\n        // END LEGACY SUPPORT CODE\n\n      } else if (!showdown.helper.isUndefined(extensions[ext])) {\n        ext = extensions[ext];\n\n      } else {\n        throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n      }\n    }\n\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExt = validate(ext, name);\n    if (!validExt.valid) {\n      throw Error(validExt.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n      }\n      if (ext[i].hasOwnProperty('listeners')) {\n        for (var ln in ext[i].listeners) {\n          if (ext[i].listeners.hasOwnProperty(ln)) {\n            listen(ln, ext[i].listeners[ln]);\n          }\n        }\n      }\n    }\n\n  }\n\n  /**\n   * LEGACY_SUPPORT\n   * @param {*} ext\n   * @param {string} name\n   */\n  function legacyExtensionLoading (ext, name) {\n    if (typeof ext === 'function') {\n      ext = ext(new showdown.Converter());\n    }\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n    var valid = validate(ext, name);\n\n    if (!valid.valid) {\n      throw Error(valid.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n        default:// should never reach here\n          throw Error('Extension loader error: Type unrecognized!!!');\n      }\n    }\n  }\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   */\n  function listen (name, callback) {\n    if (!showdown.helper.isString(name)) {\n      throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n    }\n\n    if (typeof callback !== 'function') {\n      throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n    }\n    name = name.toLowerCase();\n    if (!listeners.hasOwnProperty(name)) {\n      listeners[name] = [];\n    }\n    listeners[name].push(callback);\n  }\n\n  function rTrimInputText (text) {\n    var rsp = text.match(/^\\s*/)[0].length,\n        rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n    return text.replace(rgx, '');\n  }\n\n  /**\n   *\n   * @param {string} evtName Event name\n   * @param {string} text Text\n   * @param {{}} options Converter Options\n   * @param {{}} globals Converter globals\n   * @param {{}} [pParams] extra params for event\n   * @returns showdown.helper.Event\n   * @private\n   */\n  this._dispatch = function dispatch (evtName, text, options, globals, pParams) {\n    evtName = evtName.toLowerCase();\n    var params = pParams || {};\n    params.converter = this;\n    params.text = text;\n    params.options = options;\n    params.globals = globals;\n    var event = new showdown.helper.Event(evtName, text, params);\n\n    if (listeners.hasOwnProperty(evtName)) {\n      for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n        var nText = listeners[evtName][ei](event);\n        if (nText && typeof nText !== 'undefined') {\n          event.setText(nText);\n        }\n      }\n    }\n    return event;\n  };\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   * @returns {showdown.Converter}\n   */\n  this.listen = function (name, callback) {\n    listen(name, callback);\n    return this;\n  };\n\n  /**\n   * Converts a markdown string into HTML string\n   * @param {string} text\n   * @returns {*}\n   */\n  this.makeHtml = function (text) {\n    //check if text is not falsy\n    if (!text) {\n      return text;\n    }\n\n    var globals = {\n      gHtmlBlocks:     [],\n      gHtmlMdBlocks:   [],\n      gHtmlSpans:      [],\n      gUrls:           {},\n      gTitles:         {},\n      gDimensions:     {},\n      gListLevel:      0,\n      hashLinkCounts:  {},\n      langExtensions:  langExtensions,\n      outputModifiers: outputModifiers,\n      converter:       this,\n      ghCodeBlocks:    [],\n      metadata: {\n        parsed: {},\n        raw: '',\n        format: ''\n      }\n    };\n\n    // This lets us use ¨ trema as an escape char to avoid md5 hashes\n    // The choice of character is arbitrary; anything that isn't\n    // magic in Markdown will work.\n    text = text.replace(/¨/g, '¨T');\n\n    // Replace $ with ¨D\n    // RegExp interprets $ as a special character\n    // when it's in a replacement string\n    text = text.replace(/\\$/g, '¨D');\n\n    // Standardize line endings\n    text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n    text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n    // Stardardize line spaces\n    text = text.replace(/\\u00A0/g, '&nbsp;');\n\n    if (options.smartIndentationFix) {\n      text = rTrimInputText(text);\n    }\n\n    // Make sure text begins and ends with a couple of newlines:\n    text = '\\n\\n' + text + '\\n\\n';\n\n    // detab\n    text = showdown.subParser('makehtml.detab')(text, options, globals);\n\n    /**\n     * Strip any lines consisting only of spaces and tabs.\n     * This makes subsequent regexs easier to write, because we can\n     * match consecutive blank lines with /\\n+/ instead of something\n     * contorted like /[ \\t]*\\n+/\n     */\n    text = text.replace(/^[ \\t]+$/mg, '');\n\n    //run languageExtensions\n    showdown.helper.forEach(langExtensions, function (ext) {\n      text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);\n    });\n\n    // run the sub parsers\n    text = showdown.subParser('makehtml.metadata')(text, options, globals);\n    text = showdown.subParser('makehtml.hashPreCodeTags')(text, options, globals);\n    text = showdown.subParser('makehtml.githubCodeBlocks')(text, options, globals);\n    text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);\n    text = showdown.subParser('makehtml.hashCodeTags')(text, options, globals);\n    text = showdown.subParser('makehtml.stripLinkDefinitions')(text, options, globals);\n    text = showdown.subParser('makehtml.blockGamut')(text, options, globals);\n    text = showdown.subParser('makehtml.unhashHTMLSpans')(text, options, globals);\n    text = showdown.subParser('makehtml.unescapeSpecialChars')(text, options, globals);\n\n    // attacklab: Restore dollar signs\n    text = text.replace(/¨D/g, '$$');\n\n    // attacklab: Restore tremas\n    text = text.replace(/¨T/g, '¨');\n\n    // render a complete html document instead of a partial if the option is enabled\n    text = showdown.subParser('makehtml.completeHTMLDocument')(text, options, globals);\n\n    // Run output modifiers\n    showdown.helper.forEach(outputModifiers, function (ext) {\n      text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);\n    });\n\n    // update metadata\n    metadata = globals.metadata;\n    return text;\n  };\n\n  /**\n   * Converts an HTML string into a markdown string\n   * @param src\n   * @returns {string}\n   */\n  this.makeMarkdown = function (src) {\n\n    // replace \\r\\n with \\n\n    src = src.replace(/\\r\\n/g, '\\n');\n    src = src.replace(/\\r/g, '\\n'); // old macs\n\n    // due to an edge case, we need to find this: > <\n    // to prevent removing of non silent white spaces\n    // ex: <em>this is</em> <strong>sparta</strong>\n    src = src.replace(/>[ \\t]+</, '>¨NBSP;<');\n\n    var doc = showdown.helper.document.createElement('div');\n    doc.innerHTML = src;\n\n    var globals = {\n      preList: substitutePreCodeTags(doc)\n    };\n\n    // remove all newlines and collapse spaces\n    clean(doc);\n\n    // some stuff, like accidental reference links must now be escaped\n    // TODO\n    // doc.innerHTML = doc.innerHTML.replace(/\\[[\\S\\t ]]/);\n\n    var nodes = doc.childNodes,\n        mdDoc = '';\n\n    for (var i = 0; i < nodes.length; i++) {\n      mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals);\n    }\n\n    function clean (node) {\n      for (var n = 0; n < node.childNodes.length; ++n) {\n        var child = node.childNodes[n];\n        if (child.nodeType === 3) {\n          if (!/\\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) {\n            node.removeChild(child);\n            --n;\n          } else {\n            child.nodeValue = child.nodeValue.split('\\n').join(' ');\n            child.nodeValue = child.nodeValue.replace(/(\\s)+/g, '$1');\n          }\n        } else if (child.nodeType === 1) {\n          clean(child);\n        }\n      }\n    }\n\n    // find all pre tags and replace contents with placeholder\n    // we need this so that we can remove all indentation from html\n    // to ease up parsing\n    function substitutePreCodeTags (doc) {\n\n      var pres = doc.querySelectorAll('pre'),\n          presPH = [];\n\n      for (var i = 0; i < pres.length; ++i) {\n\n        if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {\n          var content = pres[i].firstChild.innerHTML.trim(),\n              language = pres[i].firstChild.getAttribute('data-language') || '';\n\n          // if data-language attribute is not defined, then we look for class language-*\n          if (language === '') {\n            var classes = pres[i].firstChild.className.split(' ');\n            for (var c = 0; c < classes.length; ++c) {\n              var matches = classes[c].match(/^language-(.+)$/);\n              if (matches !== null) {\n                language = matches[1];\n                break;\n              }\n            }\n          }\n\n          // unescape html entities in content\n          content = showdown.helper.unescapeHTMLEntities(content);\n\n          presPH.push(content);\n          pres[i].outerHTML = '<precode language=\"' + language + '\" precodenum=\"' + i.toString() + '\"></precode>';\n        } else {\n          presPH.push(pres[i].innerHTML);\n          pres[i].innerHTML = '';\n          pres[i].setAttribute('prenum', i.toString());\n        }\n      }\n      return presPH;\n    }\n\n    return mdDoc;\n  };\n\n  /**\n   * Set an option of this Converter instance\n   * @param {string} key\n   * @param {*} value\n   */\n  this.setOption = function (key, value) {\n    options[key] = value;\n  };\n\n  /**\n   * Get the option of this Converter instance\n   * @param {string} key\n   * @returns {*}\n   */\n  this.getOption = function (key) {\n    return options[key];\n  };\n\n  /**\n   * Get the options of this Converter instance\n   * @returns {{}}\n   */\n  this.getOptions = function () {\n    return options;\n  };\n\n  /**\n   * Add extension to THIS converter\n   * @param {{}} extension\n   * @param {string} [name=null]\n   */\n  this.addExtension = function (extension, name) {\n    name = name || null;\n    _parseExtension(extension, name);\n  };\n\n  /**\n   * Use a global registered extension with THIS converter\n   * @param {string} extensionName Name of the previously registered extension\n   */\n  this.useExtension = function (extensionName) {\n    _parseExtension(extensionName);\n  };\n\n  /**\n   * Set the flavor THIS converter should use\n   * @param {string} name\n   */\n  this.setFlavor = function (name) {\n    if (!flavor.hasOwnProperty(name)) {\n      throw Error(name + ' flavor was not found');\n    }\n    var preset = flavor[name];\n    setConvFlavor = name;\n    for (var option in preset) {\n      if (preset.hasOwnProperty(option)) {\n        options[option] = preset[option];\n      }\n    }\n  };\n\n  /**\n   * Get the currently set flavor of this converter\n   * @returns {string}\n   */\n  this.getFlavor = function () {\n    return setConvFlavor;\n  };\n\n  /**\n   * Remove an extension from THIS converter.\n   * Note: This is a costly operation. It's better to initialize a new converter\n   * and specify the extensions you wish to use\n   * @param {Array} extension\n   */\n  this.removeExtension = function (extension) {\n    if (!showdown.helper.isArray(extension)) {\n      extension = [extension];\n    }\n    for (var a = 0; a < extension.length; ++a) {\n      var ext = extension[a];\n      for (var i = 0; i < langExtensions.length; ++i) {\n        if (langExtensions[i] === ext) {\n          langExtensions.splice(i, 1);\n        }\n      }\n      for (var ii = 0; ii < outputModifiers.length; ++ii) {\n        if (outputModifiers[ii] === ext) {\n          outputModifiers.splice(ii, 1);\n        }\n      }\n    }\n  };\n\n  /**\n   * Get all extension of THIS converter\n   * @returns {{language: Array, output: Array}}\n   */\n  this.getAllExtensions = function () {\n    return {\n      language: langExtensions,\n      output: outputModifiers\n    };\n  };\n\n  /**\n   * Get the metadata of the previously parsed document\n   * @param raw\n   * @returns {string|{}}\n   */\n  this.getMetadata = function (raw) {\n    if (raw) {\n      return metadata.raw;\n    } else {\n      return metadata.parsed;\n    }\n  };\n\n  /**\n   * Get the metadata format of the previously parsed document\n   * @returns {string}\n   */\n  this.getMetadataFormat = function () {\n    return metadata.format;\n  };\n\n  /**\n   * Private: set a single key, value metadata pair\n   * @param {string} key\n   * @param {string} value\n   */\n  this._setMetadataPair = function (key, value) {\n    metadata.parsed[key] = value;\n  };\n\n  /**\n   * Private: set metadata format\n   * @param {string} format\n   */\n  this._setMetadataFormat = function (format) {\n    metadata.format = format;\n  };\n\n  /**\n   * Private: set metadata raw text\n   * @param {string} raw\n   */\n  this._setMetadataRaw = function (raw) {\n    metadata.raw = raw;\n  };\n};\n\nvar root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n  define(function () {\n    'use strict';\n    return showdown;\n  });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n  module.exports = showdown;\n\n// Regular Browser loader\n} else {\n  root.showdown = showdown;\n}\n}).call(this);\n\n//# sourceMappingURL=showdown.js.map\n"
  },
  {
    "path": "docs/assets/extra.css",
    "content": ":root {\n  --md-primary-fg-color: rgb(196, 54, 39);\n  --md-accent-fg-color: rgb(62, 139, 138);\n}"
  },
  {
    "path": "docs/available-options.md",
    "content": "!!! warning \"\"\n    Starting from the version `1.6.0` and earlier, all the options are `disabled` by default in the cli tool.\n\n### backslashEscapesHTMLTags\n\nSupport escaping of HTML tags.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.7.2`\n\n=== \"input\"\n    \n    ```html\n    \\<div>foo\\</div>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>&lt;div&gt;foo&lt;/div&gt;</p>\n    ```\n\n### completeHTMLDocument\n\nOutput a complete HTML document, including `<html>`, `<head>`, and `<body>` tags instead of an HTML fragment.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.8.5`\n\n### customizedHeaderId\n\nSet custom ID for a heading.\n\n!!! warning \"\"\n    This option can be overridden with the [`noHeaderId`](#noheaderid) option.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.7.0`\n\n=== \"code\"\n\n    ```html\n    ## Sample heading {mycustomid}\n    ```\n\n=== \"output\"\n\n    ```html\n    <h1 id=\"mycustomid\">This is a heading</h1>\n    ```\n\n!!! hint \"\"\n    For better readability and human-friendliness of the heading IDs, it is also recommended to set the [`ghCompatibleHeaderId`](#ghcompatibleheaderid) option to `true`.\n\n### disableForced4SpacesIndentedSublists\n\nDisable the rule of 4 spaces to indent sub-lists. If enabled, this option effectively reverts to the old behavior where you can indent sub-lists with 2 or 3 spaces.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.5.0`\n\n=== \"input\"\n    \n    ```\n    - one\n      - two\n\n    ...\n\n    - one\n        - two\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <ul>\n    <li>one</li>\n    <li>two</li>\n    </ul>\n    <p>...</p>\n    <ul>\n    <li>one\n        <ul>\n            <li>two</li>\n        </ul>\n    </li>\n    </ul>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <ul>\n    <li>one\n        <ul>\n            <li>two</li>\n        </ul>\n    </li>\n    </ul>\n    <p>...</p>\n    <ul>\n    <li>one\n        <ul>\n            <li>two</li>\n        </ul>\n    </li>\n    </ul>\n    ```\n\n### emoji\n\nEnable emoji support. For more info on available emojis, see https://github.com/showdownjs/showdown/wiki/Emojis (since v.1.8.0)\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.8.0`\n\n=== \"input\"\n    \n    ```\n    this is a :smile: emoji\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>this is a :smile: emoji</p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>this is a 😄 emoji</p>\n    ```\n\n!!! hint \"Full list of supported emojies\"\n\n    Check the [Showdown Wiki](https://github.com/showdownjs/showdown/wiki/Emojis#emoji-list) for a full list of supported emojies.    \n\n### encodeEmails\n\nEnable automatic obfuscation of email addresses. During this process, email addresses are encoded via Character Entities, transforming ASCII email addresses into their equivalent decimal entities.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.6.1`\n\n=== \"input\"\n    \n    ```\n    <myself@example.com>\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <a href=\"mailto:myself@example.com\">myself@example.com</a>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <a href=\"&#109;&#97;&#105;&#108;t&#x6f;&#x3a;&#109;&#x79;s&#x65;&#x6c;&#102;&#64;&#x65;xa&#109;&#112;&#108;&#101;&#x2e;c&#x6f;&#109;\">&#x6d;&#121;s&#101;&#108;f&#x40;&#x65;&#120;a&#x6d;&#x70;&#108;&#x65;&#x2e;&#99;&#x6f;&#109;</a>\n    ```\n\n### excludeTrailingPunctuationFromURLs\n\nExclude trailing punctuation from autolinked URLs: `.` `!` `?` `(` `)`\n\nThis option applies only to links generated by [`simplifiedAutoLink`](#simplifiedautolink).\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.5.1`\n\n=== \"input\"\n    \n    ```\n       check this link www.google.com.\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>check this link <a href=\"www.google.com\">www.google.com.</a></p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>check this link <a href=\"www.google.com\">www.google.com</a>.</p>\n    ```\n\n### ghCodeBlocks\n\nEnable support for GFM code block style syntax (fenced codeblocks).\n\n* type: `boolean`\n* default value: `true`\n* introduced in: `0.3.1`\n\n=== \"example\"\n    \n    ```\n     ```\n     some code here\n\t ```\n    ```\n\n### ghCompatibleHeaderId\n\nGenerate heading IDs compatible with GitHub style: spaces are replaced with dashes, and certain non-alphanumeric chars are removed.\n\n!!! warning \"\"\n    This option can be overridden with the [`noHeaderId`](#noheaderid) option.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.5.5`\n\n=== \"input\"\n    \n    ```\n    # This is a heading with @#$%\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <h1 id=\"thisisaheading\">This is a heading</h1>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <h1 id=\"this-is-a-heading-with-\">This is a heading with @#$%</h1>\n    ```\n\n### ghMentions\n\nEnables support for GitHub `@mentions` that allows you to link to the GitHub profile page of the mentioned username.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.6.0` \n\n=== \"input\"\n    \n    ```\n    hello there @tivie\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>hello there @tivie</p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>hello there <a href=\"https://www.github.com/tivie\">@tivie</a></p>\n    ```\n\n### ghMentionsLink\n\nSpecify where the link generated by `@mentions` should point to. Works only when [`ghMentions: true`](#ghmentions).\n\n* type: `boolean`\n* default value: `https://github.com/{u}`\n* introduced in: `1.6.2`\n\n=== \"input\"\n    \n    ```\n    hello there @tivie\n    ```\n\n=== \"output (value is `https://github.com/{u}`)\"\n\n    ```html\n    <p>hello there <a href=\"https://www.github.com/tivie\">@tivie</a></p>\n    ```\n\n=== \"output (value is `http://mysite.com/{u}/profile`)\"\n\n    ```html\n    <p>hello there <a href=\"//mysite.com/tivie/profile\">@tivie</a></p>\n    ```\n\n### headerLevelStart\n\nSet starting level for the heading tags.\n\n* type: `integer`\n* default value: `1`\n* introduced in: `1.1.0`\n\n=== \"input\"\n    \n    ```\n    # This is a heading\n    ```\n\n=== \"output (value is `1`)\"\n\n    ```html\n    <h1>This is a heading</h1>\n    ```\n\n=== \"output (value is `3`)\"\n\n    ```html\n    <h3>This is a heading</h3>\n    ```\n\n### literalMidWordUnderscores\n\nTreat underscores in the middle of words as literal characters.\n\nUnderscores allow you to specify the words that should be emphasized. However, in some cases, this may be unwanted behavior. With this option enabled, underscores in the middle of words will no longer be interpreted as `<em>` and `<strong>`, but as literal underscores.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n=== \"input\"\n    \n    ```\n    some text with__underscores__in the middle\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>some text with<strong>underscores</strong>in the middle</p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>some text with__underscores__in the middle</p>\n    ```\n\n### metadata\n\nEnable support for document metadata (front-matter). You can define metadata at the top of a document between `««« »»»` or `--- ---` symbols.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.8.5`\n\n=== \"input\"\n    \n    ```js\n    let ref = `referenced value`;\n\n    var markdown = `\n    ---\n    first: Lorem\n    second: Ipsum\n    ref_variable: ${ref}\n    ---\n    `\n\n    var conv = new showdown.Converter({metadata: true});\n    var html = conv.makeHtml(markdown);\n    var metadata = conv.getMetadata();\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```js\n    // console.log(metadata)\n    {\n        first: 'Lorem',\n        second: 'Ipsum',\n        ref_variable: 'referenced value'\n    }\n    ```\n\n### noHeaderId\n\nDisable automatic generation of heading IDs.\n\n!!! warning \"\"\n    Setting the option to `true` overrides the following options:\n    \n    * [`prefixHeaderId`](#prefixheaderid)\n    * [`customizedHeaderId`](#customizedheaderid)\n    * [`ghCompatibleHeaderId`](#ghcompatibleheaderid)\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.1.0`\n\n=== \"input\"\n    \n    ```\n    # This is a heading\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <h1 id=\"thisisaheading\">This is a heading</h1>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <h1>This is a heading</h1>\n    ```\n\n### omitExtraWLInCodeBlocks\n\nOmit trailing newline in code blocks (which is set by default before the closing tag). This option affects both indented and fenced (gfm style) code blocks.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.0.0`\n\n=== \"input\"\n    \n    ```\n        var foo = 'bar';\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <code><pre>var foo = 'bar';\n    </pre></code>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <code><pre>var foo = 'bar';</pre></code>\n    ```\n\n### openLinksInNewWindow\n\nOpen links in new windows.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.7.0`\n\n=== \"input\"\n    \n    ```\n    [link](https://google.com)\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <a href=\"https://google.com\">link</a>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <a href=\"https://google.com\" rel=\"noopener noreferrer\" target=\"_blank\">link</a>\n    ```\n\n### parseImgDimensions\n\nSet image dimensions from within Markdown syntax.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.1.0`\n\n=== \"example\"\n    \n    ```\n    ![foo](foo.jpg =100x80)   set width to 100px and height to 80px\n    ![bar](bar.jpg =100x*)    set width to 100px and height to \"auto\"\n    ![baz](baz.jpg =80%x5em)  set width to 80% and height to 5em\n    ```\n\n### prefixHeaderId\n\nAdd a prefix to the generated heading ID:\n\n* Passing a string will add that string to the heading ID.\n* Passing `true` will add a generic `section` prefix.\n\n!!! warning \"\"\n    This option can be overridden with the [`noHeaderId`](#noheaderid) option.\n\n* type: `string / boolean`\n* default value: `false`\n\n=== \"input\"\n    \n    ```\n    # This is a heading\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <h1 id=\"thisisaheading\">This is a heading</h1>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <h1 id=\"sectionthisisaheading\">This is a heading</h1>\n    ```\n\n=== \"output (value is `showdown`)\"\n\n     ```html\n     <h1 id=\"showdownthisisaheading\">This is a heading</h1>\n     ```\n\n### rawHeaderId\n\nReplace ` ` (space), `'` (single quote), and `\"` (double quote) with `-` (dash) in the generated heading IDs, including prefixes.\n\n!!! danger \"\"\n    **Use with caution** as it might result in malformed IDs.\n\n* type:\n* default value:\n* introduced in: `1.7.3`\n\n### rawPrefixHeaderId\n\nPrevent Showndown from modifying the prefix. Works only when [`prefixHeaderId`](#prefixheaderid) is set to a string value.\n\n!!! danger \"\"\n    **Use with caution** as it might result in malformed IDs. For example, when the prefix contains special characters like `\"` `\\` `/` or others.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.7.3`\n\n### requireSpaceBeforeHeadingText\n\nRequire a space between a heading `#` and the heading text.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.5.3`\n\n=== \"input\"\n    \n    ```\n    #heading\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <h1 id=\"heading\">heading</h1>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>#heading</p>\n    ```\n\n### simpleLineBreaks\n\nParse line breaks as `<br/>` in paragraphs (GitHub-style behavior).\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.5.1`\n\n=== \"input\"\n    \n    ```\n    a line\n    wrapped in two\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>a line\n    wrapped in two</p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>a line<br>\n    wrapped in two</p>\n    ```\n\n### simplifiedAutoLink\n\nEnable automatic linking for plain text URLs.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n=== \"input\"\n    \n    ```\n    Lorem ipsum www.google.com\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <p>Lorem ipsum www.google.com</p>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <p>Lorem ipsum <a href=\"www.google.com\">www.google.com</a></p>\n    ```\n\n### smartIndentationFix\n\nResolve indentation problems related to ES6 template strings in the midst of indented code.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.4.2`\n\n### smoothLivePreview\n\nResolve an awkward effect when a paragraph is followed by a list. This effect appears on some circumstances, in live preview editors.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.1`\n\n!!! example \"awkward effect\"\n    \n    ![](http://i.imgur.com/YQ9iHTL.gif​)\n\n### splitAdjacentBlockquotes\n\nSplit adjacent blockquote blocks.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.8.6`\n\n=== \"input\"\n    \n    ```\n    > Quote #1\n    >> Sub-quote 1\n\n    > Quote #2\n    >> Sub-quote 2\n    ```\n\n=== \"output (value is `false`)\"\n\n    ```html\n    <blockquote>\n      <p>Quote #1</p>\n      <blockquote>\n        <p>Sub-quote 1</p>\n      </blockquote>\n      <p>Quote #2</p>\n      <blockquote>\n        <p>Sub-quote 2</p>\n      </blockquote>\n    </blockquote>\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <blockquote>\n      <p>Quote #1</p>\n      <blockquote>\n        <p>Sub-quote 1</p>\n      </blockquote>\n    </blockquote>\n    <blockquote>\n      <p>Quote #2</p>\n      <blockquote>\n        <p>Sub-quote 2</p>\n      </blockquote>\n    </blockquote>    \n    ```\n\n### strikethrough\n\nEnable support for strikethrough (`<del>`).\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n=== \"input\"\n    \n    ```\n    ~~strikethrough~~\n    ```\n\n=== \"output (value is `true`)\"\n\n    ```html\n    <del>strikethrough</del>\n    ```\n\n### tables\n\nEnable support for tables syntax.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n=== \"example\"\n    \n    ```\n    | h1    |    h2   |      h3 |\n    |:------|:-------:|--------:|\n    | 100   | [a][1]  | ![b][2] |\n    | *foo* | **bar** | ~~baz~~ |\n    ```\n\n### tablesHeaderId\n\nGenerate automatic IDs for table headings. Works only when [`tables: true`](#tables).\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n### tasklists\n\nEnable support for GitHub style tasklists.\n\n* type: `boolean`\n* default value: `false`\n* introduced in: `1.2.0`\n\n=== \"example\"\n    \n    ```\n     - [x] This task is done\n     - [ ] This task is still pending\n    ```\n\n### underline\n\nEnable support for underline. If enabled, underscores will no longer be parsed as `<em>` and `<strong>`.\n\n* type: `boolean`\n* default value: `false`\n* status: `Experimental`\n\n=== \"example\"\n    \n    ```\n    __underlined word__     // double underscores\n\n    ___underlined word___   // triple underscores\n    ```\n"
  },
  {
    "path": "docs/cli.md",
    "content": "Showdown comes bundled with a Command-line interface (CLI) tool that allows you to run Showdown converter from the command line.\n\n## Requirements\n\n* [Node.js](https://nodejs.org/en/)\n\n## Quick start guide\n\n1. Check that Showdown CLI is accessible.\n\n    * If you installed Showdown globally via `npm install showdown -g`, you can access the CLI tool help by typing `showdown -h` in the command line:\n\n        === \"input\"\n\n            ```sh\n            showdown -h\n            ```\n\n        === \"output\"\n\n            ```\n            Usage: showdown <command> [options]\n\n            CLI to Showdownjs markdown parser v3.0.0-alpha\n\n            Options:\n              -V, --version       output the version number\n              -q, --quiet         Quiet mode. Only print errors\n              -m, --mute          Mute mode. Does not print anything\n              -h, --help          display help for command\n\n            Commands:\n              makehtml [options]  Converts markdown into html\n              help [command]      display help for command\n            ```\n\n    * If you installed Showdown locally via `npm install showdown`, open the folder where Showdown is installed, and type `node ./bin/showdown.js -h` in the command line:\n\n        === \"input\"\n\n            ```sh\n            node ./bin/showdown.js -h\n            ```\n\n        === \"output\"\n\n            ```\n            Usage: showdown <command> [options]\n\n            CLI to Showdownjs markdown parser v3.0.0-alpha\n\n            Options:\n              -V, --version       output the version number\n              -q, --quiet         Quiet mode. Only print errors\n              -m, --mute          Mute mode. Does not print anything\n              -h, --help          display help for command\n\n            Commands:\n              makehtml [options]  Converts markdown into html\n              help [command]      display help for command\n            ```\n\n1. Use `makehtml` command to convert your document to HTML. For example:\n\n    !!! example \"Convert `foo.md` into `bar.html`\"\n        \n        ```sh\n        showdown makehtml -i foo.md -o bar.html\n        ```\n\n## Commands\n\n### `makehtml`\n\nConvert a Markdown input into HTML.\n\n**Usage**\n\n```sh\nshowdown makehtml [options]\n```\n\n#### Options\n\n###### `-i / --input`\n\n* Short format: `-i`\n* Alias: `--input`\n* Description: Input source. Usually a `.md` file. If omitted or empty, reads from `stdin`.\n* Examples:\n\n    !!! example \"\"\n\n        ```sh\n        // Read from stdin and output to stdout\n        showdown makehtml -i\n\n        // Read from the foo.md file and output to stdout\n        showdown makehtml --input foo.md\n        ```\n\n###### `-o/--output`\n\n* Short format: `-o`\n* Alias: `--output`\n* Description: Output target. Usually a `.html` file. If omitted or empty, writes to `stdout`.\n* Example:\n\n    !!! example \"\"\n\n        ```sh\n        // Read from the foo.md file and output to bar.html\n        showdown makehtml -i foo.md -o bar.html\n        ```\n\n###### `-a/--append`\n\n* Short format: `-a`\n* Alias: `--append`\n* Description: Append data to output instead of overwriting.\n* Example: \n\n    !!! example \"\"\n\n        ```sh\n        showdown makehtml -a\n        ```\n\n###### `-u/--encoding`\n\n* Short format: `-u`\n* Alias: `--encoding`\n* Description: Specify the input encoding.\n* Example: \n    \n    !!! example \"\"\n\n        ```sh\n        showdown makehtml -u UTF8\n        ```\n\n###### `-e/--extensions`\n\n* Short format: `-e`\n* Alias: `--extension`\n* Description: Load the specified extension(s). Should be valid path(s) to Node-compatible extensions.\n* Example:\n\n    !!! example \"\"\n\n        ```sh\n        showdown makehtml -e ~/twitter.js -e ~/youtube.js\n        ```\n\n###### `-c/--config`\n\n* Short format: `-c`\n* Alias: `--config`\n* Description: Enable or disable parser options.\n* Introduced in: `2.0.1` (Breaking change. See the [`Extra options`](#extra-options) section below)\n* Example: \n\n    !!! example \"\"\n\n        ```sh\n        showdown makehtml -i foo.md -o bar.html -c strikethrough\n        showdown makehtml -i foo.md -o bar.html -c strikethrough -c emoji\n        ```\n\n## Extra options\n\nStarting from the version `2.0.1`, CLI the format of passing extra options has changed. Please make the necessary changes to your code, if required.\n\n=== \"since `v2.0.1`\"\n\n    ```sh\n    showdown makehtml -i foo.md -o bar.html -c strikethrough -c emoji\n    ```\n\n=== \"before `v2.0.1`\"\n\n    ```sh\n    showdown makehtml -i foo.md -o bar.html --strikethrough --emoji\n    ```\n\n\nYou can specify any of the [supported options](available-options.md), and they will be passed to the converter.\n\nThe above commands are equivalent of doing:\n\n```js\nvar conv = new showdown.Converter({strikethrough: true, emoji: true});\n```\n\n!!! warning \"\"\n    In the CLI tool, all the extra options are **disabled** by default. This is the opposite of what is defined for node and browser, where some options, like `ghCodeBlocks` are enabled (for backward compatibility and historical reasons).\n"
  },
  {
    "path": "docs/compatibility.md",
    "content": "## Browsers\n\nShowdown has been tested successfully with:\n\n* <img src=\"https://img.icons8.com/external-tal-revivo-color-tal-revivo/16/000000/external-firefox-a-free-and-open-source-web-browser-developed-by-the-mozilla-foundation-logo-color-tal-revivo.png\"/> Firefox 1.5 and 2.0\n* <img src=\"https://img.icons8.com/color/16/000000/chrome--v1.png\"/> Chrome 12.0\n* <img src=\"https://img.icons8.com/color/16/000000/internet-explorer.png\"/> Internet Explorer 6 and 7\n* <img src=\"https://img.icons8.com/color/16/000000/safari--v1.png\"/> Safari 2.0.4\n* <img src=\"https://img.icons8.com/color/16/000000/opera--v1.png\"/> Opera 8.54 and 9.10\n* <img src=\"https://img.icons8.com/color/16/000000/netscape.png\"/> Netscape 8.1.2\n* <img src=\"https://www.freepngimg.com/save/69063-konqueror-web-kde-manager-file-linux-browser/16x16\"/> Konqueror 3.5.4\n\nGenerally, Showdown should work in any browser that supports ECMA 262 3<sup>rd</sup> Edition (JavaScript 1.5).\n\nThe converter might even work in things that aren't web browsers, like Acrobat. However, no promises.\n\n## Node.js\n\nShowdown is intended to work on any supported Node.js version (see the [Node.js releases schedule](https://nodejs.org/en/about/releases/).\n\nPrevious versions may also be supported, but no accomodations are made to ensure this."
  },
  {
    "path": "docs/configuration.md",
    "content": "You can change Showdown's default behavior via options. \n\n## Set option\n\n### Globally\n\nSetting an option globally affects all Showdown instances.\n\n```js\nshowdown.setOption('optionKey', 'value');\n```\n\n### Locally\n\nSetting an option locally affects the specified Converter object only. You can set local options via:\n\n=== \"Constructor\"\n\n    ```js\n    var converter = new showdown.Converter({optionKey: 'value'});\n    ```\n\n=== \"setOption() method\"\n\n    ```js\n    var converter = new showdown.Converter();\n    converter.setOption('optionKey', 'value');\n    ```\n\n## Get option\n\nShowdown provides both local and global methods to retrieve previously set options:\n\n=== \"getOption()\"\n    \n    ```js\n    // Global\n    var myOption = showdown.getOption('optionKey');\n\n    //Local\n    var myOption = converter.getOption('optionKey');\n    ```\n\n=== \"getOptions()\"\n\n    ```js\n    // Global\n    var showdownGlobalOptions = showdown.getOptions();\n\n    //Local\n    var thisConverterSpecificOptions = converter.getOptions();\n    ```\n\n### Get default options\n\nYou can get Showdown's default options with:\n\n```js\nvar defaultOptions = showdown.getDefaultOptions();\n```"
  },
  {
    "path": "docs/create-extension.md",
    "content": "A Showdown extension is a function that returns an array of language or outputs extensions (henceforth called \"sub-extensions\"). \n\n```js\nvar myext = function () {\n  var myext1 = {\n    type: 'lang',\n    regex: /markdown/g,\n    replace: 'showdown'\n  };\n  var myext2 = {\n    /* extension code */\n  };\n  return [myext1, myext2];\n}\n```\n\nEach sub-extension (`myext1` and `myext2` in the example above) should be an object that defines the behavior of the corresponding sub-extension.\n\n## Sub-extension object properties\n\nA sub-extension object should have a [`type` property](#type) that defines the type of the sub-extension, and either [`regex` and `replace` properties](#regex-and-replace) or a [`filter` property](#filter).\n\n### Type\n\n**Type** is a **required** property that defines the nature of the corresponding sub-extensions. It takes one of the two values:\n\n* **`lang`**: language extension to add new Markdown syntax to Showdown.\n\n    `lang` extensions have the **highest priority** in the subparser order, so they are called after [escaping and normalizing](#escape-and-normalization) the input text and before calling any other subparser (or extension).\n\n    !!! example \"When to use `lang` type\"\n\n        For example, if you want the `^^youtube http://www.youtube.com/watch?v=oHg5SJYRHA0` syntax to automatically be rendered as an embedded YouTube video.\n\n* **`output`**: output extension (or modifier) to alter the HTML output generated by Showdown.\n \n    `output` extensions have the **lowest priority** in the subparser order, so they are called right before the cleanup step and after calling all other subparsers.\n\n    !!! example \"When to use `output` type\"\n\n        For example, if you want the `<div class=\"header\">` to become `<header>`.\n\n### Regex and replace\n\n`regex`/`replace` properties are similar to the Javascript's `string.replace` function and work the same way:\n\n* `regex`: a `string` or a `RegExp` object.\n    \n    If `regex` is a `string`, it will automatically be assigned a `g` (global) modifier, that is, all matches of that string will be replaced.\n\n* `replace` a `string` or a `function`.\n\n    If `replace` is a `string`, you can use the `$1` syntax for group substitution, exactly as if it were making use of `string.replace`.\n\n!!! example \"Regex and replace example\"\n\n    In this example, all the occurrences of `markdown` will be replaced with `showndown`.\n\n    ```js\n    var myext = {\n      type: 'lang',\n      regex: /markdown/g,\n      replace: 'showdown'\n    };\n    ```\n\n### Filter\n\nAlternately, if you'd like to have more control over the modification process, you can use `filter` property.\n\nThis property should be used as a function that acts as a callback. The callback should receive the following parameters:\n\n1. `text`: the source text within the Showdown's engine.\n1. `converter`: the full instance of the current Showdown's converter object.\n1. `options`: the options used to initialize the converter\n\n!!! warning \"\"\n    The filter function **should return the transformed text**. If it doesn't, it will fail **silently** and return an empty output.\n\n!!! example \"Filter example\"\n\n    ```js\n    var myext = {\n      type: 'lang',\n      filter: function (text, converter, options) {\n        // ... do stuff to text ...\n        return text;\n      }\n    };\n    ```\n\n!!! warning \"Use `filter` with care\"\n\n    Although Filter extensions are more powerful, they have a few pitfalls that you should keep in mind before using them, especially regarding the `converter` parameter.\n\n    Since the `converter` parameter passed to the filter function is the fully initialized instance, any change made to it will be propagated outside the scope of the filter function and will remain there until a new converter instance is created. So, **it is not recommended to make ANY change to the converter object**.\n\n    Another aspect is that if you call the `converter` recursively, it will call your extension itself at some point. It may lead to infinite recursion in some circumstances, and it's up to you to prevent this. A simple solution is to place a kind of safeguard to disable your extension if it's called more than x times:\n\n    ```js\n    var x = 0;\n    var myext = {\n      type: 'lang',\n      filter: function (text, converter) {\n        if (x < 3) {\n          ++x;\n          someSubText = converter.makeHtml(someSubText);\n        }\n      } \n    };\n    ```\n\n## Register an extension\n\n\nTo let Showdown know what extensions are available, you need to register them in the Showdown global object.\n\nTo register an extension, call the `showdown.extension` function with two parameters: the first one is the extension name; the second one is the actual extension.\n\n```js\nshowdown.extension('myext', myext);\n```\n\n## Test an extension\n\nThe Showdown test runner is configured to automatically test cases for extensions.\n\nTo add test cases for an extension:\n\n1. Create a new folder under `./test/extensions` that matches with the name of the `.js` file in `./src/extensions`.\n1. Place any test cases into the filter using the `md/html` format. These cases will automatically be executed when running tests.\n\n## Additional information\n\n### Escape and normalization\n\nShowdown performs the following escape/normalization:\n\n* Replaces `¨` (trema) with `¨T`\n* Replaces `$` (dollar sign) with `¨D`\n* Normalizes line endings (`\\r`, `\\r\\n` are converted into `\\n`)\n* Uses `\\r` as a char placeholder\n\n!!! note \"\"\n    This only applies to **language extensions** since these chars are unescaped before output extensions are run.\n\n!!! warning \"\"\n    \n    Keep in mind that these modifications happen **before language extensions** are run, so if your extension relies on any of those chars, you have to make the appropriate adjustments.\n\n\n### Implementation concerns\n\nOne of the concerns is maintaining both client-side and server-side compatibility. You can do this with a few lines of boilerplate code.:\n\n```js\n(function (extension) {\n  if (typeof showdown !== 'undefined') {\n    // global (browser or node.js global)\n    extension(showdown);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['showdown'], extension);\n  } else if (typeof exports === 'object') {\n    // Node, CommonJS-like\n    module.exports = extension(require('showdown'));\n  } else {\n    // showdown was not found so an error is thrown\n    throw Error('Could not find showdown library');\n  }\n}(function (showdown) {\n  // loading extension into showdown\n  showdown.extension('myext', function () {\n    var myext = { /* ... actual extension code ... */ };\n    return [myext];\n  });\n}));\n```\n\nIn the code above, the extension definition is wrapped in a self-executing function to prevent pollution of the global scope. It has another benefit of creating several scope layers that can be useful for interaction between sub-extensions global-wise or local-wise.\n\nIt is also loaded conditionally to make it compatible with different loading mechanisms (such as browser, CommonJS, or AMD).\n"
  },
  {
    "path": "docs/credits.md",
    "content": "=== \"v.2\"\n\n    * [Estevão Santos](https://github.com/tivie)\n    * [SyntaxRules](https://github.com/SyntaxRules)\n\n=== \"v.1\"\n\n    * [Estevão Santos](https://github.com/tivie)\n    * [Pascal Deschênes](https://github.com/pdeschen)\n\n=== \"v.0\"\n\n    * [Corey Innis](http://github.com/coreyti) - Original GitHub project maintainer\n    * [Remy Sharp](https://github.com/remy/) - CommonJS-compatibility and more\n    * [Konstantin Käfer](https://github.com/kkaefer/) - CommonJS packaging\n    * [Roger Braun](https://github.com/rogerbraun) - GitHub-style code blocks\n    * [Dominic Tarr](https://github.com/dominictarr) - Documentation\n    * [Cat Chen](https://github.com/CatChen) - Export fix\n    * [Titus Stone](https://github.com/tstone) - Mocha tests, extension mechanism, bug fixes\n    * [Rob Sutherland](https://github.com/roberocity) - The idea that lead to extensions\n    * [Pavel Lang](https://github.com/langpavel) - Code cleanup\n    * [Ben Combee](https://github.com/unwiredben) - Regex optimization\n    * [Adam Backstrom](https://github.com/abackstrom) - WebKit bug fixes\n    * [Pascal Deschênes](https://github.com/pdeschen) - Grunt support, extension fixes + additions, packaging improvements, documentation\n    * [Estevão Santos](https://github.com/tivie) - Bug fixes and late maintainer\n    * [Hannah Wolfe](https://github.com/ErisDS) - Bug fixes\n    * [Alexandre Courtiol](https://github.com/acourtiol) - Bug fixes and build optimization\n    * [Karthik Balakrishnan](https://github.com/torcellite) - Support for table alignment\n    * [rheber](https://github.com/rheber) - CLI\n    \n\n=== \"Original Project\"\n\n    * [John Gruber](http://daringfireball.net/projects/markdown/) - Author of Markdown\n    * [John Fraser](http://attacklab.net/) - Author of Showdown\n"
  },
  {
    "path": "docs/donations.md",
    "content": "ShowdownJS is a **free** library and it will remain **free forever**.\n\nHowever, maintaining and improving the library costs time and money.\n\nIf you like our work and find it useful, please donate through [PayPal](https://www.paypal.me/tiviesantos).\n\n:heart: :pray: Your contributions are greatly appreciated and will help us with the development of this awesome library."
  },
  {
    "path": "docs/event_system.md",
    "content": "# Event System\n\n## Introduction\n\n\n## The Event Object\n\n\n## Events\n\nEvents are raised when a subparser is run (or about to be run).\nWithin a subparser, the events always follow a certain order (sequence). For instance, **.before** events always run before **.captureStart**.\nEach subparser raises several events sequentially:\n\n 1. **.start**: **always runs** except it subparser is disabled\n\n    Raised when the **subparser has started**, but no capturing or any modification to the text was done.\n    \n    **Always runs** (except if the subparser is deactivated through options).\n    \n    ***Properties***:\n         \n    | property | type      | access     | description                                                        |\n    |----------|-----------|------------|--------------------------------------------------------------------|\n    | input    | string    | read       | The full text that was passed to the subparser                     |\n    | output   | string    | write      | The full text with modification that will be passed along the chain|\n    | regexp   | null      |            |                                                                    |\n    | matches  | null      |            |                                                                    |\n    \n    Usually you would want to use this event if you wish to change the input to the subparser\n     \n 2. **.captureStart**: *might not be run*;\n \n     Raised when a regex match is found and a capture was successful. Some normalization and modification \n     of the regex captured groups might be performed.\n     \n     Might not be run if no regex match is found.\n     \n     ***Properties***:\n     \n     | property | type      | access     | description                                                        |\n     |----------|-----------|------------|--------------------------------------------------------------------|\n     | input    | string    | read       | The captured text                                                  |\n     | output   | string    | write      | The text that will be passed to the subparser/other listeners      |\n     | regexp   | RegExp    | readonly   | Regular Expression used to capture groups                          |\n     | matches  | object    | read/write | Matches groups. Changes to this object are reflected in the output |\n     \n     Usually you would want to use this event if you wish to modify a certain subparser behavior.\n     Exs: remove all title attributes from links; change indentation of code blocks; etc...\n \n 3. **.captureEnd**: *might not be run*;\n \n    Raised after the modifications to the captured text are done but before the replacement is introduced in the document.\n    \n    Might not be run if no regex match is found.\n         \n    ***Properties***:\n    \n    | property   | type      | access     | description                                                                    |\n    |------------|-----------|------------|--------------------------------------------------------------------------------|\n    | input      | string    | read       | The captured text                                                              |\n    | output     | string    | write      | The text that will be passed to the subparser/other listeners                  |\n    | regexp     | RegExp    | readonly   | Regular Expression used to capture groups                                      |\n    | matches    | object    | read/write | Keypairs of matches groups. Changes to this object are reflected in the output |\n    | attributes | object    | read/write | Attributes to add to the HTML output                                           |\n \n 4. **.beforeHash**: *might not be run*;\n \n    Raised before the output is hashed.\n    \n    Always run (except if the subparser was deactivated through options), even if no hashing is performed. \n    \n    ***Properties***:\n        \n    | property | type       | access     | description                                                        |\n    |----------|------------|------------|--------------------------------------------------------------------|\n    | input    | string     | read       | The captured text                                                  |\n    | output   | string     | write      | The text that will be passed to the subparser/other listeners      |\n    | regexp   | null       |            |                                                                    |\n    | matches  | null       |            |                                                                    |\n \n    Usually you would want to use this event if you wish change the subparser output before it is hashed\n \n 5. **.end**: *always runs*;\n \n    Raised when the subparser has finished its work and is about to exit.\n     \n    Always runs (except if the subparser is deactivated through options).\n    \n    ***Properties***:\n    \n    | property | type      | access     | description                                                        |\n    |----------|-----------|------------|--------------------------------------------------------------------|\n    | input    | string    | read       | The partial/full text with the subparser modifications             |\n    | output   | string    | write      | The text that will be passed to other subparsers                   |\n    | regexp   | null      |            |                                                                    |\n    | matches  | null      |            |                                                                    |\n     \n    Usually you would want to use this event if you wish change the subparser hashed output\n\n\n### Special Events\n\nThere are some special events that are useful for *\"positioning\"* a listener extension in the main chain of events.\nUsually these extensions introduce new syntax that, due to precedence \nThese events are always guaranteed to be called, regardless of options or circumstances. \n\n 1. **.before_{subparserName}**: *always runs*\n    \n    Raised just before the **{subparserName} is about to be entered**.\n    \n    ***Properties***:\n         \n    | property | type      | access     | description                                                        |\n    |----------|-----------|------------|--------------------------------------------------------------------|\n    | input    | string    | read       | The full text that was passed to the subparser                     |\n    | output   | string    | write      | The full text with modification that will be passed along the chain|\n    | regexp   | null      |            |                                                                    |\n    | matches  | null      |            |                                                                    |\n    \n 2. **.after**.{subparserName}: *always runs*;\n \n    Raised when the **{subparserName} has exited** and before the next one is called.\n    \n    ***Properties***:\n    \n    | property | type      | access     | description                                                        |\n    |----------|-----------|------------|--------------------------------------------------------------------|\n    | input    | string    | read       | The partial/full text with the subparser modifications             |\n    | output   | string    | write      | The text that will be passed to other subparsers                   |\n    | regexp   | null      |            |                                                                    |\n    | matches  | null      |            |                                                                    |\n\n \n### Notes\n\n - There are 2 main differences between **before.{subparserName}** and **{subparserName}.start**.\n   \n     1. **before.{subparserName}** is always guaranteed to be called, even if the subparser is disabled, \n        while **{subparserName}.start** doesn't.\n        \n        ex: `makehtml.before.strikethrough` is always called even if the option `strikethrough` is false \n        \n     2. **before.{subparserName}** is only raised once in a span context while **{subparserName}.start** is raised\n        everytime **{subparserName}** is called.\n\n    As a rule of thumb, \n\n## Events List\n"
  },
  {
    "path": "docs/extensions-list.md",
    "content": "## Official\n\n* [twitter-extension][1] - Adds support of Twitter usernames and hastags\n* [prettify-extension][2] - Adds [Google Prettify][3] hints to HTML output\n\n## Community\n\n* [showdown-icon][4] - Adds support of Glyphicon and font-awesome into Markdown\n* [showdown-xss-filter][5] - Filters XSS, using leizongmin/js-xss\n* [showdown-toc][6] - Adds Table of Contents\n* [showdown-footnotes][7] - Adds simple footnotes\n* [katex-latex][8] - Displays math using KaTeX and LaTeX or AsciiMath\n\n!!! note \"\"\n    If you have a Showdown extension you would like to add here, you can [raise an issue](https://github.com/showdownjs/showdown/issues).\n\n[1]: https://github.com/showdownjs/twitter-extension\n[2]: https://github.com/showdownjs/prettify-extension\n[3]: https://github.com/googlearchive/code-prettify\n[4]: https://github.com/dbtek/showdown-icon\n[5]: https://github.com/VisionistInc/showdown-xss-filter\n[6]: https://github.com/ravisorg/showdown-toc\n[7]: https://github.com/Kriegslustig/showdown-footnotes\n[8]: https://obedm503.github.io/showdown-katex\n"
  },
  {
    "path": "docs/extensions.md",
    "content": "Showdown allows you to load additional functionality via extensions. You can find a list of known Showdown extensions [here][ext-wiki].\n\nYou can also check the [boilerplate repo][boilerplate-repo], to create your own extension(s).\n\n## Usage\n\n=== \"Server-side\"\n\n    ```js\n    // Using a bundled extension\n    var showdown = require('showdown');\n    var converter = new showdown.Converter({ extensions: ['twitter'] });\n\n    // Using a custom extension\n    var mine = require('./custom-extensions/mine');\n    var converter = new showdown.Converter({ extensions: ['twitter', mine] });\n    ```\n\n=== \"Client-side\"\n\n    ```js\n    <script src=\"src/showdown.js\"></script>\n    <script src=\"src/extensions/twitter.js\"></script>\n    <script>var converter = new showdown.Converter({ extensions: ['twitter'] });</script>\n    ```\n\n=== \"CLI\"\n\n    In the CLI tool, use the [`-e` flag](/cli/#-e-extensions) to load an extension.\n\n    ```sh\n    showdown -e twitter -i foo.md -o bar.html\n    ```\n\n[ext-wiki]: https://github.com/showdownjs/showdown/wiki/extensions\n[boilerplate-repo]: https://github.com/showdownjs/extension-boilerplate"
  },
  {
    "path": "docs/flavors.md",
    "content": "## Overview\n\nYou can use _flavors_ (or presets) to set the preferred options automatically. In this way, Showdown behaves like popular Markdown flavors.\n\nCurrently, the following flavors are available:\n\n * `original`: Original Markdown flavor as in [John Gruber's spec](https://daringfireball.net/projects/markdown/)\n * `vanilla`:  Showdown base flavor (v1.3.1 onwards)\n * `github`: [GitHub Flavored Markdown, or GFM](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)\n\n## Set flavor\n\n=== \"Globally\"\n\n    ```js\n    showdown.setFlavor('github');\n    ```\n\n=== \"Locally\"\n\n    ```js\n    converter.setFlavor('github');\n    ```"
  },
  {
    "path": "docs/index.md",
    "content": "# Showdown documentation\n\n![Showdown][sd-logo]\n\n![Build Status: Linux](https://github.com/showdownjs/showdown/actions/workflows/node.linux.yml/badge.svg)\n![Build Status: Windows](https://github.com/showdownjs/showdown/actions/workflows/node.win.yml/badge.svg)\n[![npm version](https://badge.fury.io/js/showdown.svg)](http://badge.fury.io/js/showdown)\n[![Bower version](https://badge.fury.io/bo/showdown.svg)](http://badge.fury.io/bo/showdown)\n[![Join the chat at https://gitter.im/showdownjs/showdown](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/showdownjs/showdown?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/tiviesantos)\n\nShowdown is a JavaScript Markdown to HTML converter, based on the original works by John Gruber.\nShowdown can be used on the client-side (in the browser) or server-side (with Node.js).\n\n----\n\n## Live demo\n\n<http://demo.showdownjs.com/>\n\n## Who uses Showdown (or a fork)\n\n* [Antmarky](https://github.com/bandantonio/antmarky)\n* [GoogleCloudPlatform](https://github.com/GoogleCloudPlatform)\n* [Meteor](https://www.meteor.com/)\n* [StackExchange](http://stackexchange.com/) - forked as [PageDown](https://code.google.com/p/pagedown/)\n* [docular](https://github.com/Vertafore/docular)\n* [md-page](https://github.com/oscarmorrison/md-page)\n* [QCObjects](https://qcobjects.dev)\n* [and some others](https://www.npmjs.com/browse/depended/showdown)\n\n## Installation\n\nTo install Showdown, follow the instructions from the [Quickstart guide](quickstart.md).\n\n\n## License\n\nShowdownJS v 2.0 is release under the MIT version.\n\nPrevious versions are release under BSD.\n\n[sd-logo]: https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\n[wiki]: https://github.com/showdownjs/showdown/wiki\n[cli-wiki]: https://github.com/showdownjs/showdown/wiki/CLI-tool\n[definitely-typed]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/showdown\n[xss-wiki]: https://github.com/showdownjs/showdown/wiki/Markdown's-XSS-Vulnerability-(and-how-to-mitigate-it)\n[ext-wiki]: https://github.com/showdownjs/showdown/wiki/extensions\n[coding-rules]: https://github.com/showdownjs/code-style/blob/master/README.md\n[ng-commit-guide]: https://github.com/showdownjs/code-style/blob/master/README.md#commit-message-convention\n[boilerplate-repo]: https://github.com/showdownjs/extension-boilerplate"
  },
  {
    "path": "docs/integrations.md",
    "content": "## AngularJS\n\nShowdownJS project provides seamless integration with AngularJS via a plugin.\n\nCheck [`ng-showdown`](https://github.com/showdownjs/ngShowdown) repository for more information.\n\n## TypeScript\n\nIf you're using TypeScript, you may want to use the types from the [DefinitelyTyped][definitely-typed] repository.\n\n## SystemJS/JSPM\n\nTo integrate ShowdownJS with SystemJS, you can use a third-party [system-md plugin](https://github.com/guybedford/system-md).\n\n## Vue.js\n\nTo use ShowdownJS as a Vue component, you can check [vue-showdown](https://vue-showdown.js.org/).\n\n\n[definitely-typed]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/showdown"
  },
  {
    "path": "docs/markdown-syntax.md",
    "content": "## Introduction\n\nShowdown was created by John Fraser as a direct port of the original parser written by Markdown's creator, John Gruber.\n\nAlthough Showdown has evolved since its inception, in \"vanilla mode\", it tries to follow the [original markdown spec][md-spec] (henceforth referred as vanilla) as much as possible. There are, however, a few important differences, mainly due to inconsistencies in the original spec, which Showdown addressed following the author's advice as stated in the [markdown's \"official\" newsletter][md-newsletter].\n\nShowdown also supports opt-in features, that is, an \"extra\" syntax that is not defined in the original spec. Users can enable these features via options (All the new syntax elements are disabled by default).\n\nThis document provides a quick reference of the supported syntax and the differences in output from the original markdown.pl implementation.\n\n## Paragraphs\n\nParagraphs in Showdown are **one or more lines of consecutive text** followed by one or more blank lines.\n\n```md\nOn July 2, an alien mothership entered Earth's orbit and deployed several dozen \nsaucer-shaped \"destroyer\" spacecraft, each 15 miles (24 km) wide.\n    \nOn July 3, the Black Knights, a squadron of Marine Corps F/A-18 Hornets, \nparticipated in an assault on a destroyer near the city of Los Angeles.\n```\n\nThe implication of the \"one or more consecutive lines of text\" is that Showdown supports \n\"hard-wrapped\" text paragraphs. It means the following examples produce the same output:\n\n```md\nA very long line of text\n```\n\n```md\nA very\nlong line\nof text\n```\n\nIf you **do** want to add soft line breaks (which translate to `<br>` in HTML) to a paragraph, \nyou can do so by adding 3 space characters to the end of the line.\n\nYou can also force every line break in paragraphs to translate to `<br>` (as Github does) by\nenabling the option [**`simpleLineBreaks`**][simpleLineBreaks].\n\n[simpleLineBreaks]: available-options.md#simplelinebreaks\n\n## Headings\n\n### Atx Style\n\nYou can create a heading by adding one or more `#` symbols before your heading text. The number of `#` determines the level of the heading. This is similar to [**atx style**][atx].\n\n```md\n# The 1st level heading (an <h1> tag)\n## The 2nd level heading (an <h2> tag)\n…\n###### The 6th level heading (an <h6> tag)\n```\n\nThe space between `#` and the heading text is not required but you can make it mandatory by enabling the option [**`requireSpaceBeforeHeadingText`**][requireSpaceBeforeHeadingText].\n\n[requireSpaceBeforeHeadingText]: available-options.md#requirespacebeforeheadingtext\n\nYou can wrap the headings in `#`. Both leading and trailing `#` will be removed.\n\n```md\n## My Heading ##\n```\n\nIf, for some reason, you need to keep a leading or trailing `#`, you can either add a space or escape it:\n\n```md\n# # My header # #\n\n#\\# My Header \\# #\n```\n\n### Setext style\n\nYou can also use [**setext style**][setext] headings, although only two levels are available.\n\n```md\nThis is an H1\n=============\n    \nThis is an H2\n-------------\n```\n\n!!! warning \"\"\n    There is an awkward effect when a paragraph is followed by a list. This effect appears on some circumstances, in live preview editors.\n\n    ![awkward effect][]\n\n    You can prevent this by enabling the option [**`smoothPreview`**][smoothlivepreview].\n\n[smoothlivepreview]: available-options.md#smoothlivepreview\n\n### Header IDs\n\nShowdown automatically generates bookmark anchors in titles by adding an id property to a heading.\n\n```md\n# My cool header with ID\n```\n\n```html\n<h1 id=\"mycoolheaderwithid\">My cool header with ID</h1>\n```\n\nThis behavior can be modified with options:\n\n - [**`noHeaderId`**][noHeaderId] disables automatic id generation; \n - [**`ghCompatibleHeaderId`**][ghCompatibleHeaderId] generates header ids compatible with github style (spaces are replaced with dashes and a bunch of non alphanumeric chars are removed)\n - [**`prefixHeaderId`**][prefixHeaderId] adds a prefix to the generated header ids (either automatic or custom).\n - [**`headerLevelStart`**][headerLevelStart] sets the header starting level. For instance, setting this to 3 means that `# header` will be converted to `<h3>`.\n\nRead the [README.md][readme] for more info\n\n[noHeaderId]: available-options.md#noheaderid\n[ghCompatibleHeaderId]: available-options.md#ghcompatibleheaderid\n[prefixHeaderId]: available-options.md#prefixheaderid\n[headerLevelStart]: available-options.md#headerlevelstart\n\n## Blockquotes\n\nYou can indicate blockquotes with a `>`.\n\n```md\nIn the words of Abraham Lincoln:\n    \n> Pardon my french\n```\n\nBlockquotes can have multiple paragraphs and can have other block elements inside.\n\n```md\n> A paragraph of text\n>\n> Another paragraph\n>\n> - A list\n> - with items\n```\n\n## Bold and Italic\n\nYou can make text bold or italic.\n\n```md\n*This text will be italic*\n**This text will be bold**\n```\n\nBoth bold and italic can use either a `*` or an `_` around the text for styling. This allows you to combine both bold and italic if needed.\n\n```md\n**Everyone _must_ attend the meeting at 5 o'clock today.**\n```\n\n## Strikethrough\n\nWith the option [**`strikethrough`**][] enabled, Showdown supports strikethrough elements.\nThe syntax is the same as GFM, that is, by adding two tilde (`~~`) characters around\na word or groups of words.\n\n```md\na ~~strikethrough~~ element\n```\n\na <s>strikethrough</s> element\n\n[strikethrough]: available-options.md#strikethrough\n\n## Emojis\n\nSince version 1.8.0, Showdown supports Github's emojis. A complete list of available emojis can be found [here][emoji list].\n\n```md\nthis is a :smile: smile emoji\n```\n\nthis is a :smile: smile emoji\n\n## Code formatting\n\n### Inline formats\n\nUse single backticks (`) to format text in a special monospace format. Everything within the backticks appear as-is, with no other special formatting.\n\n```md\nHere's an idea: why don't we take `SuperiorProject` and turn it into `**Reasonable**Project`.\n```\n\n```html\n<p>Here's an idea: why don't we take <code>SuperiorProject</code> and turn it into <code>**Reasonable**Project</code>.</p>\n```\n\n### Multiple lines\n\nTo create blocks of code you should indent it by four spaces.\n\n```md\n    this is a piece\n    of\n    code\n```\n\nIf the option [**`ghCodeBlocks`**][ghCodeBlocks] is activated (which is by default), you can use triple backticks <code>```</code> to format text as its own distinct block.\n\n    Check out this neat program I wrote:\n\n    ```\n    x = 0\n    x = 2 + 2\n    what is x\n    ```\n\n[ghCodeBlocks]: available-options.md#ghcodeblocks\n\n## Lists\n\nShowdown supports unordered (bulleted) and ordered (numbered) lists.\n\n### Unordered lists\n\nYou can make an unordered list by preceding list items with either `*`, `-`, or `+`. Markers are interchangeable too.\n\n```md\n* Item\n+ Item\n- Item\n```\n\n### Ordered lists\n\nYou can make an ordered list by preceding list items with a number.\n\n```md\n1. Item 1\n2. Item 2\n3. Item 3\n```\n\n!!! earning \"\"\n    The actual numbers you use to mark the list have no effect on the HTML output that Showdown produces. So you can use the same number in all items if you wish to. For example:\n\n    ```md\n    1. Item 1\n    1. Item 2\n    1. Item 3\n\n    2. Item 1\n    2. Item 2\n    2. Item 3\n    ```\n\n### TaskLists (GFM Style)\n\nShowdown supports GFM-styled takslists if the [**`tasklists`**][tasklists] option is enabled.\n\n```md\n - [x] checked list item\n - [ ] unchecked list item\n``` \n\n - [x] checked list item\n - [ ] unchecked list item\n\n\n[tasklists]: available-options.md#tasklists\n\n### List syntax\n\nList markers typically start at the left margin, but may be indented by up to three spaces. \n\n```md\n* valid list item\n   * this is valid too\n   * this is too  \n```\n\nList markers must be followed by one or more spaces or a tab.\n\nTo make lists look nicer, you can wrap items with hanging indents:\n\n```md\n*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n```\n\nBut if you want to be lazy, you don't have to :grin:\n\nIf one list item is separated by a blank line, Showdown will wrap all the list items in `<p>` tags in the HTML output.\nSo this input:\n\n```md\n* Bird\n\n* Magic\n* Johnson\n```\n\nresults in:\n\n```html\n<ul>\n<li><p>Bird</p></li>\n<li><p>Magic</p></li>\n<li><p>Johnson</p></li>\n</ul>\n```\n\nThis differs from other Markdown implementations such as GFM (GitHub) or CommonMark.  \n\n### Nested blocks\n\nList items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either 4 spaces or one tab:\n\n```md\n1.  This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n```\n\nThis is valid for other block elements such as blockquotes:\n\n```md\n*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.\n```\n\nor even other lists.\n\n### Nested lists\n\nYou can create nested lists by indenting list items by **four** spaces.\n\n```md\n1.  Item 1\n    1. A corollary to the above item.\n    2. Yet another point to consider.\n2.  Item 2\n    * A corollary that does not need to be ordered.\n    * This is indented four spaces\n    * You might want to consider making a new list.\n3.  Item 3\n```\n\nThis behavior is consistent with the original spec but differs from other implementations such as GFM or CommonMark. Prior to version 1.5, you just needed to indent two spaces for it to be considered a sublist.\n\nYou can disable the **four spaces requirement** with option [**`disableForced4SpacesIndentedSublists`**][disableForced4SpacesIndentedSublists]\n\nTo nest a third (or more) sublist level, you need to indent 4 extra spaces (or 1 extra tab) for each level:\n\n```md\n1.  level 1\n    1.  Level 2\n        *   Level 3\n    2.  level 2\n        1.  Level 3\n1.  Level 1\n```\n[disableForced4SpacesIndentedSublists]: available-options.md#disableforced4spacesindentedsublists\n\n### Nested code blocks\n\nYou can nest fenced codeblocks the same way you nest other block elements, by indenting by four spaces or a tab:\n\n```md\n1.  Some code:\n\n    ```js\n    var foo = 'bar';\n    console.log(foo);\n    ```\n```\n\nTo put an *indented style* code block within a list item, the code block needs to be indented twice — 8 spaces or two tabs:\n\n```md\n1.  Some code:\n\n        var foo = 'bar';\n        console.log(foo);\n```\n\n## Links\n\n### Simple\n\nIf you wrap a valid URL or email in `<>` it will be turned into a link whose text is the link itself.\n\n```md\nlink to <http://www.google.com/>\n\nthis is my email <somedude@mail.com>\n```\n\nIn the case of email addresses, Showdown also performs a bit of randomized decimal and hex entity-encoding to help obscure your address from address-harvesting spambots.\nYou can disable this obfuscation by setting [**`encodeEmails`**][encodeEmails] option to `false`.\n\nWith the option [**`simplifiedAutoLink`**][simplifiedAutoLink] enabled, Showdown will automagically turn every valid URL it finds in the text body into links without the need to wrap them in `<>`.\n\n```md\nlink to http://www.google.com/\n\nthis is my email somedude@mail.com\n```\n\n[encodeEmails]: available-options.md#encodeemails\n[simplifiedAutoLink]: available-options.md#simplifiedautolink\n\n### Inline\n\nYou can create an inline link by wrapping link text in brackets `[ ]`, and then wrapping the link in parentheses `( )`.\n\nFor example, a hyperlink to `github.com/showdownjs/showdown`, with a link text that says, `Get Showdown!` will look as follows:\n\n```\n[Get Showdown!](https://github.com/showdownjs/showdown)\n```\n\n### Reference Style\n\nYou can also use the reference style, like this:\n\n```md\nthis is a [link to google][1]\n\n[1]: www.google.com\n```\n\nShowdown also supports implicit link references:\n\n```md\nthis is a link to [google][]\n\n[google]: www.google.com\n```\n\n## Images\n\nIn Markdown, the syntax for images is similar to that of links, supporting both inline and reference styles as well. The only difference in syntax for images is the leading exclamation mark before brackets: `![]`.\n\n### Inline\n\nInline image syntax looks like this:\n\n```md\n![Alt text](url/to/image)\n\n![Alt text](url/to/image \"Optional title\")\n```\n\nThat is:\n\n* An exclamation mark: `!`\n* followed by a set of square brackets `[ ]` containing the alt attribute text for the image\n* followed by a set of parentheses `( )` containing the URL or path to the image and an optional title attribute enclosed in double or single quotes.\n\n\n### Reference Style\n\nReference-style image syntax looks like this:\n\n```md\n![Alt text][id]\n```\n\nWhere `id` is the name of a defined image reference. Image references are defined using syntax identical to link references:\n\n```md\n[id]: url/to/image  \"Optional title attribute\"\n```\n\nImplicit references are also supported:\n\n```md\n![showdown logo][]\n\n[showdown logo]: http://showdownjs.github.io/demo/img/editor.logo.white.png\n```\n\n### Image dimensions\n\nWhen the option [**`parseImgDimensions`**][parseImgDimensions] is activated, you can define the image dimensions, like this:\n\n```md\n![Alt text](url/to/image =250x250 \"Optional title\")\n```\n\nor in reference style:\n\n```md\n![Alt text][id]\n\n[id]: url/to/image =250x250\n```\n\n[parseImgDimensions]: available-options.md#parseimgdimensions\n\n### Base64 encoded images\n\nShowdown supports Base64 encoded images, both reference and inline style.\n\n**Since version 1.7.4**, Showdown supports wrapping of base64 strings, which are usually extremely long lines of text.\nYou can add newlines arbitrarily, as long as they are added after the `,` character.\n\ninline style\n\n```md\n![Alt text](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7l\njmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAY\nSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=)\n```\n\nreference style\n\n```md\n![Alt text][id]\n\n[id]:\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7l\njmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7D\nAcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\n```\n\n!!! warning \"\"\n    With reference-style base64 image sources, regardless of \"wrapping\", a double newline is **required** after the base64 string to separate them from a paragraph or other text block (but references can be adjacent):\n\n    !!! example \"Wrapped reference style\"\n\n        ```md\n        ![Alt text][id]\n        ![Alt text][id2]\n\n        [id]:\n        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7l\n        jmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7D\n        AcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\n        [id2]:\n        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7l\n        jmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7D\n        AcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\n\n\n        this text needs to be separated from the references by 2 newlines\n        ```\n\n## Tables\n\nTables aren't part of the core Markdown spec, but they are part of GFM. You can enable them in Showdown via the option [**`tables`**][tables].\n\n* Colons can be used to align columns.\n* The outer pipes (`|`) are optional, matching GFM spec. \n* You don't need to make the raw Markdown line up prettily.\n* You can use other Markdown syntax inside them.\n\n```md\n| Tables        | Are           | Cool  |\n| ------------- |:-------------:| -----:|\n| **col 3 is**  | right-aligned | $1600 |\n| col 2 is      | *centered*    |   $12 |\n| zebra stripes | ~~are neat~~  |    $1 |\n```\n\n[tables]: available-options.md#tables\n\n## Mentions\n\nShowdown supports GitHub mentions by enabling the option [**`ghMentions`**][mentions]. This will turn every `@username` into a link to their github profile.\n\n```md\nhey @tivie, check this out\n```\n\nSince version 1.6.2, you can customize the generated link in mentions with the option [**`ghMentionsLink`**][ghMentionsLink].\n\nFor example, setting this option to `http://mysite.com/{u}/profile`:\n\n```html\n<p>hey <a href=\"http://mysite.com/tivie/profile\">@tivie</a>, check this out</p>\n```\n\n[mentions]: available-options.md#ghmentions\n[ghMentionsLink]: available-options.md#ghmentionslink\n\n## Handle HTML in markdown documents\n\nShowdown, in most cases, leaves HTML tags untouched in the output document:\n\n```md\nsome markdown **here**\n<div>this is *not* **parsed**</div>\n```\n\n```html\n<p>some markdown <strong>here</strong></p>\n<div>this is *not* **parsed**</div>\n```\n\nHowever, the content of `<code>` and `<pre><code>` tags is always escaped.\n\n```md\nsome markdown **here** with <code>foo & bar <baz></baz></code>\n```\n\n```html\n<p>some markdown <strong>here</strong> with <code>foo &amp; bar &lt;baz&gt;&lt;/baz&gt;</code></p>\n``` \n\nIf you want to enable markdown parsing inside a specific HTML tag, you can use the html attribute **`markdown`**, **`markdown=\"1\"`**, or **`data-markdown=\"1\"`**.\n\n```md\nsome markdown **here**\n<div markdown=\"1\">this is *not* **parsed**</div>\n```\n\n```html\n<p>some markdown <strong>here</strong></p>\n<div markdown=\"1\"><p>this is <em>not</em> <strong>parsed</strong></p></div>\n```\n\n## Escape entities\n\n### Escape markdown entities\n\nShowdown allows you to use backslash (`\\`) to escape characters that have special meaning in markdown's syntax and generate literal characters instead. For example, if you want to surround a word with literal underscores (instead of an HTML `<em>` tag), you can use backslashes before the underscores, like this:\n\n```md\n\\_literal underscores\\_\n```\n\nShowdown provides backslash escapes for the following characters:\n\n```\n\\   backslash\n`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+   plus sign\n-   minus sign (hyphen)\n.   dot\n!   exclamation mark\n```\n\n### Escape HTML tags\n\nSince [version 1.7.2](https://github.com/showdownjs/showdown/tree/1.7.2), backslash escaping of HTML tags is supported when [**`backslashEscapesHTMLTags`**][backslashEscapesHTMLTags] option is enabled.\n\n```md\n\\<div>a literal div\\</div>\n``` \n\n[backslashEscapesHTMLTags]: available-options.md#backslashescapeshtmltags\n\n## Known differences and gotchas\n\nIn most cases, Showdown's output is identical to that of Perl Markdown v1.0.2b7. What follows is a list of all known deviations. Please file an issue if you find more.\n\n* **Since version 1.4.0, Showdown supports the markdown=\"1\" attribute**, but for older versions, this attribute is ignored. This means:\n\n    ```md\n    <div markdown=\"1\">\n          Markdown does *not* work in here.\n    </div>\n    ```\n\n* You can only nest square brackets in link titles to a depth of two levels:\n\n        [[fine]](http://www.github.com/)\n        [[[broken]]](http://www.github.com/)\n\n    If you need more, you can escape them with backslashes.\n\n* A list is **single paragraph** if it has only **1 line break separating items** and it becomes **multi-paragraph if ANY of its items is separated by 2 line breaks**:\n\n    ```md\n    - foo\n\n    - bar\n    - baz\n    ```\n\n    becomes\n\n    ```html\n    <ul>\n      <li><p>foo</p></li>\n      <li><p>bar</p></li>\n      <li><p>baz</p></li>\n    </ul>\n    ```\n\nThis new ruleset is based on the comments of Markdown's author John Gruber in the [Markdown discussion list][md-newsletter].\n\n[md-spec]: http://daringfireball.net/projects/markdown/\n[md-newsletter]: https://pairlist6.pair.net/mailman/listinfo/markdown-discuss\n[atx]: http://www.aaronsw.com/2002/atx/intro\n[setext]: https://en.wikipedia.org/wiki/Setext\n[readme]: https://github.com/showdownjs/showdown/blob/master/README.md\n[awkward effect]: http://i.imgur.com/YQ9iHTL.gif\n[emoji list]: https://github.com/showdownjs/showdown/wiki/emojis"
  },
  {
    "path": "docs/quickstart.md",
    "content": "To quickstart with Showdown, install it as a package (for server-side) or include it to your browser (client-side) via CDN:\n\n## Installation\n\n### Server-side\n\n=== \"npm\"\n\n    ```\n    npm install showdown\n    ```\n\n=== \"bower\"\n\n    ```\n    bower install showdown\n    ```\n\n=== \"NuGet\"\n\n    ```\n    PM> Install-Package showdownjs\n    ```\n\n    More information about the package you can find on the [NuGet website](https://www.nuget.org/packages/showdownjs/).\n\n### Client-side\n\n=== \"jsDelivr\"\n\n    ```\n    https://cdn.jsdelivr.net/npm/showdown@<version>/dist/showdown.min.js\n    ```\n    \n    [Showndown page on jsDelivr](https://www.jsdelivr.com/package/npm/showdown)\n\n=== \"cdnjs\"\n\n    ```\n    https://cdnjs.cloudflare.com/ajax/libs/showdown/<version>/showdown.min.js\n    ```\n\n    [Showndown page on cdnjs](https://cdnjs.com/libraries/showdown)\n\n=== \"unpkg\"\n\n    ```\n    https://unpkg.com/showdown/dist/showdown.min.js\n    ```\n\n    [Showndown page on unpkg](https://unpkg.com/browse/showdown@latest/)\n\n!!! note \"\"\n    Replace `<version>` with an actual full length version you're interested in. For example, `2.0.3`.\n\n## Usage\n\nOnce installed, you can use Showndown according to the chosen method:\n\n### Server-side\n\n!!! example \"Node.js\"\n\n    === \"code\"\n\n        ```js\n        var showdown  = require('showdown'),\n            converter = new showdown.Converter(),\n            text      = '# hello, markdown!',\n            html      = converter.makeHtml(text);\n        ```\n    \n    === \"output\"\n\n        ```html\n        <h1 id=\"hellomarkdown\">hello, markdown!</h1>\n        ```\n\n### Client-side\n\n!!! example \"Browser\"\n\n    === \"code\"\n\n        ```js\n        var converter = new showdown.Converter(),\n            text      = '# hello, markdown!',\n            html      = converter.makeHtml(text);\n        ```\n\n    === \"output\"\n\n        ```html\n        <h1 id=\"hellomarkdown\">hello, markdown!</h1>\n        ```\n\n!!! warning \"Potential XSS vulnerabilities\"\n    Showdown doesn't sanitize the input since Markdown relies on it to parse certain features correctly into HTML. As a result, this may lead to potential XSS injection vulnerabilities.\n\n    Please refer to the [Markdown's XSS vulnerability](xss.md) page for more information.\n\n## Other installation methods\n\n### Tarball\n\nYou can download the latest tarball directly from [releases][releases].\n\n## Previous versions\n\nIf you're looking for Showdown prior to version 1.0.0, you can find them in the [legacy branch][legacy-branch].\n\n## Changelog\n\nThe full changelog is available [here][changelog].\n\n[legacy-branch]: https://github.com/showdownjs/showdown/tree/legacy\n[releases]: https://github.com/showdownjs/showdown/releases\n[changelog]: https://github.com/showdownjs/showdown/blob/master/CHANGELOG.md"
  },
  {
    "path": "docs/tutorials/add-default-class-to-html.md",
    "content": "# Add default class for each HTML element\n\nMany people use CSS kits like Bootstrap, Semantic UI, or others that require default name classes for HTML elements:\n\n```html\n<h1 class=\"ui large header\">1st Heading</h1>\n<h2 class=\"ui medium header\">2nd Heading</h2>\n<ul class=\"ui list\">\n  <li class=\"ui item\">first item</li>\n  <li class=\"ui item\">second item</li>\n</ul>\n```\n\nShowdown does not support this out-of-the-box. But you can create an extension for this:\n\n```js\nconst showdown = require('showdown');\n\nconst classMap = {\n  h1: 'ui large header',\n  h2: 'ui medium header',\n  ul: 'ui list',\n  li: 'ui item'\n}\n\nconst bindings = Object.keys(classMap)\n  .map(key => ({\n    type: 'output',\n    regex: new RegExp(`<${key}(.*)>`, 'g'),\n    replace: `<${key} class=\"${classMap[key]}\" $1>`\n  }));\n\nconst conv = new showdown.Converter({\n  extensions: [...bindings]\n});\n\nconst text = `\n# 1st Heading\n## 2nd Heading\n\n- first item\n- second item\n`;\n```\n\nWith this extension, the output will be as follows:\n\n```html\n​​​​​<h1 class=\"ui large header\">1st Heading</h1>​​​​​\n​​​​​<h2 class=\"ui medium header\">2nd Heading</h2>​​​​​\n​​​​​<ul class=\"ui list\">​​​​​\n  ​​​​​<li class=\"ui item\">first item</li>​​​​​\n  ​​​​​<li class=\"ui item\">second item</li>​​​​​\n​​​​​</ul>​​​​​\n```\n\n## Credits\n\n* Initial creator: [@zusamann](https://github.com/zusamann), [(original issue)](https://github.com/showdownjs/showdown/issues/376).\n* Updated by [@Kameelridder](https://github.com/Kameelridder), [(original issue)](https://github.com/showdownjs/showdown/issues/509).\n"
  },
  {
    "path": "docs/tutorials/index.md",
    "content": "# Tutorials\n\n* [Add default class for each HTML element](add-default-class-to-html.md)\n* [Markdown editor with Showdown](markdown-editor-with-showdown.md)\n* [Use language and output extensions on the same block](use-both-extension-types-together.md)"
  },
  {
    "path": "docs/tutorials/markdown-editor-with-showdown.md",
    "content": "# Markdown editor with Showdown\n\n## Introduction\n\nIn this tutorial, you will create a simple in-browser Markdown editor using Showdown and some of its extensions. The purpose is to show how easy it is to include and configure Showdown in your project.\n\nThe fully working example you can see in [Fiddle][1].\n\n## Step 1: Prepare project\n\n1. Install [node.js](https://nodejs.org/en/).\n1. Install project package management tool\n\n    !!! info \"\"\n        Showdown core library doesn't have any dependencies so the setup is pretty straightforward. However, you are strongly encouraged to use a package manager such as [**npm**](http://npmjs.com) or [**yarn**](https://yarnpkg.com) to manage project dependencies.\n\n    To install package management tool:\n\n    1. Create a directory called `showdown-editor` and recreate the following structure:\n\n        ```\n        showdown-editor\n        ├── css\n        │   └── style.css\n        ├── js\n        │   └── script.js\n        └── index.html\n        ```\n\n    1. Initialize `package.json` file by running the following interactive console command:\n\n        ```\n        npm init -y\n        ```\n\n        This command creates `package.json` file in the root of the project folder, and populates the default content that you can change later if you wish.\n\n## Step 2: Install Showdown\n\nInside the `showdown-editor` directory, run the following command:\n\n```\nnpm install showdown --save\n```\n\nThis command will install `showdown` inside the `node_modules` directory and save `showdown` as a dependency in the `package.json` file.\n\n## Step 3: Update project files\n\nAdd the following content to the corresponding project files:\n\n=== \"index.html\"\n\n    ```html\n    <!DOCTYPE HTML>\n    <html>\n    <head>\n      <meta charset=\"UTF-8\"/>\n      <link rel=\"stylesheet\" href=\"css/style.css\"/>\n    </head>\n    <body>\n      \n      <textarea id=\"sourceTA\" rows=\"10\" cols=\"82\">\n    Showdown Tutorial\n    =================\n\n    This is a showdown tutorial. \n\n    Showdown supports a number of cool features, namely:\n\n      - headers \n      - lists\n      - and other stuff too\n      \n    It is also possible to include code:\n\n        var foo = 'bar';\n        \n        var baz = {\n          markdown: 'is great',\n          showdown: 'is awesome'\n        }\n\n    Don't forget to check the [extensions wiki][1].\n\n    [1]: https://github.com/showdownjs/showdown/wiki/extensions\n      </textarea>\n      <hr/>\n      <button id=\"runBtn\" onClick=\"run()\">Convert</button>\n      <hr/>\n      <div id=\"targetDiv\"></div>\n      \n      <script src=\"node_modules/showdown/dist/showdown.min.js\"></script>\n      <script src=\"js/script.js\"></script>\n    </body>\n    </html>\n    ```\n\n    !!! warning \"\"\n        Please note how Showdown and the script file are included to the `index.html` via the `script` tag at the bottom of the file.\n\n=== \"style.css\"\n\n    ```css\n    #sourceTA {\n      display: block;\n    }\n    #targetDiv {\n      border: 1px dashed #333333;\n      width: 600px;\n      height: 400px;\n    }\n    ```\n\n=== \"script.js\"\n\n    ```js\n    function run() {\n      var text = document.getElementById('sourceTA').value,\n      target = document.getElementById('targetDiv'),\n      converter = new showdown.Converter(),\n      html = converter.makeHtml(text);\n      \n      target.innerHTML = html;\n    }\n    ```\n\n    The `script.js` file is simple: when the `runBtn` button is clicked, the script gets the text of the textarea, passes it through Showdown to convert the markdown text into HTML. The resulting HTML is then put inside the `targetDiv`, replacing the previous content.\n\n## Step 4: Check the result\n\n1. Open your `index.html` file. You should see your editor with prefilled markdown text in the text area.\n1. Click `Convert` button. You show see the text to be converted to HTML:\n\n    ![](../assets/markdown-editor.png)\n\nThe fully working example you can see in [Fiddle][1].\n\n## Conclusion\n\nCongratulations! :tada: You have successfully created a simple Markdown editor!\n\n[1]: http://jsfiddle.net/tivie/6bnpptkb/"
  },
  {
    "path": "docs/tutorials/use-both-extension-types-together.md",
    "content": "# Use language and output extensions on the same block\n\n## Overview\n\nShowdown allows you to define and use any number of extensions that act on the same block. These extensions can be executed sequentially or at different moments.\n\nThis enables you to pre-parse/mark a block of text but defer any modifications for the last by using a combination of language and output extensions.\n\nThis is useful if you, for example, don't want Showdown to parse the contents of your new language construct.\n\n## Example\n\nLet's say you create an extension that captures everything between `%start%` and `%end%`. However, that content should not be modified by Showdown. Obviously, you can use `<pre>` tags but that is beside the point.\n\nAlthough Showdown doesn't have any flag to prevent parsing the content of an extension, the same effect can be easily achieved by using lang and output extensions together.\n\n!!! example \"\"\n    The fully working example you can see in [Fiddle][1].\n\n### Code\n\n[Create your extensions](../create-extension.md) with the following content:\n\n```js\nshowdown.extension('myExt', function() {\n  var matches = [];\n  return [\n    { \n      type: 'lang',\n      regex: /%start%([^]+?)%end%/gi,\n      replace: function(s, match) { \n        matches.push(match);\n        var n = matches.length - 1;\n        return '%PLACEHOLDER' + n + '%';\n      }\n    },\n    {\n      type: 'output',\n      filter: function (text) {\n        for (var i=0; i< matches.length; ++i) {\n          var pat = '<p>%PLACEHOLDER' + i + '% *<\\/p>';\n          text = text.replace(new RegExp(pat, 'gi'), matches[i]);\n        }\n        //reset array\n        matches = [];\n        return text;\n      }\n    }\n  ]\n});\n```\n\nIn this example, you created a [`lang` extension](../create-extension.md#type) that:\n\n1. Checks for the pseudo tags `%start%` and `%end%`.\n1. Extracts everything in between the tags.\n1. Saves the content between the tags in a variable.\n1. Replaces the saved content with a placeholder to identify the exact position of the extracted text.\n\nand an [`output` extension](../create-extension.md#type) that replaces the placeholder with the saved content, once Showdown is finished parsing.\n\n[1]: http://jsfiddle.net/tivie/1rqr7xy8/"
  },
  {
    "path": "docs/xss.md",
    "content": "# Markdown's XSS vulnerability\n\n## Introduction\n\nCross-Site Scripting (XSS) is a well-known technique to gain access to the private information of users on a website. The attacker injects spurious HTML content (a script) on the web page. This script can read the user’s cookies and do other malicious actions (like steal credentials). As a countermeasure, you should always filter user input for suspicious content. Showdown doesn’t include an XSS filter, so you must provide your own. But be careful in how you do it.\n\n## Markdown is inherently unsafe\n\nMarkdown syntax allows the inclusion of arbitrary HTML. For example, below is a perfectly valid Markdown:\n\n```md\nThis is a regular paragraph.\n\n<table>\n    <tr><td>Foo</td></tr>\n</table>\n\nThis is another regular paragraph.\n```\n\nThis means that an attacker could do something like this:\n\n```md\nThis is a regular paragraph.\n\n<script>alert('xss');</script>\n\nThis is another regular paragraph.\n```\n\nWhile `alert('xss');` is hardly problematic (maybe just annoying) a real-world scenario might be a lot worse. Obviously, you can easily prevent this kind of this straightforward attack. For example, you can define a whitelist for Showdown that will contain a limited set of allowed HTML tags. However, an attacker can easily circumvent this \"defense\".\n\n## Whitelist / blacklist can't prevent XSS\n\nConsider the following Markdown content:\n\n```md\nhello <a href=\"www.google.com\">*you*</a>\n```\n\nAs you can see, it's a link, nothing malicious about this. And `<a>` tags are pretty innocuous, right? Showdown should definitely allow them. But what if the content is slightly altered, like this:\n\n```md\nhello <a name=\"n\" href=\"javascript:alert('xss')\">*you*</a>\n```\n\nNow this is a lot more problematic. Once again, it's not that hard to filter Showdown's input to expunge problematic attributes (such as `href` in `<a>` tags) of scripting attacks. In fact, a regular HTML XSS prevention library should catch this kind of straightforward attack.\n\nAt this point you're probably thinking that the best way is to follow Stackoverflow's cue and disallow embedded HTML in Markdown. Unfortunately it's still not enough.\n\n## Strip HTML tags is not enough\n\nConsider the following Markdown input:\n\n```md\n[some text](javascript:alert('xss'))\n```\n\nShowdown will correctly parse this piece of Markdown input as:\n\n```html\n<a href=\"javascript:alert('xss')\">some text</a>\n```\n\nIn this case, it was Markdown's syntax itself to create the dangerous link. HTML XSS filter cannot catch this. And unless you start striping dangerous words like *javascript* (which would make this article extremely hard to write), there's nothing you can really do to filter XSS attacks from your input. Things get even harder when you tightly mix HTML with Markdown.\n\n## Mixed HTML/Markdown XSS attack\n\nConsider the following piece of Markdown:\n\n```md\n> hello <a name=\"n\"\n> href=\"javascript:alert('xss')\">*you*</a>\n```\n\nIf you apply an XSS filter to filter bad HTML in this Markdown input, the XSS filter, expecting HTML, will likely think the `<a>` tag ends with the first character on the second line and will leave the text snippet untouched. It will probably fail to see that the `href=\"javascript:…\"` is part of the `<a>` element and leave it alone. But when Markdown converts this to HTML, you get this:\n\n```html\n<blockquote>\n <p>hello <a name=\"n\"\n href=\"javascript:alert('xss')\"><em>you</em></a></p>\n</blockquote>\n```\n\nAfter parsing with Markdown, the first `>` on the second line disappears because it was the blockquote marker in the Markdown blockquote syntax. As a result, you’ve got a link containing an XSS attack!\n\nDid Markdown generate the HTML? No, the HTML was already in plain sight in the input. The XSS filter couldn’t catch it because the input doesn’t follow HTML rules: it’s a mix of Markdown and HTML, and the filter doesn’t know a dime about Markdown.\n\n## Mitigate XSS\n\nSo, is it all lost? Not really. The answer is not to filter the *input* but rather the *output*. After the *input* text is converted into full-fledged HTML, you can reliably apply the correct XSS filters to remove any dangerous or malicious content.\n\nAlso, client-side validations are not reliable. It should be a given, but in case you're wondering, you should (almost) never trust data sent by the client. If there's some critical operation you must perform on the data (such as XSS filtering), you should do it *SERVER-SIDE* not client-side.\n\nHTML XSS filtering libraries are useful here since they prevent most of the attacks. However, you should not use them blindly: a library can't predict all the contexts and situations your application may face.\n\n## Conclusion\n\nShowdown tries to convert the input text as closely as possible, without any concerns for XSS attacks or malicious intent. So, the basic rules are:\n\n* **removing HTML entities from Markdown does not prevent XSS**. Markdown syntax can generate XSS attacks.\n* **XSS filtering should be done after Showdown has processed input, not before or during**. If you filter before, it will break some of Markdown’s features and will leave security holes.\n* **perform the necessary filtering server-side, not client-side**. XSS filtering libraries are useful but should not be used blindly.\n\n## Disclaimer\n\nThis page is based on the excellent article: [\"Markdown and XSS\"][1] by [Michel Fortin][2] \n\n[1]: https://michelf.ca/blog/2010/markdown-and-xss/\n[2]: https://github.com/michelf\n"
  },
  {
    "path": "karma.browserstack.js",
    "content": "module.exports = function (config) {\n  config.set({\n    // global config of your BrowserStack account\n    browserStack: {\n      username: process.env.BROWSERSTACK_USERNAME,\n      accessKey: process.env.BROWSERSTACK_ACCESSKEY,\n      project: process.env.BROWSERSTACK_PROJECT_NAME || 'showdown',\n      build: process.env.BROWSERSTACK_BUILD_NAME || require('./package.json').version,\n      name: process.env.COMMIT_MSG || 'Unit Testing'\n    },\n\n    // define browsers\n    customLaunchers: {\n      bstack_chrome_windows: {\n        base: 'BrowserStack',\n        browser: 'chrome',\n        browser_version: '49',\n        os: 'Windows',\n        os_version: '10'\n      },\n      bstack_firefox_windows: {\n        base: 'BrowserStack',\n        browser: 'firefox',\n        browser_version: '44',\n        os: 'Windows',\n        os_version: '10'\n      },\n      bstack_edge_windows: {\n        base: 'BrowserStack',\n        browser: 'edge',\n        browser_version: '15',\n        os: 'Windows',\n        os_version: '10'\n      },\n      bstack_ie11_windows: {\n        base: 'BrowserStack',\n        browser: 'ie',\n        browser_version: '11',\n        os: 'Windows',\n        os_version: '10'\n      },\n      bstack_macos_safari: {\n        base: 'BrowserStack',\n        browser: 'safari',\n        browser_version: '10.1',\n        os: 'OS X',\n        os_version: 'Sierra'\n      },\n      bstack_iphoneX: {\n        base: 'BrowserStack',\n        browser: 'safari',\n        os: 'ios',\n        os_version: '11.0',\n        device: 'iPhone X',\n        real_mobile: true\n      },\n      bstack_android: {\n        base: 'BrowserStack',\n        browser: 'chrome',\n        os: 'android',\n        os_version:'4.4',\n        device: 'Samsung Galaxy Tab 4',\n        realMobile: true\n      }\n    },\n\n    browsers: ['bstack_chrome_windows', 'bstack_firefox_windows', 'bstack_ie11_windows', 'bstack_edge_windows', 'bstack_iphoneX', 'bstack_macos_safari', 'bstack_android'],\n    frameworks: ['mocha', 'chai'],\n    reporters: ['dots', 'BrowserStack'],\n    files: [\n      { pattern: '.build/showdown.js'},\n      { pattern: 'src/options.js'},\n      // tests\n      { pattern: 'test/unit/showdown*.js' }\n      //{ pattern: 'test/functional/showdown*.js' },\n    ],\n    singleRun: true,\n    concurrency: Infinity\n  });\n};\n"
  },
  {
    "path": "karma.conf.js",
    "content": "module.exports = function (config) {\n  config.set({\n    client: {\n      captureConsole: true\n    },\n    browserConsoleLogOptions: {\n      level: 'log',\n      format: '%b %T: %m',\n      terminal: true\n    },\n    logLevel: config.LOG_LOG,\n    frameworks: ['mocha', 'chai'],\n    files: [\n      { pattern: '.build/showdown.js'},\n      { pattern: 'src/options.js'},\n      // tests\n      { pattern: 'test/unit/showdown*.js' },\n      { pattern: 'test/functional/showdown*.js' },\n    ],\n    reporters: ['progress'],\n    port: 9876,  // karma web server port\n    colors: true,\n    browsers: ['ChromeHeadless', 'FirefoxHeadless', 'jsdom'],\n    autoWatch: false,\n    singleRun: true, // Karma captures browsers, runs the tests and exits\n    //concurrency: Infinity,\n    customLaunchers: {\n      'FirefoxHeadless': {\n        base: 'Firefox',\n        flags: [\n          '-headless',\n        ]\n      }\n    },\n  });\n};\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: Showdown documentation\nsite_description: Showdown is a JavaScript Markdown to HTML converter\n\ntheme:\n  name: material\n  logo: http://showdownjs.com/apple-touch-icon.png\n  favicon: http://showdownjs.com/apple-touch-icon.png\n  icon:\n    repo: fontawesome/brands/github\n  features:\n    - navigation.tabs\n\nmarkdown_extensions:\n  - admonition\n  - pymdownx.superfences\n  - pymdownx.tabbed:\n      alternate_style: true \n  - pymdownx.tasklist\n  - pymdownx.emoji:\n      emoji_index: !!python/name:materialx.emoji.twemoji\n      emoji_generator: !!python/name:materialx.emoji.to_svg\n\nextra_css:\n  - assets/extra.css \n  \nrepo_url: https://github.com/showdownjs/showdown\nrepo_name: showdownjs/showdown\nsite_dir: public\n\nnav:\n  - Home:\n    - Introduction: index.md\n    - Donations: donations.md\n    - Credits: credits.md\n  - Quickstart:\n    - Quickstart: quickstart.md\n    - Showdown's Markdown syntax: markdown-syntax.md\n    - Compatibility: compatibility.md\n  - Configuration:\n    - Showdown options: configuration.md\n    - Available options: available-options.md\n    - Flavors: flavors.md\n  - CLI: cli.md\n  - Integrations: integrations.md\n  - Extensions:\n    - Overview: extensions.md\n    - Create an extension: create-extension.md\n    - List of known extensions: extensions-list.md \n  - Tutorials: tutorials/index.md"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"showdown\",\n  \"version\": \"3.0.0-alpha\",\n  \"description\": \"A Markdown to HTML converter written in Javascript\",\n  \"author\": \"Estevão Santos\",\n  \"homepage\": \"http://showdownjs.com/\",\n  \"keywords\": [\n    \"markdown\",\n    \"converter\"\n  ],\n  \"contributors\": [\n    \"John Gruber\",\n    \"John Fraser\",\n    \"Corey Innis\",\n    \"Remy Sharp\",\n    \"Konstantin Käfer\",\n    \"Roger Braun\",\n    \"Dominic Tarr\",\n    \"Cat Chen\",\n    \"Titus Stone\",\n    \"Rob Sutherland\",\n    \"Pavel Lang\",\n    \"Ben Combee\",\n    \"Adam Backstrom\",\n    \"Pascal Deschênes\",\n    \"Estevão Santos\"\n  ],\n  \"funding\": {\n    \"type\": \"individual\",\n    \"url\": \"https://www.paypal.me/tiviesantos\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/showdownjs/showdown.git\",\n    \"web\": \"https://github.com/showdownjs/showdown\"\n  },\n  \"license\": \"MIT\",\n  \"main\": \"./dist/showdown.js\",\n  \"scripts\": {\n    \"test\": \"grunt test\"\n  },\n  \"bin\": {\n    \"showdown\": \"bin/showdown.js\"\n  },\n  \"files\": [\n    \"bin\",\n    \"dist\"\n  ],\n  \"devDependencies\": {\n    \"chai\": \"*\",\n    \"chai-match\": \"*\",\n    \"grunt\": \"^1.4.1\",\n    \"grunt-contrib-clean\": \"^2.0.0\",\n    \"grunt-contrib-concat\": \"^2.0.0\",\n    \"grunt-contrib-jshint\": \"^3.1.0\",\n    \"grunt-contrib-uglify\": \"^5.0.1\",\n    \"grunt-conventional-changelog\": \"^6.1.0\",\n    \"grunt-conventional-github-releaser\": \"^1.0.0\",\n    \"grunt-endline\": \"^0.7.0\",\n    \"grunt-eslint\": \"^24.0.0\",\n    \"grunt-mocha-test\": \"^0.13.3\",\n    \"grunt-simple-mocha\": \"^0.4.0\",\n    \"karma\": \"^6.3.17\",\n    \"karma-browserstack-launcher\": \"^1.6.0\",\n    \"karma-chai\": \"^0.1.0\",\n    \"karma-chrome-launcher\": \"^3.1.1\",\n    \"karma-firefox-launcher\": \"^2.1.2\",\n    \"karma-jsdom-launcher\": \"^12.0.0\",\n    \"karma-mocha\": \"^2.0.1\",\n    \"load-grunt-tasks\": \"^5.1.0\",\n    \"performance-now\": \"^2.1.0\",\n    \"quiet-grunt\": \"^0.2.0\",\n    \"semver-sort\": \"^1.0.0\",\n    \"sinon\": \"*\",\n    \"source-map-support\": \"^0.5.21\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^9.0.0\",\n    \"jsdom\": \"^19.0.0\"\n  },\n  \"overrides\": {\n    \"minimist\": \"^1.2.6\"\n  }\n}\n"
  },
  {
    "path": "performance.json",
    "content": "{\"2.0.0\":[{\"suiteName\":\"Basic\",\"cycles\":50,\"tests\":[{\"name\":\"Simple \\\"Hello World\\\"\",\"time\":0.5814020752906799,\"maxTime\":12.278934955596924,\"minTime\":0.15148591995239258},{\"name\":\"performance.testfile.md\",\"time\":35.49076347827911,\"maxTime\":79.40457594394684,\"minTime\":29.04559099674225}]},{\"suiteName\":\"subParsers\",\"cycles\":20,\"tests\":[{\"name\":\"hashHTMLBlocks\",\"time\":4.561372250318527,\"maxTime\":7.806509017944336,\"minTime\":2.461485981941223},{\"name\":\"anchors\",\"time\":2.9101044595241548,\"maxTime\":6.510464072227478,\"minTime\":1.055580973625183},{\"name\":\"blockQuotes\",\"time\":4.141605257987976,\"maxTime\":19.022807955741882,\"minTime\":2.540547013282776},{\"name\":\"codeBlocks\",\"time\":0.263570636510849,\"maxTime\":0.8583500385284424,\"minTime\":0.19387996196746826},{\"name\":\"codeSpans\",\"time\":0.3651615560054779,\"maxTime\":1.4206420183181763,\"minTime\":0.27775895595550537},{\"name\":\"detab\",\"time\":0.054944151639938356,\"maxTime\":0.11614596843719482,\"minTime\":0.04707300662994385},{\"name\":\"encodeAmpsAndAngles\",\"time\":0.144669109582901,\"maxTime\":0.796051025390625,\"minTime\":0.09184098243713379},{\"name\":\"encodeBackslashEscapes\",\"time\":0.08684400320053101,\"maxTime\":0.2664440870285034,\"minTime\":0.0629270076751709},{\"name\":\"encodeCode\",\"time\":0.6048604607582092,\"maxTime\":1.1443489789962769,\"minTime\":0.5217140913009644},{\"name\":\"escapeSpecialCharsWithinTagAttributes\",\"time\":0.2064647912979126,\"maxTime\":0.2871870994567871,\"minTime\":0.1843109130859375},{\"name\":\"githubCodeBlocks\",\"time\":0.25113869905471803,\"maxTime\":1.0032700300216675,\"minTime\":0.19171404838562012},{\"name\":\"hashBlock\",\"time\":0.038335990905761716,\"maxTime\":0.10441303253173828,\"minTime\":0.034361958503723145},{\"name\":\"hashElement\",\"time\":0.0046201348304748535,\"maxTime\":0.05286991596221924,\"minTime\":0.0013968944549560547},{\"name\":\"hashHTMLSpans\",\"time\":5.228999066352844,\"maxTime\":9.835397958755493,\"minTime\":4.239645004272461},{\"name\":\"hashPreCodeTags\",\"time\":0.15527103543281556,\"maxTime\":0.7053269147872925,\"minTime\":0.11698400974273682},{\"name\":\"headers\",\"time\":2.277534711360931,\"maxTime\":4.824635028839111,\"minTime\":1.6311440467834473},{\"name\":\"horizontalRule\",\"time\":0.1592068076133728,\"maxTime\":0.27559399604797363,\"minTime\":0.14848291873931885},{\"name\":\"images\",\"time\":0.15910540223121644,\"maxTime\":0.3903430700302124,\"minTime\":0.1241079568862915},{\"name\":\"italicsAndBold\",\"time\":0.2797422528266907,\"maxTime\":0.7730040550231934,\"minTime\":0.21085107326507568},{\"name\":\"lists\",\"time\":4.25269467830658,\"maxTime\":8.173315048217773,\"minTime\":3.1456509828567505},{\"name\":\"outdent\",\"time\":0.18059219121932985,\"maxTime\":0.23801898956298828,\"minTime\":0.16182196140289307},{\"name\":\"paragraphs\",\"time\":8.96755729317665,\"maxTime\":11.331398010253906,\"minTime\":7.8572129011154175},{\"name\":\"spanGamut\",\"time\":2.985103452205658,\"maxTime\":4.162191033363342,\"minTime\":2.48593008518219},{\"name\":\"strikethrough\",\"time\":0.006921297311782837,\"maxTime\":0.09889602661132812,\"minTime\":0.001326918601989746},{\"name\":\"stripLinkDefinitions\",\"time\":1.9106478571891785,\"maxTime\":2.8545520305633545,\"minTime\":1.446552038192749},{\"name\":\"tables\",\"time\":0.008185452222824097,\"maxTime\":0.12662196159362793,\"minTime\":0.0015370845794677734},{\"name\":\"unescapeSpecialChars\",\"time\":0.013451296091079711,\"maxTime\":0.07347309589385986,\"minTime\":0.009706974029541016}]}]}"
  },
  {
    "path": "performance.log.md",
    "content": "# Performance Tests for showdown\n\n\n## [version 2.0.0](https://github.com/showdownjs/showdown/tree/2.0.0)\n\n### Test Suite: Basic (50 cycles)\n| test | avgTime | max | min |\n|:-----|--------:|----:|----:|\n|Simple \"Hello World\"|0.581|12.279|0.151|\n|performance.testfile.md|35.491|79.405|29.046|\n\n### Test Suite: subParsers (20 cycles)\n| test | avgTime | max | min |\n|:-----|--------:|----:|----:|\n|hashHTMLBlocks|4.561|7.807|2.461|\n|anchors|2.910|6.510|1.056|\n|blockQuotes|4.142|19.023|2.541|\n|codeBlocks|0.264|0.858|0.194|\n|codeSpans|0.365|1.421|0.278|\n|detab|0.055|0.116|0.047|\n|encodeAmpsAndAngles|0.145|0.796|0.092|\n|encodeBackslashEscapes|0.087|0.266|0.063|\n|encodeCode|0.605|1.144|0.522|\n|escapeSpecialCharsWithinTagAttributes|0.206|0.287|0.184|\n|githubCodeBlocks|0.251|1.003|0.192|\n|hashBlock|0.038|0.104|0.034|\n|hashElement|0.005|0.053|0.001|\n|hashHTMLSpans|5.229|9.835|4.240|\n|hashPreCodeTags|0.155|0.705|0.117|\n|headers|2.278|4.825|1.631|\n|horizontalRule|0.159|0.276|0.148|\n|images|0.159|0.390|0.124|\n|italicsAndBold|0.280|0.773|0.211|\n|lists|4.253|8.173|3.146|\n|outdent|0.181|0.238|0.162|\n|paragraphs|8.968|11.331|7.857|\n|spanGamut|2.985|4.162|2.486|\n|strikethrough|0.007|0.099|0.001|\n|stripLinkDefinitions|1.911|2.855|1.447|\n|tables|0.008|0.127|0.002|\n|unescapeSpecialChars|0.013|0.073|0.010|\n\n\n"
  },
  {
    "path": "src/cli/cli.js",
    "content": "/**\n * Created by tivie\n */\nvar fs = require('fs'),\n    path = require('path'),\n    Command = require('commander').Command,\n    program = new Command(),\n    path1 = path.resolve(__dirname + '/../dist/showdown.js'),\n    path2 = path.resolve(__dirname + '/../../.build/showdown.js'),\n    showdown,\n    version;\n\n// require shodown. We use conditional loading for each use case\nif (fs.existsSync(path1)) {\n  // production. File lives in bin directory\n  showdown = require(path1);\n  version = require(path.resolve(__dirname + '/../package.json')).version;\n} else if (fs.existsSync(path2)) {\n  // testing envo, uses the concatenated stuff for testing\n  showdown = require(path2);\n  version = require(path.resolve(__dirname + '/../../package.json')).version;\n} else {\n  // cold testing (manual) of cli.js in the src file. We load the dist file\n  showdown = require('../../dist/showdown');\n  version = require('../../package.json');\n}\n\n\nprogram\n  .name('showdown')\n  .description('CLI to Showdownjs markdown parser v' + version)\n  .version(version)\n  .usage('<command> [options]')\n  .option('-q, --quiet', 'Quiet mode. Only print errors')\n  .option('-m, --mute', 'Mute mode. Does not print anything');\n\nprogram.command('makehtml')\n  .description('Converts markdown into html')\n\n  .addHelpText('after', '\\n\\nExamples:')\n  .addHelpText('after', '  showdown makehtml -i                     Reads from stdin and outputs to stdout')\n  .addHelpText('after', '  showdown makehtml -i foo.md -o bar.html  Reads \\'foo.md\\' and writes to \\'bar.html\\'')\n  .addHelpText('after', '  showdown makehtml -i --flavor=\"github\"   Parses stdin using GFM style')\n\n  .addHelpText('after', '\\nNote for windows users:')\n  .addHelpText('after', 'When reading from stdin, use option -u to set the proper encoding or run `chcp 65001` prior to calling showdown cli to set the command line to utf-8')\n\n  .option('-i, --input [file]', 'Input source. Usually a md file. If omitted or empty, reads from stdin. Windows users see note below.', true)\n  .option('-o, --output [file]', 'Output target. Usually a html file. If omitted or empty, writes to stdout', true)\n  .option('-u, --encoding <encoding>', 'Sets the input encoding', 'utf8')\n  .option('-y, --output-encoding <encoding>', 'Sets the output encoding', 'utf8')\n  .option('-a, --append', 'Append data to output instead of overwriting. Ignored if writing to stdout', false)\n  .option('-e, --extensions <extensions...>', 'Load the specified extensions. Should be valid paths to node compatible extensions')\n  .option('-p, --flavor <flavor>', 'Run with a predetermined flavor of options. Default is vanilla', 'vanilla')\n  .option('-c, --config <config...>', 'Enables showdown makehtml parser config options. Overrides flavor')\n  .option('--config-help', 'Shows configuration options for showdown parser')\n  .action(makehtmlCommand);\n\nprogram.parse();\n\n\n//\n// HELPER FUCNTIONS\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Messenger helper object to the CLI\n * @param {string} writeMode\n * @param {boolean} supress\n * @param {boolean} mute\n * @constructor\n */\nfunction Messenger (writeMode, supress, mute) {\n  'use strict';\n  writeMode = writeMode || 'stderr';\n  supress = (!!supress || !!mute);\n  mute = !!mute;\n  this._print = (writeMode === 'stdout') ? console.log : console.error;\n\n  this.errorExit = function (e) {\n    if (!mute) {\n      console.error('ERROR: ' + e.message);\n      console.error('Run \\'showdown <command> -h\\' for help');\n    }\n    process.exit(1);\n  };\n\n  this.okExit = function () {\n    if (!mute) {\n      this._print('\\n');\n      this._print('DONE!');\n    }\n    process.exit(0);\n  };\n\n  this.printMsg = function (msg) {\n    if (supress || mute || !msg) {\n      return;\n    }\n    this._print(msg);\n  };\n\n  this.printError = function (msg) {\n    if (mute) {\n      return;\n    }\n    console.error(msg);\n  };\n\n}\n\n/**\n * Helper function to show Showdown Options\n */\nfunction showShowdownOptions () {\n  'use strict';\n  var showdownOptions = showdown.getDefaultOptions(false);\n  console.log('\\nshowdown makehtml config options:');\n  // show showdown options\n  for (var sopt in showdownOptions) {\n    if (showdownOptions.hasOwnProperty(sopt)) {\n      console.log('  ' + sopt + ':', '[default=' + showdownOptions[sopt].defaultValue + ']',showdownOptions[sopt].describe);\n    }\n  }\n  console.log('\\n\\nExample: showdown makehtml -c openLinksInNewWindow ghMentions ghMentionsLink=\"https://google.com\"');\n}\n\n/**\n * Helper function to parse showdown options\n * @param {{}} configOptions\n * @param {{}} defaultOptions\n * @returns {{}}\n */\nfunction parseShowdownOptions (configOptions, defaultOptions) {\n  'use strict';\n  var shOpt = defaultOptions;\n\n  // first prepare passed options\n  if (configOptions) {\n    for (var i = 0; i < configOptions.length; ++i) {\n      var opt = configOptions[i],\n          key = configOptions[i],\n          val = true;\n      if (/=/.test(opt)) {\n        key = opt.split('=')[0];\n        val = opt.split('=')[1];\n      }\n      shOpt[key] = val;\n    }\n  }\n  return shOpt;\n}\n\n/**\n * Reads stdin\n * @returns {string}\n */\nfunction readFromStdIn (encoding) {\n  'use strict';\n  /*\n  // aparently checking the size of stdin is unreliable so we just won't test\n  var size = fs.fstatSync(process.stdin.fd).size;\n  if (size <= 0) {\n    throw new Error('Could not read from stdin, reason: stdin is empty');\n  }\n  */\n  encoding = encoding || 'utf8';\n  try {\n    return fs.readFileSync(process.stdin.fd, encoding).toString();\n  } catch (e) {\n    throw new Error('Could not read from stdin, reason: ' + e.message);\n  }\n}\n\n/**\n * Reads from a file\n * @param {string} file Filepath to dile\n * @param {string} encoding Encoding of the file\n * @returns {Buffer}\n */\nfunction readFromFile (file, encoding) {\n  'use strict';\n  try {\n    return fs.readFileSync(file, encoding);\n  } catch (err) {\n    throw new Error('Could not read from file ' + file + ', reason: ' + err.message);\n  }\n}\n\n/**\n * Writes to stdout\n * @param {string} html\n * @returns {boolean}\n */\nfunction writeToStdOut (html) {\n  'use strict';\n  if (!process.stdout.write(html)) {\n    throw new Error('Could not write to StdOut');\n  }\n}\n\n/**\n * Writes to file\n * @param {string} html HTML to write\n * @param {string} file Filepath\n * @param {boolean} append If the result should be appended\n */\nfunction writeToFile (html, file, append) {\n  'use strict';\n  // If a flag is passed, it means we should append instead of overwriting.\n  // Only works with files, obviously\n  var write = (append) ? fs.appendFileSync : fs.writeFileSync;\n  try {\n    write(file, html);\n  } catch (err) {\n    throw new Error('Could not write to file ' + file + ', readon: ' + err.message);\n  }\n}\n\n/**\n * makehtml command\n * @param {{}} options\n * @param {Command} cmd\n */\nfunction makehtmlCommand (options, cmd) {\n  'use strict';\n\n  // show configuration options for showdown helper if configHelp was passed\n  if (options.configHelp) {\n    showShowdownOptions();\n    return;\n  }\n\n  var quiet = !!(cmd.parent._optionValues.quiet),\n      mute = !!(cmd.parent._optionValues.mute),\n      readMode = (!options.input || options.input === '' || options.input === true) ? 'stdin' : 'file',\n      writeMode = (!options.output || options.output === '' || options.output === true) ? 'stdout' : 'file',\n      msgMode = (writeMode === 'file') ? 'stdout' : 'stderr',\n      // initiate Messenger helper, can maybe be replaced with commanderjs internal stuff\n      messenger = new Messenger(msgMode, quiet, mute),\n      defaultOptions = showdown.getDefaultOptions(true),\n      md, html;\n\n  // deal with flavor first since config flag overrides flavor individual options\n  if (options.flavor) {\n    messenger.printMsg('Enabling flavor ' + options.flavor + '...');\n    defaultOptions = showdown.getFlavorOptions(options.flavor);\n    if (!defaultOptions) {\n      messenger.errorExit(new Error('Flavor ' + options.flavor + ' is not recognised'));\n      return;\n    }\n    messenger.printMsg('OK!');\n  }\n  // store config options in the options.config as an object\n  options.config = parseShowdownOptions(options.config, defaultOptions);\n\n  // print enabled options\n  for (var o in options.config) {\n    if (options.config.hasOwnProperty(o) && options.config[o] === true) {\n      messenger.printMsg('Enabling option ' + o);\n    }\n  }\n\n  // initialize the converter\n  messenger.printMsg('\\nInitializing converter...');\n  var converter;\n  try {\n    converter = new showdown.Converter(options.config);\n  } catch (e) {\n    messenger.errorExit(e);\n    return;\n  }\n  messenger.printMsg('OK!');\n\n  // load extensions\n  if (options.extensions) {\n    messenger.printMsg('\\nLoading extensions...');\n    for (var i = 0; i < options.extensions.length; ++i) {\n      try {\n        messenger.printMsg(options.extensions[i]);\n        var ext = require(options.extensions[i]);\n        converter.addExtension(ext, options.extensions[i]);\n        messenger.printMsg(options.extensions[i] + ' loaded...');\n      } catch (e) {\n        messenger.printError('ERROR: Could not load extension ' + options.extensions[i] + '. Reason:');\n        messenger.errorExit(e);\n      }\n    }\n  }\n\n  messenger.printMsg('...');\n  // read the input\n  messenger.printMsg('Reading data from ' + readMode + '...');\n\n  if (readMode === 'stdin') {\n    try {\n      md = readFromStdIn(options.encoding);\n    } catch (err) {\n      messenger.errorExit(err);\n      return;\n    }\n  } else {\n    try {\n      md = readFromFile(options.input, options.encoding);\n    } catch (err) {\n      messenger.errorExit(err);\n      return;\n    }\n  }\n\n  // process the input\n  messenger.printMsg('Parsing markdown...');\n  html = converter.makeHtml(md);\n\n  // write the output\n  messenger.printMsg('Writing data to ' + writeMode + '...');\n  if (writeMode === 'stdout') {\n    try {\n      writeToStdOut(html);\n    } catch (err) {\n      messenger.errorExit(err);\n      return;\n    }\n  } else {\n    try {\n      writeToFile(html, options.output, options.append);\n    } catch (err) {\n      messenger.errorExit(err);\n      return;\n    }\n  }\n  messenger.okExit();\n}\n"
  },
  {
    "path": "src/converter.js",
    "content": "/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n  'use strict';\n\n  var\n      /**\n       * Options used by this converter\n       * @private\n       * @type {{}}\n       */\n      options = {},\n\n      /**\n       * Language extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      langExtensions = [],\n\n      /**\n       * Output modifiers extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      outputModifiers = [],\n\n      /**\n       * Event listeners\n       * @private\n       * @type {{}}\n       */\n      listeners = {},\n\n      /**\n       * The flavor set in this converter\n       */\n      setConvFlavor = setFlavor,\n\n      /**\n       * Metadata of the document\n       * @type {{parsed: {}, raw: string, format: string}}\n       */\n      metadata = {\n        parsed: {},\n        raw: '',\n        format: ''\n      };\n\n  _constructor();\n\n  /**\n   * Converter constructor\n   * @private\n   */\n  function _constructor () {\n    converterOptions = converterOptions || {};\n\n    for (var gOpt in globalOptions) {\n      if (globalOptions.hasOwnProperty(gOpt)) {\n        options[gOpt] = globalOptions[gOpt];\n      }\n    }\n\n    // Merge options\n    if (typeof converterOptions === 'object') {\n      for (var opt in converterOptions) {\n        if (converterOptions.hasOwnProperty(opt)) {\n          options[opt] = converterOptions[opt];\n        }\n      }\n    } else {\n      throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n      ' was passed instead.');\n    }\n\n    if (options.extensions) {\n      showdown.helper.forEach(options.extensions, _parseExtension);\n    }\n  }\n\n  /**\n   * Parse extension\n   * @param {*} ext\n   * @param {string} [name='']\n   * @private\n   */\n  function _parseExtension (ext, name) {\n\n    name = name || null;\n    // If it's a string, the extension was previously loaded\n    if (showdown.helper.isString(ext)) {\n      ext = showdown.helper.stdExtName(ext);\n      name = ext;\n\n      // LEGACY_SUPPORT CODE\n      if (showdown.extensions[ext]) {\n        console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n          'Please inform the developer that the extension should be updated!');\n        legacyExtensionLoading(showdown.extensions[ext], ext);\n        return;\n        // END LEGACY SUPPORT CODE\n\n      } else if (!showdown.helper.isUndefined(extensions[ext])) {\n        ext = extensions[ext];\n\n      } else {\n        throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n      }\n    }\n\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExt = validate(ext, name);\n    if (!validExt.valid) {\n      throw Error(validExt.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n      }\n      if (ext[i].hasOwnProperty('listeners')) {\n        for (var ln in ext[i].listeners) {\n          if (ext[i].listeners.hasOwnProperty(ln)) {\n            listen(ln, ext[i].listeners[ln]);\n          }\n        }\n      }\n    }\n\n  }\n\n  /**\n   * LEGACY_SUPPORT\n   * @param {*} ext\n   * @param {string} name\n   */\n  function legacyExtensionLoading (ext, name) {\n    if (typeof ext === 'function') {\n      ext = ext(new showdown.Converter());\n    }\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n    var valid = validate(ext, name);\n\n    if (!valid.valid) {\n      throw Error(valid.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n        default:// should never reach here\n          throw Error('Extension loader error: Type unrecognized!!!');\n      }\n    }\n  }\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   */\n  function listen (name, callback) {\n    if (!showdown.helper.isString(name)) {\n      throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n    }\n\n    if (typeof callback !== 'function') {\n      throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n    }\n    name = name.toLowerCase();\n    if (!listeners.hasOwnProperty(name)) {\n      listeners[name] = [];\n    }\n    listeners[name].push(callback);\n  }\n\n  function rTrimInputText (text) {\n    var rsp = text.match(/^\\s*/)[0].length,\n        rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n    return text.replace(rgx, '');\n  }\n\n  /**\n   *\n   * @param {string} evtName Event name\n   * @param {string} text Text\n   * @param {{}} options Converter Options\n   * @param {{}} globals Converter globals\n   * @param {{}} [pParams] extra params for event\n   * @returns showdown.helper.Event\n   * @private\n   */\n  this._dispatch = function dispatch (evtName, text, options, globals, pParams) {\n    evtName = evtName.toLowerCase();\n    var params = pParams || {};\n    params.converter = this;\n    params.text = text;\n    params.options = options;\n    params.globals = globals;\n    var event = new showdown.helper.Event(evtName, text, params);\n\n    if (listeners.hasOwnProperty(evtName)) {\n      for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n        var nText = listeners[evtName][ei](event);\n        if (nText && typeof nText !== 'undefined') {\n          event.setText(nText);\n        }\n      }\n    }\n    return event;\n  };\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   * @returns {showdown.Converter}\n   */\n  this.listen = function (name, callback) {\n    listen(name, callback);\n    return this;\n  };\n\n  /**\n   * Converts a markdown string into HTML string\n   * @param {string} text\n   * @returns {*}\n   */\n  this.makeHtml = function (text) {\n    //check if text is not falsy\n    if (!text) {\n      return text;\n    }\n\n    var globals = {\n      gHtmlBlocks:     [],\n      gHtmlMdBlocks:   [],\n      gHtmlSpans:      [],\n      gUrls:           {},\n      gTitles:         {},\n      gDimensions:     {},\n      gListLevel:      0,\n      hashLinkCounts:  {},\n      langExtensions:  langExtensions,\n      outputModifiers: outputModifiers,\n      converter:       this,\n      ghCodeBlocks:    [],\n      metadata: {\n        parsed: {},\n        raw: '',\n        format: ''\n      }\n    };\n\n    // This lets us use ¨ trema as an escape char to avoid md5 hashes\n    // The choice of character is arbitrary; anything that isn't\n    // magic in Markdown will work.\n    text = text.replace(/¨/g, '¨T');\n\n    // Replace $ with ¨D\n    // RegExp interprets $ as a special character\n    // when it's in a replacement string\n    text = text.replace(/\\$/g, '¨D');\n\n    // Standardize line endings\n    text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n    text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n    // Stardardize line spaces\n    text = text.replace(/\\u00A0/g, '&nbsp;');\n\n    if (options.smartIndentationFix) {\n      text = rTrimInputText(text);\n    }\n\n    // Make sure text begins and ends with a couple of newlines:\n    text = '\\n\\n' + text + '\\n\\n';\n\n    // detab\n    text = showdown.subParser('makehtml.detab')(text, options, globals);\n\n    /**\n     * Strip any lines consisting only of spaces and tabs.\n     * This makes subsequent regexs easier to write, because we can\n     * match consecutive blank lines with /\\n+/ instead of something\n     * contorted like /[ \\t]*\\n+/\n     */\n    text = text.replace(/^[ \\t]+$/mg, '');\n\n    //run languageExtensions\n    showdown.helper.forEach(langExtensions, function (ext) {\n      text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);\n    });\n\n    // run the sub parsers\n    text = showdown.subParser('makehtml.metadata')(text, options, globals);\n    text = showdown.subParser('makehtml.hashPreCodeTags')(text, options, globals);\n    text = showdown.subParser('makehtml.githubCodeBlocks')(text, options, globals);\n    text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);\n    text = showdown.subParser('makehtml.hashCodeTags')(text, options, globals);\n    text = showdown.subParser('makehtml.stripLinkDefinitions')(text, options, globals);\n    text = showdown.subParser('makehtml.blockGamut')(text, options, globals);\n    text = showdown.subParser('makehtml.unhashHTMLSpans')(text, options, globals);\n    text = showdown.subParser('makehtml.unescapeSpecialChars')(text, options, globals);\n\n    // attacklab: Restore dollar signs\n    text = text.replace(/¨D/g, '$$');\n\n    // attacklab: Restore tremas\n    text = text.replace(/¨T/g, '¨');\n\n    // render a complete html document instead of a partial if the option is enabled\n    text = showdown.subParser('makehtml.completeHTMLDocument')(text, options, globals);\n\n    // Run output modifiers\n    showdown.helper.forEach(outputModifiers, function (ext) {\n      text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);\n    });\n\n    // update metadata\n    metadata = globals.metadata;\n    return text;\n  };\n\n  /**\n   * Converts an HTML string into a markdown string\n   * @param src\n   * @returns {string}\n   */\n  this.makeMarkdown = function (src) {\n\n    // replace \\r\\n with \\n\n    src = src.replace(/\\r\\n/g, '\\n');\n    src = src.replace(/\\r/g, '\\n'); // old macs\n\n    // due to an edge case, we need to find this: > <\n    // to prevent removing of non silent white spaces\n    // ex: <em>this is</em> <strong>sparta</strong>\n    src = src.replace(/>[ \\t]+</, '>¨NBSP;<');\n\n    var doc = showdown.helper.document.createElement('div');\n    doc.innerHTML = src;\n\n    var globals = {\n      preList: substitutePreCodeTags(doc)\n    };\n\n    // remove all newlines and collapse spaces\n    clean(doc);\n\n    // some stuff, like accidental reference links must now be escaped\n    // TODO\n    // doc.innerHTML = doc.innerHTML.replace(/\\[[\\S\\t ]]/);\n\n    var nodes = doc.childNodes,\n        mdDoc = '';\n\n    for (var i = 0; i < nodes.length; i++) {\n      mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], options, globals);\n    }\n\n    function clean (node) {\n      for (var n = 0; n < node.childNodes.length; ++n) {\n        var child = node.childNodes[n];\n        if (child.nodeType === 3) {\n          if (!/\\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) {\n            node.removeChild(child);\n            --n;\n          } else {\n            child.nodeValue = child.nodeValue.split('\\n').join(' ');\n            child.nodeValue = child.nodeValue.replace(/(\\s)+/g, '$1');\n          }\n        } else if (child.nodeType === 1) {\n          clean(child);\n        }\n      }\n    }\n\n    // find all pre tags and replace contents with placeholder\n    // we need this so that we can remove all indentation from html\n    // to ease up parsing\n    function substitutePreCodeTags (doc) {\n\n      var pres = doc.querySelectorAll('pre'),\n          presPH = [];\n\n      for (var i = 0; i < pres.length; ++i) {\n\n        if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {\n          var content = pres[i].firstChild.innerHTML.trim(),\n              language = pres[i].firstChild.getAttribute('data-language') || '';\n\n          // if data-language attribute is not defined, then we look for class language-*\n          if (language === '') {\n            var classes = pres[i].firstChild.className.split(' ');\n            for (var c = 0; c < classes.length; ++c) {\n              var matches = classes[c].match(/^language-(.+)$/);\n              if (matches !== null) {\n                language = matches[1];\n                break;\n              }\n            }\n          }\n\n          // unescape html entities in content\n          content = showdown.helper.unescapeHTMLEntities(content);\n\n          presPH.push(content);\n          pres[i].outerHTML = '<precode language=\"' + language + '\" precodenum=\"' + i.toString() + '\"></precode>';\n        } else {\n          presPH.push(pres[i].innerHTML);\n          pres[i].innerHTML = '';\n          pres[i].setAttribute('prenum', i.toString());\n        }\n      }\n      return presPH;\n    }\n\n    return mdDoc;\n  };\n\n  /**\n   * Set an option of this Converter instance\n   * @param {string} key\n   * @param {*} value\n   */\n  this.setOption = function (key, value) {\n    options[key] = value;\n  };\n\n  /**\n   * Get the option of this Converter instance\n   * @param {string} key\n   * @returns {*}\n   */\n  this.getOption = function (key) {\n    return options[key];\n  };\n\n  /**\n   * Get the options of this Converter instance\n   * @returns {{}}\n   */\n  this.getOptions = function () {\n    return options;\n  };\n\n  /**\n   * Add extension to THIS converter\n   * @param {{}} extension\n   * @param {string} [name=null]\n   */\n  this.addExtension = function (extension, name) {\n    name = name || null;\n    _parseExtension(extension, name);\n  };\n\n  /**\n   * Use a global registered extension with THIS converter\n   * @param {string} extensionName Name of the previously registered extension\n   */\n  this.useExtension = function (extensionName) {\n    _parseExtension(extensionName);\n  };\n\n  /**\n   * Set the flavor THIS converter should use\n   * @param {string} name\n   */\n  this.setFlavor = function (name) {\n    if (!flavor.hasOwnProperty(name)) {\n      throw Error(name + ' flavor was not found');\n    }\n    var preset = flavor[name];\n    setConvFlavor = name;\n    for (var option in preset) {\n      if (preset.hasOwnProperty(option)) {\n        options[option] = preset[option];\n      }\n    }\n  };\n\n  /**\n   * Get the currently set flavor of this converter\n   * @returns {string}\n   */\n  this.getFlavor = function () {\n    return setConvFlavor;\n  };\n\n  /**\n   * Remove an extension from THIS converter.\n   * Note: This is a costly operation. It's better to initialize a new converter\n   * and specify the extensions you wish to use\n   * @param {Array} extension\n   */\n  this.removeExtension = function (extension) {\n    if (!showdown.helper.isArray(extension)) {\n      extension = [extension];\n    }\n    for (var a = 0; a < extension.length; ++a) {\n      var ext = extension[a];\n      for (var i = 0; i < langExtensions.length; ++i) {\n        if (langExtensions[i] === ext) {\n          langExtensions.splice(i, 1);\n        }\n      }\n      for (var ii = 0; ii < outputModifiers.length; ++ii) {\n        if (outputModifiers[ii] === ext) {\n          outputModifiers.splice(ii, 1);\n        }\n      }\n    }\n  };\n\n  /**\n   * Get all extension of THIS converter\n   * @returns {{language: Array, output: Array}}\n   */\n  this.getAllExtensions = function () {\n    return {\n      language: langExtensions,\n      output: outputModifiers\n    };\n  };\n\n  /**\n   * Get the metadata of the previously parsed document\n   * @param raw\n   * @returns {string|{}}\n   */\n  this.getMetadata = function (raw) {\n    if (raw) {\n      return metadata.raw;\n    } else {\n      return metadata.parsed;\n    }\n  };\n\n  /**\n   * Get the metadata format of the previously parsed document\n   * @returns {string}\n   */\n  this.getMetadataFormat = function () {\n    return metadata.format;\n  };\n\n  /**\n   * Private: set a single key, value metadata pair\n   * @param {string} key\n   * @param {string} value\n   */\n  this._setMetadataPair = function (key, value) {\n    metadata.parsed[key] = value;\n  };\n\n  /**\n   * Private: set metadata format\n   * @param {string} format\n   */\n  this._setMetadataFormat = function (format) {\n    metadata.format = format;\n  };\n\n  /**\n   * Private: set metadata raw text\n   * @param {string} raw\n   */\n  this._setMetadataRaw = function (raw) {\n    metadata.raw = raw;\n  };\n};\n"
  },
  {
    "path": "src/helpers.js",
    "content": "/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n  showdown.helper = {};\n}\n\nif (typeof this === 'undefined' && typeof window !== 'undefined') {\n  showdown.helper.document = window.document;\n} else {\n  if (typeof this.document === 'undefined' && typeof this.window === 'undefined') {\n    var jsdom = require('jsdom');\n    this.window = new jsdom.JSDOM('', {}).window; // jshint ignore:line\n  }\n  showdown.helper.document = this.window.document;\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function (a) {\n  'use strict';\n  return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function (a) {\n  'use strict';\n  var getType = {};\n  return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function (a) {\n  'use strict';\n  let isArray;\n  if (!Array.isArray) {\n    isArray = function (arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n  } else {\n    isArray = Array.isArray;\n  }\n  return isArray(a);\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function (value) {\n  'use strict';\n  return typeof value === 'undefined';\n};\n\n/**\n * ForEach helper function\n * Iterates over Arrays and Objects (own properties only)\n * @static\n * @param {*} obj\n * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object\n */\nshowdown.helper.forEach = function (obj, callback) {\n  'use strict';\n  // check if obj is defined\n  if (showdown.helper.isUndefined(obj)) {\n    throw new Error('obj param is required');\n  }\n\n  if (showdown.helper.isUndefined(callback)) {\n    throw new Error('callback param is required');\n  }\n\n  if (!showdown.helper.isFunction(callback)) {\n    throw new Error('callback param must be a function/closure');\n  }\n\n  if (typeof obj.forEach === 'function') {\n    obj.forEach(callback);\n  } else if (showdown.helper.isArray(obj)) {\n    for (var i = 0; i < obj.length; i++) {\n      callback(obj[i], i, obj);\n    }\n  } else if (typeof (obj) === 'object') {\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        callback(obj[prop], prop, obj);\n      }\n    }\n  } else {\n    throw new Error('obj does not seem to be an array or an iterable object');\n  }\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n  'use strict';\n  return s.replace(/[_?*+\\/\\\\.^-]/g, '').replace(/\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback (wholeMatch, m1) {\n  'use strict';\n  var charCodeToEscape = m1.charCodeAt(0);\n  return '¨E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {string|void|*}\n */\nshowdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {\n  'use strict';\n  // First we have to escape the escape characters so that\n  // we can build a character class out of them\n  var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n  if (afterBackslash) {\n    regexString = '\\\\\\\\' + regexString;\n  }\n\n  var regex = new RegExp(regexString, 'g');\n  text = text.replace(regex, escapeCharactersCallback);\n\n  return text;\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n  'use strict';\n  var f = flags || '',\n      g = f.indexOf('g') > -1,\n      x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n      l = new RegExp(left, f.replace(/g/g, '')),\n      pos = [],\n      t, s, m, start, end;\n\n  do {\n    t = 0;\n    while ((m = x.exec(str))) {\n      if (l.test(m[0])) {\n        if (!(t++)) {\n          s = x.lastIndex;\n          start = s - m[0].length;\n        }\n      } else if (t) {\n        if (!--t) {\n          end = m.index + m[0].length;\n          var obj = {\n            left: {start: start, end: s},\n            match: {start: s, end: m.index},\n            right: {start: m.index, end: end},\n            wholeMatch: {start: start, end: end}\n          };\n          pos.push(obj);\n          if (!g) {\n            return pos;\n          }\n        }\n      }\n    }\n  } while (t && (x.lastIndex = s));\n\n  return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan <stevenlevithan.com>\n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<<x>\" and \"<x>>\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"<x>\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\"<t<<e>><s>>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<<e>><s>\", \"\"]\n * matchRecursiveRegExp(\"<div id=\\\"x\\\">test</div>\", \"<div\\\\b[^>]*>\", \"</div>\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n  'use strict';\n\n  var matchPos = rgxFindMatchPos (str, left, right, flags),\n      results = [];\n\n  for (var i = 0; i < matchPos.length; ++i) {\n    results.push([\n      str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n      str.slice(matchPos[i].match.start, matchPos[i].match.end),\n      str.slice(matchPos[i].left.start, matchPos[i].left.end),\n      str.slice(matchPos[i].right.start, matchPos[i].right.end)\n    ]);\n  }\n  return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n  'use strict';\n\n  if (!showdown.helper.isFunction(replacement)) {\n    var repStr = replacement;\n    replacement = function () {\n      return repStr;\n    };\n  }\n\n  var matchPos = rgxFindMatchPos(str, left, right, flags),\n      finalStr = str,\n      lng = matchPos.length;\n\n  if (lng > 0) {\n    var bits = [];\n    if (matchPos[0].wholeMatch.start !== 0) {\n      bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n    }\n    for (var i = 0; i < lng; ++i) {\n      bits.push(\n        replacement(\n          str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n          str.slice(matchPos[i].match.start, matchPos[i].match.end),\n          str.slice(matchPos[i].left.start, matchPos[i].left.end),\n          str.slice(matchPos[i].right.start, matchPos[i].right.end)\n        )\n      );\n      if (i < lng - 1) {\n        bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n      }\n    }\n    if (matchPos[lng - 1].wholeMatch.end < str.length) {\n      bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n    }\n    finalStr = bits.join('');\n  }\n  return finalStr;\n};\n\n/**\n * Returns the index within the passed String object of the first occurrence of the specified regex,\n * starting the search at fromIndex. Returns -1 if the value is not found.\n *\n * @param {string} str string to search\n * @param {RegExp} regex Regular expression to search\n * @param {int} [fromIndex = 0] Index to start the search\n * @returns {Number}\n * @throws InvalidArgumentError\n */\nshowdown.helper.regexIndexOf = function (str, regex, fromIndex) {\n  'use strict';\n  if (!showdown.helper.isString(str)) {\n    throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n  }\n  if (!(regex instanceof RegExp)) {\n    throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';\n  }\n  var indexOf = str.substring(fromIndex || 0).search(regex);\n  return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;\n};\n\n/**\n * Splits the passed string object at the defined index, and returns an array composed of the two substrings\n * @param {string} str string to split\n * @param {int} index index to split string at\n * @returns {[string,string]}\n * @throws InvalidArgumentError\n */\nshowdown.helper.splitAtIndex = function (str, index) {\n  'use strict';\n  if (!showdown.helper.isString(str)) {\n    throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n  }\n  return [str.substring(0, index), str.substring(index)];\n};\n\n\n/**\n * MurmurHash3's mixing function\n * https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript/47593316#47593316\n *\n * @param {string} string\n * @returns {Number}\n */\n/*jshint bitwise: false*/\nfunction xmur3 (str) {\n  for (var i = 0, h = 1779033703 ^ str.length; i < str.length; i++) {\n    h = Math.imul(h ^ str.charCodeAt(i), 3432918353);\n    h = h << 13 | h >>> 19;\n  }\n  return function () {\n    h = Math.imul(h ^ h >>> 16, 2246822507);\n    h = Math.imul(h ^ h >>> 13, 3266489909);\n    return (h ^= h >>> 16) >>> 0;\n  };\n}\n\n/**\n * Random Number Generator\n * https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript/47593316#47593316\n *\n * @param {Number} seed\n * @returns {Number}\n */\n/*jshint bitwise: false*/\nfunction mulberry32 (a) {\n  return function () {\n    var t = a += 0x6D2B79F5;\n    t = Math.imul(t ^ t >>> 15, t | 1);\n    t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n    return ((t ^ t >>> 14) >>> 0) / 4294967296;\n  };\n}\n\n/**\n * Obfuscate an e-mail address through the use of Character Entities,\n * transforming ASCII characters into their equivalent decimal or hex entities.\n *\n *\n * @param {string} mail\n * @returns {string}\n */\nshowdown.helper.encodeEmailAddress = function (mail) {\n  'use strict';\n  var encode = [\n    function (ch) {\n      return '&#' + ch.charCodeAt(0) + ';';\n    },\n    function (ch) {\n      return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n    },\n    function (ch) {\n      return ch;\n    }\n  ];\n\n  // RNG seeded with mail, so that we can get determined results for each email.\n  var rand = mulberry32(xmur3(mail));\n\n  mail = mail.replace(/./g, function (ch) {\n    if (ch === '@') {\n      // this *must* be encoded. I insist.\n      ch = encode[Math.floor(rand() * 2)](ch);\n    } else {\n      var r = rand();\n      // roughly 10% raw, 45% hex, 45% dec\n      ch = (\n        r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n      );\n    }\n    return ch;\n  });\n\n  return mail;\n};\n\n/**\n * String.prototype.repeat polyfill\n *\n * @param {string} str\n * @param {int} count\n * @returns {string}\n */\nshowdown.helper.repeat = function (str, count) {\n  'use strict';\n  // use built-in method if it's available\n  if (!showdown.helper.isUndefined(String.prototype.repeat)) {\n    return str.repeat(count);\n  }\n  str = '' + str;\n  if (count < 0) {\n    throw new RangeError('repeat count must be non-negative');\n  }\n  if (count === Infinity) {\n    throw new RangeError('repeat count must be less than infinity');\n  }\n  count = Math.floor(count);\n  if (str.length === 0 || count === 0) {\n    return '';\n  }\n  // Ensuring count is a 31-bit integer allows us to heavily optimize the\n  // main part. But anyway, most current (August 2014) browsers can't handle\n  // strings 1 << 28 chars or longer, so:\n  /*jshint bitwise: false*/\n  if (str.length * count >= 1 << 28) {\n    throw new RangeError('repeat count must not overflow maximum string size');\n  }\n  /*jshint bitwise: true*/\n  var maxCount = str.length * count;\n  count = Math.floor(Math.log(count) / Math.log(2));\n  while (count) {\n    str += str;\n    count--;\n  }\n  str += str.substring(0, maxCount - str.length);\n  return str;\n};\n\n/**\n * String.prototype.padEnd polyfill\n *\n * @param {string} str\n * @param {int} targetLength\n * @param {string} [padString]\n * @returns {string}\n */\nshowdown.helper.padEnd = function padEnd (str, targetLength, padString) {\n  'use strict';\n  /*jshint bitwise: false*/\n  // eslint-disable-next-line space-infix-ops\n  targetLength = targetLength>>0; //floor if number or convert non-number to 0;\n  /*jshint bitwise: true*/\n  padString = String(padString || ' ');\n  if (str.length > targetLength) {\n    return String(str);\n  } else {\n    targetLength = targetLength - str.length;\n    if (targetLength > padString.length) {\n      padString += showdown.helper.repeat(padString, targetLength / padString.length); //append to original to ensure we are longer than needed\n    }\n    return String(str) + padString.slice(0,targetLength);\n  }\n};\n\n/**\n * Unescape HTML entities\n * @param txt\n * @returns {string}\n */\nshowdown.helper.unescapeHTMLEntities = function (txt) {\n  'use strict';\n\n  return txt\n    .replace(/&quot;/g, '\"')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&amp;/g, '&');\n};\n\nshowdown.helper._hashHTMLSpan = function (html, globals) {\n  return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';\n};\n\n/**\n * Prepends a base URL to relative paths.\n *\n * @param {string} baseUrl the base URL to prepend to a relative path\n * @param {string} url the path to modify, which may be relative\n * @returns {string} the full URL\n */\nshowdown.helper.applyBaseUrl = function (baseUrl, url) {\n  // Only prepend if given a base URL and the path is not absolute.\n  if (baseUrl && !this.isAbsolutePath(url)) {\n    var urlResolve = require('url').resolve;\n    url = urlResolve(baseUrl, url);\n  }\n\n  return url;\n};\n\n/**\n * Checks if the given path is absolute.\n *\n * @param {string} path the path to test for absolution\n * @returns {boolean} `true` if the given path is absolute, else `false`\n */\nshowdown.helper.isAbsolutePath = function (path) {\n  // Absolute paths begin with '[protocol:]//' or '#' (anchors)\n  return /(^([a-z]+:)?\\/\\/)|(^#)/i.test(path);\n};\n\n/**\n * Showdown's Event Object\n * @param {string} name Name of the event\n * @param {string} text Text\n * @param {{}} params optional. params of the event\n * @constructor\n */\nshowdown.helper.Event = function (name, text, params) {\n  'use strict';\n\n  var regexp = params.regexp || null;\n  var matches = params.matches || {};\n  var options = params.options || {};\n  var converter = params.converter || null;\n  var globals = params.globals || {};\n\n  /**\n   * Get the name of the event\n   * @returns {string}\n   */\n  this.getName = function () {\n    return name;\n  };\n\n  this.getEventName = function () {\n    return name;\n  };\n\n  this._stopExecution = false;\n\n  this.parsedText = params.parsedText || null;\n\n  this.getRegexp = function () {\n    return regexp;\n  };\n\n  this.getOptions = function () {\n    return options;\n  };\n\n  this.getConverter = function () {\n    return converter;\n  };\n\n  this.getGlobals = function () {\n    return globals;\n  };\n\n  this.getCapturedText = function () {\n    return text;\n  };\n\n  this.getText = function () {\n    return text;\n  };\n\n  this.setText = function (newText) {\n    text = newText;\n  };\n\n  this.getMatches = function () {\n    return matches;\n  };\n\n  this.setMatches = function (newMatches) {\n    matches = newMatches;\n  };\n\n  this.preventDefault = function (bool) {\n    this._stopExecution = !bool;\n  };\n};\n\n/**\n * POLYFILLS\n */\n// use this instead of builtin is undefined for IE8 compatibility\nif (typeof (console) === 'undefined') {\n  console = {\n    warn: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    log: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    error: function (msg) {\n      'use strict';\n      throw msg;\n    }\n  };\n}\n\n// Math.imul() polyfill\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\nif (!Math.imul) {\n  Math.imul = function (opA, opB) {\n    opB |= 0; // ensure that opB is an integer. opA will automatically be coerced.\n    // floating points give us 53 bits of precision to work with plus 1 sign bit\n    // automatically handled for our convienence:\n    // 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001\n    //    0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/\n    var result = (opA & 0x003fffff) * opB;\n    // 2. We can remove an integer coersion from the statement above because:\n    //    0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001\n    //    0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/\n    if (opA & 0xffc00000 /*!== 0*/) {\n      result += (opA & 0xffc00000) * opB | 0;\n    }\n    return result | 0;\n  };\n}\n\n/**\n * Common regexes.\n * We declare some common regexes to improve performance\n */\nshowdown.helper.regexes = {\n  asteriskDashTildeAndColon: /([*_:~])/g,\n  asteriskDashAndTilde:      /([*_~])/g\n};\n\n/**\n * EMOJIS LIST\n */\nshowdown.helper.emojis = {\n  '100': '\\ud83d\\udcaf',\n  '1234': '\\ud83d\\udd22',\n  '+1': '\\ud83d\\udc4d',\n  '-1': '\\ud83d\\udc4e',\n  '1st_place_medal': '\\ud83e\\udd47',\n  '2nd_place_medal': '\\ud83e\\udd48',\n  '3rd_place_medal': '\\ud83e\\udd49',\n  '8ball': '\\ud83c\\udfb1',\n  'a': '\\ud83c\\udd70\\ufe0f',\n  'ab': '\\ud83c\\udd8e',\n  'abacus': '\\ud83e\\uddee',\n  'abc': '\\ud83d\\udd24',\n  'abcd': '\\ud83d\\udd21',\n  'accept': '\\ud83c\\ude51',\n  'adhesive_bandage': '\\ud83e\\ude79',\n  'adult': '\\ud83e\\uddd1',\n  'aerial_tramway': '\\ud83d\\udea1',\n  'afghanistan': '\\ud83c\\udde6\\ud83c\\uddeb',\n  'airplane': '\\u2708\\ufe0f',\n  'aland_islands': '\\ud83c\\udde6\\ud83c\\uddfd',\n  'alarm_clock': '\\u23f0',\n  'albania': '\\ud83c\\udde6\\ud83c\\uddf1',\n  'alembic': '\\u2697\\ufe0f',\n  'algeria': '\\ud83c\\udde9\\ud83c\\uddff',\n  'alien': '\\ud83d\\udc7d',\n  'ambulance': '\\ud83d\\ude91',\n  'american_samoa': '\\ud83c\\udde6\\ud83c\\uddf8',\n  'amphora': '\\ud83c\\udffa',\n  'anchor': '\\u2693',\n  'andorra': '\\ud83c\\udde6\\ud83c\\udde9',\n  'angel': '\\ud83d\\udc7c',\n  'anger': '\\ud83d\\udca2',\n  'angola': '\\ud83c\\udde6\\ud83c\\uddf4',\n  'angry': '\\ud83d\\ude20',\n  'anguilla': '\\ud83c\\udde6\\ud83c\\uddee',\n  'anguished': '\\ud83d\\ude27',\n  'ant': '\\ud83d\\udc1c',\n  'antarctica': '\\ud83c\\udde6\\ud83c\\uddf6',\n  'antigua_barbuda': '\\ud83c\\udde6\\ud83c\\uddec',\n  'apple': '\\ud83c\\udf4e',\n  'aquarius': '\\u2652',\n  'argentina': '\\ud83c\\udde6\\ud83c\\uddf7',\n  'aries': '\\u2648',\n  'armenia': '\\ud83c\\udde6\\ud83c\\uddf2',\n  'arrow_backward': '\\u25c0\\ufe0f',\n  'arrow_double_down': '\\u23ec',\n  'arrow_double_up': '\\u23eb',\n  'arrow_down': '\\u2b07\\ufe0f',\n  'arrow_down_small': '\\ud83d\\udd3d',\n  'arrow_forward': '\\u25b6\\ufe0f',\n  'arrow_heading_down': '\\u2935\\ufe0f',\n  'arrow_heading_up': '\\u2934\\ufe0f',\n  'arrow_left': '\\u2b05\\ufe0f',\n  'arrow_lower_left': '\\u2199\\ufe0f',\n  'arrow_lower_right': '\\u2198\\ufe0f',\n  'arrow_right': '\\u27a1\\ufe0f',\n  'arrow_right_hook': '\\u21aa\\ufe0f',\n  'arrow_up': '\\u2b06\\ufe0f',\n  'arrow_up_down': '\\u2195\\ufe0f',\n  'arrow_up_small': '\\ud83d\\udd3c',\n  'arrow_upper_left': '\\u2196\\ufe0f',\n  'arrow_upper_right': '\\u2197\\ufe0f',\n  'arrows_clockwise': '\\ud83d\\udd03',\n  'arrows_counterclockwise': '\\ud83d\\udd04',\n  'art': '\\ud83c\\udfa8',\n  'articulated_lorry': '\\ud83d\\ude9b',\n  'artificial_satellite': '\\ud83d\\udef0\\ufe0f',\n  'artist': '\\ud83e\\uddd1\\u200d\\ud83c\\udfa8',\n  'aruba': '\\ud83c\\udde6\\ud83c\\uddfc',\n  'ascension_island': '\\ud83c\\udde6\\ud83c\\udde8',\n  'asterisk': '*\\ufe0f\\u20e3',\n  'astonished': '\\ud83d\\ude32',\n  'astronaut': '\\ud83e\\uddd1\\u200d\\ud83d\\ude80',\n  'athletic_shoe': '\\ud83d\\udc5f',\n  'atm': '\\ud83c\\udfe7',\n  'atom_symbol': '\\u269b\\ufe0f',\n  'australia': '\\ud83c\\udde6\\ud83c\\uddfa',\n  'austria': '\\ud83c\\udde6\\ud83c\\uddf9',\n  'auto_rickshaw': '\\ud83d\\udefa',\n  'avocado': '\\ud83e\\udd51',\n  'axe': '\\ud83e\\ude93',\n  'azerbaijan': '\\ud83c\\udde6\\ud83c\\uddff',\n  'b': '\\ud83c\\udd71\\ufe0f',\n  'baby': '\\ud83d\\udc76',\n  'baby_bottle': '\\ud83c\\udf7c',\n  'baby_chick': '\\ud83d\\udc24',\n  'baby_symbol': '\\ud83d\\udebc',\n  'back': '\\ud83d\\udd19',\n  'bacon': '\\ud83e\\udd53',\n  'badger': '\\ud83e\\udda1',\n  'badminton': '\\ud83c\\udff8',\n  'bagel': '\\ud83e\\udd6f',\n  'baggage_claim': '\\ud83d\\udec4',\n  'baguette_bread': '\\ud83e\\udd56',\n  'bahamas': '\\ud83c\\udde7\\ud83c\\uddf8',\n  'bahrain': '\\ud83c\\udde7\\ud83c\\udded',\n  'balance_scale': '\\u2696\\ufe0f',\n  'bald_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb2',\n  'bald_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb2',\n  'ballet_shoes': '\\ud83e\\ude70',\n  'balloon': '\\ud83c\\udf88',\n  'ballot_box': '\\ud83d\\uddf3\\ufe0f',\n  'ballot_box_with_check': '\\u2611\\ufe0f',\n  'bamboo': '\\ud83c\\udf8d',\n  'banana': '\\ud83c\\udf4c',\n  'bangbang': '\\u203c\\ufe0f',\n  'bangladesh': '\\ud83c\\udde7\\ud83c\\udde9',\n  'banjo': '\\ud83e\\ude95',\n  'bank': '\\ud83c\\udfe6',\n  'bar_chart': '\\ud83d\\udcca',\n  'barbados': '\\ud83c\\udde7\\ud83c\\udde7',\n  'barber': '\\ud83d\\udc88',\n  'baseball': '\\u26be',\n  'basket': '\\ud83e\\uddfa',\n  'basketball': '\\ud83c\\udfc0',\n  'basketball_man': '\\u26f9\\ufe0f\\u200d\\u2642\\ufe0f',\n  'basketball_woman': '\\u26f9\\ufe0f\\u200d\\u2640\\ufe0f',\n  'bat': '\\ud83e\\udd87',\n  'bath': '\\ud83d\\udec0',\n  'bathtub': '\\ud83d\\udec1',\n  'battery': '\\ud83d\\udd0b',\n  'beach_umbrella': '\\ud83c\\udfd6\\ufe0f',\n  'bear': '\\ud83d\\udc3b',\n  'bearded_person': '\\ud83e\\uddd4',\n  'bed': '\\ud83d\\udecf\\ufe0f',\n  'bee': '\\ud83d\\udc1d',\n  'beer': '\\ud83c\\udf7a',\n  'beers': '\\ud83c\\udf7b',\n  'beetle': '\\ud83d\\udc1e',\n  'beginner': '\\ud83d\\udd30',\n  'belarus': '\\ud83c\\udde7\\ud83c\\uddfe',\n  'belgium': '\\ud83c\\udde7\\ud83c\\uddea',\n  'belize': '\\ud83c\\udde7\\ud83c\\uddff',\n  'bell': '\\ud83d\\udd14',\n  'bellhop_bell': '\\ud83d\\udece\\ufe0f',\n  'benin': '\\ud83c\\udde7\\ud83c\\uddef',\n  'bento': '\\ud83c\\udf71',\n  'bermuda': '\\ud83c\\udde7\\ud83c\\uddf2',\n  'beverage_box': '\\ud83e\\uddc3',\n  'bhutan': '\\ud83c\\udde7\\ud83c\\uddf9',\n  'bicyclist': '\\ud83d\\udeb4',\n  'bike': '\\ud83d\\udeb2',\n  'biking_man': '\\ud83d\\udeb4\\u200d\\u2642\\ufe0f',\n  'biking_woman': '\\ud83d\\udeb4\\u200d\\u2640\\ufe0f',\n  'bikini': '\\ud83d\\udc59',\n  'billed_cap': '\\ud83e\\udde2',\n  'biohazard': '\\u2623\\ufe0f',\n  'bird': '\\ud83d\\udc26',\n  'birthday': '\\ud83c\\udf82',\n  'black_circle': '\\u26ab',\n  'black_flag': '\\ud83c\\udff4',\n  'black_heart': '\\ud83d\\udda4',\n  'black_joker': '\\ud83c\\udccf',\n  'black_large_square': '\\u2b1b',\n  'black_medium_small_square': '\\u25fe',\n  'black_medium_square': '\\u25fc\\ufe0f',\n  'black_nib': '\\u2712\\ufe0f',\n  'black_small_square': '\\u25aa\\ufe0f',\n  'black_square_button': '\\ud83d\\udd32',\n  'blond_haired_man': '\\ud83d\\udc71\\u200d\\u2642\\ufe0f',\n  'blond_haired_person': '\\ud83d\\udc71',\n  'blond_haired_woman': '\\ud83d\\udc71\\u200d\\u2640\\ufe0f',\n  'blonde_woman': '\\ud83d\\udc71\\u200d\\u2640\\ufe0f',\n  'blossom': '\\ud83c\\udf3c',\n  'blowfish': '\\ud83d\\udc21',\n  'blue_book': '\\ud83d\\udcd8',\n  'blue_car': '\\ud83d\\ude99',\n  'blue_heart': '\\ud83d\\udc99',\n  'blue_square': '\\ud83d\\udfe6',\n  'blush': '\\ud83d\\ude0a',\n  'boar': '\\ud83d\\udc17',\n  'boat': '\\u26f5',\n  'bolivia': '\\ud83c\\udde7\\ud83c\\uddf4',\n  'bomb': '\\ud83d\\udca3',\n  'bone': '\\ud83e\\uddb4',\n  'book': '\\ud83d\\udcd6',\n  'bookmark': '\\ud83d\\udd16',\n  'bookmark_tabs': '\\ud83d\\udcd1',\n  'books': '\\ud83d\\udcda',\n  'boom': '\\ud83d\\udca5',\n  'boot': '\\ud83d\\udc62',\n  'bosnia_herzegovina': '\\ud83c\\udde7\\ud83c\\udde6',\n  'botswana': '\\ud83c\\udde7\\ud83c\\uddfc',\n  'bouncing_ball_man': '\\u26f9\\ufe0f\\u200d\\u2642\\ufe0f',\n  'bouncing_ball_person': '\\u26f9\\ufe0f',\n  'bouncing_ball_woman': '\\u26f9\\ufe0f\\u200d\\u2640\\ufe0f',\n  'bouquet': '\\ud83d\\udc90',\n  'bouvet_island': '\\ud83c\\udde7\\ud83c\\uddfb',\n  'bow': '\\ud83d\\ude47',\n  'bow_and_arrow': '\\ud83c\\udff9',\n  'bowing_man': '\\ud83d\\ude47\\u200d\\u2642\\ufe0f',\n  'bowing_woman': '\\ud83d\\ude47\\u200d\\u2640\\ufe0f',\n  'bowl_with_spoon': '\\ud83e\\udd63',\n  'bowling': '\\ud83c\\udfb3',\n  'boxing_glove': '\\ud83e\\udd4a',\n  'boy': '\\ud83d\\udc66',\n  'brain': '\\ud83e\\udde0',\n  'brazil': '\\ud83c\\udde7\\ud83c\\uddf7',\n  'bread': '\\ud83c\\udf5e',\n  'breast_feeding': '\\ud83e\\udd31',\n  'bricks': '\\ud83e\\uddf1',\n  'bride_with_veil': '\\ud83d\\udc70',\n  'bridge_at_night': '\\ud83c\\udf09',\n  'briefcase': '\\ud83d\\udcbc',\n  'british_indian_ocean_territory': '\\ud83c\\uddee\\ud83c\\uddf4',\n  'british_virgin_islands': '\\ud83c\\uddfb\\ud83c\\uddec',\n  'broccoli': '\\ud83e\\udd66',\n  'broken_heart': '\\ud83d\\udc94',\n  'broom': '\\ud83e\\uddf9',\n  'brown_circle': '\\ud83d\\udfe4',\n  'brown_heart': '\\ud83e\\udd0e',\n  'brown_square': '\\ud83d\\udfeb',\n  'brunei': '\\ud83c\\udde7\\ud83c\\uddf3',\n  'bug': '\\ud83d\\udc1b',\n  'building_construction': '\\ud83c\\udfd7\\ufe0f',\n  'bulb': '\\ud83d\\udca1',\n  'bulgaria': '\\ud83c\\udde7\\ud83c\\uddec',\n  'bullettrain_front': '\\ud83d\\ude85',\n  'bullettrain_side': '\\ud83d\\ude84',\n  'burkina_faso': '\\ud83c\\udde7\\ud83c\\uddeb',\n  'burrito': '\\ud83c\\udf2f',\n  'burundi': '\\ud83c\\udde7\\ud83c\\uddee',\n  'bus': '\\ud83d\\ude8c',\n  'business_suit_levitating': '\\ud83d\\udd74\\ufe0f',\n  'busstop': '\\ud83d\\ude8f',\n  'bust_in_silhouette': '\\ud83d\\udc64',\n  'busts_in_silhouette': '\\ud83d\\udc65',\n  'butter': '\\ud83e\\uddc8',\n  'butterfly': '\\ud83e\\udd8b',\n  'cactus': '\\ud83c\\udf35',\n  'cake': '\\ud83c\\udf70',\n  'calendar': '\\ud83d\\udcc6',\n  'call_me_hand': '\\ud83e\\udd19',\n  'calling': '\\ud83d\\udcf2',\n  'cambodia': '\\ud83c\\uddf0\\ud83c\\udded',\n  'camel': '\\ud83d\\udc2b',\n  'camera': '\\ud83d\\udcf7',\n  'camera_flash': '\\ud83d\\udcf8',\n  'cameroon': '\\ud83c\\udde8\\ud83c\\uddf2',\n  'camping': '\\ud83c\\udfd5\\ufe0f',\n  'canada': '\\ud83c\\udde8\\ud83c\\udde6',\n  'canary_islands': '\\ud83c\\uddee\\ud83c\\udde8',\n  'cancer': '\\u264b',\n  'candle': '\\ud83d\\udd6f\\ufe0f',\n  'candy': '\\ud83c\\udf6c',\n  'canned_food': '\\ud83e\\udd6b',\n  'canoe': '\\ud83d\\udef6',\n  'cape_verde': '\\ud83c\\udde8\\ud83c\\uddfb',\n  'capital_abcd': '\\ud83d\\udd20',\n  'capricorn': '\\u2651',\n  'car': '\\ud83d\\ude97',\n  'card_file_box': '\\ud83d\\uddc3\\ufe0f',\n  'card_index': '\\ud83d\\udcc7',\n  'card_index_dividers': '\\ud83d\\uddc2\\ufe0f',\n  'caribbean_netherlands': '\\ud83c\\udde7\\ud83c\\uddf6',\n  'carousel_horse': '\\ud83c\\udfa0',\n  'carrot': '\\ud83e\\udd55',\n  'cartwheeling': '\\ud83e\\udd38',\n  'cat': '\\ud83d\\udc31',\n  'cat2': '\\ud83d\\udc08',\n  'cayman_islands': '\\ud83c\\uddf0\\ud83c\\uddfe',\n  'cd': '\\ud83d\\udcbf',\n  'central_african_republic': '\\ud83c\\udde8\\ud83c\\uddeb',\n  'ceuta_melilla': '\\ud83c\\uddea\\ud83c\\udde6',\n  'chad': '\\ud83c\\uddf9\\ud83c\\udde9',\n  'chains': '\\u26d3\\ufe0f',\n  'chair': '\\ud83e\\ude91',\n  'champagne': '\\ud83c\\udf7e',\n  'chart': '\\ud83d\\udcb9',\n  'chart_with_downwards_trend': '\\ud83d\\udcc9',\n  'chart_with_upwards_trend': '\\ud83d\\udcc8',\n  'checkered_flag': '\\ud83c\\udfc1',\n  'cheese': '\\ud83e\\uddc0',\n  'cherries': '\\ud83c\\udf52',\n  'cherry_blossom': '\\ud83c\\udf38',\n  'chess_pawn': '\\u265f\\ufe0f',\n  'chestnut': '\\ud83c\\udf30',\n  'chicken': '\\ud83d\\udc14',\n  'child': '\\ud83e\\uddd2',\n  'children_crossing': '\\ud83d\\udeb8',\n  'chile': '\\ud83c\\udde8\\ud83c\\uddf1',\n  'chipmunk': '\\ud83d\\udc3f\\ufe0f',\n  'chocolate_bar': '\\ud83c\\udf6b',\n  'chopsticks': '\\ud83e\\udd62',\n  'christmas_island': '\\ud83c\\udde8\\ud83c\\uddfd',\n  'christmas_tree': '\\ud83c\\udf84',\n  'church': '\\u26ea',\n  'cinema': '\\ud83c\\udfa6',\n  'circus_tent': '\\ud83c\\udfaa',\n  'city_sunrise': '\\ud83c\\udf07',\n  'city_sunset': '\\ud83c\\udf06',\n  'cityscape': '\\ud83c\\udfd9\\ufe0f',\n  'cl': '\\ud83c\\udd91',\n  'clamp': '\\ud83d\\udddc\\ufe0f',\n  'clap': '\\ud83d\\udc4f',\n  'clapper': '\\ud83c\\udfac',\n  'classical_building': '\\ud83c\\udfdb\\ufe0f',\n  'climbing': '\\ud83e\\uddd7',\n  'climbing_man': '\\ud83e\\uddd7\\u200d\\u2642\\ufe0f',\n  'climbing_woman': '\\ud83e\\uddd7\\u200d\\u2640\\ufe0f',\n  'clinking_glasses': '\\ud83e\\udd42',\n  'clipboard': '\\ud83d\\udccb',\n  'clipperton_island': '\\ud83c\\udde8\\ud83c\\uddf5',\n  'clock1': '\\ud83d\\udd50',\n  'clock10': '\\ud83d\\udd59',\n  'clock1030': '\\ud83d\\udd65',\n  'clock11': '\\ud83d\\udd5a',\n  'clock1130': '\\ud83d\\udd66',\n  'clock12': '\\ud83d\\udd5b',\n  'clock1230': '\\ud83d\\udd67',\n  'clock130': '\\ud83d\\udd5c',\n  'clock2': '\\ud83d\\udd51',\n  'clock230': '\\ud83d\\udd5d',\n  'clock3': '\\ud83d\\udd52',\n  'clock330': '\\ud83d\\udd5e',\n  'clock4': '\\ud83d\\udd53',\n  'clock430': '\\ud83d\\udd5f',\n  'clock5': '\\ud83d\\udd54',\n  'clock530': '\\ud83d\\udd60',\n  'clock6': '\\ud83d\\udd55',\n  'clock630': '\\ud83d\\udd61',\n  'clock7': '\\ud83d\\udd56',\n  'clock730': '\\ud83d\\udd62',\n  'clock8': '\\ud83d\\udd57',\n  'clock830': '\\ud83d\\udd63',\n  'clock9': '\\ud83d\\udd58',\n  'clock930': '\\ud83d\\udd64',\n  'closed_book': '\\ud83d\\udcd5',\n  'closed_lock_with_key': '\\ud83d\\udd10',\n  'closed_umbrella': '\\ud83c\\udf02',\n  'cloud': '\\u2601\\ufe0f',\n  'cloud_with_lightning': '\\ud83c\\udf29\\ufe0f',\n  'cloud_with_lightning_and_rain': '\\u26c8\\ufe0f',\n  'cloud_with_rain': '\\ud83c\\udf27\\ufe0f',\n  'cloud_with_snow': '\\ud83c\\udf28\\ufe0f',\n  'clown_face': '\\ud83e\\udd21',\n  'clubs': '\\u2663\\ufe0f',\n  'cn': '\\ud83c\\udde8\\ud83c\\uddf3',\n  'coat': '\\ud83e\\udde5',\n  'cocktail': '\\ud83c\\udf78',\n  'coconut': '\\ud83e\\udd65',\n  'cocos_islands': '\\ud83c\\udde8\\ud83c\\udde8',\n  'coffee': '\\u2615',\n  'coffin': '\\u26b0\\ufe0f',\n  'cold_face': '\\ud83e\\udd76',\n  'cold_sweat': '\\ud83d\\ude30',\n  'collision': '\\ud83d\\udca5',\n  'colombia': '\\ud83c\\udde8\\ud83c\\uddf4',\n  'comet': '\\u2604\\ufe0f',\n  'comoros': '\\ud83c\\uddf0\\ud83c\\uddf2',\n  'compass': '\\ud83e\\udded',\n  'computer': '\\ud83d\\udcbb',\n  'computer_mouse': '\\ud83d\\uddb1\\ufe0f',\n  'confetti_ball': '\\ud83c\\udf8a',\n  'confounded': '\\ud83d\\ude16',\n  'confused': '\\ud83d\\ude15',\n  'congo_brazzaville': '\\ud83c\\udde8\\ud83c\\uddec',\n  'congo_kinshasa': '\\ud83c\\udde8\\ud83c\\udde9',\n  'congratulations': '\\u3297\\ufe0f',\n  'construction': '\\ud83d\\udea7',\n  'construction_worker': '\\ud83d\\udc77',\n  'construction_worker_man': '\\ud83d\\udc77\\u200d\\u2642\\ufe0f',\n  'construction_worker_woman': '\\ud83d\\udc77\\u200d\\u2640\\ufe0f',\n  'control_knobs': '\\ud83c\\udf9b\\ufe0f',\n  'convenience_store': '\\ud83c\\udfea',\n  'cook': '\\ud83e\\uddd1\\u200d\\ud83c\\udf73',\n  'cook_islands': '\\ud83c\\udde8\\ud83c\\uddf0',\n  'cookie': '\\ud83c\\udf6a',\n  'cool': '\\ud83c\\udd92',\n  'cop': '\\ud83d\\udc6e',\n  'copyright': '\\u00a9\\ufe0f',\n  'corn': '\\ud83c\\udf3d',\n  'costa_rica': '\\ud83c\\udde8\\ud83c\\uddf7',\n  'cote_divoire': '\\ud83c\\udde8\\ud83c\\uddee',\n  'couch_and_lamp': '\\ud83d\\udecb\\ufe0f',\n  'couple': '\\ud83d\\udc6b',\n  'couple_with_heart': '\\ud83d\\udc91',\n  'couple_with_heart_man_man': '\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68',\n  'couple_with_heart_woman_man': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68',\n  'couple_with_heart_woman_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69',\n  'couplekiss': '\\ud83d\\udc8f',\n  'couplekiss_man_man': '\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68',\n  'couplekiss_man_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68',\n  'couplekiss_woman_woman': '\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69',\n  'cow': '\\ud83d\\udc2e',\n  'cow2': '\\ud83d\\udc04',\n  'cowboy_hat_face': '\\ud83e\\udd20',\n  'crab': '\\ud83e\\udd80',\n  'crayon': '\\ud83d\\udd8d\\ufe0f',\n  'credit_card': '\\ud83d\\udcb3',\n  'crescent_moon': '\\ud83c\\udf19',\n  'cricket': '\\ud83e\\udd97',\n  'cricket_game': '\\ud83c\\udfcf',\n  'croatia': '\\ud83c\\udded\\ud83c\\uddf7',\n  'crocodile': '\\ud83d\\udc0a',\n  'croissant': '\\ud83e\\udd50',\n  'crossed_fingers': '\\ud83e\\udd1e',\n  'crossed_flags': '\\ud83c\\udf8c',\n  'crossed_swords': '\\u2694\\ufe0f',\n  'crown': '\\ud83d\\udc51',\n  'cry': '\\ud83d\\ude22',\n  'crying_cat_face': '\\ud83d\\ude3f',\n  'crystal_ball': '\\ud83d\\udd2e',\n  'cuba': '\\ud83c\\udde8\\ud83c\\uddfa',\n  'cucumber': '\\ud83e\\udd52',\n  'cup_with_straw': '\\ud83e\\udd64',\n  'cupcake': '\\ud83e\\uddc1',\n  'cupid': '\\ud83d\\udc98',\n  'curacao': '\\ud83c\\udde8\\ud83c\\uddfc',\n  'curling_stone': '\\ud83e\\udd4c',\n  'curly_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb1',\n  'curly_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb1',\n  'curly_loop': '\\u27b0',\n  'currency_exchange': '\\ud83d\\udcb1',\n  'curry': '\\ud83c\\udf5b',\n  'cursing_face': '\\ud83e\\udd2c',\n  'custard': '\\ud83c\\udf6e',\n  'customs': '\\ud83d\\udec3',\n  'cut_of_meat': '\\ud83e\\udd69',\n  'cyclone': '\\ud83c\\udf00',\n  'cyprus': '\\ud83c\\udde8\\ud83c\\uddfe',\n  'czech_republic': '\\ud83c\\udde8\\ud83c\\uddff',\n  'dagger': '\\ud83d\\udde1\\ufe0f',\n  'dancer': '\\ud83d\\udc83',\n  'dancers': '\\ud83d\\udc6f',\n  'dancing_men': '\\ud83d\\udc6f\\u200d\\u2642\\ufe0f',\n  'dancing_women': '\\ud83d\\udc6f\\u200d\\u2640\\ufe0f',\n  'dango': '\\ud83c\\udf61',\n  'dark_sunglasses': '\\ud83d\\udd76\\ufe0f',\n  'dart': '\\ud83c\\udfaf',\n  'dash': '\\ud83d\\udca8',\n  'date': '\\ud83d\\udcc5',\n  'de': '\\ud83c\\udde9\\ud83c\\uddea',\n  'deaf_man': '\\ud83e\\uddcf\\u200d\\u2642\\ufe0f',\n  'deaf_person': '\\ud83e\\uddcf',\n  'deaf_woman': '\\ud83e\\uddcf\\u200d\\u2640\\ufe0f',\n  'deciduous_tree': '\\ud83c\\udf33',\n  'deer': '\\ud83e\\udd8c',\n  'denmark': '\\ud83c\\udde9\\ud83c\\uddf0',\n  'department_store': '\\ud83c\\udfec',\n  'derelict_house': '\\ud83c\\udfda\\ufe0f',\n  'desert': '\\ud83c\\udfdc\\ufe0f',\n  'desert_island': '\\ud83c\\udfdd\\ufe0f',\n  'desktop_computer': '\\ud83d\\udda5\\ufe0f',\n  'detective': '\\ud83d\\udd75\\ufe0f',\n  'diamond_shape_with_a_dot_inside': '\\ud83d\\udca0',\n  'diamonds': '\\u2666\\ufe0f',\n  'diego_garcia': '\\ud83c\\udde9\\ud83c\\uddec',\n  'disappointed': '\\ud83d\\ude1e',\n  'disappointed_relieved': '\\ud83d\\ude25',\n  'diving_mask': '\\ud83e\\udd3f',\n  'diya_lamp': '\\ud83e\\ude94',\n  'dizzy': '\\ud83d\\udcab',\n  'dizzy_face': '\\ud83d\\ude35',\n  'djibouti': '\\ud83c\\udde9\\ud83c\\uddef',\n  'dna': '\\ud83e\\uddec',\n  'do_not_litter': '\\ud83d\\udeaf',\n  'dog': '\\ud83d\\udc36',\n  'dog2': '\\ud83d\\udc15',\n  'dollar': '\\ud83d\\udcb5',\n  'dolls': '\\ud83c\\udf8e',\n  'dolphin': '\\ud83d\\udc2c',\n  'dominica': '\\ud83c\\udde9\\ud83c\\uddf2',\n  'dominican_republic': '\\ud83c\\udde9\\ud83c\\uddf4',\n  'door': '\\ud83d\\udeaa',\n  'doughnut': '\\ud83c\\udf69',\n  'dove': '\\ud83d\\udd4a\\ufe0f',\n  'dragon': '\\ud83d\\udc09',\n  'dragon_face': '\\ud83d\\udc32',\n  'dress': '\\ud83d\\udc57',\n  'dromedary_camel': '\\ud83d\\udc2a',\n  'drooling_face': '\\ud83e\\udd24',\n  'drop_of_blood': '\\ud83e\\ude78',\n  'droplet': '\\ud83d\\udca7',\n  'drum': '\\ud83e\\udd41',\n  'duck': '\\ud83e\\udd86',\n  'dumpling': '\\ud83e\\udd5f',\n  'dvd': '\\ud83d\\udcc0',\n  'e-mail': '\\ud83d\\udce7',\n  'eagle': '\\ud83e\\udd85',\n  'ear': '\\ud83d\\udc42',\n  'ear_of_rice': '\\ud83c\\udf3e',\n  'ear_with_hearing_aid': '\\ud83e\\uddbb',\n  'earth_africa': '\\ud83c\\udf0d',\n  'earth_americas': '\\ud83c\\udf0e',\n  'earth_asia': '\\ud83c\\udf0f',\n  'ecuador': '\\ud83c\\uddea\\ud83c\\udde8',\n  'egg': '\\ud83e\\udd5a',\n  'eggplant': '\\ud83c\\udf46',\n  'egypt': '\\ud83c\\uddea\\ud83c\\uddec',\n  'eight': '8\\ufe0f\\u20e3',\n  'eight_pointed_black_star': '\\u2734\\ufe0f',\n  'eight_spoked_asterisk': '\\u2733\\ufe0f',\n  'eject_button': '\\u23cf\\ufe0f',\n  'el_salvador': '\\ud83c\\uddf8\\ud83c\\uddfb',\n  'electric_plug': '\\ud83d\\udd0c',\n  'elephant': '\\ud83d\\udc18',\n  'elf': '\\ud83e\\udddd',\n  'elf_man': '\\ud83e\\udddd\\u200d\\u2642\\ufe0f',\n  'elf_woman': '\\ud83e\\udddd\\u200d\\u2640\\ufe0f',\n  'email': '\\u2709\\ufe0f',\n  'end': '\\ud83d\\udd1a',\n  'england': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f',\n  'envelope': '\\u2709\\ufe0f',\n  'envelope_with_arrow': '\\ud83d\\udce9',\n  'equatorial_guinea': '\\ud83c\\uddec\\ud83c\\uddf6',\n  'eritrea': '\\ud83c\\uddea\\ud83c\\uddf7',\n  'es': '\\ud83c\\uddea\\ud83c\\uddf8',\n  'estonia': '\\ud83c\\uddea\\ud83c\\uddea',\n  'ethiopia': '\\ud83c\\uddea\\ud83c\\uddf9',\n  'eu': '\\ud83c\\uddea\\ud83c\\uddfa',\n  'euro': '\\ud83d\\udcb6',\n  'european_castle': '\\ud83c\\udff0',\n  'european_post_office': '\\ud83c\\udfe4',\n  'european_union': '\\ud83c\\uddea\\ud83c\\uddfa',\n  'evergreen_tree': '\\ud83c\\udf32',\n  'exclamation': '\\u2757',\n  'exploding_head': '\\ud83e\\udd2f',\n  'expressionless': '\\ud83d\\ude11',\n  'eye': '\\ud83d\\udc41\\ufe0f',\n  'eye_speech_bubble': '\\ud83d\\udc41\\ufe0f\\u200d\\ud83d\\udde8\\ufe0f',\n  'eyeglasses': '\\ud83d\\udc53',\n  'eyes': '\\ud83d\\udc40',\n  'face_with_head_bandage': '\\ud83e\\udd15',\n  'face_with_thermometer': '\\ud83e\\udd12',\n  'facepalm': '\\ud83e\\udd26',\n  'facepunch': '\\ud83d\\udc4a',\n  'factory': '\\ud83c\\udfed',\n  'factory_worker': '\\ud83e\\uddd1\\u200d\\ud83c\\udfed',\n  'fairy': '\\ud83e\\uddda',\n  'fairy_man': '\\ud83e\\uddda\\u200d\\u2642\\ufe0f',\n  'fairy_woman': '\\ud83e\\uddda\\u200d\\u2640\\ufe0f',\n  'falafel': '\\ud83e\\uddc6',\n  'falkland_islands': '\\ud83c\\uddeb\\ud83c\\uddf0',\n  'fallen_leaf': '\\ud83c\\udf42',\n  'family': '\\ud83d\\udc6a',\n  'family_man_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc66',\n  'family_man_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc67',\n  'family_man_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_man_man_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66',\n  'family_man_man_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_man_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67',\n  'family_man_man_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_man_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_man_woman_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_man_woman_boy_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_man_woman_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_man_woman_girl_boy': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_man_woman_girl_girl': '\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_woman_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_woman_boy_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_woman_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_woman_girl_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_woman_girl_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'family_woman_woman_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66',\n  'family_woman_woman_boy_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66',\n  'family_woman_woman_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67',\n  'family_woman_woman_girl_boy': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66',\n  'family_woman_woman_girl_girl': '\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67',\n  'farmer': '\\ud83e\\uddd1\\u200d\\ud83c\\udf3e',\n  'faroe_islands': '\\ud83c\\uddeb\\ud83c\\uddf4',\n  'fast_forward': '\\u23e9',\n  'fax': '\\ud83d\\udce0',\n  'fearful': '\\ud83d\\ude28',\n  'feet': '\\ud83d\\udc3e',\n  'female_detective': '\\ud83d\\udd75\\ufe0f\\u200d\\u2640\\ufe0f',\n  'female_sign': '\\u2640\\ufe0f',\n  'ferris_wheel': '\\ud83c\\udfa1',\n  'ferry': '\\u26f4\\ufe0f',\n  'field_hockey': '\\ud83c\\udfd1',\n  'fiji': '\\ud83c\\uddeb\\ud83c\\uddef',\n  'file_cabinet': '\\ud83d\\uddc4\\ufe0f',\n  'file_folder': '\\ud83d\\udcc1',\n  'film_projector': '\\ud83d\\udcfd\\ufe0f',\n  'film_strip': '\\ud83c\\udf9e\\ufe0f',\n  'finland': '\\ud83c\\uddeb\\ud83c\\uddee',\n  'fire': '\\ud83d\\udd25',\n  'fire_engine': '\\ud83d\\ude92',\n  'fire_extinguisher': '\\ud83e\\uddef',\n  'firecracker': '\\ud83e\\udde8',\n  'firefighter': '\\ud83e\\uddd1\\u200d\\ud83d\\ude92',\n  'fireworks': '\\ud83c\\udf86',\n  'first_quarter_moon': '\\ud83c\\udf13',\n  'first_quarter_moon_with_face': '\\ud83c\\udf1b',\n  'fish': '\\ud83d\\udc1f',\n  'fish_cake': '\\ud83c\\udf65',\n  'fishing_pole_and_fish': '\\ud83c\\udfa3',\n  'fist': '\\u270a',\n  'fist_left': '\\ud83e\\udd1b',\n  'fist_oncoming': '\\ud83d\\udc4a',\n  'fist_raised': '\\u270a',\n  'fist_right': '\\ud83e\\udd1c',\n  'five': '5\\ufe0f\\u20e3',\n  'flags': '\\ud83c\\udf8f',\n  'flamingo': '\\ud83e\\udda9',\n  'flashlight': '\\ud83d\\udd26',\n  'flat_shoe': '\\ud83e\\udd7f',\n  'fleur_de_lis': '\\u269c\\ufe0f',\n  'flight_arrival': '\\ud83d\\udeec',\n  'flight_departure': '\\ud83d\\udeeb',\n  'flipper': '\\ud83d\\udc2c',\n  'floppy_disk': '\\ud83d\\udcbe',\n  'flower_playing_cards': '\\ud83c\\udfb4',\n  'flushed': '\\ud83d\\ude33',\n  'flying_disc': '\\ud83e\\udd4f',\n  'flying_saucer': '\\ud83d\\udef8',\n  'fog': '\\ud83c\\udf2b\\ufe0f',\n  'foggy': '\\ud83c\\udf01',\n  'foot': '\\ud83e\\uddb6',\n  'football': '\\ud83c\\udfc8',\n  'footprints': '\\ud83d\\udc63',\n  'fork_and_knife': '\\ud83c\\udf74',\n  'fortune_cookie': '\\ud83e\\udd60',\n  'fountain': '\\u26f2',\n  'fountain_pen': '\\ud83d\\udd8b\\ufe0f',\n  'four': '4\\ufe0f\\u20e3',\n  'four_leaf_clover': '\\ud83c\\udf40',\n  'fox_face': '\\ud83e\\udd8a',\n  'fr': '\\ud83c\\uddeb\\ud83c\\uddf7',\n  'framed_picture': '\\ud83d\\uddbc\\ufe0f',\n  'free': '\\ud83c\\udd93',\n  'french_guiana': '\\ud83c\\uddec\\ud83c\\uddeb',\n  'french_polynesia': '\\ud83c\\uddf5\\ud83c\\uddeb',\n  'french_southern_territories': '\\ud83c\\uddf9\\ud83c\\uddeb',\n  'fried_egg': '\\ud83c\\udf73',\n  'fried_shrimp': '\\ud83c\\udf64',\n  'fries': '\\ud83c\\udf5f',\n  'frog': '\\ud83d\\udc38',\n  'frowning': '\\ud83d\\ude26',\n  'frowning_face': '\\u2639\\ufe0f',\n  'frowning_man': '\\ud83d\\ude4d\\u200d\\u2642\\ufe0f',\n  'frowning_person': '\\ud83d\\ude4d',\n  'frowning_woman': '\\ud83d\\ude4d\\u200d\\u2640\\ufe0f',\n  'fu': '\\ud83d\\udd95',\n  'fuelpump': '\\u26fd',\n  'full_moon': '\\ud83c\\udf15',\n  'full_moon_with_face': '\\ud83c\\udf1d',\n  'funeral_urn': '\\u26b1\\ufe0f',\n  'gabon': '\\ud83c\\uddec\\ud83c\\udde6',\n  'gambia': '\\ud83c\\uddec\\ud83c\\uddf2',\n  'game_die': '\\ud83c\\udfb2',\n  'garlic': '\\ud83e\\uddc4',\n  'gb': '\\ud83c\\uddec\\ud83c\\udde7',\n  'gear': '\\u2699\\ufe0f',\n  'gem': '\\ud83d\\udc8e',\n  'gemini': '\\u264a',\n  'genie': '\\ud83e\\uddde',\n  'genie_man': '\\ud83e\\uddde\\u200d\\u2642\\ufe0f',\n  'genie_woman': '\\ud83e\\uddde\\u200d\\u2640\\ufe0f',\n  'georgia': '\\ud83c\\uddec\\ud83c\\uddea',\n  'ghana': '\\ud83c\\uddec\\ud83c\\udded',\n  'ghost': '\\ud83d\\udc7b',\n  'gibraltar': '\\ud83c\\uddec\\ud83c\\uddee',\n  'gift': '\\ud83c\\udf81',\n  'gift_heart': '\\ud83d\\udc9d',\n  'giraffe': '\\ud83e\\udd92',\n  'girl': '\\ud83d\\udc67',\n  'globe_with_meridians': '\\ud83c\\udf10',\n  'gloves': '\\ud83e\\udde4',\n  'goal_net': '\\ud83e\\udd45',\n  'goat': '\\ud83d\\udc10',\n  'goggles': '\\ud83e\\udd7d',\n  'golf': '\\u26f3',\n  'golfing': '\\ud83c\\udfcc\\ufe0f',\n  'golfing_man': '\\ud83c\\udfcc\\ufe0f\\u200d\\u2642\\ufe0f',\n  'golfing_woman': '\\ud83c\\udfcc\\ufe0f\\u200d\\u2640\\ufe0f',\n  'gorilla': '\\ud83e\\udd8d',\n  'grapes': '\\ud83c\\udf47',\n  'greece': '\\ud83c\\uddec\\ud83c\\uddf7',\n  'green_apple': '\\ud83c\\udf4f',\n  'green_book': '\\ud83d\\udcd7',\n  'green_circle': '\\ud83d\\udfe2',\n  'green_heart': '\\ud83d\\udc9a',\n  'green_salad': '\\ud83e\\udd57',\n  'green_square': '\\ud83d\\udfe9',\n  'greenland': '\\ud83c\\uddec\\ud83c\\uddf1',\n  'grenada': '\\ud83c\\uddec\\ud83c\\udde9',\n  'grey_exclamation': '\\u2755',\n  'grey_question': '\\u2754',\n  'grimacing': '\\ud83d\\ude2c',\n  'grin': '\\ud83d\\ude01',\n  'grinning': '\\ud83d\\ude00',\n  'guadeloupe': '\\ud83c\\uddec\\ud83c\\uddf5',\n  'guam': '\\ud83c\\uddec\\ud83c\\uddfa',\n  'guard': '\\ud83d\\udc82',\n  'guardsman': '\\ud83d\\udc82\\u200d\\u2642\\ufe0f',\n  'guardswoman': '\\ud83d\\udc82\\u200d\\u2640\\ufe0f',\n  'guatemala': '\\ud83c\\uddec\\ud83c\\uddf9',\n  'guernsey': '\\ud83c\\uddec\\ud83c\\uddec',\n  'guide_dog': '\\ud83e\\uddae',\n  'guinea': '\\ud83c\\uddec\\ud83c\\uddf3',\n  'guinea_bissau': '\\ud83c\\uddec\\ud83c\\uddfc',\n  'guitar': '\\ud83c\\udfb8',\n  'gun': '\\ud83d\\udd2b',\n  'guyana': '\\ud83c\\uddec\\ud83c\\uddfe',\n  'haircut': '\\ud83d\\udc87',\n  'haircut_man': '\\ud83d\\udc87\\u200d\\u2642\\ufe0f',\n  'haircut_woman': '\\ud83d\\udc87\\u200d\\u2640\\ufe0f',\n  'haiti': '\\ud83c\\udded\\ud83c\\uddf9',\n  'hamburger': '\\ud83c\\udf54',\n  'hammer': '\\ud83d\\udd28',\n  'hammer_and_pick': '\\u2692\\ufe0f',\n  'hammer_and_wrench': '\\ud83d\\udee0\\ufe0f',\n  'hamster': '\\ud83d\\udc39',\n  'hand': '\\u270b',\n  'hand_over_mouth': '\\ud83e\\udd2d',\n  'handbag': '\\ud83d\\udc5c',\n  'handball_person': '\\ud83e\\udd3e',\n  'handshake': '\\ud83e\\udd1d',\n  'hankey': '\\ud83d\\udca9',\n  'hash': '#\\ufe0f\\u20e3',\n  'hatched_chick': '\\ud83d\\udc25',\n  'hatching_chick': '\\ud83d\\udc23',\n  'headphones': '\\ud83c\\udfa7',\n  'health_worker': '\\ud83e\\uddd1\\u200d\\u2695\\ufe0f',\n  'hear_no_evil': '\\ud83d\\ude49',\n  'heard_mcdonald_islands': '\\ud83c\\udded\\ud83c\\uddf2',\n  'heart': '\\u2764\\ufe0f',\n  'heart_decoration': '\\ud83d\\udc9f',\n  'heart_eyes': '\\ud83d\\ude0d',\n  'heart_eyes_cat': '\\ud83d\\ude3b',\n  'heartbeat': '\\ud83d\\udc93',\n  'heartpulse': '\\ud83d\\udc97',\n  'hearts': '\\u2665\\ufe0f',\n  'heavy_check_mark': '\\u2714\\ufe0f',\n  'heavy_division_sign': '\\u2797',\n  'heavy_dollar_sign': '\\ud83d\\udcb2',\n  'heavy_exclamation_mark': '\\u2757',\n  'heavy_heart_exclamation': '\\u2763\\ufe0f',\n  'heavy_minus_sign': '\\u2796',\n  'heavy_multiplication_x': '\\u2716\\ufe0f',\n  'heavy_plus_sign': '\\u2795',\n  'hedgehog': '\\ud83e\\udd94',\n  'helicopter': '\\ud83d\\ude81',\n  'herb': '\\ud83c\\udf3f',\n  'hibiscus': '\\ud83c\\udf3a',\n  'high_brightness': '\\ud83d\\udd06',\n  'high_heel': '\\ud83d\\udc60',\n  'hiking_boot': '\\ud83e\\udd7e',\n  'hindu_temple': '\\ud83d\\uded5',\n  'hippopotamus': '\\ud83e\\udd9b',\n  'hocho': '\\ud83d\\udd2a',\n  'hole': '\\ud83d\\udd73\\ufe0f',\n  'honduras': '\\ud83c\\udded\\ud83c\\uddf3',\n  'honey_pot': '\\ud83c\\udf6f',\n  'honeybee': '\\ud83d\\udc1d',\n  'hong_kong': '\\ud83c\\udded\\ud83c\\uddf0',\n  'horse': '\\ud83d\\udc34',\n  'horse_racing': '\\ud83c\\udfc7',\n  'hospital': '\\ud83c\\udfe5',\n  'hot_face': '\\ud83e\\udd75',\n  'hot_pepper': '\\ud83c\\udf36\\ufe0f',\n  'hotdog': '\\ud83c\\udf2d',\n  'hotel': '\\ud83c\\udfe8',\n  'hotsprings': '\\u2668\\ufe0f',\n  'hourglass': '\\u231b',\n  'hourglass_flowing_sand': '\\u23f3',\n  'house': '\\ud83c\\udfe0',\n  'house_with_garden': '\\ud83c\\udfe1',\n  'houses': '\\ud83c\\udfd8\\ufe0f',\n  'hugs': '\\ud83e\\udd17',\n  'hungary': '\\ud83c\\udded\\ud83c\\uddfa',\n  'hushed': '\\ud83d\\ude2f',\n  'ice_cream': '\\ud83c\\udf68',\n  'ice_cube': '\\ud83e\\uddca',\n  'ice_hockey': '\\ud83c\\udfd2',\n  'ice_skate': '\\u26f8\\ufe0f',\n  'icecream': '\\ud83c\\udf66',\n  'iceland': '\\ud83c\\uddee\\ud83c\\uddf8',\n  'id': '\\ud83c\\udd94',\n  'ideograph_advantage': '\\ud83c\\ude50',\n  'imp': '\\ud83d\\udc7f',\n  'inbox_tray': '\\ud83d\\udce5',\n  'incoming_envelope': '\\ud83d\\udce8',\n  'india': '\\ud83c\\uddee\\ud83c\\uddf3',\n  'indonesia': '\\ud83c\\uddee\\ud83c\\udde9',\n  'infinity': '\\u267e\\ufe0f',\n  'information_desk_person': '\\ud83d\\udc81',\n  'information_source': '\\u2139\\ufe0f',\n  'innocent': '\\ud83d\\ude07',\n  'interrobang': '\\u2049\\ufe0f',\n  'iphone': '\\ud83d\\udcf1',\n  'iran': '\\ud83c\\uddee\\ud83c\\uddf7',\n  'iraq': '\\ud83c\\uddee\\ud83c\\uddf6',\n  'ireland': '\\ud83c\\uddee\\ud83c\\uddea',\n  'isle_of_man': '\\ud83c\\uddee\\ud83c\\uddf2',\n  'israel': '\\ud83c\\uddee\\ud83c\\uddf1',\n  'it': '\\ud83c\\uddee\\ud83c\\uddf9',\n  'izakaya_lantern': '\\ud83c\\udfee',\n  'jack_o_lantern': '\\ud83c\\udf83',\n  'jamaica': '\\ud83c\\uddef\\ud83c\\uddf2',\n  'japan': '\\ud83d\\uddfe',\n  'japanese_castle': '\\ud83c\\udfef',\n  'japanese_goblin': '\\ud83d\\udc7a',\n  'japanese_ogre': '\\ud83d\\udc79',\n  'jeans': '\\ud83d\\udc56',\n  'jersey': '\\ud83c\\uddef\\ud83c\\uddea',\n  'jigsaw': '\\ud83e\\udde9',\n  'jordan': '\\ud83c\\uddef\\ud83c\\uddf4',\n  'joy': '\\ud83d\\ude02',\n  'joy_cat': '\\ud83d\\ude39',\n  'joystick': '\\ud83d\\udd79\\ufe0f',\n  'jp': '\\ud83c\\uddef\\ud83c\\uddf5',\n  'judge': '\\ud83e\\uddd1\\u200d\\u2696\\ufe0f',\n  'juggling_person': '\\ud83e\\udd39',\n  'kaaba': '\\ud83d\\udd4b',\n  'kangaroo': '\\ud83e\\udd98',\n  'kazakhstan': '\\ud83c\\uddf0\\ud83c\\uddff',\n  'kenya': '\\ud83c\\uddf0\\ud83c\\uddea',\n  'key': '\\ud83d\\udd11',\n  'keyboard': '\\u2328\\ufe0f',\n  'keycap_ten': '\\ud83d\\udd1f',\n  'kick_scooter': '\\ud83d\\udef4',\n  'kimono': '\\ud83d\\udc58',\n  'kiribati': '\\ud83c\\uddf0\\ud83c\\uddee',\n  'kiss': '\\ud83d\\udc8b',\n  'kissing': '\\ud83d\\ude17',\n  'kissing_cat': '\\ud83d\\ude3d',\n  'kissing_closed_eyes': '\\ud83d\\ude1a',\n  'kissing_heart': '\\ud83d\\ude18',\n  'kissing_smiling_eyes': '\\ud83d\\ude19',\n  'kite': '\\ud83e\\ude81',\n  'kiwi_fruit': '\\ud83e\\udd5d',\n  'kneeling_man': '\\ud83e\\uddce\\u200d\\u2642\\ufe0f',\n  'kneeling_person': '\\ud83e\\uddce',\n  'kneeling_woman': '\\ud83e\\uddce\\u200d\\u2640\\ufe0f',\n  'knife': '\\ud83d\\udd2a',\n  'koala': '\\ud83d\\udc28',\n  'koko': '\\ud83c\\ude01',\n  'kosovo': '\\ud83c\\uddfd\\ud83c\\uddf0',\n  'kr': '\\ud83c\\uddf0\\ud83c\\uddf7',\n  'kuwait': '\\ud83c\\uddf0\\ud83c\\uddfc',\n  'kyrgyzstan': '\\ud83c\\uddf0\\ud83c\\uddec',\n  'lab_coat': '\\ud83e\\udd7c',\n  'label': '\\ud83c\\udff7\\ufe0f',\n  'lacrosse': '\\ud83e\\udd4d',\n  'lantern': '\\ud83c\\udfee',\n  'laos': '\\ud83c\\uddf1\\ud83c\\udde6',\n  'large_blue_circle': '\\ud83d\\udd35',\n  'large_blue_diamond': '\\ud83d\\udd37',\n  'large_orange_diamond': '\\ud83d\\udd36',\n  'last_quarter_moon': '\\ud83c\\udf17',\n  'last_quarter_moon_with_face': '\\ud83c\\udf1c',\n  'latin_cross': '\\u271d\\ufe0f',\n  'latvia': '\\ud83c\\uddf1\\ud83c\\uddfb',\n  'laughing': '\\ud83d\\ude06',\n  'leafy_green': '\\ud83e\\udd6c',\n  'leaves': '\\ud83c\\udf43',\n  'lebanon': '\\ud83c\\uddf1\\ud83c\\udde7',\n  'ledger': '\\ud83d\\udcd2',\n  'left_luggage': '\\ud83d\\udec5',\n  'left_right_arrow': '\\u2194\\ufe0f',\n  'left_speech_bubble': '\\ud83d\\udde8\\ufe0f',\n  'leftwards_arrow_with_hook': '\\u21a9\\ufe0f',\n  'leg': '\\ud83e\\uddb5',\n  'lemon': '\\ud83c\\udf4b',\n  'leo': '\\u264c',\n  'leopard': '\\ud83d\\udc06',\n  'lesotho': '\\ud83c\\uddf1\\ud83c\\uddf8',\n  'level_slider': '\\ud83c\\udf9a\\ufe0f',\n  'liberia': '\\ud83c\\uddf1\\ud83c\\uddf7',\n  'libra': '\\u264e',\n  'libya': '\\ud83c\\uddf1\\ud83c\\uddfe',\n  'liechtenstein': '\\ud83c\\uddf1\\ud83c\\uddee',\n  'light_rail': '\\ud83d\\ude88',\n  'link': '\\ud83d\\udd17',\n  'lion': '\\ud83e\\udd81',\n  'lips': '\\ud83d\\udc44',\n  'lipstick': '\\ud83d\\udc84',\n  'lithuania': '\\ud83c\\uddf1\\ud83c\\uddf9',\n  'lizard': '\\ud83e\\udd8e',\n  'llama': '\\ud83e\\udd99',\n  'lobster': '\\ud83e\\udd9e',\n  'lock': '\\ud83d\\udd12',\n  'lock_with_ink_pen': '\\ud83d\\udd0f',\n  'lollipop': '\\ud83c\\udf6d',\n  'loop': '\\u27bf',\n  'lotion_bottle': '\\ud83e\\uddf4',\n  'lotus_position': '\\ud83e\\uddd8',\n  'lotus_position_man': '\\ud83e\\uddd8\\u200d\\u2642\\ufe0f',\n  'lotus_position_woman': '\\ud83e\\uddd8\\u200d\\u2640\\ufe0f',\n  'loud_sound': '\\ud83d\\udd0a',\n  'loudspeaker': '\\ud83d\\udce2',\n  'love_hotel': '\\ud83c\\udfe9',\n  'love_letter': '\\ud83d\\udc8c',\n  'love_you_gesture': '\\ud83e\\udd1f',\n  'low_brightness': '\\ud83d\\udd05',\n  'luggage': '\\ud83e\\uddf3',\n  'luxembourg': '\\ud83c\\uddf1\\ud83c\\uddfa',\n  'lying_face': '\\ud83e\\udd25',\n  'm': '\\u24c2\\ufe0f',\n  'macau': '\\ud83c\\uddf2\\ud83c\\uddf4',\n  'macedonia': '\\ud83c\\uddf2\\ud83c\\uddf0',\n  'madagascar': '\\ud83c\\uddf2\\ud83c\\uddec',\n  'mag': '\\ud83d\\udd0d',\n  'mag_right': '\\ud83d\\udd0e',\n  'mage': '\\ud83e\\uddd9',\n  'mage_man': '\\ud83e\\uddd9\\u200d\\u2642\\ufe0f',\n  'mage_woman': '\\ud83e\\uddd9\\u200d\\u2640\\ufe0f',\n  'magnet': '\\ud83e\\uddf2',\n  'mahjong': '\\ud83c\\udc04',\n  'mailbox': '\\ud83d\\udceb',\n  'mailbox_closed': '\\ud83d\\udcea',\n  'mailbox_with_mail': '\\ud83d\\udcec',\n  'mailbox_with_no_mail': '\\ud83d\\udced',\n  'malawi': '\\ud83c\\uddf2\\ud83c\\uddfc',\n  'malaysia': '\\ud83c\\uddf2\\ud83c\\uddfe',\n  'maldives': '\\ud83c\\uddf2\\ud83c\\uddfb',\n  'male_detective': '\\ud83d\\udd75\\ufe0f\\u200d\\u2642\\ufe0f',\n  'male_sign': '\\u2642\\ufe0f',\n  'mali': '\\ud83c\\uddf2\\ud83c\\uddf1',\n  'malta': '\\ud83c\\uddf2\\ud83c\\uddf9',\n  'man': '\\ud83d\\udc68',\n  'man_artist': '\\ud83d\\udc68\\u200d\\ud83c\\udfa8',\n  'man_astronaut': '\\ud83d\\udc68\\u200d\\ud83d\\ude80',\n  'man_cartwheeling': '\\ud83e\\udd38\\u200d\\u2642\\ufe0f',\n  'man_cook': '\\ud83d\\udc68\\u200d\\ud83c\\udf73',\n  'man_dancing': '\\ud83d\\udd7a',\n  'man_facepalming': '\\ud83e\\udd26\\u200d\\u2642\\ufe0f',\n  'man_factory_worker': '\\ud83d\\udc68\\u200d\\ud83c\\udfed',\n  'man_farmer': '\\ud83d\\udc68\\u200d\\ud83c\\udf3e',\n  'man_firefighter': '\\ud83d\\udc68\\u200d\\ud83d\\ude92',\n  'man_health_worker': '\\ud83d\\udc68\\u200d\\u2695\\ufe0f',\n  'man_in_manual_wheelchair': '\\ud83d\\udc68\\u200d\\ud83e\\uddbd',\n  'man_in_motorized_wheelchair': '\\ud83d\\udc68\\u200d\\ud83e\\uddbc',\n  'man_in_tuxedo': '\\ud83e\\udd35',\n  'man_judge': '\\ud83d\\udc68\\u200d\\u2696\\ufe0f',\n  'man_juggling': '\\ud83e\\udd39\\u200d\\u2642\\ufe0f',\n  'man_mechanic': '\\ud83d\\udc68\\u200d\\ud83d\\udd27',\n  'man_office_worker': '\\ud83d\\udc68\\u200d\\ud83d\\udcbc',\n  'man_pilot': '\\ud83d\\udc68\\u200d\\u2708\\ufe0f',\n  'man_playing_handball': '\\ud83e\\udd3e\\u200d\\u2642\\ufe0f',\n  'man_playing_water_polo': '\\ud83e\\udd3d\\u200d\\u2642\\ufe0f',\n  'man_scientist': '\\ud83d\\udc68\\u200d\\ud83d\\udd2c',\n  'man_shrugging': '\\ud83e\\udd37\\u200d\\u2642\\ufe0f',\n  'man_singer': '\\ud83d\\udc68\\u200d\\ud83c\\udfa4',\n  'man_student': '\\ud83d\\udc68\\u200d\\ud83c\\udf93',\n  'man_teacher': '\\ud83d\\udc68\\u200d\\ud83c\\udfeb',\n  'man_technologist': '\\ud83d\\udc68\\u200d\\ud83d\\udcbb',\n  'man_with_gua_pi_mao': '\\ud83d\\udc72',\n  'man_with_probing_cane': '\\ud83d\\udc68\\u200d\\ud83e\\uddaf',\n  'man_with_turban': '\\ud83d\\udc73\\u200d\\u2642\\ufe0f',\n  'mandarin': '\\ud83c\\udf4a',\n  'mango': '\\ud83e\\udd6d',\n  'mans_shoe': '\\ud83d\\udc5e',\n  'mantelpiece_clock': '\\ud83d\\udd70\\ufe0f',\n  'manual_wheelchair': '\\ud83e\\uddbd',\n  'maple_leaf': '\\ud83c\\udf41',\n  'marshall_islands': '\\ud83c\\uddf2\\ud83c\\udded',\n  'martial_arts_uniform': '\\ud83e\\udd4b',\n  'martinique': '\\ud83c\\uddf2\\ud83c\\uddf6',\n  'mask': '\\ud83d\\ude37',\n  'massage': '\\ud83d\\udc86',\n  'massage_man': '\\ud83d\\udc86\\u200d\\u2642\\ufe0f',\n  'massage_woman': '\\ud83d\\udc86\\u200d\\u2640\\ufe0f',\n  'mate': '\\ud83e\\uddc9',\n  'mauritania': '\\ud83c\\uddf2\\ud83c\\uddf7',\n  'mauritius': '\\ud83c\\uddf2\\ud83c\\uddfa',\n  'mayotte': '\\ud83c\\uddfe\\ud83c\\uddf9',\n  'meat_on_bone': '\\ud83c\\udf56',\n  'mechanic': '\\ud83e\\uddd1\\u200d\\ud83d\\udd27',\n  'mechanical_arm': '\\ud83e\\uddbe',\n  'mechanical_leg': '\\ud83e\\uddbf',\n  'medal_military': '\\ud83c\\udf96\\ufe0f',\n  'medal_sports': '\\ud83c\\udfc5',\n  'medical_symbol': '\\u2695\\ufe0f',\n  'mega': '\\ud83d\\udce3',\n  'melon': '\\ud83c\\udf48',\n  'memo': '\\ud83d\\udcdd',\n  'men_wrestling': '\\ud83e\\udd3c\\u200d\\u2642\\ufe0f',\n  'menorah': '\\ud83d\\udd4e',\n  'mens': '\\ud83d\\udeb9',\n  'mermaid': '\\ud83e\\udddc\\u200d\\u2640\\ufe0f',\n  'merman': '\\ud83e\\udddc\\u200d\\u2642\\ufe0f',\n  'merperson': '\\ud83e\\udddc',\n  'metal': '\\ud83e\\udd18',\n  'metro': '\\ud83d\\ude87',\n  'mexico': '\\ud83c\\uddf2\\ud83c\\uddfd',\n  'microbe': '\\ud83e\\udda0',\n  'micronesia': '\\ud83c\\uddeb\\ud83c\\uddf2',\n  'microphone': '\\ud83c\\udfa4',\n  'microscope': '\\ud83d\\udd2c',\n  'middle_finger': '\\ud83d\\udd95',\n  'milk_glass': '\\ud83e\\udd5b',\n  'milky_way': '\\ud83c\\udf0c',\n  'minibus': '\\ud83d\\ude90',\n  'minidisc': '\\ud83d\\udcbd',\n  'mobile_phone_off': '\\ud83d\\udcf4',\n  'moldova': '\\ud83c\\uddf2\\ud83c\\udde9',\n  'monaco': '\\ud83c\\uddf2\\ud83c\\udde8',\n  'money_mouth_face': '\\ud83e\\udd11',\n  'money_with_wings': '\\ud83d\\udcb8',\n  'moneybag': '\\ud83d\\udcb0',\n  'mongolia': '\\ud83c\\uddf2\\ud83c\\uddf3',\n  'monkey': '\\ud83d\\udc12',\n  'monkey_face': '\\ud83d\\udc35',\n  'monocle_face': '\\ud83e\\uddd0',\n  'monorail': '\\ud83d\\ude9d',\n  'montenegro': '\\ud83c\\uddf2\\ud83c\\uddea',\n  'montserrat': '\\ud83c\\uddf2\\ud83c\\uddf8',\n  'moon': '\\ud83c\\udf14',\n  'moon_cake': '\\ud83e\\udd6e',\n  'morocco': '\\ud83c\\uddf2\\ud83c\\udde6',\n  'mortar_board': '\\ud83c\\udf93',\n  'mosque': '\\ud83d\\udd4c',\n  'mosquito': '\\ud83e\\udd9f',\n  'motor_boat': '\\ud83d\\udee5\\ufe0f',\n  'motor_scooter': '\\ud83d\\udef5',\n  'motorcycle': '\\ud83c\\udfcd\\ufe0f',\n  'motorized_wheelchair': '\\ud83e\\uddbc',\n  'motorway': '\\ud83d\\udee3\\ufe0f',\n  'mount_fuji': '\\ud83d\\uddfb',\n  'mountain': '\\u26f0\\ufe0f',\n  'mountain_bicyclist': '\\ud83d\\udeb5',\n  'mountain_biking_man': '\\ud83d\\udeb5\\u200d\\u2642\\ufe0f',\n  'mountain_biking_woman': '\\ud83d\\udeb5\\u200d\\u2640\\ufe0f',\n  'mountain_cableway': '\\ud83d\\udea0',\n  'mountain_railway': '\\ud83d\\ude9e',\n  'mountain_snow': '\\ud83c\\udfd4\\ufe0f',\n  'mouse': '\\ud83d\\udc2d',\n  'mouse2': '\\ud83d\\udc01',\n  'movie_camera': '\\ud83c\\udfa5',\n  'moyai': '\\ud83d\\uddff',\n  'mozambique': '\\ud83c\\uddf2\\ud83c\\uddff',\n  'mrs_claus': '\\ud83e\\udd36',\n  'muscle': '\\ud83d\\udcaa',\n  'mushroom': '\\ud83c\\udf44',\n  'musical_keyboard': '\\ud83c\\udfb9',\n  'musical_note': '\\ud83c\\udfb5',\n  'musical_score': '\\ud83c\\udfbc',\n  'mute': '\\ud83d\\udd07',\n  'myanmar': '\\ud83c\\uddf2\\ud83c\\uddf2',\n  'nail_care': '\\ud83d\\udc85',\n  'name_badge': '\\ud83d\\udcdb',\n  'namibia': '\\ud83c\\uddf3\\ud83c\\udde6',\n  'national_park': '\\ud83c\\udfde\\ufe0f',\n  'nauru': '\\ud83c\\uddf3\\ud83c\\uddf7',\n  'nauseated_face': '\\ud83e\\udd22',\n  'nazar_amulet': '\\ud83e\\uddff',\n  'necktie': '\\ud83d\\udc54',\n  'negative_squared_cross_mark': '\\u274e',\n  'nepal': '\\ud83c\\uddf3\\ud83c\\uddf5',\n  'nerd_face': '\\ud83e\\udd13',\n  'netherlands': '\\ud83c\\uddf3\\ud83c\\uddf1',\n  'neutral_face': '\\ud83d\\ude10',\n  'new': '\\ud83c\\udd95',\n  'new_caledonia': '\\ud83c\\uddf3\\ud83c\\udde8',\n  'new_moon': '\\ud83c\\udf11',\n  'new_moon_with_face': '\\ud83c\\udf1a',\n  'new_zealand': '\\ud83c\\uddf3\\ud83c\\uddff',\n  'newspaper': '\\ud83d\\udcf0',\n  'newspaper_roll': '\\ud83d\\uddde\\ufe0f',\n  'next_track_button': '\\u23ed\\ufe0f',\n  'ng': '\\ud83c\\udd96',\n  'ng_man': '\\ud83d\\ude45\\u200d\\u2642\\ufe0f',\n  'ng_woman': '\\ud83d\\ude45\\u200d\\u2640\\ufe0f',\n  'nicaragua': '\\ud83c\\uddf3\\ud83c\\uddee',\n  'niger': '\\ud83c\\uddf3\\ud83c\\uddea',\n  'nigeria': '\\ud83c\\uddf3\\ud83c\\uddec',\n  'night_with_stars': '\\ud83c\\udf03',\n  'nine': '9\\ufe0f\\u20e3',\n  'niue': '\\ud83c\\uddf3\\ud83c\\uddfa',\n  'no_bell': '\\ud83d\\udd15',\n  'no_bicycles': '\\ud83d\\udeb3',\n  'no_entry': '\\u26d4',\n  'no_entry_sign': '\\ud83d\\udeab',\n  'no_good': '\\ud83d\\ude45',\n  'no_good_man': '\\ud83d\\ude45\\u200d\\u2642\\ufe0f',\n  'no_good_woman': '\\ud83d\\ude45\\u200d\\u2640\\ufe0f',\n  'no_mobile_phones': '\\ud83d\\udcf5',\n  'no_mouth': '\\ud83d\\ude36',\n  'no_pedestrians': '\\ud83d\\udeb7',\n  'no_smoking': '\\ud83d\\udead',\n  'non-potable_water': '\\ud83d\\udeb1',\n  'norfolk_island': '\\ud83c\\uddf3\\ud83c\\uddeb',\n  'north_korea': '\\ud83c\\uddf0\\ud83c\\uddf5',\n  'northern_mariana_islands': '\\ud83c\\uddf2\\ud83c\\uddf5',\n  'norway': '\\ud83c\\uddf3\\ud83c\\uddf4',\n  'nose': '\\ud83d\\udc43',\n  'notebook': '\\ud83d\\udcd3',\n  'notebook_with_decorative_cover': '\\ud83d\\udcd4',\n  'notes': '\\ud83c\\udfb6',\n  'nut_and_bolt': '\\ud83d\\udd29',\n  'o': '\\u2b55',\n  'o2': '\\ud83c\\udd7e\\ufe0f',\n  'ocean': '\\ud83c\\udf0a',\n  'octopus': '\\ud83d\\udc19',\n  'oden': '\\ud83c\\udf62',\n  'office': '\\ud83c\\udfe2',\n  'office_worker': '\\ud83e\\uddd1\\u200d\\ud83d\\udcbc',\n  'oil_drum': '\\ud83d\\udee2\\ufe0f',\n  'ok': '\\ud83c\\udd97',\n  'ok_hand': '\\ud83d\\udc4c',\n  'ok_man': '\\ud83d\\ude46\\u200d\\u2642\\ufe0f',\n  'ok_person': '\\ud83d\\ude46',\n  'ok_woman': '\\ud83d\\ude46\\u200d\\u2640\\ufe0f',\n  'old_key': '\\ud83d\\udddd\\ufe0f',\n  'older_adult': '\\ud83e\\uddd3',\n  'older_man': '\\ud83d\\udc74',\n  'older_woman': '\\ud83d\\udc75',\n  'om': '\\ud83d\\udd49\\ufe0f',\n  'oman': '\\ud83c\\uddf4\\ud83c\\uddf2',\n  'on': '\\ud83d\\udd1b',\n  'oncoming_automobile': '\\ud83d\\ude98',\n  'oncoming_bus': '\\ud83d\\ude8d',\n  'oncoming_police_car': '\\ud83d\\ude94',\n  'oncoming_taxi': '\\ud83d\\ude96',\n  'one': '1\\ufe0f\\u20e3',\n  'one_piece_swimsuit': '\\ud83e\\ude71',\n  'onion': '\\ud83e\\uddc5',\n  'open_book': '\\ud83d\\udcd6',\n  'open_file_folder': '\\ud83d\\udcc2',\n  'open_hands': '\\ud83d\\udc50',\n  'open_mouth': '\\ud83d\\ude2e',\n  'open_umbrella': '\\u2602\\ufe0f',\n  'ophiuchus': '\\u26ce',\n  'orange': '\\ud83c\\udf4a',\n  'orange_book': '\\ud83d\\udcd9',\n  'orange_circle': '\\ud83d\\udfe0',\n  'orange_heart': '\\ud83e\\udde1',\n  'orange_square': '\\ud83d\\udfe7',\n  'orangutan': '\\ud83e\\udda7',\n  'orthodox_cross': '\\u2626\\ufe0f',\n  'otter': '\\ud83e\\udda6',\n  'outbox_tray': '\\ud83d\\udce4',\n  'owl': '\\ud83e\\udd89',\n  'ox': '\\ud83d\\udc02',\n  'oyster': '\\ud83e\\uddaa',\n  'package': '\\ud83d\\udce6',\n  'page_facing_up': '\\ud83d\\udcc4',\n  'page_with_curl': '\\ud83d\\udcc3',\n  'pager': '\\ud83d\\udcdf',\n  'paintbrush': '\\ud83d\\udd8c\\ufe0f',\n  'pakistan': '\\ud83c\\uddf5\\ud83c\\uddf0',\n  'palau': '\\ud83c\\uddf5\\ud83c\\uddfc',\n  'palestinian_territories': '\\ud83c\\uddf5\\ud83c\\uddf8',\n  'palm_tree': '\\ud83c\\udf34',\n  'palms_up_together': '\\ud83e\\udd32',\n  'panama': '\\ud83c\\uddf5\\ud83c\\udde6',\n  'pancakes': '\\ud83e\\udd5e',\n  'panda_face': '\\ud83d\\udc3c',\n  'paperclip': '\\ud83d\\udcce',\n  'paperclips': '\\ud83d\\udd87\\ufe0f',\n  'papua_new_guinea': '\\ud83c\\uddf5\\ud83c\\uddec',\n  'parachute': '\\ud83e\\ude82',\n  'paraguay': '\\ud83c\\uddf5\\ud83c\\uddfe',\n  'parasol_on_ground': '\\u26f1\\ufe0f',\n  'parking': '\\ud83c\\udd7f\\ufe0f',\n  'parrot': '\\ud83e\\udd9c',\n  'part_alternation_mark': '\\u303d\\ufe0f',\n  'partly_sunny': '\\u26c5',\n  'partying_face': '\\ud83e\\udd73',\n  'passenger_ship': '\\ud83d\\udef3\\ufe0f',\n  'passport_control': '\\ud83d\\udec2',\n  'pause_button': '\\u23f8\\ufe0f',\n  'paw_prints': '\\ud83d\\udc3e',\n  'peace_symbol': '\\u262e\\ufe0f',\n  'peach': '\\ud83c\\udf51',\n  'peacock': '\\ud83e\\udd9a',\n  'peanuts': '\\ud83e\\udd5c',\n  'pear': '\\ud83c\\udf50',\n  'pen': '\\ud83d\\udd8a\\ufe0f',\n  'pencil': '\\ud83d\\udcdd',\n  'pencil2': '\\u270f\\ufe0f',\n  'penguin': '\\ud83d\\udc27',\n  'pensive': '\\ud83d\\ude14',\n  'people_holding_hands': '\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1',\n  'performing_arts': '\\ud83c\\udfad',\n  'persevere': '\\ud83d\\ude23',\n  'person_bald': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb2',\n  'person_curly_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb1',\n  'person_fencing': '\\ud83e\\udd3a',\n  'person_in_manual_wheelchair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddbd',\n  'person_in_motorized_wheelchair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddbc',\n  'person_red_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb0',\n  'person_white_hair': '\\ud83e\\uddd1\\u200d\\ud83e\\uddb3',\n  'person_with_probing_cane': '\\ud83e\\uddd1\\u200d\\ud83e\\uddaf',\n  'person_with_turban': '\\ud83d\\udc73',\n  'peru': '\\ud83c\\uddf5\\ud83c\\uddea',\n  'petri_dish': '\\ud83e\\uddeb',\n  'philippines': '\\ud83c\\uddf5\\ud83c\\udded',\n  'phone': '\\u260e\\ufe0f',\n  'pick': '\\u26cf\\ufe0f',\n  'pie': '\\ud83e\\udd67',\n  'pig': '\\ud83d\\udc37',\n  'pig2': '\\ud83d\\udc16',\n  'pig_nose': '\\ud83d\\udc3d',\n  'pill': '\\ud83d\\udc8a',\n  'pilot': '\\ud83e\\uddd1\\u200d\\u2708\\ufe0f',\n  'pinching_hand': '\\ud83e\\udd0f',\n  'pineapple': '\\ud83c\\udf4d',\n  'ping_pong': '\\ud83c\\udfd3',\n  'pirate_flag': '\\ud83c\\udff4\\u200d\\u2620\\ufe0f',\n  'pisces': '\\u2653',\n  'pitcairn_islands': '\\ud83c\\uddf5\\ud83c\\uddf3',\n  'pizza': '\\ud83c\\udf55',\n  'place_of_worship': '\\ud83d\\uded0',\n  'plate_with_cutlery': '\\ud83c\\udf7d\\ufe0f',\n  'play_or_pause_button': '\\u23ef\\ufe0f',\n  'pleading_face': '\\ud83e\\udd7a',\n  'point_down': '\\ud83d\\udc47',\n  'point_left': '\\ud83d\\udc48',\n  'point_right': '\\ud83d\\udc49',\n  'point_up': '\\u261d\\ufe0f',\n  'point_up_2': '\\ud83d\\udc46',\n  'poland': '\\ud83c\\uddf5\\ud83c\\uddf1',\n  'police_car': '\\ud83d\\ude93',\n  'police_officer': '\\ud83d\\udc6e',\n  'policeman': '\\ud83d\\udc6e\\u200d\\u2642\\ufe0f',\n  'policewoman': '\\ud83d\\udc6e\\u200d\\u2640\\ufe0f',\n  'poodle': '\\ud83d\\udc29',\n  'poop': '\\ud83d\\udca9',\n  'popcorn': '\\ud83c\\udf7f',\n  'portugal': '\\ud83c\\uddf5\\ud83c\\uddf9',\n  'post_office': '\\ud83c\\udfe3',\n  'postal_horn': '\\ud83d\\udcef',\n  'postbox': '\\ud83d\\udcee',\n  'potable_water': '\\ud83d\\udeb0',\n  'potato': '\\ud83e\\udd54',\n  'pouch': '\\ud83d\\udc5d',\n  'poultry_leg': '\\ud83c\\udf57',\n  'pound': '\\ud83d\\udcb7',\n  'pout': '\\ud83d\\ude21',\n  'pouting_cat': '\\ud83d\\ude3e',\n  'pouting_face': '\\ud83d\\ude4e',\n  'pouting_man': '\\ud83d\\ude4e\\u200d\\u2642\\ufe0f',\n  'pouting_woman': '\\ud83d\\ude4e\\u200d\\u2640\\ufe0f',\n  'pray': '\\ud83d\\ude4f',\n  'prayer_beads': '\\ud83d\\udcff',\n  'pregnant_woman': '\\ud83e\\udd30',\n  'pretzel': '\\ud83e\\udd68',\n  'previous_track_button': '\\u23ee\\ufe0f',\n  'prince': '\\ud83e\\udd34',\n  'princess': '\\ud83d\\udc78',\n  'printer': '\\ud83d\\udda8\\ufe0f',\n  'probing_cane': '\\ud83e\\uddaf',\n  'puerto_rico': '\\ud83c\\uddf5\\ud83c\\uddf7',\n  'punch': '\\ud83d\\udc4a',\n  'purple_circle': '\\ud83d\\udfe3',\n  'purple_heart': '\\ud83d\\udc9c',\n  'purple_square': '\\ud83d\\udfea',\n  'purse': '\\ud83d\\udc5b',\n  'pushpin': '\\ud83d\\udccc',\n  'put_litter_in_its_place': '\\ud83d\\udeae',\n  'qatar': '\\ud83c\\uddf6\\ud83c\\udde6',\n  'question': '\\u2753',\n  'rabbit': '\\ud83d\\udc30',\n  'rabbit2': '\\ud83d\\udc07',\n  'raccoon': '\\ud83e\\udd9d',\n  'racehorse': '\\ud83d\\udc0e',\n  'racing_car': '\\ud83c\\udfce\\ufe0f',\n  'radio': '\\ud83d\\udcfb',\n  'radio_button': '\\ud83d\\udd18',\n  'radioactive': '\\u2622\\ufe0f',\n  'rage': '\\ud83d\\ude21',\n  'railway_car': '\\ud83d\\ude83',\n  'railway_track': '\\ud83d\\udee4\\ufe0f',\n  'rainbow': '\\ud83c\\udf08',\n  'rainbow_flag': '\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08',\n  'raised_back_of_hand': '\\ud83e\\udd1a',\n  'raised_eyebrow': '\\ud83e\\udd28',\n  'raised_hand': '\\u270b',\n  'raised_hand_with_fingers_splayed': '\\ud83d\\udd90\\ufe0f',\n  'raised_hands': '\\ud83d\\ude4c',\n  'raising_hand': '\\ud83d\\ude4b',\n  'raising_hand_man': '\\ud83d\\ude4b\\u200d\\u2642\\ufe0f',\n  'raising_hand_woman': '\\ud83d\\ude4b\\u200d\\u2640\\ufe0f',\n  'ram': '\\ud83d\\udc0f',\n  'ramen': '\\ud83c\\udf5c',\n  'rat': '\\ud83d\\udc00',\n  'razor': '\\ud83e\\ude92',\n  'receipt': '\\ud83e\\uddfe',\n  'record_button': '\\u23fa\\ufe0f',\n  'recycle': '\\u267b\\ufe0f',\n  'red_car': '\\ud83d\\ude97',\n  'red_circle': '\\ud83d\\udd34',\n  'red_envelope': '\\ud83e\\udde7',\n  'red_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb0',\n  'red_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb0',\n  'red_square': '\\ud83d\\udfe5',\n  'registered': '\\u00ae\\ufe0f',\n  'relaxed': '\\u263a\\ufe0f',\n  'relieved': '\\ud83d\\ude0c',\n  'reminder_ribbon': '\\ud83c\\udf97\\ufe0f',\n  'repeat': '\\ud83d\\udd01',\n  'repeat_one': '\\ud83d\\udd02',\n  'rescue_worker_helmet': '\\u26d1\\ufe0f',\n  'restroom': '\\ud83d\\udebb',\n  'reunion': '\\ud83c\\uddf7\\ud83c\\uddea',\n  'revolving_hearts': '\\ud83d\\udc9e',\n  'rewind': '\\u23ea',\n  'rhinoceros': '\\ud83e\\udd8f',\n  'ribbon': '\\ud83c\\udf80',\n  'rice': '\\ud83c\\udf5a',\n  'rice_ball': '\\ud83c\\udf59',\n  'rice_cracker': '\\ud83c\\udf58',\n  'rice_scene': '\\ud83c\\udf91',\n  'right_anger_bubble': '\\ud83d\\uddef\\ufe0f',\n  'ring': '\\ud83d\\udc8d',\n  'ringed_planet': '\\ud83e\\ude90',\n  'robot': '\\ud83e\\udd16',\n  'rocket': '\\ud83d\\ude80',\n  'rofl': '\\ud83e\\udd23',\n  'roll_eyes': '\\ud83d\\ude44',\n  'roll_of_paper': '\\ud83e\\uddfb',\n  'roller_coaster': '\\ud83c\\udfa2',\n  'romania': '\\ud83c\\uddf7\\ud83c\\uddf4',\n  'rooster': '\\ud83d\\udc13',\n  'rose': '\\ud83c\\udf39',\n  'rosette': '\\ud83c\\udff5\\ufe0f',\n  'rotating_light': '\\ud83d\\udea8',\n  'round_pushpin': '\\ud83d\\udccd',\n  'rowboat': '\\ud83d\\udea3',\n  'rowing_man': '\\ud83d\\udea3\\u200d\\u2642\\ufe0f',\n  'rowing_woman': '\\ud83d\\udea3\\u200d\\u2640\\ufe0f',\n  'ru': '\\ud83c\\uddf7\\ud83c\\uddfa',\n  'rugby_football': '\\ud83c\\udfc9',\n  'runner': '\\ud83c\\udfc3',\n  'running': '\\ud83c\\udfc3',\n  'running_man': '\\ud83c\\udfc3\\u200d\\u2642\\ufe0f',\n  'running_shirt_with_sash': '\\ud83c\\udfbd',\n  'running_woman': '\\ud83c\\udfc3\\u200d\\u2640\\ufe0f',\n  'rwanda': '\\ud83c\\uddf7\\ud83c\\uddfc',\n  'sa': '\\ud83c\\ude02\\ufe0f',\n  'safety_pin': '\\ud83e\\uddf7',\n  'safety_vest': '\\ud83e\\uddba',\n  'sagittarius': '\\u2650',\n  'sailboat': '\\u26f5',\n  'sake': '\\ud83c\\udf76',\n  'salt': '\\ud83e\\uddc2',\n  'samoa': '\\ud83c\\uddfc\\ud83c\\uddf8',\n  'san_marino': '\\ud83c\\uddf8\\ud83c\\uddf2',\n  'sandal': '\\ud83d\\udc61',\n  'sandwich': '\\ud83e\\udd6a',\n  'santa': '\\ud83c\\udf85',\n  'sao_tome_principe': '\\ud83c\\uddf8\\ud83c\\uddf9',\n  'sari': '\\ud83e\\udd7b',\n  'sassy_man': '\\ud83d\\udc81\\u200d\\u2642\\ufe0f',\n  'sassy_woman': '\\ud83d\\udc81\\u200d\\u2640\\ufe0f',\n  'satellite': '\\ud83d\\udce1',\n  'satisfied': '\\ud83d\\ude06',\n  'saudi_arabia': '\\ud83c\\uddf8\\ud83c\\udde6',\n  'sauna_man': '\\ud83e\\uddd6\\u200d\\u2642\\ufe0f',\n  'sauna_person': '\\ud83e\\uddd6',\n  'sauna_woman': '\\ud83e\\uddd6\\u200d\\u2640\\ufe0f',\n  'sauropod': '\\ud83e\\udd95',\n  'saxophone': '\\ud83c\\udfb7',\n  'scarf': '\\ud83e\\udde3',\n  'school': '\\ud83c\\udfeb',\n  'school_satchel': '\\ud83c\\udf92',\n  'scientist': '\\ud83e\\uddd1\\u200d\\ud83d\\udd2c',\n  'scissors': '\\u2702\\ufe0f',\n  'scorpion': '\\ud83e\\udd82',\n  'scorpius': '\\u264f',\n  'scotland': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f',\n  'scream': '\\ud83d\\ude31',\n  'scream_cat': '\\ud83d\\ude40',\n  'scroll': '\\ud83d\\udcdc',\n  'seat': '\\ud83d\\udcba',\n  'secret': '\\u3299\\ufe0f',\n  'see_no_evil': '\\ud83d\\ude48',\n  'seedling': '\\ud83c\\udf31',\n  'selfie': '\\ud83e\\udd33',\n  'senegal': '\\ud83c\\uddf8\\ud83c\\uddf3',\n  'serbia': '\\ud83c\\uddf7\\ud83c\\uddf8',\n  'service_dog': '\\ud83d\\udc15\\u200d\\ud83e\\uddba',\n  'seven': '7\\ufe0f\\u20e3',\n  'seychelles': '\\ud83c\\uddf8\\ud83c\\udde8',\n  'shallow_pan_of_food': '\\ud83e\\udd58',\n  'shamrock': '\\u2618\\ufe0f',\n  'shark': '\\ud83e\\udd88',\n  'shaved_ice': '\\ud83c\\udf67',\n  'sheep': '\\ud83d\\udc11',\n  'shell': '\\ud83d\\udc1a',\n  'shield': '\\ud83d\\udee1\\ufe0f',\n  'shinto_shrine': '\\u26e9\\ufe0f',\n  'ship': '\\ud83d\\udea2',\n  'shirt': '\\ud83d\\udc55',\n  'shit': '\\ud83d\\udca9',\n  'shoe': '\\ud83d\\udc5e',\n  'shopping': '\\ud83d\\udecd\\ufe0f',\n  'shopping_cart': '\\ud83d\\uded2',\n  'shorts': '\\ud83e\\ude73',\n  'shower': '\\ud83d\\udebf',\n  'shrimp': '\\ud83e\\udd90',\n  'shrug': '\\ud83e\\udd37',\n  'shushing_face': '\\ud83e\\udd2b',\n  'sierra_leone': '\\ud83c\\uddf8\\ud83c\\uddf1',\n  'signal_strength': '\\ud83d\\udcf6',\n  'singapore': '\\ud83c\\uddf8\\ud83c\\uddec',\n  'singer': '\\ud83e\\uddd1\\u200d\\ud83c\\udfa4',\n  'sint_maarten': '\\ud83c\\uddf8\\ud83c\\uddfd',\n  'six': '6\\ufe0f\\u20e3',\n  'six_pointed_star': '\\ud83d\\udd2f',\n  'skateboard': '\\ud83d\\udef9',\n  'ski': '\\ud83c\\udfbf',\n  'skier': '\\u26f7\\ufe0f',\n  'skull': '\\ud83d\\udc80',\n  'skull_and_crossbones': '\\u2620\\ufe0f',\n  'skunk': '\\ud83e\\udda8',\n  'sled': '\\ud83d\\udef7',\n  'sleeping': '\\ud83d\\ude34',\n  'sleeping_bed': '\\ud83d\\udecc',\n  'sleepy': '\\ud83d\\ude2a',\n  'slightly_frowning_face': '\\ud83d\\ude41',\n  'slightly_smiling_face': '\\ud83d\\ude42',\n  'slot_machine': '\\ud83c\\udfb0',\n  'sloth': '\\ud83e\\udda5',\n  'slovakia': '\\ud83c\\uddf8\\ud83c\\uddf0',\n  'slovenia': '\\ud83c\\uddf8\\ud83c\\uddee',\n  'small_airplane': '\\ud83d\\udee9\\ufe0f',\n  'small_blue_diamond': '\\ud83d\\udd39',\n  'small_orange_diamond': '\\ud83d\\udd38',\n  'small_red_triangle': '\\ud83d\\udd3a',\n  'small_red_triangle_down': '\\ud83d\\udd3b',\n  'smile': '\\ud83d\\ude04',\n  'smile_cat': '\\ud83d\\ude38',\n  'smiley': '\\ud83d\\ude03',\n  'smiley_cat': '\\ud83d\\ude3a',\n  'smiling_face_with_three_hearts': '\\ud83e\\udd70',\n  'smiling_imp': '\\ud83d\\ude08',\n  'smirk': '\\ud83d\\ude0f',\n  'smirk_cat': '\\ud83d\\ude3c',\n  'smoking': '\\ud83d\\udeac',\n  'snail': '\\ud83d\\udc0c',\n  'snake': '\\ud83d\\udc0d',\n  'sneezing_face': '\\ud83e\\udd27',\n  'snowboarder': '\\ud83c\\udfc2',\n  'snowflake': '\\u2744\\ufe0f',\n  'snowman': '\\u26c4',\n  'snowman_with_snow': '\\u2603\\ufe0f',\n  'soap': '\\ud83e\\uddfc',\n  'sob': '\\ud83d\\ude2d',\n  'soccer': '\\u26bd',\n  'socks': '\\ud83e\\udde6',\n  'softball': '\\ud83e\\udd4e',\n  'solomon_islands': '\\ud83c\\uddf8\\ud83c\\udde7',\n  'somalia': '\\ud83c\\uddf8\\ud83c\\uddf4',\n  'soon': '\\ud83d\\udd1c',\n  'sos': '\\ud83c\\udd98',\n  'sound': '\\ud83d\\udd09',\n  'south_africa': '\\ud83c\\uddff\\ud83c\\udde6',\n  'south_georgia_south_sandwich_islands': '\\ud83c\\uddec\\ud83c\\uddf8',\n  'south_sudan': '\\ud83c\\uddf8\\ud83c\\uddf8',\n  'space_invader': '\\ud83d\\udc7e',\n  'spades': '\\u2660\\ufe0f',\n  'spaghetti': '\\ud83c\\udf5d',\n  'sparkle': '\\u2747\\ufe0f',\n  'sparkler': '\\ud83c\\udf87',\n  'sparkles': '\\u2728',\n  'sparkling_heart': '\\ud83d\\udc96',\n  'speak_no_evil': '\\ud83d\\ude4a',\n  'speaker': '\\ud83d\\udd08',\n  'speaking_head': '\\ud83d\\udde3\\ufe0f',\n  'speech_balloon': '\\ud83d\\udcac',\n  'speedboat': '\\ud83d\\udea4',\n  'spider': '\\ud83d\\udd77\\ufe0f',\n  'spider_web': '\\ud83d\\udd78\\ufe0f',\n  'spiral_calendar': '\\ud83d\\uddd3\\ufe0f',\n  'spiral_notepad': '\\ud83d\\uddd2\\ufe0f',\n  'sponge': '\\ud83e\\uddfd',\n  'spoon': '\\ud83e\\udd44',\n  'squid': '\\ud83e\\udd91',\n  'sri_lanka': '\\ud83c\\uddf1\\ud83c\\uddf0',\n  'st_barthelemy': '\\ud83c\\udde7\\ud83c\\uddf1',\n  'st_helena': '\\ud83c\\uddf8\\ud83c\\udded',\n  'st_kitts_nevis': '\\ud83c\\uddf0\\ud83c\\uddf3',\n  'st_lucia': '\\ud83c\\uddf1\\ud83c\\udde8',\n  'st_martin': '\\ud83c\\uddf2\\ud83c\\uddeb',\n  'st_pierre_miquelon': '\\ud83c\\uddf5\\ud83c\\uddf2',\n  'st_vincent_grenadines': '\\ud83c\\uddfb\\ud83c\\udde8',\n  'stadium': '\\ud83c\\udfdf\\ufe0f',\n  'standing_man': '\\ud83e\\uddcd\\u200d\\u2642\\ufe0f',\n  'standing_person': '\\ud83e\\uddcd',\n  'standing_woman': '\\ud83e\\uddcd\\u200d\\u2640\\ufe0f',\n  'star': '\\u2b50',\n  'star2': '\\ud83c\\udf1f',\n  'star_and_crescent': '\\u262a\\ufe0f',\n  'star_of_david': '\\u2721\\ufe0f',\n  'star_struck': '\\ud83e\\udd29',\n  'stars': '\\ud83c\\udf20',\n  'station': '\\ud83d\\ude89',\n  'statue_of_liberty': '\\ud83d\\uddfd',\n  'steam_locomotive': '\\ud83d\\ude82',\n  'stethoscope': '\\ud83e\\ude7a',\n  'stew': '\\ud83c\\udf72',\n  'stop_button': '\\u23f9\\ufe0f',\n  'stop_sign': '\\ud83d\\uded1',\n  'stopwatch': '\\u23f1\\ufe0f',\n  'straight_ruler': '\\ud83d\\udccf',\n  'strawberry': '\\ud83c\\udf53',\n  'stuck_out_tongue': '\\ud83d\\ude1b',\n  'stuck_out_tongue_closed_eyes': '\\ud83d\\ude1d',\n  'stuck_out_tongue_winking_eye': '\\ud83d\\ude1c',\n  'student': '\\ud83e\\uddd1\\u200d\\ud83c\\udf93',\n  'studio_microphone': '\\ud83c\\udf99\\ufe0f',\n  'stuffed_flatbread': '\\ud83e\\udd59',\n  'sudan': '\\ud83c\\uddf8\\ud83c\\udde9',\n  'sun_behind_large_cloud': '\\ud83c\\udf25\\ufe0f',\n  'sun_behind_rain_cloud': '\\ud83c\\udf26\\ufe0f',\n  'sun_behind_small_cloud': '\\ud83c\\udf24\\ufe0f',\n  'sun_with_face': '\\ud83c\\udf1e',\n  'sunflower': '\\ud83c\\udf3b',\n  'sunglasses': '\\ud83d\\ude0e',\n  'sunny': '\\u2600\\ufe0f',\n  'sunrise': '\\ud83c\\udf05',\n  'sunrise_over_mountains': '\\ud83c\\udf04',\n  'superhero': '\\ud83e\\uddb8',\n  'superhero_man': '\\ud83e\\uddb8\\u200d\\u2642\\ufe0f',\n  'superhero_woman': '\\ud83e\\uddb8\\u200d\\u2640\\ufe0f',\n  'supervillain': '\\ud83e\\uddb9',\n  'supervillain_man': '\\ud83e\\uddb9\\u200d\\u2642\\ufe0f',\n  'supervillain_woman': '\\ud83e\\uddb9\\u200d\\u2640\\ufe0f',\n  'surfer': '\\ud83c\\udfc4',\n  'surfing_man': '\\ud83c\\udfc4\\u200d\\u2642\\ufe0f',\n  'surfing_woman': '\\ud83c\\udfc4\\u200d\\u2640\\ufe0f',\n  'suriname': '\\ud83c\\uddf8\\ud83c\\uddf7',\n  'sushi': '\\ud83c\\udf63',\n  'suspension_railway': '\\ud83d\\ude9f',\n  'svalbard_jan_mayen': '\\ud83c\\uddf8\\ud83c\\uddef',\n  'swan': '\\ud83e\\udda2',\n  'swaziland': '\\ud83c\\uddf8\\ud83c\\uddff',\n  'sweat': '\\ud83d\\ude13',\n  'sweat_drops': '\\ud83d\\udca6',\n  'sweat_smile': '\\ud83d\\ude05',\n  'sweden': '\\ud83c\\uddf8\\ud83c\\uddea',\n  'sweet_potato': '\\ud83c\\udf60',\n  'swim_brief': '\\ud83e\\ude72',\n  'swimmer': '\\ud83c\\udfca',\n  'swimming_man': '\\ud83c\\udfca\\u200d\\u2642\\ufe0f',\n  'swimming_woman': '\\ud83c\\udfca\\u200d\\u2640\\ufe0f',\n  'switzerland': '\\ud83c\\udde8\\ud83c\\udded',\n  'symbols': '\\ud83d\\udd23',\n  'synagogue': '\\ud83d\\udd4d',\n  'syria': '\\ud83c\\uddf8\\ud83c\\uddfe',\n  'syringe': '\\ud83d\\udc89',\n  't-rex': '\\ud83e\\udd96',\n  'taco': '\\ud83c\\udf2e',\n  'tada': '\\ud83c\\udf89',\n  'taiwan': '\\ud83c\\uddf9\\ud83c\\uddfc',\n  'tajikistan': '\\ud83c\\uddf9\\ud83c\\uddef',\n  'takeout_box': '\\ud83e\\udd61',\n  'tanabata_tree': '\\ud83c\\udf8b',\n  'tangerine': '\\ud83c\\udf4a',\n  'tanzania': '\\ud83c\\uddf9\\ud83c\\uddff',\n  'taurus': '\\u2649',\n  'taxi': '\\ud83d\\ude95',\n  'tea': '\\ud83c\\udf75',\n  'teacher': '\\ud83e\\uddd1\\u200d\\ud83c\\udfeb',\n  'technologist': '\\ud83e\\uddd1\\u200d\\ud83d\\udcbb',\n  'teddy_bear': '\\ud83e\\uddf8',\n  'telephone': '\\u260e\\ufe0f',\n  'telephone_receiver': '\\ud83d\\udcde',\n  'telescope': '\\ud83d\\udd2d',\n  'tennis': '\\ud83c\\udfbe',\n  'tent': '\\u26fa',\n  'test_tube': '\\ud83e\\uddea',\n  'thailand': '\\ud83c\\uddf9\\ud83c\\udded',\n  'thermometer': '\\ud83c\\udf21\\ufe0f',\n  'thinking': '\\ud83e\\udd14',\n  'thought_balloon': '\\ud83d\\udcad',\n  'thread': '\\ud83e\\uddf5',\n  'three': '3\\ufe0f\\u20e3',\n  'thumbsdown': '\\ud83d\\udc4e',\n  'thumbsup': '\\ud83d\\udc4d',\n  'ticket': '\\ud83c\\udfab',\n  'tickets': '\\ud83c\\udf9f\\ufe0f',\n  'tiger': '\\ud83d\\udc2f',\n  'tiger2': '\\ud83d\\udc05',\n  'timer_clock': '\\u23f2\\ufe0f',\n  'timor_leste': '\\ud83c\\uddf9\\ud83c\\uddf1',\n  'tipping_hand_man': '\\ud83d\\udc81\\u200d\\u2642\\ufe0f',\n  'tipping_hand_person': '\\ud83d\\udc81',\n  'tipping_hand_woman': '\\ud83d\\udc81\\u200d\\u2640\\ufe0f',\n  'tired_face': '\\ud83d\\ude2b',\n  'tm': '\\u2122\\ufe0f',\n  'togo': '\\ud83c\\uddf9\\ud83c\\uddec',\n  'toilet': '\\ud83d\\udebd',\n  'tokelau': '\\ud83c\\uddf9\\ud83c\\uddf0',\n  'tokyo_tower': '\\ud83d\\uddfc',\n  'tomato': '\\ud83c\\udf45',\n  'tonga': '\\ud83c\\uddf9\\ud83c\\uddf4',\n  'tongue': '\\ud83d\\udc45',\n  'toolbox': '\\ud83e\\uddf0',\n  'tooth': '\\ud83e\\uddb7',\n  'top': '\\ud83d\\udd1d',\n  'tophat': '\\ud83c\\udfa9',\n  'tornado': '\\ud83c\\udf2a\\ufe0f',\n  'tr': '\\ud83c\\uddf9\\ud83c\\uddf7',\n  'trackball': '\\ud83d\\uddb2\\ufe0f',\n  'tractor': '\\ud83d\\ude9c',\n  'traffic_light': '\\ud83d\\udea5',\n  'train': '\\ud83d\\ude8b',\n  'train2': '\\ud83d\\ude86',\n  'tram': '\\ud83d\\ude8a',\n  'triangular_flag_on_post': '\\ud83d\\udea9',\n  'triangular_ruler': '\\ud83d\\udcd0',\n  'trident': '\\ud83d\\udd31',\n  'trinidad_tobago': '\\ud83c\\uddf9\\ud83c\\uddf9',\n  'tristan_da_cunha': '\\ud83c\\uddf9\\ud83c\\udde6',\n  'triumph': '\\ud83d\\ude24',\n  'trolleybus': '\\ud83d\\ude8e',\n  'trophy': '\\ud83c\\udfc6',\n  'tropical_drink': '\\ud83c\\udf79',\n  'tropical_fish': '\\ud83d\\udc20',\n  'truck': '\\ud83d\\ude9a',\n  'trumpet': '\\ud83c\\udfba',\n  'tshirt': '\\ud83d\\udc55',\n  'tulip': '\\ud83c\\udf37',\n  'tumbler_glass': '\\ud83e\\udd43',\n  'tunisia': '\\ud83c\\uddf9\\ud83c\\uddf3',\n  'turkey': '\\ud83e\\udd83',\n  'turkmenistan': '\\ud83c\\uddf9\\ud83c\\uddf2',\n  'turks_caicos_islands': '\\ud83c\\uddf9\\ud83c\\udde8',\n  'turtle': '\\ud83d\\udc22',\n  'tuvalu': '\\ud83c\\uddf9\\ud83c\\uddfb',\n  'tv': '\\ud83d\\udcfa',\n  'twisted_rightwards_arrows': '\\ud83d\\udd00',\n  'two': '2\\ufe0f\\u20e3',\n  'two_hearts': '\\ud83d\\udc95',\n  'two_men_holding_hands': '\\ud83d\\udc6c',\n  'two_women_holding_hands': '\\ud83d\\udc6d',\n  'u5272': '\\ud83c\\ude39',\n  'u5408': '\\ud83c\\ude34',\n  'u55b6': '\\ud83c\\ude3a',\n  'u6307': '\\ud83c\\ude2f',\n  'u6708': '\\ud83c\\ude37\\ufe0f',\n  'u6709': '\\ud83c\\ude36',\n  'u6e80': '\\ud83c\\ude35',\n  'u7121': '\\ud83c\\ude1a',\n  'u7533': '\\ud83c\\ude38',\n  'u7981': '\\ud83c\\ude32',\n  'u7a7a': '\\ud83c\\ude33',\n  'uganda': '\\ud83c\\uddfa\\ud83c\\uddec',\n  'uk': '\\ud83c\\uddec\\ud83c\\udde7',\n  'ukraine': '\\ud83c\\uddfa\\ud83c\\udde6',\n  'umbrella': '\\u2614',\n  'unamused': '\\ud83d\\ude12',\n  'underage': '\\ud83d\\udd1e',\n  'unicorn': '\\ud83e\\udd84',\n  'united_arab_emirates': '\\ud83c\\udde6\\ud83c\\uddea',\n  'united_nations': '\\ud83c\\uddfa\\ud83c\\uddf3',\n  'unlock': '\\ud83d\\udd13',\n  'up': '\\ud83c\\udd99',\n  'upside_down_face': '\\ud83d\\ude43',\n  'uruguay': '\\ud83c\\uddfa\\ud83c\\uddfe',\n  'us': '\\ud83c\\uddfa\\ud83c\\uddf8',\n  'us_outlying_islands': '\\ud83c\\uddfa\\ud83c\\uddf2',\n  'us_virgin_islands': '\\ud83c\\uddfb\\ud83c\\uddee',\n  'uzbekistan': '\\ud83c\\uddfa\\ud83c\\uddff',\n  'v': '\\u270c\\ufe0f',\n  'vampire': '\\ud83e\\udddb',\n  'vampire_man': '\\ud83e\\udddb\\u200d\\u2642\\ufe0f',\n  'vampire_woman': '\\ud83e\\udddb\\u200d\\u2640\\ufe0f',\n  'vanuatu': '\\ud83c\\uddfb\\ud83c\\uddfa',\n  'vatican_city': '\\ud83c\\uddfb\\ud83c\\udde6',\n  'venezuela': '\\ud83c\\uddfb\\ud83c\\uddea',\n  'vertical_traffic_light': '\\ud83d\\udea6',\n  'vhs': '\\ud83d\\udcfc',\n  'vibration_mode': '\\ud83d\\udcf3',\n  'video_camera': '\\ud83d\\udcf9',\n  'video_game': '\\ud83c\\udfae',\n  'vietnam': '\\ud83c\\uddfb\\ud83c\\uddf3',\n  'violin': '\\ud83c\\udfbb',\n  'virgo': '\\u264d',\n  'volcano': '\\ud83c\\udf0b',\n  'volleyball': '\\ud83c\\udfd0',\n  'vomiting_face': '\\ud83e\\udd2e',\n  'vs': '\\ud83c\\udd9a',\n  'vulcan_salute': '\\ud83d\\udd96',\n  'waffle': '\\ud83e\\uddc7',\n  'wales': '\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f',\n  'walking': '\\ud83d\\udeb6',\n  'walking_man': '\\ud83d\\udeb6\\u200d\\u2642\\ufe0f',\n  'walking_woman': '\\ud83d\\udeb6\\u200d\\u2640\\ufe0f',\n  'wallis_futuna': '\\ud83c\\uddfc\\ud83c\\uddeb',\n  'waning_crescent_moon': '\\ud83c\\udf18',\n  'waning_gibbous_moon': '\\ud83c\\udf16',\n  'warning': '\\u26a0\\ufe0f',\n  'wastebasket': '\\ud83d\\uddd1\\ufe0f',\n  'watch': '\\u231a',\n  'water_buffalo': '\\ud83d\\udc03',\n  'water_polo': '\\ud83e\\udd3d',\n  'watermelon': '\\ud83c\\udf49',\n  'wave': '\\ud83d\\udc4b',\n  'wavy_dash': '\\u3030\\ufe0f',\n  'waxing_crescent_moon': '\\ud83c\\udf12',\n  'waxing_gibbous_moon': '\\ud83c\\udf14',\n  'wc': '\\ud83d\\udebe',\n  'weary': '\\ud83d\\ude29',\n  'wedding': '\\ud83d\\udc92',\n  'weight_lifting': '\\ud83c\\udfcb\\ufe0f',\n  'weight_lifting_man': '\\ud83c\\udfcb\\ufe0f\\u200d\\u2642\\ufe0f',\n  'weight_lifting_woman': '\\ud83c\\udfcb\\ufe0f\\u200d\\u2640\\ufe0f',\n  'western_sahara': '\\ud83c\\uddea\\ud83c\\udded',\n  'whale': '\\ud83d\\udc33',\n  'whale2': '\\ud83d\\udc0b',\n  'wheel_of_dharma': '\\u2638\\ufe0f',\n  'wheelchair': '\\u267f',\n  'white_check_mark': '\\u2705',\n  'white_circle': '\\u26aa',\n  'white_flag': '\\ud83c\\udff3\\ufe0f',\n  'white_flower': '\\ud83d\\udcae',\n  'white_haired_man': '\\ud83d\\udc68\\u200d\\ud83e\\uddb3',\n  'white_haired_woman': '\\ud83d\\udc69\\u200d\\ud83e\\uddb3',\n  'white_heart': '\\ud83e\\udd0d',\n  'white_large_square': '\\u2b1c',\n  'white_medium_small_square': '\\u25fd',\n  'white_medium_square': '\\u25fb\\ufe0f',\n  'white_small_square': '\\u25ab\\ufe0f',\n  'white_square_button': '\\ud83d\\udd33',\n  'wilted_flower': '\\ud83e\\udd40',\n  'wind_chime': '\\ud83c\\udf90',\n  'wind_face': '\\ud83c\\udf2c\\ufe0f',\n  'wine_glass': '\\ud83c\\udf77',\n  'wink': '\\ud83d\\ude09',\n  'wolf': '\\ud83d\\udc3a',\n  'woman': '\\ud83d\\udc69',\n  'woman_artist': '\\ud83d\\udc69\\u200d\\ud83c\\udfa8',\n  'woman_astronaut': '\\ud83d\\udc69\\u200d\\ud83d\\ude80',\n  'woman_cartwheeling': '\\ud83e\\udd38\\u200d\\u2640\\ufe0f',\n  'woman_cook': '\\ud83d\\udc69\\u200d\\ud83c\\udf73',\n  'woman_dancing': '\\ud83d\\udc83',\n  'woman_facepalming': '\\ud83e\\udd26\\u200d\\u2640\\ufe0f',\n  'woman_factory_worker': '\\ud83d\\udc69\\u200d\\ud83c\\udfed',\n  'woman_farmer': '\\ud83d\\udc69\\u200d\\ud83c\\udf3e',\n  'woman_firefighter': '\\ud83d\\udc69\\u200d\\ud83d\\ude92',\n  'woman_health_worker': '\\ud83d\\udc69\\u200d\\u2695\\ufe0f',\n  'woman_in_manual_wheelchair': '\\ud83d\\udc69\\u200d\\ud83e\\uddbd',\n  'woman_in_motorized_wheelchair': '\\ud83d\\udc69\\u200d\\ud83e\\uddbc',\n  'woman_judge': '\\ud83d\\udc69\\u200d\\u2696\\ufe0f',\n  'woman_juggling': '\\ud83e\\udd39\\u200d\\u2640\\ufe0f',\n  'woman_mechanic': '\\ud83d\\udc69\\u200d\\ud83d\\udd27',\n  'woman_office_worker': '\\ud83d\\udc69\\u200d\\ud83d\\udcbc',\n  'woman_pilot': '\\ud83d\\udc69\\u200d\\u2708\\ufe0f',\n  'woman_playing_handball': '\\ud83e\\udd3e\\u200d\\u2640\\ufe0f',\n  'woman_playing_water_polo': '\\ud83e\\udd3d\\u200d\\u2640\\ufe0f',\n  'woman_scientist': '\\ud83d\\udc69\\u200d\\ud83d\\udd2c',\n  'woman_shrugging': '\\ud83e\\udd37\\u200d\\u2640\\ufe0f',\n  'woman_singer': '\\ud83d\\udc69\\u200d\\ud83c\\udfa4',\n  'woman_student': '\\ud83d\\udc69\\u200d\\ud83c\\udf93',\n  'woman_teacher': '\\ud83d\\udc69\\u200d\\ud83c\\udfeb',\n  'woman_technologist': '\\ud83d\\udc69\\u200d\\ud83d\\udcbb',\n  'woman_with_headscarf': '\\ud83e\\uddd5',\n  'woman_with_probing_cane': '\\ud83d\\udc69\\u200d\\ud83e\\uddaf',\n  'woman_with_turban': '\\ud83d\\udc73\\u200d\\u2640\\ufe0f',\n  'womans_clothes': '\\ud83d\\udc5a',\n  'womans_hat': '\\ud83d\\udc52',\n  'women_wrestling': '\\ud83e\\udd3c\\u200d\\u2640\\ufe0f',\n  'womens': '\\ud83d\\udeba',\n  'woozy_face': '\\ud83e\\udd74',\n  'world_map': '\\ud83d\\uddfa\\ufe0f',\n  'worried': '\\ud83d\\ude1f',\n  'wrench': '\\ud83d\\udd27',\n  'wrestling': '\\ud83e\\udd3c',\n  'writing_hand': '\\u270d\\ufe0f',\n  'x': '\\u274c',\n  'yarn': '\\ud83e\\uddf6',\n  'yawning_face': '\\ud83e\\udd71',\n  'yellow_circle': '\\ud83d\\udfe1',\n  'yellow_heart': '\\ud83d\\udc9b',\n  'yellow_square': '\\ud83d\\udfe8',\n  'yemen': '\\ud83c\\uddfe\\ud83c\\uddea',\n  'yen': '\\ud83d\\udcb4',\n  'yin_yang': '\\u262f\\ufe0f',\n  'yo_yo': '\\ud83e\\ude80',\n  'yum': '\\ud83d\\ude0b',\n  'zambia': '\\ud83c\\uddff\\ud83c\\uddf2',\n  'zany_face': '\\ud83e\\udd2a',\n  'zap': '\\u26a1',\n  'zebra': '\\ud83e\\udd93',\n  'zero': '0\\ufe0f\\u20e3',\n  'zimbabwe': '\\ud83c\\uddff\\ud83c\\uddfc',\n  'zipper_mouth_face': '\\ud83e\\udd10',\n  'zombie': '\\ud83e\\udddf',\n  'zombie_man': '\\ud83e\\udddf\\u200d\\u2642\\ufe0f',\n  'zombie_woman': '\\ud83e\\udddf\\u200d\\u2640\\ufe0f',\n  'zzz': '\\ud83d\\udca4',\n\n  /* special emojis :P */\n  'atom': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/atom.png?v8\">',\n  'basecamp': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/basecamp.png?v8\">',\n  'basecampy': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/basecampy.png?v8\">',\n  'bowtie': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/bowtie.png?v8\">',\n  'electron': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/electron.png?v8\">',\n  'feelsgood': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/feelsgood.png?v8\">',\n  'finnadie': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/finnadie.png?v8\">',\n  'goberserk': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/goberserk.png?v8\">',\n  'godmode': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/godmode.png?v8\">',\n  'hurtrealbad': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/hurtrealbad.png?v8\">',\n  'neckbeard': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/neckbeard.png?v8\">',\n  'octocat': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/octocat.png?v8\">',\n  'rage1': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage1.png?v8\">',\n  'rage2': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage2.png?v8\">',\n  'rage3': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage3.png?v8\">',\n  'rage4': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/rage4.png?v8\">',\n  'shipit': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/shipit.png?v8\">',\n  'suspect': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/suspect.png?v8\">',\n  'trollface': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/trollface.png?v8\">',\n  'showdown': '<img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAS1BMVEX///8jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS3b1q3b1q3b1q3b1q3b1q3b1q3b1q3b1q0565CIAAAAGXRSTlMAQHCAYCCw/+DQwPCQUBAwoHCAEP+wwFBgS2fvBgAAAUZJREFUeAHs1cGy7BAUheFFsEDw/k97VTq3T6ge2EmdM+pvrP6Iwd74XV9Kb52xuMU4/uc1YNgZLFOeV8FGdhGrNk5SEgUyPxAEdj4LlMRDyhVAMVEa2M7TBSeVZAFPdqHgzSZJwPKgcLFLAooHDJo4EDCw4gAtBoJA5UFj4Ng5LOGLwVXZuoIlji/jeQHFk7+baHxrCjeUwB9+s88KndvlhcyBN5BSkYNQIVVb4pV+Npm7hhuKDs/uMP5KxT3WzSNNLIuuoDpMmuAVMruMSeDyQBi24DTr43LAY7ILA1QYaWkgfHzFthYYzg67SQsCbB8GhJUEGCtO9n0rSaCLxgJQjS/JSgMTg2eBDEHAJ+H350AsjYNYscrErgI2e/l+mdR967TCX/v6N0EhPECYCP0i+IAoYQOE8BogNhQMEMdrgAQWHaMAAGi5I5euoY9NAAAAAElFTkSuQmCC\">'\n};\n"
  },
  {
    "path": "src/loader.js",
    "content": "var root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n  define(function () {\n    'use strict';\n    return showdown;\n  });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n  module.exports = showdown;\n\n// Regular Browser loader\n} else {\n  root.showdown = showdown;\n}\n"
  },
  {
    "path": "src/options.js",
    "content": "/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts (simple) {\n  'use strict';\n\n  var defaultOptions = {\n    omitExtraWLInCodeBlocks: {\n      defaultValue: false,\n      describe: 'Omit the default extra whiteline added to code blocks',\n      type: 'boolean'\n    },\n    noHeaderId: {\n      defaultValue: false,\n      describe: 'Turn on/off generated header id',\n      type: 'boolean'\n    },\n    prefixHeaderId: {\n      defaultValue: false,\n      describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \\'section-\\' prefix',\n      type: 'string'\n    },\n    rawPrefixHeaderId: {\n      defaultValue: false,\n      describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the \" char is used in the prefix)',\n      type: 'boolean'\n    },\n    ghCompatibleHeaderId: {\n      defaultValue: false,\n      describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',\n      type: 'boolean'\n    },\n    rawHeaderId: {\n      defaultValue: false,\n      describe: 'Remove only spaces, \\' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',\n      type: 'boolean'\n    },\n    headerLevelStart: {\n      defaultValue: false,\n      describe: 'The header blocks level start',\n      type: 'integer'\n    },\n    parseImgDimensions: {\n      defaultValue: false,\n      describe: 'Turn on/off image dimension parsing',\n      type: 'boolean'\n    },\n    simplifiedAutoLink: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM autolink style',\n      type: 'boolean'\n    },\n    literalMidWordUnderscores: {\n      defaultValue: false,\n      describe: 'Parse midword underscores as literal underscores',\n      type: 'boolean'\n    },\n    literalMidWordAsterisks: {\n      defaultValue: false,\n      describe: 'Parse midword asterisks as literal asterisks',\n      type: 'boolean'\n    },\n    strikethrough: {\n      defaultValue: false,\n      describe: 'Turn on/off strikethrough support',\n      type: 'boolean'\n    },\n    tables: {\n      defaultValue: false,\n      describe: 'Turn on/off tables support',\n      type: 'boolean'\n    },\n    tablesHeaderId: {\n      defaultValue: false,\n      describe: 'Add an id to table headers',\n      type: 'boolean'\n    },\n    ghCodeBlocks: {\n      defaultValue: true,\n      describe: 'Turn on/off GFM fenced code blocks support',\n      type: 'boolean'\n    },\n    tasklists: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM tasklist support',\n      type: 'boolean'\n    },\n    smoothLivePreview: {\n      defaultValue: false,\n      describe: 'Prevents weird effects in live previews due to incomplete input',\n      type: 'boolean'\n    },\n    smartIndentationFix: {\n      defaultValue: false,\n      describe: 'Tries to smartly fix indentation in es6 strings',\n      type: 'boolean'\n    },\n    disableForced4SpacesIndentedSublists: {\n      defaultValue: false,\n      describe: 'Disables the requirement of indenting nested sublists by 4 spaces',\n      type: 'boolean'\n    },\n    simpleLineBreaks: {\n      defaultValue: false,\n      describe: 'Parses simple line breaks as <br> (GFM Style)',\n      type: 'boolean'\n    },\n    requireSpaceBeforeHeadingText: {\n      defaultValue: false,\n      describe: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n      type: 'boolean'\n    },\n    ghMentions: {\n      defaultValue: false,\n      describe: 'Enables github @mentions',\n      type: 'boolean'\n    },\n    ghMentionsLink: {\n      defaultValue: 'https://github.com/{u}',\n      describe: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',\n      type: 'string'\n    },\n    encodeEmails: {\n      defaultValue: true,\n      describe: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',\n      type: 'boolean'\n    },\n    openLinksInNewWindow: {\n      defaultValue: false,\n      describe: 'Open all links in new windows',\n      type: 'boolean'\n    },\n    backslashEscapesHTMLTags: {\n      defaultValue: false,\n      describe: 'Support for HTML Tag escaping. ex: \\<div>foo\\</div>',\n      type: 'boolean'\n    },\n    emoji: {\n      defaultValue: false,\n      describe: 'Enable emoji support. Ex: `this is a :smile: emoji`',\n      type: 'boolean'\n    },\n    underline: {\n      defaultValue: false,\n      describe: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`',\n      type: 'boolean'\n    },\n    ellipsis: {\n      defaultValue: true,\n      describe: 'Replaces three dots with the ellipsis unicode character',\n      type: 'boolean'\n    },\n    completeHTMLDocument: {\n      defaultValue: false,\n      describe: 'Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags',\n      type: 'boolean'\n    },\n    metadata: {\n      defaultValue: false,\n      describe: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',\n      type: 'boolean'\n    },\n    splitAdjacentBlockquotes: {\n      defaultValue: false,\n      describe: 'Split adjacent blockquote blocks',\n      type: 'boolean'\n    },\n    moreStyling: {\n      defaultValue: false,\n      describe: 'Adds some useful styling css classes in the generated html',\n      type: 'boolean'\n    },\n    relativePathBaseUrl: {\n      defaultValue: false,\n      describe: 'Prepends a base URL to relative paths',\n      type: 'string'\n    },\n  };\n  if (simple === false) {\n    return JSON.parse(JSON.stringify(defaultOptions));\n  }\n  var ret = {};\n  for (var opt in defaultOptions) {\n    if (defaultOptions.hasOwnProperty(opt)) {\n      ret[opt] = defaultOptions[opt].defaultValue;\n    }\n  }\n  return ret;\n}\n\nfunction allOptionsOn () {\n  'use strict';\n  var options = getDefaultOpts(true),\n      ret = {};\n  for (var opt in options) {\n    if (options.hasOwnProperty(opt)) {\n      ret[opt] = true;\n    }\n  }\n  return ret;\n}\n"
  },
  {
    "path": "src/showdown.js",
    "content": "/**\n * Created by Tivie on 06-01-2015.\n */\n// Private properties\nvar showdown = {},\n    parsers = {},\n    extensions = {},\n    globalOptions = getDefaultOpts(true),\n    setFlavor = 'vanilla',\n    flavor = {\n      github: {\n        omitExtraWLInCodeBlocks:              true,\n        simplifiedAutoLink:                   true,\n        literalMidWordUnderscores:            true,\n        strikethrough:                        true,\n        tables:                               true,\n        tablesHeaderId:                       true,\n        ghCodeBlocks:                         true,\n        tasklists:                            true,\n        disableForced4SpacesIndentedSublists: true,\n        simpleLineBreaks:                     true,\n        requireSpaceBeforeHeadingText:        true,\n        ghCompatibleHeaderId:                 true,\n        ghMentions:                           true,\n        backslashEscapesHTMLTags:             true,\n        emoji:                                true,\n        splitAdjacentBlockquotes:             true\n      },\n      original: {\n        noHeaderId:                           true,\n        ghCodeBlocks:                         false\n      },\n      ghost: {\n        omitExtraWLInCodeBlocks:              true,\n        parseImgDimensions:                   true,\n        simplifiedAutoLink:                   true,\n        literalMidWordUnderscores:            true,\n        strikethrough:                        true,\n        tables:                               true,\n        tablesHeaderId:                       true,\n        ghCodeBlocks:                         true,\n        tasklists:                            true,\n        smoothLivePreview:                    true,\n        simpleLineBreaks:                     true,\n        requireSpaceBeforeHeadingText:        true,\n        ghMentions:                           false,\n        encodeEmails:                         true\n      },\n      vanilla: getDefaultOpts(true),\n      allOn: allOptionsOn()\n    };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n  'use strict';\n  globalOptions[key] = value;\n  return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n  'use strict';\n  return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n  'use strict';\n  return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n  'use strict';\n  globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n  'use strict';\n  if (!flavor.hasOwnProperty(name)) {\n    throw Error(name + ' flavor was not found');\n  }\n  showdown.resetOptions();\n  var preset = flavor[name];\n  setFlavor = name;\n  for (var option in preset) {\n    if (preset.hasOwnProperty(option)) {\n      globalOptions[option] = preset[option];\n    }\n  }\n};\n\n/**\n * Get the currently set flavor\n * @returns {string}\n */\nshowdown.getFlavor = function () {\n  'use strict';\n  return setFlavor;\n};\n\n/**\n * Get the options of a specified flavor. Returns undefined if the flavor was not found\n * @param {string} name Name of the flavor\n * @returns {{}|undefined}\n */\nshowdown.getFlavorOptions = function (name) {\n  'use strict';\n  if (flavor.hasOwnProperty(name)) {\n    return flavor[name];\n  }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n  'use strict';\n  return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name)       - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n  'use strict';\n  if (showdown.helper.isString(name)) {\n    if (typeof func !== 'undefined') {\n      parsers[name] = func;\n    } else {\n      if (parsers.hasOwnProperty(name)) {\n        return parsers[name];\n      } else {\n        throw Error('SubParser named ' + name + ' not registered!');\n      }\n    }\n  } else {\n    throw Error('showdown.subParser function first argument must be a string (the name of the subparser)');\n  }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|object[]|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n  'use strict';\n\n  if (!showdown.helper.isString(name)) {\n    throw Error('Extension \\'name\\' must be a string');\n  }\n\n  name = showdown.helper.stdExtName(name);\n\n  // Getter\n  if (showdown.helper.isUndefined(ext)) {\n    if (!extensions.hasOwnProperty(name)) {\n      throw Error('Extension named ' + name + ' is not registered!');\n    }\n    return extensions[name];\n\n    // Setter\n  } else {\n    // Expand extension if it's wrapped in a function\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    // Ensure extension is an array\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExtension = validate(ext, name);\n\n    if (validExtension.valid) {\n      extensions[name] = ext;\n    } else {\n      throw Error(validExtension.error);\n    }\n  }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n  'use strict';\n  return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n  'use strict';\n  delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n  'use strict';\n  extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate (extension, name) {\n  'use strict';\n\n  var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n      ret = {\n        valid: true,\n        error: ''\n      };\n\n  if (!showdown.helper.isArray(extension)) {\n    extension = [extension];\n  }\n\n  for (var i = 0; i < extension.length; ++i) {\n    var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n        ext = extension[i];\n    if (typeof ext !== 'object') {\n      ret.valid = false;\n      ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n      return ret;\n    }\n\n    if (!showdown.helper.isString(ext.type)) {\n      ret.valid = false;\n      ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n      return ret;\n    }\n\n    var type = ext.type = ext.type.toLowerCase();\n\n    // normalize extension type\n    if (type === 'language') {\n      type = ext.type = 'lang';\n    }\n\n    if (type === 'html') {\n      type = ext.type = 'output';\n    }\n\n    if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n      ret.valid = false;\n      ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n      return ret;\n    }\n\n    if (type === 'listener') {\n      if (showdown.helper.isUndefined(ext.listeners)) {\n        ret.valid = false;\n        ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n        return ret;\n      }\n    } else {\n      if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n        ret.valid = false;\n        ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n        return ret;\n      }\n    }\n\n    if (ext.listeners) {\n      if (typeof ext.listeners !== 'object') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n        return ret;\n      }\n      for (var ln in ext.listeners) {\n        if (ext.listeners.hasOwnProperty(ln)) {\n          if (typeof ext.listeners[ln] !== 'function') {\n            ret.valid = false;\n            ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n              ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n            return ret;\n          }\n        }\n      }\n    }\n\n    if (ext.filter) {\n      if (typeof ext.filter !== 'function') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n        return ret;\n      }\n    } else if (ext.regex) {\n      if (showdown.helper.isString(ext.regex)) {\n        ext.regex = new RegExp(ext.regex, 'g');\n      }\n      if (!(ext.regex instanceof RegExp)) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n        return ret;\n      }\n      if (showdown.helper.isUndefined(ext.replace)) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n        return ret;\n      }\n    }\n  }\n  return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n  'use strict';\n\n  var validateExtension = validate(ext, null);\n  if (!validateExtension.valid) {\n    console.warn(validateExtension.error);\n    return false;\n  }\n  return true;\n};\n"
  },
  {
    "path": "src/subParsers/makehtml/blockGamut.js",
    "content": "/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('makehtml.blockGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.blockGamut.before', text, options, globals).getText();\n\n  // we parse blockquotes first so that we can have headings and hrs\n  // inside blockquotes\n  text = showdown.subParser('makehtml.blockQuotes')(text, options, globals);\n  text = showdown.subParser('makehtml.headers')(text, options, globals);\n\n  // Do Horizontal Rules:\n  text = showdown.subParser('makehtml.horizontalRule')(text, options, globals);\n\n  text = showdown.subParser('makehtml.lists')(text, options, globals);\n  text = showdown.subParser('makehtml.codeBlocks')(text, options, globals);\n  text = showdown.subParser('makehtml.tables')(text, options, globals);\n\n  // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n  // was to escape raw HTML in the original Markdown source. This time,\n  // we're escaping the markup we've just created, so that we don't wrap\n  // <p> tags around block-level tags.\n  text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);\n  text = showdown.subParser('makehtml.paragraphs')(text, options, globals);\n\n  text = globals.converter._dispatch('makehtml.blockGamut.after', text, options, globals).getText();\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/blockQuotes.js",
    "content": "showdown.subParser('makehtml.blockQuotes', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.blockQuotes.before', text, options, globals).getText();\n\n  // add a couple extra lines after the text and endtext mark\n  text = text + '\\n\\n';\n\n  var rgx = /(^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+/gm;\n\n  if (options.splitAdjacentBlockquotes) {\n    rgx = /^ {0,3}>[\\s\\S]*?(?:\\n\\n)/gm;\n  }\n\n  text = text.replace(rgx, function (bq) {\n    // attacklab: hack around Konqueror 3.5.4 bug:\n    // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n    bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, ''); // trim one level of quoting\n\n    // attacklab: clean up hack\n    bq = bq.replace(/¨0/g, '');\n\n    bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n    bq = showdown.subParser('makehtml.githubCodeBlocks')(bq, options, globals);\n    bq = showdown.subParser('makehtml.blockGamut')(bq, options, globals); // recurse\n\n    bq = bq.replace(/(^|\\n)/g, '$1  ');\n    // These leading spaces screw with <pre> content, so we need to fix that:\n    bq = bq.replace(/(\\s*<pre>[^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '¨0');\n      pre = pre.replace(/¨0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('makehtml.hashBlock')('<blockquote>\\n' + bq + '\\n</blockquote>', options, globals);\n  });\n\n  text = globals.converter._dispatch('makehtml.blockQuotes.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/codeBlocks.js",
    "content": "/**\n * Process Markdown `<pre><code>` blocks.\n */\nshowdown.subParser('makehtml.codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.codeBlocks.before', text, options, globals).getText();\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=¨0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('makehtml.outdent')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '<pre><code>' + codeblock + end + '</code></pre>';\n\n    return showdown.subParser('makehtml.hashBlock')(codeblock, options, globals) + nextChar;\n  });\n\n  // strip sentinel\n  text = text.replace(/¨0/, '');\n\n  text = globals.converter._dispatch('makehtml.codeBlocks.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/codeSpans.js",
    "content": "/**\n *\n *   *  Backtick quotes are used for <code></code> spans.\n *\n *   *  You can use multiple backticks as the delimiters if you want to\n *     include literal backticks in the code span. So, this input:\n *\n *         Just type ``foo `bar` baz`` at the prompt.\n *\n *       Will translate to:\n *\n *         <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\n *\n *    There's no arbitrary limit to the number of backticks you\n *    can use as delimters. If you need three consecutive backticks\n *    in your code, use four for delimiters, etc.\n *\n *  *  You can use spaces to get literal backticks at the edges:\n *\n *         ... type `` `bar` `` ...\n *\n *       Turns to:\n *\n *         ... type <code>`bar`</code> ...\n */\nshowdown.subParser('makehtml.codeSpans', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.codeSpans.before', text, options, globals).getText();\n\n  if (typeof (text) === 'undefined') {\n    text = '';\n  }\n  text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n    function (wholeMatch, m1, m2, m3) {\n      var c = m3;\n      c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n      c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n      c = showdown.subParser('makehtml.encodeCode')(c, options, globals);\n      c = m1 + '<code>' + c + '</code>';\n      c = showdown.subParser('makehtml.hashHTMLSpans')(c, options, globals);\n      return c;\n    }\n  );\n\n  text = globals.converter._dispatch('makehtml.codeSpans.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/completeHTMLDocument.js",
    "content": "/**\n * Create a full HTML document from the processed markdown\n */\nshowdown.subParser('makehtml.completeHTMLDocument', function (text, options, globals) {\n  'use strict';\n\n  if (!options.completeHTMLDocument) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.completeHTMLDocument.before', text, options, globals).getText();\n\n  var doctype = 'html',\n      doctypeParsed = '<!DOCTYPE HTML>\\n',\n      title = '',\n      charset = '<meta charset=\"utf-8\">\\n',\n      lang = '',\n      metadata = '';\n\n  if (typeof globals.metadata.parsed.doctype !== 'undefined') {\n    doctypeParsed = '<!DOCTYPE ' +  globals.metadata.parsed.doctype + '>\\n';\n    doctype = globals.metadata.parsed.doctype.toString().toLowerCase();\n    if (doctype === 'html' || doctype === 'html5') {\n      charset = '<meta charset=\"utf-8\">';\n    }\n  }\n\n  for (var meta in globals.metadata.parsed) {\n    if (globals.metadata.parsed.hasOwnProperty(meta)) {\n      switch (meta.toLowerCase()) {\n        case 'doctype':\n          break;\n\n        case 'title':\n          title = '<title>' +  globals.metadata.parsed.title + '</title>\\n';\n          break;\n\n        case 'charset':\n          if (doctype === 'html' || doctype === 'html5') {\n            charset = '<meta charset=\"' + globals.metadata.parsed.charset + '\">\\n';\n          } else {\n            charset = '<meta name=\"charset\" content=\"' + globals.metadata.parsed.charset + '\">\\n';\n          }\n          break;\n\n        case 'language':\n        case 'lang':\n          lang = ' lang=\"' + globals.metadata.parsed[meta] + '\"';\n          metadata += '<meta name=\"' + meta + '\" content=\"' + globals.metadata.parsed[meta] + '\">\\n';\n          break;\n\n        default:\n          metadata += '<meta name=\"' + meta + '\" content=\"' + globals.metadata.parsed[meta] + '\">\\n';\n      }\n    }\n  }\n\n  text = doctypeParsed + '<html' + lang + '>\\n<head>\\n' + title + charset + metadata + '</head>\\n<body>\\n' + text.trim() + '\\n</body>\\n</html>';\n\n  text = globals.converter._dispatch('makehtml.completeHTMLDocument.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/detab.js",
    "content": "/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('makehtml.detab', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.detab.before', text, options, globals).getText();\n\n  // expand first n-1 tabs\n  text = text.replace(/\\t(?=\\t)/g, '    '); // g_tab_width\n\n  // replace the nth with two sentinels\n  text = text.replace(/\\t/g, '¨A¨B');\n\n  // use the sentinel to anchor our regex so it doesn't explode\n  text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {\n    var leadingText = m1,\n        numSpaces = 4 - leadingText.length % 4;  // g_tab_width\n\n    // there *must* be a better way to do this:\n    for (var i = 0; i < numSpaces; i++) {\n      leadingText += ' ';\n    }\n\n    return leadingText;\n  });\n\n  // clean up sentinels\n  text = text.replace(/¨A/g, '    ');  // g_tab_width\n  text = text.replace(/¨B/g, '');\n\n  text = globals.converter._dispatch('makehtml.detab.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/ellipsis.js",
    "content": "showdown.subParser('makehtml.ellipsis', function (text, options, globals) {\n  'use strict';\n\n  if (!options.ellipsis) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.ellipsis.before', text, options, globals).getText();\n\n  text = text.replace(/\\.\\.\\./g, '…');\n\n  text = globals.converter._dispatch('makehtml.ellipsis.after', text, options, globals).getText();\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/emoji.js",
    "content": "/**\n * Turn emoji codes into emojis\n *\n * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis\n */\nshowdown.subParser('makehtml.emoji', function (text, options, globals) {\n  'use strict';\n\n  if (!options.emoji) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.emoji.before', text, options, globals).getText();\n\n  var emojiRgx = /:([\\S]+?):/g;\n\n  text = text.replace(emojiRgx, function (wm, emojiCode) {\n    if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {\n      return showdown.helper.emojis[emojiCode];\n    }\n    return wm;\n  });\n\n  text = globals.converter._dispatch('makehtml.emoji.after', text, options, globals).getText();\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/encodeAmpsAndAngles.js",
    "content": "/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('makehtml.encodeAmpsAndAngles', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.before', text, options, globals).getText();\n\n  // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n  // http://bumppo.net/projects/amputator/\n  text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&amp;');\n\n  // Encode naked <'s\n  text = text.replace(/<(?![a-z\\/?$!])/gi, '&lt;');\n\n  // Encode <\n  text = text.replace(/</g, '&lt;');\n\n  // Encode >\n  text = text.replace(/>/g, '&gt;');\n\n  text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/encodeBackslashEscapes.js",
    "content": "/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n *    text = escapeCharacters(text,\"\\\\\",true);\n *    text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox.  This function gets called a LOT.\n */\nshowdown.subParser('makehtml.encodeBackslashEscapes', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.before', text, options, globals).getText();\n\n  text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n  text = text.replace(/\\\\([`*_{}\\[\\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/encodeCode.js",
    "content": "/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('makehtml.encodeCode', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.encodeCode.before', text, options, globals).getText();\n\n  // Encode all ampersands; HTML entities are not\n  // entities within a Markdown code span.\n  text = text\n    .replace(/&/g, '&amp;')\n  // Do the angle bracket song and dance:\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n  // Now, escape characters that are magic in Markdown:\n    .replace(/([*_{}\\[\\]\\\\=~-])/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.encodeCode.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/escapeSpecialCharsWithinTagAttributes.js",
    "content": "/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _ ~ =] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.before', text, options, globals).getText();\n\n  // Build a regex to find HTML tags.\n  var tags     = /<\\/?[a-z\\d_:-]+(?:[\\s]+[\\s\\S]+?)?>/gi,\n      comments = /<!(--(?:(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;\n\n  text = text.replace(tags, function (wholeMatch) {\n    return wholeMatch\n      .replace(/(.)<\\/?code>(?=.)/g, '$1`')\n      .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n  });\n\n  text = text.replace(comments, function (wholeMatch) {\n    return wholeMatch\n      .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n  });\n\n  text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/githubCodeBlocks.js",
    "content": "/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n *     def hello_world(x)\n *       puts \"Hello, #{x}\"\n *     end\n * ```\n */\nshowdown.subParser('makehtml.githubCodeBlocks', function (text, options, globals) {\n  'use strict';\n\n  // early exit if option is not enabled\n  if (!options.ghCodeBlocks) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.githubCodeBlocks.before', text, options, globals).getText();\n\n  text += '¨0';\n\n  text = text.replace(/(?:^|\\n) {0,3}(```+|~~~+) *([^\\n\\t`~]*)\\n([\\s\\S]*?)\\n {0,3}\\1/g, function (wholeMatch, delim, language, codeblock) {\n    var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n    // if the language has spaces followed by some other chars, according to the spec we should just ignore everything\n    // after the first space\n    language = language.trim().split(' ')[0];\n\n    // First parse the github code block\n    codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n    codeblock = '<pre><code' + (language ? ' class=\"' + language + ' language-' + language + '\"' : '') + '>' + codeblock + end + '</code></pre>';\n\n    codeblock = showdown.subParser('makehtml.hashBlock')(codeblock, options, globals);\n\n    // Since GHCodeblocks can be false positives, we need to\n    // store the primitive text and the parsed text in a global var,\n    // and then return a token\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  });\n\n  // attacklab: strip sentinel\n  text = text.replace(/¨0/, '');\n\n  return globals.converter._dispatch('makehtml.githubCodeBlocks.after', text, options, globals).getText();\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashBlock.js",
    "content": "showdown.subParser('makehtml.hashBlock', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashBlock.before', text, options, globals).getText();\n  text = text.replace(/(^\\n+|\\n+$)/g, '');\n  text = '\\n\\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n  text = globals.converter._dispatch('makehtml.hashBlock.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashCodeTags.js",
    "content": "/**\n * Hash and escape <code> elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashCodeTags.before', text, options, globals).getText();\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;\n    return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';\n  };\n\n  // Hash naked <code>\n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '<code\\\\b[^>]*>', '</code>', 'gim');\n\n  text = globals.converter._dispatch('makehtml.hashCodeTags.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashElement.js",
    "content": "showdown.subParser('makehtml.hashElement', function (text, options, globals) {\n  'use strict';\n\n  return function (wholeMatch, m1) {\n    var blockText = m1;\n\n    // Undo double lines\n    blockText = blockText.replace(/\\n\\n/g, '\\n');\n    blockText = blockText.replace(/^\\n/, '');\n\n    // strip trailing blank lines\n    blockText = blockText.replace(/\\n+$/g, '');\n\n    // Replace the element text with a marker (\"¨KxK\" where x is its key)\n    blockText = '\\n\\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n    return blockText;\n  };\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashHTMLBlocks.js",
    "content": "showdown.subParser('makehtml.hashHTMLBlocks', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashHTMLBlocks.before', text, options, globals).getText();\n\n  var blockTags = [\n        'pre',\n        'div',\n        'h1',\n        'h2',\n        'h3',\n        'h4',\n        'h5',\n        'h6',\n        'blockquote',\n        'table',\n        'dl',\n        'ol',\n        'ul',\n        'script',\n        'noscript',\n        'form',\n        'fieldset',\n        'iframe',\n        'math',\n        'style',\n        'section',\n        'header',\n        'footer',\n        'nav',\n        'article',\n        'aside',\n        'address',\n        'audio',\n        'canvas',\n        'figure',\n        'hgroup',\n        'output',\n        'video',\n        'details',\n        'p'\n      ],\n      repFunc = function (wholeMatch, match, left, right) {\n        var txt = wholeMatch;\n        // check if this html element is marked as markdown\n        // if so, it's contents should be parsed as markdown\n        if (left.search(/\\bmarkdown\\b/) !== -1) {\n          txt = left + globals.converter.makeHtml(match) + right;\n        }\n        return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n      };\n\n  if (options.backslashEscapesHTMLTags) {\n    // encode backslash escaped HTML tags\n    text = text.replace(/\\\\<(\\/?[^>]+?)>/g, function (wm, inside) {\n      return '&lt;' + inside + '&gt;';\n    });\n  }\n\n  // hash HTML Blocks\n  for (var i = 0; i < blockTags.length; ++i) {\n\n    var opTagPos,\n        rgx1     = new RegExp('^ {0,3}(<' + blockTags[i] + '\\\\b[^>]*>)', 'im'),\n        patLeft  = '<' + blockTags[i] + '\\\\b[^>]*>',\n        patRight = '</' + blockTags[i] + '>';\n    // 1. Look for the first position of the first opening HTML tag in the text\n    while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {\n\n      // if the HTML tag is \\ escaped, we need to escape it and break\n\n\n      //2. Split the text in that position\n      var subTexts = showdown.helper.splitAtIndex(text, opTagPos),\n          //3. Match recursively\n          newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');\n\n      // prevent an infinite loop\n      if (newSubText1 === subTexts[1]) {\n        break;\n      }\n      text = subTexts[0].concat(newSubText1);\n    }\n  }\n  // HR SPECIAL CASE\n  text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('makehtml.hashElement')(text, options, globals));\n\n  // Special case for standalone HTML comments\n  text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n    return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n  }, '^ {0,3}<!--', '-->', 'gm');\n\n  // PHP and ASP-style processor instructions (<?...?> and <%...%>)\n  text = text.replace(/\\n\\n( {0,3}<([?%])[^\\r]*?\\2>[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('makehtml.hashElement')(text, options, globals));\n\n  text = globals.converter._dispatch('makehtml.hashHTMLBlocks.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashHTMLSpans.js",
    "content": "/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashHTMLSpans', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashHTMLSpans.before', text, options, globals).getText();\n\n  // Hash Self Closing tags\n  text = text.replace(/<[^>]+?\\/>/gi, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash tags without properties\n  text = text.replace(/<([^>]+?)>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash tags with properties\n  text = text.replace(/<([^>]+?)\\s[^>]+?>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  // Hash self closing tags without />\n  text = text.replace(/<[^>]+?>/gi, function (wm) {\n    return showdown.helper._hashHTMLSpan(wm, globals);\n  });\n\n  text = globals.converter._dispatch('makehtml.hashHTMLSpans.after', text, options, globals).getText();\n  return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('makehtml.unhashHTMLSpans', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.unhashHTMLSpans.before', text, options, globals).getText();\n\n  for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n    var repText = globals.gHtmlSpans[i],\n        // limiter to prevent infinite loop (assume 10 as limit for recurse)\n        limit = 0;\n\n    while (/¨C(\\d+)C/.test(repText)) {\n      var num = RegExp.$1;\n      repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);\n      if (limit === 10) {\n        console.error('maximum nesting of 10 spans reached!!!');\n        break;\n      }\n      ++limit;\n    }\n    text = text.replace('¨C' + i + 'C', repText);\n  }\n\n  text = globals.converter._dispatch('makehtml.unhashHTMLSpans.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/hashPreCodeTags.js",
    "content": "/**\n * Hash and escape <pre><code> elements that should not be parsed as markdown\n */\nshowdown.subParser('makehtml.hashPreCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.hashPreCodeTags.before', text, options, globals).getText();\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  // Hash <pre><code>\n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<pre\\\\b[^>]*>\\\\s*<code\\\\b[^>]*>', '^ {0,3}</code>\\\\s*</pre>', 'gim');\n\n  text = globals.converter._dispatch('makehtml.hashPreCodeTags.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/headers.js",
    "content": "showdown.subParser('makehtml.headers', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.headers.before', text, options, globals).getText();\n\n  var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n      // Set text-style headers:\n      //\tHeader 1\n      //\t========\n      //\n      //\tHeader 2\n      //\t--------\n      //\n      setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n      setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n  text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n    var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart,\n        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);\n  });\n\n  text = text.replace(setextRegexH2, function (matchFound, m1) {\n    var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart + 1,\n        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);\n  });\n\n  // atx-style headers:\n  //  # Header 1\n  //  ## Header 2\n  //  ## Header 2 with closing hashes ##\n  //  ...\n  //  ###### Header 6\n  //\n  var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n  text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n    var hText = m2;\n    if (options.customizedHeaderId) {\n      hText = m2.replace(/\\s?{([^{]+?)}\\s*$/, '');\n    }\n\n    var span = showdown.subParser('makehtml.spanGamut')(hText, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n        hLevel = headerLevelStart - 1 + m1.length,\n        header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';\n\n    return showdown.subParser('makehtml.hashBlock')(header, options, globals);\n  });\n\n  function headerId (m) {\n    var title,\n        prefix;\n\n    // It is separate from other options to allow combining prefix and customized\n    if (options.customizedHeaderId) {\n      var match = m.match(/{([^{]+?)}\\s*$/);\n      if (match && match[1]) {\n        m = match[1];\n      }\n    }\n\n    title = m;\n\n    // Prefix id to prevent causing inadvertent pre-existing style matches.\n    if (showdown.helper.isString(options.prefixHeaderId)) {\n      prefix = options.prefixHeaderId;\n    } else if (options.prefixHeaderId === true) {\n      prefix = 'section-';\n    } else {\n      prefix = '';\n    }\n\n    if (!options.rawPrefixHeaderId) {\n      title = prefix + title;\n    }\n\n    if (options.ghCompatibleHeaderId) {\n      title = title\n        .replace(/ /g, '-')\n        // replace previously escaped chars (&, ¨ and $)\n        .replace(/&amp;/g, '')\n        .replace(/¨T/g, '')\n        .replace(/¨D/g, '')\n        // replace rest of the chars (&~$ are repeated as they might have been escaped)\n        // borrowed from github's redcarpet (some they should produce similar results)\n        .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, '')\n        .toLowerCase();\n    } else if (options.rawHeaderId) {\n      title = title\n        .replace(/ /g, '-')\n        // replace previously escaped chars (&, ¨ and $)\n        .replace(/&amp;/g, '&')\n        .replace(/¨T/g, '¨')\n        .replace(/¨D/g, '$')\n        // replace \" and '\n        .replace(/[\"']/g, '-')\n        .toLowerCase();\n    } else {\n      title = title\n        .replace(/[^\\w]/g, '')\n        .toLowerCase();\n    }\n\n    if (options.rawPrefixHeaderId) {\n      title = prefix + title;\n    }\n\n    if (globals.hashLinkCounts[title]) {\n      title = title + '-' + (globals.hashLinkCounts[title]++);\n    } else {\n      globals.hashLinkCounts[title] = 1;\n    }\n    return title;\n  }\n\n  text = globals.converter._dispatch('makehtml.headers.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/horizontalRule.js",
    "content": "/**\n * Turn Markdown horizontal rule shortcuts into <hr /> tags.\n *\n * Any 3 or more unindented consecutive hyphens, asterisks or underscores with or without a space beetween them\n * in a single line is considered a horizontal rule\n */\nshowdown.subParser('makehtml.horizontalRule', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.horizontalRule.before', text, options, globals).getText();\n\n  var key = showdown.subParser('makehtml.hashBlock')('<hr />', options, globals);\n  text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n  text = globals.converter._dispatch('makehtml.horizontalRule.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/images.js",
    "content": "/**\n * Turn Markdown image shortcuts into <img> tags.\n */\nshowdown.subParser('makehtml.images', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.images.before', text, options, globals).getText();\n\n  var inlineRegExp      = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<?([\\S]+?(?:\\([\\S]*?\\)[\\S]*?)?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n      crazyRegExp       = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<([^>]*)>(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(?:([\"'])([^\"]*?)\\6))?[ \\t]?\\)/g,\n      base64RegExp      = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<?(data:.+?\\/.+?;base64,[A-Za-z0-9+/=\\n]+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n      referenceRegExp   = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[([\\s\\S]*?)]()()()()()/g,\n      refShortcutRegExp = /!\\[([^\\[\\]]+)]()()()()()/g;\n\n  function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {\n    url = url.replace(/\\s/g, '');\n    return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n  }\n\n  function writeImageTagBaseUrl (wholeMatch, altText, linkId, url, width, height, m5, title) {\n    url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n    return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n  }\n\n  function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n    var gUrls   = globals.gUrls,\n        gTitles = globals.gTitles,\n        gDims   = globals.gDimensions;\n\n    linkId = linkId.toLowerCase();\n\n    if (!title) {\n      title = '';\n    }\n    // Special case for explicit empty url\n    if (wholeMatch.search(/\\(<?\\s*>? ?(['\"].*['\"])?\\)$/m) > -1) {\n      url = '';\n\n    } else if (url === '' || url === null) {\n      if (linkId === '' || linkId === null) {\n        // lower-case and turn embedded newlines into spaces\n        linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + linkId;\n\n      if (!showdown.helper.isUndefined(gUrls[linkId])) {\n        url = gUrls[linkId];\n        if (!showdown.helper.isUndefined(gTitles[linkId])) {\n          title = gTitles[linkId];\n        }\n        if (!showdown.helper.isUndefined(gDims[linkId])) {\n          width = gDims[linkId].width;\n          height = gDims[linkId].height;\n        }\n      } else {\n        return wholeMatch;\n      }\n    }\n\n    altText = altText\n      .replace(/\"/g, '&quot;')\n    //altText = showdown.helper.escapeCharacters(altText, '*_', false);\n      .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n    //url = showdown.helper.escapeCharacters(url, '*_', false);\n    url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n    var result = '<img src=\"' + url + '\" alt=\"' + altText + '\"';\n\n    if (title && showdown.helper.isString(title)) {\n      title = title\n        .replace(/\"/g, '&quot;')\n      //title = showdown.helper.escapeCharacters(title, '*_', false);\n        .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n      result += ' title=\"' + title + '\"';\n    }\n\n    if (width && height) {\n      width  = (width === '*') ? 'auto' : width;\n      height = (height === '*') ? 'auto' : height;\n\n      result += ' width=\"' + width + '\"';\n      result += ' height=\"' + height + '\"';\n    }\n\n    result += ' />';\n\n    return result;\n  }\n\n  // First, handle reference-style labeled images: ![alt text][id]\n  text = text.replace(referenceRegExp, writeImageTag);\n\n  // Next, handle inline images:  ![alt text](url =<width>x<height> \"optional title\")\n\n  // base64 encoded images\n  text = text.replace(base64RegExp, writeImageTagBase64);\n\n  // cases with crazy urls like ./image/cat1).png\n  text = text.replace(crazyRegExp, writeImageTagBaseUrl);\n\n  // normal cases\n  text = text.replace(inlineRegExp, writeImageTagBaseUrl);\n\n  // handle reference-style shortcuts: ![img text]\n  text = text.replace(refShortcutRegExp, writeImageTag);\n\n  text = globals.converter._dispatch('makehtml.images.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/italicsAndBold.js",
    "content": "showdown.subParser('makehtml.italicsAndBold', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.italicsAndBold.before', text, options, globals).getText();\n\n  // it's faster to have 3 separate regexes for each case than have just one\n  // because of backtracing, in some cases, it could lead to an exponential effect\n  // called \"catastrophic backtrace\". Ominous!\n\n  function parseInside (txt, left, right) {\n    return left + txt + right;\n  }\n\n  // Parse underscores\n  if (options.literalMidWordUnderscores) {\n    text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n      return parseInside (txt, '<strong><em>', '</em></strong>');\n    });\n    text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n      return parseInside (txt, '<strong>', '</strong>');\n    });\n    text = text.replace(/\\b_(\\S[\\s\\S]*?)_\\b/g, function (wm, txt) {\n      return parseInside (txt, '<em>', '</em>');\n    });\n  } else {\n    text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;\n    });\n    text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;\n    });\n    text = text.replace(/_([^\\s_][\\s\\S]*?)_/g, function (wm, m) {\n      // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)\n      return (/\\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;\n    });\n  }\n\n  // Now parse asterisks\n  /*\n  if (options.literalMidWordAsterisks) {\n    text = text.replace(/([^*]|^)\\B\\*\\*\\*(\\S[\\s\\S]+?)\\*\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<strong><em>', '</em></strong>');\n    });\n    text = text.replace(/([^*]|^)\\B\\*\\*(\\S[\\s\\S]+?)\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<strong>', '</strong>');\n    });\n    text = text.replace(/([^*]|^)\\B\\*(\\S[\\s\\S]+?)\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n      return parseInside (txt, lead + '<em>', '</em>');\n    });\n  } else {\n  */\n  text = text.replace(/\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*/g, function (wm, m) {\n    return (/\\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;\n  });\n  text = text.replace(/\\*\\*(\\S[\\s\\S]*?)\\*\\*/g, function (wm, m) {\n    return (/\\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;\n  });\n  text = text.replace(/\\*([^\\s*][\\s\\S]*?)\\*/g, function (wm, m) {\n    // !/^\\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)\n    return (/\\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;\n  });\n  //}\n\n  text = globals.converter._dispatch('makehtml.italicsAndBold.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/links.js",
    "content": "////\n// makehtml/links.js\n// Copyright (c) 2018 ShowdownJS\n//\n// Transforms MD links into `<a>` html anchors\n//\n// A link contains link text (the visible text), a link destination (the URI that is the link destination), and\n// optionally a link title. There are two basic kinds of links in Markdown.\n// In inline links the destination and title are given immediately after the link text.\n// In reference links the destination and title are defined elsewhere in the document.\n//\n// ***Author:***\n// - Estevão Soares dos Santos (Tivie) <https://github.com/tivie>\n////\n\n(function () {\n  /**\n   * Helper function: Wrapper function to pass as second replace parameter\n   *\n   * @param {RegExp} rgx\n   * @param {string} evtRootName\n   * @param {{}} options\n   * @param {{}} globals\n   * @returns {Function}\n   */\n  function replaceAnchorTagReference (rgx, evtRootName, options, globals, emptyCase) {\n    emptyCase = !!emptyCase;\n    return function (wholeMatch, text, id, url, m5, m6, title) {\n      // bail we we find 2 newlines somewhere\n      if (/\\n\\n/.test(wholeMatch)) {\n        return wholeMatch;\n      }\n\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);\n      return writeAnchorTag(evt, options, globals, emptyCase);\n    };\n  }\n\n  function replaceAnchorTagBaseUrl (rgx, evtRootName, options, globals, emptyCase) {\n    return function (wholeMatch, text, id, url, m5, m6, title) {\n      url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);\n      return writeAnchorTag(evt, options, globals, emptyCase);\n    };\n  }\n\n  /**\n   * TODO Normalize this\n   * Helper function: Create a capture event\n   * @param {RegExp} rgx\n   * @param {String} evtName Event name\n   * @param {String} wholeMatch\n   * @param {String} text\n   * @param {String} id\n   * @param {String} url\n   * @param {String} title\n   * @param {{}} options\n   * @param {{}} globals\n   * @returns {showdown.helper.Event|*}\n   */\n  function createEvent (rgx, evtName, wholeMatch, text, id, url, title, options, globals) {\n    return globals.converter._dispatch(evtName, wholeMatch, options, globals, {\n      regexp: rgx,\n      matches: {\n        wholeMatch: wholeMatch,\n        text: text,\n        id: id,\n        url: url,\n        title: title\n      }\n    });\n  }\n\n  /**\n   * Helper Function: Normalize and write an anchor tag based on passed parameters\n   * @param evt\n   * @param options\n   * @param globals\n   * @param {boolean} emptyCase\n   * @returns {string}\n   */\n  function writeAnchorTag (evt, options, globals, emptyCase) {\n\n    var wholeMatch = evt.getMatches().wholeMatch;\n    var text = evt.getMatches().text;\n    var id = evt.getMatches().id;\n    var url = evt.getMatches().url;\n    var title = evt.getMatches().title;\n    var target = '';\n\n    if (!title) {\n      title = '';\n    }\n    id = (id) ? id.toLowerCase() : '';\n\n    if (emptyCase) {\n      url = '';\n    } else if (!url) {\n      if (!id) {\n        // lower-case and turn embedded newlines into spaces\n        id = text.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + id;\n\n      if (!showdown.helper.isUndefined(globals.gUrls[id])) {\n        url = globals.gUrls[id];\n        if (!showdown.helper.isUndefined(globals.gTitles[id])) {\n          title = globals.gTitles[id];\n        }\n      } else {\n        return wholeMatch;\n      }\n    }\n    //url = showdown.helper.escapeCharacters(url, '*_:~', false); // replaced line to improve performance\n    url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n\n    if (title !== '' && title !== null) {\n      title = title.replace(/\"/g, '&quot;');\n      //title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance\n      title = title.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n      title = ' title=\"' + title + '\"';\n    }\n\n    // optionLinksInNewWindow only applies\n    // to external links. Hash links (#) open in same page\n    if (options.openLinksInNewWindow && !/^#/.test(url)) {\n      // escaped _\n      target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n    }\n\n    // Text can be a markdown element, so we run through the appropriate parsers\n    text = showdown.subParser('makehtml.codeSpans')(text, options, globals);\n    text = showdown.subParser('makehtml.emoji')(text, options, globals);\n    text = showdown.subParser('makehtml.underline')(text, options, globals);\n    text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);\n    text = showdown.subParser('makehtml.strikethrough')(text, options, globals);\n    text = showdown.subParser('makehtml.ellipsis')(text, options, globals);\n    text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);\n\n    //evt = createEvent(rgx, evtRootName + '.captureEnd', wholeMatch, text, id, url, title, options, globals);\n\n    var result = '<a href=\"' + url + '\"' + title + target + '>' + text + '</a>';\n\n    //evt = createEvent(rgx, evtRootName + '.beforeHash', wholeMatch, text, id, url, title, options, globals);\n\n    result = showdown.subParser('makehtml.hashHTMLSpans')(result, options, globals);\n\n    return result;\n  }\n\n  var evtRootName = 'makehtml.links';\n\n  /**\n   * Turn Markdown link shortcuts into XHTML <a> tags.\n   */\n  showdown.subParser('makehtml.links', function (text, options, globals) {\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Handle reference-style links: [link text] [id]\n    text = showdown.subParser('makehtml.links.reference')(text, options, globals);\n\n    // 2. Handle inline-style links: [link text](url \"optional title\")\n    text = showdown.subParser('makehtml.links.inline')(text, options, globals);\n\n    // 3. Handle reference-style shortcuts: [link text]\n    // These must come last in case there's a [link text][1] or [link text](/foo)\n    text = showdown.subParser('makehtml.links.referenceShortcut')(text, options, globals);\n\n    // 4. Handle angle brackets links -> `<http://example.com/>`\n    // Must come after links, because you can use < and > delimiters in inline links like [this](<url>).\n    text = showdown.subParser('makehtml.links.angleBrackets')(text, options, globals);\n\n    // 5. Handle GithubMentions (if option is enabled)\n    text = showdown.subParser('makehtml.links.ghMentions')(text, options, globals);\n\n    // 6. Handle <a> tags and img tags\n    text = text.replace(/<a\\s[^>]*>[\\s\\S]*<\\/a>/g, function (wholeMatch) {\n      return showdown.helper._hashHTMLSpan(wholeMatch, globals);\n    });\n\n    text = text.replace(/<img\\s[^>]*\\/?>/g, function (wholeMatch) {\n      return showdown.helper._hashHTMLSpan(wholeMatch, globals);\n    });\n\n    // 7. Handle naked links (if option is enabled)\n    text = showdown.subParser('makehtml.links.naked')(text, options, globals);\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.inline', function (text, options, globals) {\n    var evtRootName = evtRootName + '.inline';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Look for empty cases: []() and [empty]() and [](\"title\")\n    var rgxEmpty = /\\[(.*?)]()()()()\\(<? ?>? ?(?:[\"'](.*)[\"'])?\\)/g;\n    text = text.replace(rgxEmpty, replaceAnchorTagBaseUrl(rgxEmpty, evtRootName, options, globals, true));\n\n    // 2. Look for cases with crazy urls like ./image/cat1).png\n    var rgxCrazy = /\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()\\s?\\([ \\t]?<([^>]*)>(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g;\n    text = text.replace(rgxCrazy, replaceAnchorTagBaseUrl(rgxCrazy, evtRootName, options, globals));\n\n    // 3. inline links with no title or titles wrapped in ' or \":\n    // [text](url.com) || [text](<url.com>) || [text](url.com \"title\") || [text](<url.com> \"title\")\n    //var rgx2 = /\\[[ ]*[\\s]?[ ]*([^\\n\\[\\]]*?)[ ]*[\\s]?[ ]*] ?()\\(<?[ ]*[\\s]?[ ]*([^\\s'\"]*)>?(?:[ ]*[\\n]?[ ]*()(['\"])(.*?)\\5)?[ ]*[\\s]?[ ]*\\)/; // this regex is too slow!!!\n    var rgx2 = /\\[([\\S ]*?)]\\s?()\\( *<?([^\\s'\"]*?(?:\\([\\S]*?\\)[\\S]*?)?)>?\\s*(?:()(['\"])(.*?)\\5)? *\\)/g;\n    text = text.replace(rgx2, replaceAnchorTagBaseUrl(rgx2, evtRootName, options, globals));\n\n    // 4. inline links with titles wrapped in (): [foo](bar.com (title))\n    var rgx3 = /\\[([\\S ]*?)]\\s?()\\( *<?([^\\s'\"]*?(?:\\([\\S]*?\\)[\\S]*?)?)>?\\s+()()\\((.*?)\\) *\\)/g;\n    text = text.replace(rgx3, replaceAnchorTagBaseUrl(rgx3, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.reference', function (text, options, globals) {\n    var evtRootName = evtRootName + '.reference';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /\\[((?:\\[[^\\]]*]|[^\\[\\]])*)] ?(?:\\n *)?\\[(.*?)]()()()()/g;\n    text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.referenceShortcut', function (text, options, globals) {\n    var evtRootName = evtRootName + '.referenceShortcut';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /\\[([^\\[\\]]+)]()()()()()/g;\n    text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.ghMentions', function (text, options, globals) {\n    var evtRootName = evtRootName + 'ghMentions';\n\n    if (!options.ghMentions) {\n      return text;\n    }\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    var rgx = /(^|\\s)(\\\\)?(@([a-z\\d]+(?:[a-z\\d._-]+?[a-z\\d]+)*))/gi;\n\n    text = text.replace(rgx, function (wholeMatch, st, escape, mentions, username) {\n      // bail if the mentions was escaped\n      if (escape === '\\\\') {\n        return st + mentions;\n      }\n\n      // check if options.ghMentionsLink is a string\n      // TODO Validation should be done at initialization not at runtime\n      if (!showdown.helper.isString(options.ghMentionsLink)) {\n        throw new Error('ghMentionsLink option must be a string');\n      }\n      var url = options.ghMentionsLink.replace(/{u}/g, username);\n      var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, mentions, null, url, null, options, globals);\n      // captureEnd Event is triggered inside writeAnchorTag function\n      return st + writeAnchorTag(evt, options, globals);\n    });\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n\n    return text;\n  });\n\n  /**\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.angleBrackets', function (text, options, globals) {\n    var evtRootName = 'makehtml.links.angleBrackets';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 1. Parse links first\n    var urlRgx  = /<(((?:https?|ftp):\\/\\/|www\\.)[^'\">\\s]+)>/gi;\n    text = text.replace(urlRgx, function (wholeMatch, url, urlStart) {\n      var text = url;\n      url = (urlStart === 'www.') ? 'http://' + url : url;\n      var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);\n      return writeAnchorTag(evt, options, globals);\n    });\n\n    // 2. Then Mail Addresses\n    var mailRgx = /<(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi;\n    text = text.replace(mailRgx, function (wholeMatch, mail) {\n      var url = 'mailto:';\n      mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);\n      if (options.encodeEmails) {\n        url = showdown.helper.encodeEmailAddress(url + mail);\n        mail = showdown.helper.encodeEmailAddress(mail);\n      } else {\n        url = url + mail;\n      }\n      var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);\n      return writeAnchorTag(evt, options, globals);\n    });\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n\n  /**\n   * TODO MAKE THIS WORK (IT'S NOT ACTIVATED)\n   * TODO WRITE THIS DOCUMENTATION\n   */\n  showdown.subParser('makehtml.links.naked', function (text, options, globals) {\n    if (!options.simplifiedAutoLink) {\n      return text;\n    }\n\n    var evtRootName = 'makehtml.links.naked';\n\n    text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();\n\n    // 2. Now we check for\n    // we also include leading markdown magic chars [_*~] for cases like __https://www.google.com/foobar__\n    var urlRgx = /([_*~]*?)(((?:https?|ftp):\\/\\/|www\\.)[^\\s<>\"'`´.-][^\\s<>\"'`´]*?\\.[a-z\\d.]+[^\\s<>\"']*)\\1/gi;\n    text = text.replace(urlRgx, function (wholeMatch, leadingMDChars, url, urlPrefix) {\n\n      // we now will start traversing the url from the front to back, looking for punctuation chars [_*~,;:.!?\\)\\]]\n      var len = url.length;\n      var suffix = '';\n      for (var i = len - 1; i >= 0; --i) {\n        var char = url.charAt(i);\n\n        if (/[_*~,;:.!?]/.test(char)) {\n          // it's a punctuation char\n          // we remove it from the url\n          url = url.slice(0, -1);\n          // and prepend it to the suffix\n          suffix = char + suffix;\n        } else if (/\\)/.test(char)) {\n          var opPar = url.match(/\\(/g) || [];\n          var clPar = url.match(/\\)/g);\n\n          // it's a curved parenthesis so we need to check for \"balance\" (kinda)\n          if (opPar.length < clPar.length) {\n            // there are more closing Parenthesis than opening so chop it!!!!!\n            url = url.slice(0, -1);\n            // and prepend it to the suffix\n            suffix = char + suffix;\n          } else {\n            // it's (kinda) balanced so our work is done\n            break;\n          }\n        } else if (/]/.test(char)) {\n          var opPar2 = url.match(/\\[/g) || [];\n          var clPar2 = url.match(/\\]/g);\n          // it's a squared parenthesis so we need to check for \"balance\" (kinda)\n          if (opPar2.length < clPar2.length) {\n            // there are more closing Parenthesis than opening so chop it!!!!!\n            url = url.slice(0, -1);\n            // and prepend it to the suffix\n            suffix = char + suffix;\n          } else {\n            // it's (kinda) balanced so our work is done\n            break;\n          }\n        } else {\n          // it's not a punctuation or a parenthesis so our work is done\n          break;\n        }\n      }\n\n      // we copy the treated url to the text variable\n      var text = url;\n      // finally, if it's a www shortcut, we prepend http\n      url = (urlPrefix === 'www.') ? 'http://' + url : url;\n\n      // url part is done so let's take care of text now\n      // we need to escape the text (because of links such as www.example.com/foo__bar__baz)\n      text = text.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);\n\n      // finally we dispatch the event\n      var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);\n\n      // and return the link tag, with the leadingMDChars and  suffix. The leadingMDChars are added at the end too because\n      // we consumed those characters in the regexp\n      return leadingMDChars + writeAnchorTag(evt, options, globals) + suffix + leadingMDChars;\n    });\n\n    // 2. Then mails\n    var mailRgx = /(^|\\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?=$|\\s)/gmi;\n    text = text.replace(mailRgx, function (wholeMatch, leadingChar, mail) {\n      var url = 'mailto:';\n      mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);\n      if (options.encodeEmails) {\n        url = showdown.helper.encodeEmailAddress(url + mail);\n        mail = showdown.helper.encodeEmailAddress(mail);\n      } else {\n        url = url + mail;\n      }\n      var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);\n      return leadingChar + writeAnchorTag(evt, options, globals);\n    });\n\n\n    text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();\n    return text;\n  });\n})();\n"
  },
  {
    "path": "src/subParsers/makehtml/lists.js",
    "content": "/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('makehtml.lists', function (text, options, globals) {\n  'use strict';\n\n  /**\n   * Process the contents of a single ordered or unordered list, splitting it\n   * into individual list items.\n   * @param {string} listStr\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function processListItems (listStr, trimTrailing) {\n    // The $g_list_level global keeps track of when we're inside a list.\n    // Each time we enter a list, we increment it; when we leave a list,\n    // we decrement. If it's zero, we're not in a list anymore.\n    //\n    // We do this because when we're not inside a list, we want to treat\n    // something like this:\n    //\n    //    I recommend upgrading to version\n    //    8. Oops, now this line is treated\n    //    as a sub-list.\n    //\n    // As a single paragraph, despite the fact that the second line starts\n    // with a digit-period-space sequence.\n    //\n    // Whereas when we're inside a list (or sub-list), that line will be\n    // treated as the start of a sub-list. What a kludge, huh? This is\n    // an aspect of Markdown's syntax that's hard to parse perfectly\n    // without resorting to mind-reading. Perhaps the solution is to\n    // change the syntax rules such that sub-lists must start with a\n    // starting cardinal number; e.g. \"1.\" or \"a.\".\n    globals.gListLevel++;\n\n    // trim trailing blank lines:\n    listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n    // attacklab: add sentinel to emulate \\z\n    listStr += '¨0';\n\n    var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[([xX ])])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n        isParagraphed = (/\\n[ \\t]*\\n(?!¨0)/.test(listStr));\n\n    // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n    // which is a syntax breaking change\n    // activating this option reverts to old behavior\n    // This will be removed in version 2.0\n    if (options.disableForced4SpacesIndentedSublists) {\n      rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[([xX ])])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n    }\n\n    listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n      checked = (checked && checked.trim() !== '');\n\n      var item = showdown.subParser('makehtml.outdent')(m4, options, globals),\n          bulletStyle = '';\n\n      // Support for github tasklists\n      if (taskbtn && options.tasklists) {\n\n        // Style used for tasklist bullets\n        bulletStyle = ' class=\"task-list-item';\n        if (options.moreStyling) {bulletStyle +=  checked ? ' task-list-item-complete' : '';}\n        bulletStyle += '\" style=\"list-style-type: none;\"';\n\n        item = item.replace(/^[ \\t]*\\[([xX ])?]/m, function () {\n          var otp = '<input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"';\n          if (checked) {\n            otp += ' checked';\n          }\n          otp += '>';\n          return otp;\n        });\n      }\n\n      // ISSUE #312\n      // This input: - - - a\n      // causes trouble to the parser, since it interprets it as:\n      // <ul><li><li><li>a</li></li></li></ul>\n      // instead of:\n      // <ul><li>- - a</li></ul>\n      // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n      // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n      item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n        return '¨A' + wm2;\n      });\n\n      // SPECIAL CASE: a heading followed by a paragraph of text that is not separated by a double newline\n      // or/nor indented. ex:\n      //\n      // - # foo\n      // bar is great\n      //\n      // While this does now follow the spec per se, not allowing for this might cause confusion since\n      // header blocks don't need double-newlines after\n      if (/^#+.+\\n.+/.test(item)) {\n        item = item.replace(/^(#+.+)$/m, '$1\\n');\n      }\n\n      // m1 - Leading line or\n      // Has a double return (multi paragraph)\n      if (m1 || (item.search(/\\n{2,}/) > -1)) {\n        item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals);\n        item = showdown.subParser('makehtml.blockQuotes')(item, options, globals);\n        item = showdown.subParser('makehtml.headers')(item, options, globals);\n        item = showdown.subParser('makehtml.lists')(item, options, globals);\n        item = showdown.subParser('makehtml.codeBlocks')(item, options, globals);\n        item = showdown.subParser('makehtml.tables')(item, options, globals);\n        item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals);\n        //item = showdown.subParser('makehtml.paragraphs')(item, options, globals);\n\n        // TODO: This is a copy of the paragraph parser\n        // This is a provisory fix for issue #494\n        // For a permanente fix we need to rewrite the paragraph parser, passing the unhashify logic outside\n        // so that we can call the paragraph parser without accidently unashifying previously parsed blocks\n\n        // Strip leading and trailing lines:\n        item = item.replace(/^\\n+/g, '');\n        item = item.replace(/\\n+$/g, '');\n\n        var grafs = item.split(/\\n{2,}/g),\n            grafsOut = [],\n            end = grafs.length; // Wrap <p> tags\n\n        for (var i = 0; i < end; i++) {\n          var str = grafs[i];\n          // if this is an HTML marker, copy it\n          if (str.search(/¨([KG])(\\d+)\\1/g) >= 0) {\n            grafsOut.push(str);\n\n            // test for presence of characters to prevent empty lines being parsed\n            // as paragraphs (resulting in undesired extra empty paragraphs)\n          } else if (str.search(/\\S/) >= 0) {\n            str = showdown.subParser('makehtml.spanGamut')(str, options, globals);\n            str = str.replace(/^([ \\t]*)/g, '<p>');\n            str += '</p>';\n            grafsOut.push(str);\n          }\n        }\n        item = grafsOut.join('\\n');\n        // Strip leading and trailing lines:\n        item = item.replace(/^\\n+/g, '');\n        item = item.replace(/\\n+$/g, '');\n\n      } else {\n\n        // Recursion for sub-lists:\n        item = showdown.subParser('makehtml.lists')(item, options, globals);\n        item = item.replace(/\\n$/, ''); // chomp(item)\n        item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals);\n\n        // Colapse double linebreaks\n        item = item.replace(/\\n\\n+/g, '\\n\\n');\n\n        if (isParagraphed) {\n          item = showdown.subParser('makehtml.paragraphs')(item, options, globals);\n        } else {\n          item = showdown.subParser('makehtml.spanGamut')(item, options, globals);\n        }\n      }\n\n      // now we need to remove the marker (¨A)\n      item = item.replace('¨A', '');\n      // we can finally wrap the line in list item tags\n      item =  '<li' + bulletStyle + '>' + item + '</li>\\n';\n\n      return item;\n    });\n\n    // attacklab: strip sentinel\n    listStr = listStr.replace(/¨0/g, '');\n\n    globals.gListLevel--;\n\n    if (trimTrailing) {\n      listStr = listStr.replace(/\\s+$/, '');\n    }\n\n    return listStr;\n  }\n\n  function styleStartNumber (list, listType) {\n    // check if ol and starts by a number different than 1\n    if (listType === 'ol') {\n      var res = list.match(/^ *(\\d+)\\./);\n      if (res && res[1] !== '1') {\n        return ' start=\"' + res[1] + '\"';\n      }\n    }\n    return '';\n  }\n\n  /**\n   * Check and parse consecutive lists (better fix for issue #142)\n   * @param {string} list\n   * @param {string} listType\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function parseConsecutiveLists (list, listType, trimTrailing) {\n    // check if we caught 2 or more consecutive lists by mistake\n    // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n    var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n        ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n        counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n        result = '';\n\n    if (list.search(counterRxg) !== -1) {\n      (function parseCL (txt) {\n        var pos = txt.search(counterRxg),\n            style = styleStartNumber(list, listType);\n        if (pos !== -1) {\n          // slice\n          result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\\n';\n\n          // invert counterType and listType\n          listType = (listType === 'ul') ? 'ol' : 'ul';\n          counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n          //recurse\n          parseCL(txt.slice(pos));\n        } else {\n          result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\\n';\n        }\n      })(list);\n    } else {\n      var style = styleStartNumber(list, listType);\n      result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\\n';\n    }\n\n    return result;\n  }\n\n  // Start of list parsing\n  var subListRgx = /^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n  var mainListRgx = /(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n\n  text = globals.converter._dispatch('lists.before', text, options, globals).getText();\n  // add sentinel to hack around khtml/safari bug:\n  // http://bugs.webkit.org/show_bug.cgi?id=11231\n  text += '¨0';\n\n  if (globals.gListLevel) {\n    text = text.replace(subListRgx, function (wholeMatch, list, m2) {\n      var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n      return parseConsecutiveLists(list, listType, true);\n    });\n  } else {\n    text = text.replace(mainListRgx, function (wholeMatch, m1, list, m3) {\n      var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n      return parseConsecutiveLists(list, listType, false);\n    });\n  }\n\n  // strip sentinel\n  text = text.replace(/¨0/, '');\n  text = globals.converter._dispatch('makehtml.lists.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/metadata.js",
    "content": "/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('makehtml.metadata', function (text, options, globals) {\n  'use strict';\n\n  if (!options.metadata) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.metadata.before', text, options, globals).getText();\n\n  function parseMetadataContents (content) {\n    // raw is raw so it's not changed in any way\n    globals.metadata.raw = content;\n\n    // escape chars forbidden in html attributes\n    // double quotes\n    content = content\n      // ampersand first\n      .replace(/&/g, '&amp;')\n      // double quotes\n      .replace(/\"/g, '&quot;');\n\n    // Restore dollar signs and tremas\n    content = content\n      .replace(/¨D/g, '$$')\n      .replace(/¨T/g, '¨');\n\n    content = content.replace(/\\n {4}/g, ' ');\n    content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n      globals.metadata.parsed[key] = value;\n      return '';\n    });\n  }\n\n  text = text.replace(/^\\s*«««+\\s*(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\s*\\n/, function (wholematch, format, content) {\n    parseMetadataContents(content);\n    return '¨M';\n  });\n\n  text = text.replace(/^\\s*---+\\s*(\\S*?)\\n([\\s\\S]+?)\\n---+\\s*\\n/, function (wholematch, format, content) {\n    if (format) {\n      globals.metadata.format = format;\n    }\n    parseMetadataContents(content);\n    return '¨M';\n  });\n\n  text = text.replace(/¨M/g, '');\n\n  text = globals.converter._dispatch('makehtml.metadata.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/outdent.js",
    "content": "/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('makehtml.outdent', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.outdent.before', text, options, globals).getText();\n\n  // attacklab: hack around Konqueror 3.5.4 bug:\n  // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n  text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n  // attacklab: clean up hack\n  text = text.replace(/¨0/g, '');\n\n  text = globals.converter._dispatch('makehtml.outdent.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/paragraphs.js",
    "content": "/**\n *\n */\nshowdown.subParser('makehtml.paragraphs', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.paragraphs.before', text, options, globals).getText();\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n\n  var grafs = text.split(/\\n{2,}/g),\n      grafsOut = [],\n      end = grafs.length; // Wrap <p> tags\n\n  for (var i = 0; i < end; i++) {\n    var str = grafs[i];\n    // if this is an HTML marker, copy it\n    if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n      grafsOut.push(str);\n\n    // test for presence of characters to prevent empty lines being parsed\n    // as paragraphs (resulting in undesired extra empty paragraphs)\n    } else if (str.search(/\\S/) >= 0) {\n      str = showdown.subParser('makehtml.spanGamut')(str, options, globals);\n      str = str.replace(/^([ \\t]*)/g, '<p>');\n      str += '</p>';\n      grafsOut.push(str);\n    }\n  }\n\n  /** Unhashify HTML blocks */\n  end = grafsOut.length;\n  for (i = 0; i < end; i++) {\n    var blockText = '',\n        grafsOutIt = grafsOut[i],\n        codeFlag = false;\n    // if this is a marker for an html block...\n    // use RegExp.test instead of string.search because of QML bug\n    while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n      var delim = RegExp.$1,\n          num   = RegExp.$2;\n\n      if (delim === 'K') {\n        blockText = globals.gHtmlBlocks[num];\n      } else {\n        // we need to check if ghBlock is a false positive\n        if (codeFlag) {\n          // use encoded version of all text\n          blockText = showdown.subParser('makehtml.encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n        } else {\n          blockText = globals.ghCodeBlocks[num].codeblock;\n        }\n      }\n      blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n      grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n      // Check if grafsOutIt is a pre->code\n      if (/^<pre\\b[^>]*>\\s*<code\\b[^>]*>/.test(grafsOutIt)) {\n        codeFlag = true;\n      }\n    }\n    grafsOut[i] = grafsOutIt;\n  }\n  text = grafsOut.join('\\n');\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n  return globals.converter._dispatch('makehtml.paragraphs.after', text, options, globals).getText();\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/runExtension.js",
    "content": "/**\n * Run extension\n */\nshowdown.subParser('makehtml.runExtension', function (ext, text, options, globals) {\n  'use strict';\n\n  if (ext.filter) {\n    text = ext.filter(text, globals.converter, options);\n\n  } else if (ext.regex) {\n    // TODO remove this when old extension loading mechanism is deprecated\n    var re = ext.regex;\n    if (!(re instanceof RegExp)) {\n      re = new RegExp(re, 'g');\n    }\n    text = text.replace(re, ext.replace);\n  }\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/spanGamut.js",
    "content": "/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('makehtml.spanGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('makehtml.span.before', text, options, globals).getText();\n\n  text = showdown.subParser('makehtml.codeSpans')(text, options, globals);\n  text = showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n  text = showdown.subParser('makehtml.encodeBackslashEscapes')(text, options, globals);\n\n  // Process link and image tags. Images must come first,\n  // because ![foo][f] looks like a link.\n  text = showdown.subParser('makehtml.images')(text, options, globals);\n\n  text = globals.converter._dispatch('smakehtml.links.before', text, options, globals).getText();\n  text = showdown.subParser('makehtml.links')(text, options, globals);\n  text = globals.converter._dispatch('smakehtml.links.after', text, options, globals).getText();\n\n  //text = showdown.subParser('makehtml.autoLinks')(text, options, globals);\n  //text = showdown.subParser('makehtml.simplifiedAutoLinks')(text, options, globals);\n  text = showdown.subParser('makehtml.emoji')(text, options, globals);\n  text = showdown.subParser('makehtml.underline')(text, options, globals);\n  text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);\n  text = showdown.subParser('makehtml.strikethrough')(text, options, globals);\n  text = showdown.subParser('makehtml.ellipsis')(text, options, globals);\n\n  // we need to hash HTML tags inside spans\n  text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);\n\n  // now we encode amps and angles\n  text = showdown.subParser('makehtml.encodeAmpsAndAngles')(text, options, globals);\n\n  // Do hard breaks\n  if (options.simpleLineBreaks) {\n    // GFM style hard breaks\n    // only add line breaks if the text does not contain a block (special case for lists)\n    if (!/\\n\\n¨K/.test(text)) {\n      text = text.replace(/\\n+/g, '<br />\\n');\n    }\n  } else {\n    // Vanilla hard breaks\n    text = text.replace(/  +\\n/g, '<br />\\n');\n  }\n\n  text = globals.converter._dispatch('makehtml.spanGamut.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/strikethrough.js",
    "content": "showdown.subParser('makehtml.strikethrough', function (text, options, globals) {\n  'use strict';\n\n  if (options.strikethrough) {\n    text = globals.converter._dispatch('makehtml.strikethrough.before', text, options, globals).getText();\n    text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return '<del>' + txt + '</del>'; });\n    text = globals.converter._dispatch('makehtml.strikethrough.after', text, options, globals).getText();\n  }\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/stripLinkDefinitions.js",
    "content": "/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('makehtml.stripLinkDefinitions', function (text, options, globals) {\n  'use strict';\n\n  var regex       = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*<?([^>\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n      base64Regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*<?(data:.+?\\/.+?;base64,[A-Za-z0-9+/=\\n]+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n  // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n\n    // if there aren't two instances of linkId it must not be a reference link so back out\n    linkId = linkId.toLowerCase();\n    if (text.toLowerCase().split(linkId).length - 1 < 2) {\n      return wholeMatch;\n    }\n    if (url.match(/^data:.+?\\/.+?;base64,/)) {\n      // remove newlines\n      globals.gUrls[linkId] = url.replace(/\\s/g, '');\n    } else {\n      url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);\n\n      globals.gUrls[linkId] = showdown.subParser('makehtml.encodeAmpsAndAngles')(url, options, globals);  // Link IDs are case-insensitive\n    }\n\n    if (blankLines) {\n      // Oops, found blank lines, so it's not a title.\n      // Put back the parenthetical statement we stole.\n      return blankLines + title;\n\n    } else {\n      if (title) {\n        globals.gTitles[linkId] = title.replace(/\"|'/g, '&quot;');\n      }\n      if (options.parseImgDimensions && width && height) {\n        globals.gDimensions[linkId] = {\n          width:  width,\n          height: height\n        };\n      }\n    }\n    // Completely remove the definition from the text\n    return '';\n  };\n\n  // first we try to find base64 link references\n  text = text.replace(base64Regex, replaceFunc);\n\n  text = text.replace(regex, replaceFunc);\n\n  // attacklab: strip sentinel\n  text = text.replace(/¨0/, '');\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/tables.js",
    "content": "showdown.subParser('makehtml.tables', function (text, options, globals) {\n  'use strict';\n\n  if (!options.tables) {\n    return text;\n  }\n\n  var tableRgx       = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*[-=]{2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*[-=]{2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n      //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n      singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*[-=]{2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n  function parseStyles (sLine) {\n    if (/^:[ \\t]*--*$/.test(sLine)) {\n      return ' style=\"text-align:left;\"';\n    } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n      return ' style=\"text-align:right;\"';\n    } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n      return ' style=\"text-align:center;\"';\n    } else {\n      return '';\n    }\n  }\n\n  function parseHeaders (header, style) {\n    var id = '';\n    header = header.trim();\n    // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n    if (options.tablesHeaderId || options.tableHeaderId) {\n      id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n    }\n    header = showdown.subParser('makehtml.spanGamut')(header, options, globals);\n\n    return '<th' + id + style + '>' + header + '</th>\\n';\n  }\n\n  function parseCells (cell, style) {\n    var subText = showdown.subParser('makehtml.spanGamut')(cell, options, globals);\n    return '<td' + style + '>' + subText + '</td>\\n';\n  }\n\n  function buildTable (headers, cells) {\n    var tb = '<table>\\n<thead>\\n<tr>\\n',\n        tblLgn = headers.length;\n\n    for (var i = 0; i < tblLgn; ++i) {\n      tb += headers[i];\n    }\n    tb += '</tr>\\n</thead>\\n<tbody>\\n';\n\n    for (i = 0; i < cells.length; ++i) {\n      tb += '<tr>\\n';\n      for (var ii = 0; ii < tblLgn; ++ii) {\n        tb += cells[i][ii];\n      }\n      tb += '</tr>\\n';\n    }\n    tb += '</tbody>\\n</table>\\n';\n    return tb;\n  }\n\n  function parseTable (rawTable) {\n    var i, tableLines = rawTable.split('\\n');\n\n    for (i = 0; i < tableLines.length; ++i) {\n      // strip wrong first and last column if wrapped tables are used\n      if (/^ {0,3}\\|/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n      }\n      if (/\\|[ \\t]*$/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n      }\n      // parse code spans first, but we only support one line code spans\n\n      tableLines[i] = showdown.subParser('makehtml.codeSpans')(tableLines[i], options, globals);\n    }\n\n    var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n        rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n        rawCells = [],\n        headers = [],\n        styles = [],\n        cells = [];\n\n    tableLines.shift();\n    tableLines.shift();\n\n    for (i = 0; i < tableLines.length; ++i) {\n      if (tableLines[i].trim() === '') {\n        continue;\n      }\n      rawCells.push(\n        tableLines[i]\n          .split('|')\n          .map(function (s) {\n            return s.trim();\n          })\n      );\n    }\n\n    if (rawHeaders.length < rawStyles.length) {\n      return rawTable;\n    }\n\n    for (i = 0; i < rawStyles.length; ++i) {\n      styles.push(parseStyles(rawStyles[i]));\n    }\n\n    for (i = 0; i < rawHeaders.length; ++i) {\n      if (showdown.helper.isUndefined(styles[i])) {\n        styles[i] = '';\n      }\n      headers.push(parseHeaders(rawHeaders[i], styles[i]));\n    }\n\n    for (i = 0; i < rawCells.length; ++i) {\n      var row = [];\n      for (var ii = 0; ii < headers.length; ++ii) {\n        if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n        }\n        row.push(parseCells(rawCells[i][ii], styles[ii]));\n      }\n      cells.push(row);\n    }\n\n    return buildTable(headers, cells);\n  }\n\n  text = globals.converter._dispatch('makehtml.tables.before', text, options, globals).getText();\n\n  // find escaped pipe characters\n  text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n  // parse multi column tables\n  text = text.replace(tableRgx, parseTable);\n\n  // parse one column tables\n  text = text.replace(singeColTblRgx, parseTable);\n\n  text = globals.converter._dispatch('makehtml.tables.after', text, options, globals).getText();\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/underline.js",
    "content": "showdown.subParser('makehtml.underline', function (text, options, globals) {\n  'use strict';\n\n  if (!options.underline) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('makehtml.underline.before', text, options, globals).getText();\n\n  if (options.literalMidWordUnderscores) {\n    text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n      return '<u>' + txt + '</u>';\n    });\n    text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n      return '<u>' + txt + '</u>';\n    });\n  } else {\n    text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? '<u>' + m + '</u>' : wm;\n    });\n    text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n      return (/\\S$/.test(m)) ? '<u>' + m + '</u>' : wm;\n    });\n  }\n\n  // escape remaining underscores to prevent them being parsed by italic and bold\n  text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n  text = globals.converter._dispatch('makehtml.underline.after', text, options, globals).getText();\n\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makehtml/unescapeSpecialChars.js",
    "content": "/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('makehtml.unescapeSpecialChars', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('makehtml.unescapeSpecialChars.before', text, options, globals).getText();\n\n  text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n    var charCodeToReplace = parseInt(m1);\n    return String.fromCharCode(charCodeToReplace);\n  });\n\n  text = globals.converter._dispatch('makehtml.unescapeSpecialChars.after', text, options, globals).getText();\n  return text;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/blockquote.js",
    "content": "showdown.subParser('makeMarkdown.blockquote', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n\n    for (var i = 0; i < childrenLength; ++i) {\n      var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n\n      if (innerTxt === '') {\n        continue;\n      }\n      txt += innerTxt;\n    }\n  }\n  // cleanup\n  txt = txt.trim();\n  txt = '> ' + txt.split('\\n').join('\\n> ');\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/break.js",
    "content": "showdown.subParser('makeMarkdown.break', function () {\n  'use strict';\n\n  return '  \\n';\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/codeBlock.js",
    "content": "showdown.subParser('makeMarkdown.codeBlock', function (node, options, globals) {\n  'use strict';\n\n  var lang = node.getAttribute('language'),\n      num  = node.getAttribute('precodenum');\n  return '```' + lang + '\\n' + globals.preList[num] + '\\n```';\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/codeSpan.js",
    "content": "showdown.subParser('makeMarkdown.codeSpan', function (node) {\n  'use strict';\n\n  return '`' + node.innerHTML + '`';\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/emphasis.js",
    "content": "showdown.subParser('makeMarkdown.emphasis', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '*';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n    }\n    txt += '*';\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/header.js",
    "content": "showdown.subParser('makeMarkdown.header', function (node, options, globals, headerLevel) {\n  'use strict';\n\n  var headerMark = new Array(headerLevel + 1).join('#'),\n      txt = '';\n\n  if (node.hasChildNodes()) {\n    txt = headerMark + ' ';\n    var children = node.childNodes,\n        childrenLength = children.length;\n\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n    }\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/hr.js",
    "content": "showdown.subParser('makeMarkdown.hr', function () {\n  'use strict';\n\n  return '---';\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/image.js",
    "content": "showdown.subParser('makeMarkdown.image', function (node) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasAttribute('src') && node.getAttribute('src') !== '') {\n    txt += '![' + node.getAttribute('alt') + '](';\n    txt += '<' + node.getAttribute('src') + '>';\n    if (node.hasAttribute('width') && node.hasAttribute('height')) {\n      var width = node.getAttribute('width');\n      var height = node.getAttribute('height');\n      txt += ' =' + (width === 'auto' ? '*' : width) + 'x' + (height === 'auto' ? '*' : height);\n    }\n\n    if (node.hasAttribute('title')) {\n      txt += ' \"' + node.getAttribute('title') + '\"';\n    }\n    txt += ')';\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/input.js",
    "content": "showdown.subParser('makeMarkdown.input', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.getAttribute('checked') !== null) {\n    txt += '[x]';\n  } else {\n    txt += '[ ]';\n  }\n  var children = node.childNodes,\n      childrenLength = children.length;\n  for (var i = 0; i < childrenLength; ++i) {\n    txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/links.js",
    "content": "showdown.subParser('makeMarkdown.links', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes() && node.hasAttribute('href')) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n\n    // special case for mentions\n    // to simplify (and not make stuff really complicated) mentions will only work in this circumstance:\n    // <a class=\"user-mention\" href=\"https://github.com/user\">@user</a>\n    // that is, if there's a \"user-mention\" class and option ghMentions is true\n    // otherwise is ignored\n    var classes = node.getAttribute('class');\n    if (options.ghMentions && /(?:^| )user-mention\\b/.test(classes)) {\n      for (var ii = 0; ii < childrenLength; ++ii) {\n        txt += showdown.subParser('makeMarkdown.node')(children[ii], options, globals);\n      }\n\n    } else {\n      txt = '[';\n      for (var i = 0; i < childrenLength; ++i) {\n        txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n      }\n      txt += '](';\n      txt += '<' + node.getAttribute('href') + '>';\n      if (node.hasAttribute('title')) {\n        txt += ' \"' + node.getAttribute('title') + '\"';\n      }\n      txt += ')';\n    }\n\n\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/list.js",
    "content": "showdown.subParser('makeMarkdown.list', function (node, options, globals, type) {\n  'use strict';\n\n  var txt = '';\n  if (!node.hasChildNodes()) {\n    return '';\n  }\n  var listItems       = node.childNodes,\n      listItemsLenght = listItems.length,\n      listNum = node.getAttribute('start') || 1;\n\n  for (var i = 0; i < listItemsLenght; ++i) {\n    if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {\n      continue;\n    }\n\n    // define the bullet to use in list\n    var bullet = '';\n    if (type === 'ol') {\n      bullet = listNum.toString() + '. ';\n    } else {\n      bullet = '- ';\n    }\n\n    // parse list item\n    txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], options, globals);\n    ++listNum;\n  }\n\n  return txt.trim();\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/listItem.js",
    "content": "showdown.subParser('makeMarkdown.listItem', function (node, options, globals) {\n  'use strict';\n\n  var listItemTxt = '';\n\n  var children = node.childNodes,\n      childrenLenght = children.length;\n\n  for (var i = 0; i < childrenLenght; ++i) {\n    listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n  }\n  // if it's only one liner, we need to add a newline at the end\n  if (!/\\n$/.test(listItemTxt)) {\n    listItemTxt += '\\n';\n  } else {\n    // it's multiparagraph, so we need to indent\n    listItemTxt = listItemTxt\n      .split('\\n')\n      .join('\\n    ')\n      .replace(/^ {4}$/gm, '')\n      .replace(/\\n\\n+/g, '\\n\\n');\n  }\n\n  return listItemTxt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/node.js",
    "content": "\n\nshowdown.subParser('makeMarkdown.node', function (node, options, globals, spansOnly) {\n  'use strict';\n\n  spansOnly = spansOnly || false;\n\n  var txt = '';\n\n  // edge case of text without wrapper paragraph\n  if (node.nodeType === 3) {\n    return showdown.subParser('makeMarkdown.txt')(node, options, globals);\n  }\n\n  // HTML comment\n  if (node.nodeType === 8) {\n    return '<!--' + node.data + '-->\\n\\n';\n  }\n\n  // process only node elements\n  if (node.nodeType !== 1) {\n    return '';\n  }\n\n  var tagName = node.tagName.toLowerCase();\n\n  switch (tagName) {\n\n    //\n    // BLOCKS\n    //\n    case 'h1':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 1) + '\\n\\n'; }\n      break;\n    case 'h2':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 2) + '\\n\\n'; }\n      break;\n    case 'h3':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 3) + '\\n\\n'; }\n      break;\n    case 'h4':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 4) + '\\n\\n'; }\n      break;\n    case 'h5':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 5) + '\\n\\n'; }\n      break;\n    case 'h6':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, options, globals, 6) + '\\n\\n'; }\n      break;\n\n    case 'p':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    case 'blockquote':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    case 'hr':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    case 'ol':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, options, globals, 'ol') + '\\n\\n'; }\n      break;\n\n    case 'ul':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, options, globals, 'ul') + '\\n\\n'; }\n      break;\n\n    case 'precode':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    case 'pre':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    case 'table':\n      if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, options, globals) + '\\n\\n'; }\n      break;\n\n    //\n    // SPANS\n    //\n    case 'code':\n      txt = showdown.subParser('makeMarkdown.codeSpan')(node, options, globals);\n      break;\n\n    case 'em':\n    case 'i':\n      txt = showdown.subParser('makeMarkdown.emphasis')(node, options, globals);\n      break;\n\n    case 'strong':\n    case 'b':\n      txt = showdown.subParser('makeMarkdown.strong')(node, options, globals);\n      break;\n\n    case 'del':\n      txt = showdown.subParser('makeMarkdown.strikethrough')(node, options, globals);\n      break;\n\n    case 'a':\n      txt = showdown.subParser('makeMarkdown.links')(node, options, globals);\n      break;\n\n    case 'img':\n      txt = showdown.subParser('makeMarkdown.image')(node, options, globals);\n      break;\n\n    case 'br':\n      txt = showdown.subParser('makeMarkdown.break')(node, options, globals);\n      break;\n\n    case 'input':\n      txt = showdown.subParser('makeMarkdown.input')(node, options, globals);\n      break;\n\n    default:\n      txt = node.outerHTML + '\\n\\n';\n  }\n\n  // common normalization\n  // TODO eventually\n\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/paragraph.js",
    "content": "showdown.subParser('makeMarkdown.paragraph', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n    }\n  }\n\n  // some text normalization\n  txt = txt.trim();\n\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/pre.js",
    "content": "showdown.subParser('makeMarkdown.pre', function (node, options, globals) {\n  'use strict';\n\n  var num  = node.getAttribute('prenum');\n  return '<pre>' + globals.preList[num] + '</pre>';\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/strikethrough.js",
    "content": "showdown.subParser('makeMarkdown.strikethrough', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '~~';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n    }\n    txt += '~~';\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/strong.js",
    "content": "showdown.subParser('makeMarkdown.strong', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (node.hasChildNodes()) {\n    txt += '**';\n    var children = node.childNodes,\n        childrenLength = children.length;\n    for (var i = 0; i < childrenLength; ++i) {\n      txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals);\n    }\n    txt += '**';\n  }\n  return txt;\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/table.js",
    "content": "showdown.subParser('makeMarkdown.table',\n  /**\n   *\n   * @param {DocumentFragment} node\n   * @param {{}} options\n   * @param {{}} globals\n   * @returns {string}\n   */\n  function (node, options, globals) {\n    'use strict';\n\n    var txt = '',\n        tableArray = [[], []],\n        headings,\n        rows = [],\n        colCount,\n        i,\n        ii;\n\n    /**\n     * @param {Element} tr\n     */\n    function iterateRow (tr) {\n      var children = tr.childNodes,\n          cols = [];\n      // we need to iterate by order, since td and th can be used interchangeably and in any order\n      // we will ignore malformed stuff, comments and floating text.\n      for (var i = 0; i < children.length; ++i) {\n        var childName = children[i].nodeName.toUpperCase();\n        if (childName === 'TD' || childName === 'TH') {\n          cols.push(children[i]);\n        }\n      }\n      return cols;\n    }\n\n\n    // first lets look for <thead>\n    // we will ignore thead without <tr> children\n    // also, since markdown doesn't support tables with multiple heading rows, only the first one will be transformed\n    // the rest will count as regular rows\n    if (node.querySelectorAll(':scope>thead').length !== 0 && node.querySelectorAll(':scope>thead>tr').length !== 0) {\n      var thead = node.querySelectorAll(':scope>thead>tr');\n\n      // thead>tr can have td and th children\n      for (i = 0; i < thead.length; ++i) {\n        rows.push(iterateRow(thead[i]));\n      }\n    }\n\n    // now let's look for tbody\n    // we will ignore tbody without <tr> children\n    if (node.querySelectorAll(':scope>tbody').length !== 0 && node.querySelectorAll(':scope>tbody>tr').length !== 0) {\n      var tbody = node.querySelectorAll(':scope>tbody>tr');\n      // tbody>tr can have td and th children, although th are not very screen reader friendly\n      for (i = 0; i < tbody.length; ++i) {\n        rows.push(iterateRow(tbody[i]));\n      }\n    }\n\n    // now look for tfoot\n    if (node.querySelectorAll(':scope>tfoot').length !== 0 && node.querySelectorAll(':scope>tfoot>tr').length !== 0) {\n      var tfoot = node.querySelectorAll(':scope>tfoot>tr');\n      // tfoot>tr can have td and th children, although th are not very screen reader friendly\n      for (i = 0; i < tfoot.length; ++i) {\n        rows.push(iterateRow(tfoot[i]));\n      }\n    }\n\n    // lastly look for naked tr\n    if (node.querySelectorAll(':scope>tr').length !== 0) {\n\n      var tr = node.querySelectorAll(':scope>tr');\n      // tfoot>tr can have td and th children, although th are not very screen reader friendly\n      for (i = 0; i < tr.length; ++i) {\n        rows.push(iterateRow(tr[i]));\n      }\n    }\n\n    // TODO: implement <caption> in tables https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/caption\n    // note: <colgroup> is ignored, since they are basically styling\n\n    // we need now to account for cases of completely empty tables, like <table></table> or equivalent\n    if (rows.length === 0) {\n      // table is empty, return empty text\n      return txt;\n    }\n\n    // count the first row. We need it to trim the table (if table rows have inconsistent number of columns)\n    colCount = rows[0].length;\n\n    // let's shift the first row as a heading\n    headings = rows.shift();\n\n    for (i = 0; i < headings.length; ++i) {\n      var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),\n          align = '---';\n\n      if (headings[i].hasAttribute('style')) {\n        var style = headings[i].getAttribute('style').toLowerCase().replace(/\\s/g, '');\n        switch (style) {\n          case 'text-align:left;':\n            align = ':---';\n            break;\n          case 'text-align:right;':\n            align = '---:';\n            break;\n          case 'text-align:center;':\n            align = ':---:';\n            break;\n        }\n      }\n      tableArray[0][i] = headContent.trim();\n      tableArray[1][i] = align;\n    }\n\n    // now iterate through the rows and create the pseudo output (not pretty yet)\n    for (i = 0; i < rows.length; ++i) {\n      var r = tableArray.push([]) - 1;\n\n      for (ii = 0; ii < colCount; ++ii) {\n        var cellContent = ' ';\n        if (typeof rows[i][ii] !== 'undefined') {\n          // Note: if rows[i][ii] is undefined, it means the row has fewer elements than the header,\n          // and empty content will be added\n          cellContent = showdown.subParser('makeMarkdown.tableCell')(rows[i][ii], globals);\n        }\n        tableArray[r].push(cellContent);\n      }\n    }\n\n    // now tidy up the output, aligning cells and stuff\n    var cellSpacesCount = 3;\n    for (i = 0; i < tableArray.length; ++i) {\n      for (ii = 0; ii < tableArray[i].length; ++ii) {\n        var strLen = tableArray[i][ii].length;\n        if (strLen > cellSpacesCount) {\n          cellSpacesCount = strLen;\n        }\n      }\n    }\n\n    for (i = 0; i < tableArray.length; ++i) {\n      for (ii = 0; ii < tableArray[i].length; ++ii) {\n        if (i === 1) {\n          if (tableArray[i][ii].slice(-1) === ':') {\n            tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(0, -1), cellSpacesCount - 1, '-') + ':';\n          } else {\n            tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');\n          }\n\n        } else {\n          tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);\n        }\n      }\n      txt += '| ' + tableArray[i].join(' | ') + ' |\\n';\n    }\n\n    return txt.trim();\n  }\n);\n"
  },
  {
    "path": "src/subParsers/makemarkdown/tableCell.js",
    "content": "showdown.subParser('makeMarkdown.tableCell', function (node, options, globals) {\n  'use strict';\n\n  var txt = '';\n  if (!node.hasChildNodes()) {\n    return '';\n  }\n  var children = node.childNodes,\n      childrenLength = children.length;\n\n  for (var i = 0; i < childrenLength; ++i) {\n    txt += showdown.subParser('makeMarkdown.node')(children[i], options, globals, true);\n  }\n  return txt.trim();\n});\n"
  },
  {
    "path": "src/subParsers/makemarkdown/txt.js",
    "content": "showdown.subParser('makeMarkdown.txt', function (node) {\n  'use strict';\n\n  var txt = node.nodeValue;\n\n  // multiple spaces are collapsed\n  txt = txt.replace(/ +/g, ' ');\n\n  // replace the custom ¨NBSP; with a space\n  txt = txt.replace(/¨NBSP;/g, ' ');\n\n  // \", <, > and & should replace escaped html entities\n  txt = showdown.helper.unescapeHTMLEntities(txt);\n\n  // escape markdown magic characters\n  // emphasis, strong and strikethrough - can appear everywhere\n  // we also escape pipe (|) because of tables\n  // and escape ` because of code blocks and spans\n  txt = txt.replace(/([*_~|`])/g, '\\\\$1');\n\n  // escape > because of blockquotes\n  txt = txt.replace(/^(\\s*)>/g, '\\\\$1>');\n\n  // hash character, only troublesome at the beginning of a line because of headers\n  txt = txt.replace(/^#/gm, '\\\\#');\n\n  // horizontal rules\n  txt = txt.replace(/^(\\s*)([-=]{3,})(\\s*)$/, '$1\\\\$2$3');\n\n  // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer\n  txt = txt.replace(/^( {0,3}\\d+)\\./gm, '$1\\\\.');\n\n  // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)\n  txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\\\$2');\n\n  // images and links, ] followed by ( is problematic, so we escape it\n  txt = txt.replace(/]([\\s]*)\\(/g, '\\\\]$1\\\\(');\n\n  // reference URIs must also be escaped\n  txt = txt.replace(/^ {0,3}\\[([\\S \\t]*?)]:/gm, '\\\\[$1]:');\n\n  return txt;\n});\n"
  },
  {
    "path": "test/bootstrap.js",
    "content": "//.webstorm.bootstrap.js\nvar chai = require('chai');\nglobal.chai = chai;\nglobal.expect = chai.expect;\nglobal.showdown = require('../.build/showdown.js');\nglobal.getDefaultOpts = require('./optionswp.js').getDefaultOpts;\n"
  },
  {
    "path": "test/cli/basic.html",
    "content": "<h1 id=\"sometitle\">some title</h1>\n"
  },
  {
    "path": "test/cli/basic.md",
    "content": "# some title\n"
  },
  {
    "path": "test/functional/makehtml/cases/commonmark.testsuite.json",
    "content": "[\n  {\n    \"end_line\": 355,\n    \"section\": \"Tabs\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"markdown\": \"\\tfoo\\tbaz\\t\\tbim\\n\",\n    \"example\": 1,\n    \"start_line\": 350\n  },\n  {\n    \"end_line\": 362,\n    \"section\": \"Tabs\",\n    \"html\": \"<pre><code>foo\\tbaz\\t\\tbim\\n</code></pre>\\n\",\n    \"markdown\": \"  \\tfoo\\tbaz\\t\\tbim\\n\",\n    \"example\": 2,\n    \"start_line\": 357\n  },\n  {\n    \"end_line\": 371,\n    \"section\": \"Tabs\",\n    \"html\": \"<pre><code>a\\ta\\nὐ\\ta\\n</code></pre>\\n\",\n    \"markdown\": \"    a\\ta\\n    ὐ\\ta\\n\",\n    \"example\": 3,\n    \"start_line\": 364\n  },\n  {\n    \"end_line\": 388,\n    \"section\": \"Tabs\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"  - foo\\n\\n\\tbar\\n\",\n    \"example\": 4,\n    \"start_line\": 377\n  },\n  {\n    \"end_line\": 402,\n    \"section\": \"Tabs\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>  bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n\\n\\t\\tbar\\n\",\n    \"example\": 5,\n    \"start_line\": 390\n  },\n  {\n    \"end_line\": 420,\n    \"section\": \"Tabs\",\n    \"html\": \"<blockquote>\\n<pre><code>  foo\\n</code></pre>\\n</blockquote>\\n\",\n    \"markdown\": \">\\t\\tfoo\\n\",\n    \"example\": 6,\n    \"start_line\": 413\n  },\n  {\n    \"end_line\": 431,\n    \"section\": \"Tabs\",\n    \"html\": \"<ul>\\n<li>\\n<pre><code>  foo\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"-\\t\\tfoo\\n\",\n    \"example\": 7,\n    \"start_line\": 422\n  },\n  {\n    \"end_line\": 441,\n    \"section\": \"Tabs\",\n    \"html\": \"<pre><code>foo\\nbar\\n</code></pre>\\n\",\n    \"markdown\": \"    foo\\n\\tbar\\n\",\n    \"example\": 8,\n    \"start_line\": 434\n  },\n  {\n    \"end_line\": 459,\n    \"section\": \"Tabs\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \" - foo\\n   - bar\\n\\t - baz\\n\",\n    \"example\": 9,\n    \"start_line\": 443\n  },\n  {\n    \"end_line\": 465,\n    \"section\": \"Tabs\",\n    \"html\": \"<h1>Foo</h1>\\n\",\n    \"markdown\": \"#\\tFoo\\n\",\n    \"example\": 10,\n    \"start_line\": 461\n  },\n  {\n    \"end_line\": 471,\n    \"section\": \"Tabs\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \"*\\t*\\t*\\t\\n\",\n    \"example\": 11,\n    \"start_line\": 467\n  },\n  {\n    \"end_line\": 502,\n    \"section\": \"Precedence\",\n    \"html\": \"<ul>\\n<li>`one</li>\\n<li>two`</li>\\n</ul>\\n\",\n    \"markdown\": \"- `one\\n- two`\\n\",\n    \"example\": 12,\n    \"start_line\": 494\n  },\n  {\n    \"end_line\": 541,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"markdown\": \"***\\n\\n---\\n\\n___\\n\\n\",\n    \"example\": 13,\n    \"start_line\": 533\n  },\n  {\n    \"end_line\": 550,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>+++</p>\\n\",\n    \"markdown\": \"+++\\n\",\n    \"example\": 14,\n    \"start_line\": 546\n  },\n  {\n    \"end_line\": 557,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>===</p>\\n\",\n    \"markdown\": \"===\\n\",\n    \"example\": 15,\n    \"start_line\": 553\n  },\n  {\n    \"end_line\": 570,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>--\\n**\\n__</p>\\n\",\n    \"markdown\": \"--\\n**\\n__\\n\",\n    \"example\": 16,\n    \"start_line\": 562\n  },\n  {\n    \"end_line\": 583,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n<hr />\\n<hr />\\n\",\n    \"markdown\": \" ***\\n  ***\\n   ***\\n\",\n    \"example\": 17,\n    \"start_line\": 575\n  },\n  {\n    \"end_line\": 593,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<pre><code>***\\n</code></pre>\\n\",\n    \"markdown\": \"    ***\\n\",\n    \"example\": 18,\n    \"start_line\": 588\n  },\n  {\n    \"end_line\": 602,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>Foo\\n***</p>\\n\",\n    \"markdown\": \"Foo\\n    ***\\n\",\n    \"example\": 19,\n    \"start_line\": 596\n  },\n  {\n    \"end_line\": 611,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \"_____________________________________\\n\",\n    \"example\": 20,\n    \"start_line\": 607\n  },\n  {\n    \"end_line\": 620,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \" - - -\\n\",\n    \"example\": 21,\n    \"start_line\": 616\n  },\n  {\n    \"end_line\": 627,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \" **  * ** * ** * **\\n\",\n    \"example\": 22,\n    \"start_line\": 623\n  },\n  {\n    \"end_line\": 634,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \"-     -      -      -\\n\",\n    \"example\": 23,\n    \"start_line\": 630\n  },\n  {\n    \"end_line\": 643,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<hr />\\n\",\n    \"markdown\": \"- - - -    \\n\",\n    \"example\": 24,\n    \"start_line\": 639\n  },\n  {\n    \"end_line\": 658,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>_ _ _ _ a</p>\\n<p>a------</p>\\n<p>---a---</p>\\n\",\n    \"markdown\": \"_ _ _ _ a\\n\\na------\\n\\n---a---\\n\",\n    \"example\": 25,\n    \"start_line\": 648\n  },\n  {\n    \"end_line\": 668,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p><em>-</em></p>\\n\",\n    \"markdown\": \" *-*\\n\",\n    \"example\": 26,\n    \"start_line\": 664\n  },\n  {\n    \"end_line\": 685,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n***\\n- bar\\n\",\n    \"example\": 27,\n    \"start_line\": 673\n  },\n  {\n    \"end_line\": 698,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<p>Foo</p>\\n<hr />\\n<p>bar</p>\\n\",\n    \"markdown\": \"Foo\\n***\\nbar\\n\",\n    \"example\": 28,\n    \"start_line\": 690\n  },\n  {\n    \"end_line\": 714,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<h2>Foo</h2>\\n<p>bar</p>\\n\",\n    \"markdown\": \"Foo\\n---\\nbar\\n\",\n    \"example\": 29,\n    \"start_line\": 707\n  },\n  {\n    \"end_line\": 732,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n<ul>\\n<li>Bar</li>\\n</ul>\\n\",\n    \"markdown\": \"* Foo\\n* * *\\n* Bar\\n\",\n    \"example\": 30,\n    \"start_line\": 720\n  },\n  {\n    \"end_line\": 747,\n    \"section\": \"Thematic breaks\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n<li>\\n<hr />\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- Foo\\n- * * *\\n\",\n    \"example\": 31,\n    \"start_line\": 737\n  },\n  {\n    \"end_line\": 780,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h1>foo</h1>\\n<h2>foo</h2>\\n<h3>foo</h3>\\n<h4>foo</h4>\\n<h5>foo</h5>\\n<h6>foo</h6>\\n\",\n    \"markdown\": \"# foo\\n## foo\\n### foo\\n#### foo\\n##### foo\\n###### foo\\n\",\n    \"example\": 32,\n    \"start_line\": 766\n  },\n  {\n    \"end_line\": 789,\n    \"section\": \"ATX headings\",\n    \"html\": \"<p>####### foo</p>\\n\",\n    \"markdown\": \"####### foo\\n\",\n    \"example\": 33,\n    \"start_line\": 785\n  },\n  {\n    \"end_line\": 807,\n    \"section\": \"ATX headings\",\n    \"html\": \"<p>#5 bolt</p>\\n<p>#hashtag</p>\\n\",\n    \"markdown\": \"#5 bolt\\n\\n#hashtag\\n\",\n    \"example\": 34,\n    \"start_line\": 800\n  },\n  {\n    \"end_line\": 816,\n    \"section\": \"ATX headings\",\n    \"html\": \"<p>## foo</p>\\n\",\n    \"markdown\": \"\\\\## foo\\n\",\n    \"example\": 35,\n    \"start_line\": 812\n  },\n  {\n    \"end_line\": 825,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h1>foo <em>bar</em> *baz*</h1>\\n\",\n    \"markdown\": \"# foo *bar* \\\\*baz\\\\*\\n\",\n    \"example\": 36,\n    \"start_line\": 821\n  },\n  {\n    \"end_line\": 834,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h1>foo</h1>\\n\",\n    \"markdown\": \"#                  foo                     \\n\",\n    \"example\": 37,\n    \"start_line\": 830\n  },\n  {\n    \"end_line\": 847,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h3>foo</h3>\\n<h2>foo</h2>\\n<h1>foo</h1>\\n\",\n    \"markdown\": \" ### foo\\n  ## foo\\n   # foo\\n\",\n    \"example\": 38,\n    \"start_line\": 839\n  },\n  {\n    \"end_line\": 857,\n    \"section\": \"ATX headings\",\n    \"html\": \"<pre><code># foo\\n</code></pre>\\n\",\n    \"markdown\": \"    # foo\\n\",\n    \"example\": 39,\n    \"start_line\": 852\n  },\n  {\n    \"end_line\": 866,\n    \"section\": \"ATX headings\",\n    \"html\": \"<p>foo\\n# bar</p>\\n\",\n    \"markdown\": \"foo\\n    # bar\\n\",\n    \"example\": 40,\n    \"start_line\": 860\n  },\n  {\n    \"end_line\": 877,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h2>foo</h2>\\n<h3>bar</h3>\\n\",\n    \"markdown\": \"## foo ##\\n  ###   bar    ###\\n\",\n    \"example\": 41,\n    \"start_line\": 871\n  },\n  {\n    \"end_line\": 888,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h1>foo</h1>\\n<h5>foo</h5>\\n\",\n    \"markdown\": \"# foo ##################################\\n##### foo ##\\n\",\n    \"example\": 42,\n    \"start_line\": 882\n  },\n  {\n    \"end_line\": 897,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"markdown\": \"### foo ###     \\n\",\n    \"example\": 43,\n    \"start_line\": 893\n  },\n  {\n    \"end_line\": 908,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h3>foo ### b</h3>\\n\",\n    \"markdown\": \"### foo ### b\\n\",\n    \"example\": 44,\n    \"start_line\": 904\n  },\n  {\n    \"end_line\": 917,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h1>foo#</h1>\\n\",\n    \"markdown\": \"# foo#\\n\",\n    \"example\": 45,\n    \"start_line\": 913\n  },\n  {\n    \"end_line\": 931,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h3>foo ###</h3>\\n<h2>foo ###</h2>\\n<h1>foo #</h1>\\n\",\n    \"markdown\": \"### foo \\\\###\\n## foo #\\\\##\\n# foo \\\\#\\n\",\n    \"example\": 46,\n    \"start_line\": 923\n  },\n  {\n    \"end_line\": 945,\n    \"section\": \"ATX headings\",\n    \"html\": \"<hr />\\n<h2>foo</h2>\\n<hr />\\n\",\n    \"markdown\": \"****\\n## foo\\n****\\n\",\n    \"example\": 47,\n    \"start_line\": 937\n  },\n  {\n    \"end_line\": 956,\n    \"section\": \"ATX headings\",\n    \"html\": \"<p>Foo bar</p>\\n<h1>baz</h1>\\n<p>Bar foo</p>\\n\",\n    \"markdown\": \"Foo bar\\n# baz\\nBar foo\\n\",\n    \"example\": 48,\n    \"start_line\": 948\n  },\n  {\n    \"end_line\": 969,\n    \"section\": \"ATX headings\",\n    \"html\": \"<h2></h2>\\n<h1></h1>\\n<h3></h3>\\n\",\n    \"markdown\": \"## \\n#\\n### ###\\n\",\n    \"example\": 49,\n    \"start_line\": 961\n  },\n  {\n    \"end_line\": 1013,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h1>Foo <em>bar</em></h1>\\n<h2>Foo <em>bar</em></h2>\\n\",\n    \"markdown\": \"Foo *bar*\\n=========\\n\\nFoo *bar*\\n---------\\n\",\n    \"example\": 50,\n    \"start_line\": 1004\n  },\n  {\n    \"end_line\": 1025,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h1>Foo <em>bar\\nbaz</em></h1>\\n\",\n    \"markdown\": \"Foo *bar\\nbaz*\\n====\\n\",\n    \"example\": 51,\n    \"start_line\": 1018\n  },\n  {\n    \"end_line\": 1039,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"markdown\": \"Foo\\n-------------------------\\n\\nFoo\\n=\\n\",\n    \"example\": 52,\n    \"start_line\": 1030\n  },\n  {\n    \"end_line\": 1058,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo</h2>\\n<h2>Foo</h2>\\n<h1>Foo</h1>\\n\",\n    \"markdown\": \"   Foo\\n---\\n\\n  Foo\\n-----\\n\\n  Foo\\n  ===\\n\",\n    \"example\": 53,\n    \"start_line\": 1045\n  },\n  {\n    \"end_line\": 1076,\n    \"section\": \"Setext headings\",\n    \"html\": \"<pre><code>Foo\\n---\\n\\nFoo\\n</code></pre>\\n<hr />\\n\",\n    \"markdown\": \"    Foo\\n    ---\\n\\n    Foo\\n---\\n\",\n    \"example\": 54,\n    \"start_line\": 1063\n  },\n  {\n    \"end_line\": 1087,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"markdown\": \"Foo\\n   ----      \\n\",\n    \"example\": 55,\n    \"start_line\": 1082\n  },\n  {\n    \"end_line\": 1098,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo\\n---</p>\\n\",\n    \"markdown\": \"Foo\\n    ---\\n\",\n    \"example\": 56,\n    \"start_line\": 1092\n  },\n  {\n    \"end_line\": 1114,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo\\n= =</p>\\n<p>Foo</p>\\n<hr />\\n\",\n    \"markdown\": \"Foo\\n= =\\n\\nFoo\\n--- -\\n\",\n    \"example\": 57,\n    \"start_line\": 1103\n  },\n  {\n    \"end_line\": 1124,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo</h2>\\n\",\n    \"markdown\": \"Foo  \\n-----\\n\",\n    \"example\": 58,\n    \"start_line\": 1119\n  },\n  {\n    \"end_line\": 1134,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo\\\\</h2>\\n\",\n    \"markdown\": \"Foo\\\\\\n----\\n\",\n    \"example\": 59,\n    \"start_line\": 1129\n  },\n  {\n    \"end_line\": 1153,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>`Foo</h2>\\n<p>`</p>\\n<h2>&lt;a title=&quot;a lot</h2>\\n<p>of dashes&quot;/&gt;</p>\\n\",\n    \"markdown\": \"`Foo\\n----\\n`\\n\\n<a title=\\\"a lot\\n---\\nof dashes\\\"/>\\n\",\n    \"example\": 60,\n    \"start_line\": 1140\n  },\n  {\n    \"end_line\": 1167,\n    \"section\": \"Setext headings\",\n    \"html\": \"<blockquote>\\n<p>Foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"markdown\": \"> Foo\\n---\\n\",\n    \"example\": 61,\n    \"start_line\": 1159\n  },\n  {\n    \"end_line\": 1180,\n    \"section\": \"Setext headings\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar\\n===</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> foo\\nbar\\n===\\n\",\n    \"example\": 62,\n    \"start_line\": 1170\n  },\n  {\n    \"end_line\": 1191,\n    \"section\": \"Setext headings\",\n    \"html\": \"<ul>\\n<li>Foo</li>\\n</ul>\\n<hr />\\n\",\n    \"markdown\": \"- Foo\\n---\\n\",\n    \"example\": 63,\n    \"start_line\": 1183\n  },\n  {\n    \"end_line\": 1205,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>Foo\\nBar</h2>\\n\",\n    \"markdown\": \"Foo\\nBar\\n---\\n\",\n    \"example\": 64,\n    \"start_line\": 1198\n  },\n  {\n    \"end_line\": 1223,\n    \"section\": \"Setext headings\",\n    \"html\": \"<hr />\\n<h2>Foo</h2>\\n<h2>Bar</h2>\\n<p>Baz</p>\\n\",\n    \"markdown\": \"---\\nFoo\\n---\\nBar\\n---\\nBaz\\n\",\n    \"example\": 65,\n    \"start_line\": 1211\n  },\n  {\n    \"end_line\": 1233,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>====</p>\\n\",\n    \"markdown\": \"\\n====\\n\",\n    \"example\": 66,\n    \"start_line\": 1228\n  },\n  {\n    \"end_line\": 1246,\n    \"section\": \"Setext headings\",\n    \"html\": \"<hr />\\n<hr />\\n\",\n    \"markdown\": \"---\\n---\\n\",\n    \"example\": 67,\n    \"start_line\": 1240\n  },\n  {\n    \"end_line\": 1257,\n    \"section\": \"Setext headings\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<hr />\\n\",\n    \"markdown\": \"- foo\\n-----\\n\",\n    \"example\": 68,\n    \"start_line\": 1249\n  },\n  {\n    \"end_line\": 1267,\n    \"section\": \"Setext headings\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"markdown\": \"    foo\\n---\\n\",\n    \"example\": 69,\n    \"start_line\": 1260\n  },\n  {\n    \"end_line\": 1278,\n    \"section\": \"Setext headings\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"markdown\": \"> foo\\n-----\\n\",\n    \"example\": 70,\n    \"start_line\": 1270\n  },\n  {\n    \"end_line\": 1289,\n    \"section\": \"Setext headings\",\n    \"html\": \"<h2>&gt; foo</h2>\\n\",\n    \"markdown\": \"\\\\> foo\\n------\\n\",\n    \"example\": 71,\n    \"start_line\": 1284\n  },\n  {\n    \"end_line\": 1325,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo</p>\\n<h2>bar</h2>\\n<p>baz</p>\\n\",\n    \"markdown\": \"Foo\\n\\nbar\\n---\\nbaz\\n\",\n    \"example\": 72,\n    \"start_line\": 1315\n  },\n  {\n    \"end_line\": 1343,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"markdown\": \"Foo\\nbar\\n\\n---\\n\\nbaz\\n\",\n    \"example\": 73,\n    \"start_line\": 1331\n  },\n  {\n    \"end_line\": 1359,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo\\nbar</p>\\n<hr />\\n<p>baz</p>\\n\",\n    \"markdown\": \"Foo\\nbar\\n* * *\\nbaz\\n\",\n    \"example\": 74,\n    \"start_line\": 1349\n  },\n  {\n    \"end_line\": 1374,\n    \"section\": \"Setext headings\",\n    \"html\": \"<p>Foo\\nbar\\n---\\nbaz</p>\\n\",\n    \"markdown\": \"Foo\\nbar\\n\\\\---\\nbaz\\n\",\n    \"example\": 75,\n    \"start_line\": 1364\n  },\n  {\n    \"end_line\": 1399,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>a simple\\n  indented code block\\n</code></pre>\\n\",\n    \"markdown\": \"    a simple\\n      indented code block\\n\",\n    \"example\": 76,\n    \"start_line\": 1392\n  },\n  {\n    \"end_line\": 1417,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"  - foo\\n\\n    bar\\n\",\n    \"example\": 77,\n    \"start_line\": 1406\n  },\n  {\n    \"end_line\": 1433,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1.  foo\\n\\n    - bar\\n\",\n    \"example\": 78,\n    \"start_line\": 1420\n  },\n  {\n    \"end_line\": 1451,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>&lt;a/&gt;\\n*hi*\\n\\n- one\\n</code></pre>\\n\",\n    \"markdown\": \"    <a/>\\n    *hi*\\n\\n    - one\\n\",\n    \"example\": 79,\n    \"start_line\": 1440\n  },\n  {\n    \"end_line\": 1473,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>chunk1\\n\\nchunk2\\n\\n\\n\\nchunk3\\n</code></pre>\\n\",\n    \"markdown\": \"    chunk1\\n\\n    chunk2\\n  \\n \\n \\n    chunk3\\n\",\n    \"example\": 80,\n    \"start_line\": 1456\n  },\n  {\n    \"end_line\": 1488,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>chunk1\\n  \\n  chunk2\\n</code></pre>\\n\",\n    \"markdown\": \"    chunk1\\n      \\n      chunk2\\n\",\n    \"example\": 81,\n    \"start_line\": 1479\n  },\n  {\n    \"end_line\": 1501,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<p>Foo\\nbar</p>\\n\",\n    \"markdown\": \"Foo\\n    bar\\n\\n\",\n    \"example\": 82,\n    \"start_line\": 1494\n  },\n  {\n    \"end_line\": 1515,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n\",\n    \"markdown\": \"    foo\\nbar\\n\",\n    \"example\": 83,\n    \"start_line\": 1508\n  },\n  {\n    \"end_line\": 1536,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<h1>Heading</h1>\\n<pre><code>foo\\n</code></pre>\\n<h2>Heading</h2>\\n<pre><code>foo\\n</code></pre>\\n<hr />\\n\",\n    \"markdown\": \"# Heading\\n    foo\\nHeading\\n------\\n    foo\\n----\\n\",\n    \"example\": 84,\n    \"start_line\": 1521\n  },\n  {\n    \"end_line\": 1548,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>    foo\\nbar\\n</code></pre>\\n\",\n    \"markdown\": \"        foo\\n    bar\\n\",\n    \"example\": 85,\n    \"start_line\": 1541\n  },\n  {\n    \"end_line\": 1563,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>foo\\n</code></pre>\\n\",\n    \"markdown\": \"\\n    \\n    foo\\n    \\n\\n\",\n    \"example\": 86,\n    \"start_line\": 1554\n  },\n  {\n    \"end_line\": 1573,\n    \"section\": \"Indented code blocks\",\n    \"html\": \"<pre><code>foo  \\n</code></pre>\\n\",\n    \"markdown\": \"    foo  \\n\",\n    \"example\": 87,\n    \"start_line\": 1568\n  },\n  {\n    \"end_line\": 1632,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"markdown\": \"```\\n<\\n >\\n```\\n\",\n    \"example\": 88,\n    \"start_line\": 1623\n  },\n  {\n    \"end_line\": 1646,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>&lt;\\n &gt;\\n</code></pre>\\n\",\n    \"markdown\": \"~~~\\n<\\n >\\n~~~\\n\",\n    \"example\": 89,\n    \"start_line\": 1637\n  },\n  {\n    \"end_line\": 1656,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"markdown\": \"``\\nfoo\\n``\\n\",\n    \"example\": 90,\n    \"start_line\": 1650\n  },\n  {\n    \"end_line\": 1670,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"markdown\": \"```\\naaa\\n~~~\\n```\\n\",\n    \"example\": 91,\n    \"start_line\": 1661\n  },\n  {\n    \"end_line\": 1682,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"markdown\": \"~~~\\naaa\\n```\\n~~~\\n\",\n    \"example\": 92,\n    \"start_line\": 1673\n  },\n  {\n    \"end_line\": 1696,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n```\\n</code></pre>\\n\",\n    \"markdown\": \"````\\naaa\\n```\\n``````\\n\",\n    \"example\": 93,\n    \"start_line\": 1687\n  },\n  {\n    \"end_line\": 1708,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n~~~\\n</code></pre>\\n\",\n    \"markdown\": \"~~~~\\naaa\\n~~~\\n~~~~\\n\",\n    \"example\": 94,\n    \"start_line\": 1699\n  },\n  {\n    \"end_line\": 1718,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"markdown\": \"```\\n\",\n    \"example\": 95,\n    \"start_line\": 1714\n  },\n  {\n    \"end_line\": 1731,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>\\n```\\naaa\\n</code></pre>\\n\",\n    \"markdown\": \"`````\\n\\n```\\naaa\\n\",\n    \"example\": 96,\n    \"start_line\": 1721\n  },\n  {\n    \"end_line\": 1745,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<blockquote>\\n<pre><code>aaa\\n</code></pre>\\n</blockquote>\\n<p>bbb</p>\\n\",\n    \"markdown\": \"> ```\\n> aaa\\n\\nbbb\\n\",\n    \"example\": 97,\n    \"start_line\": 1734\n  },\n  {\n    \"end_line\": 1759,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>\\n  \\n</code></pre>\\n\",\n    \"markdown\": \"```\\n\\n  \\n```\\n\",\n    \"example\": 98,\n    \"start_line\": 1750\n  },\n  {\n    \"end_line\": 1769,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code></code></pre>\\n\",\n    \"markdown\": \"```\\n```\\n\",\n    \"example\": 99,\n    \"start_line\": 1764\n  },\n  {\n    \"end_line\": 1785,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\naaa\\n</code></pre>\\n\",\n    \"markdown\": \" ```\\n aaa\\naaa\\n```\\n\",\n    \"example\": 100,\n    \"start_line\": 1776\n  },\n  {\n    \"end_line\": 1799,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\naaa\\naaa\\n</code></pre>\\n\",\n    \"markdown\": \"  ```\\naaa\\n  aaa\\naaa\\n  ```\\n\",\n    \"example\": 101,\n    \"start_line\": 1788\n  },\n  {\n    \"end_line\": 1813,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n aaa\\naaa\\n</code></pre>\\n\",\n    \"markdown\": \"   ```\\n   aaa\\n    aaa\\n  aaa\\n   ```\\n\",\n    \"example\": 102,\n    \"start_line\": 1802\n  },\n  {\n    \"end_line\": 1827,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>```\\naaa\\n```\\n</code></pre>\\n\",\n    \"markdown\": \"    ```\\n    aaa\\n    ```\\n\",\n    \"example\": 103,\n    \"start_line\": 1818\n  },\n  {\n    \"end_line\": 1840,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"markdown\": \"```\\naaa\\n  ```\\n\",\n    \"example\": 104,\n    \"start_line\": 1833\n  },\n  {\n    \"end_line\": 1850,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n\",\n    \"markdown\": \"   ```\\naaa\\n  ```\\n\",\n    \"example\": 105,\n    \"start_line\": 1843\n  },\n  {\n    \"end_line\": 1863,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n    ```\\n</code></pre>\\n\",\n    \"markdown\": \"```\\naaa\\n    ```\\n\",\n    \"example\": 106,\n    \"start_line\": 1855\n  },\n  {\n    \"end_line\": 1875,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<p><code></code>\\naaa</p>\\n\",\n    \"markdown\": \"``` ```\\naaa\\n\",\n    \"example\": 107,\n    \"start_line\": 1869\n  },\n  {\n    \"end_line\": 1886,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>aaa\\n~~~ ~~\\n</code></pre>\\n\",\n    \"markdown\": \"~~~~~~\\naaa\\n~~~ ~~\\n\",\n    \"example\": 108,\n    \"start_line\": 1878\n  },\n  {\n    \"end_line\": 1903,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n\",\n    \"markdown\": \"foo\\n```\\nbar\\n```\\nbaz\\n\",\n    \"example\": 109,\n    \"start_line\": 1892\n  },\n  {\n    \"end_line\": 1921,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<h2>foo</h2>\\n<pre><code>bar\\n</code></pre>\\n<h1>baz</h1>\\n\",\n    \"markdown\": \"foo\\n---\\n~~~\\nbar\\n~~~\\n# baz\\n\",\n    \"example\": 110,\n    \"start_line\": 1909\n  },\n  {\n    \"end_line\": 1940,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"markdown\": \"```ruby\\ndef foo(x)\\n  return 3\\nend\\n```\\n\",\n    \"example\": 111,\n    \"start_line\": 1929\n  },\n  {\n    \"end_line\": 1954,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code class=\\\"language-ruby\\\">def foo(x)\\n  return 3\\nend\\n</code></pre>\\n\",\n    \"markdown\": \"~~~~    ruby startline=3 $%@#$\\ndef foo(x)\\n  return 3\\nend\\n~~~~~~~\\n\",\n    \"example\": 112,\n    \"start_line\": 1943\n  },\n  {\n    \"end_line\": 1962,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code class=\\\"language-;\\\"></code></pre>\\n\",\n    \"markdown\": \"````;\\n````\\n\",\n    \"example\": 113,\n    \"start_line\": 1957\n  },\n  {\n    \"end_line\": 1973,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<p><code>aa</code>\\nfoo</p>\\n\",\n    \"markdown\": \"``` aa ```\\nfoo\\n\",\n    \"example\": 114,\n    \"start_line\": 1967\n  },\n  {\n    \"end_line\": 1985,\n    \"section\": \"Fenced code blocks\",\n    \"html\": \"<pre><code>``` aaa\\n</code></pre>\\n\",\n    \"markdown\": \"```\\n``` aaa\\n```\\n\",\n    \"example\": 115,\n    \"start_line\": 1978\n  },\n  {\n    \"end_line\": 2070,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n<p><em>world</em>.\\n</pre></p>\\n</td></tr></table>\\n\",\n    \"markdown\": \"<table><tr><td>\\n<pre>\\n**Hello**,\\n\\n_world_.\\n</pre>\\n</td></tr></table>\\n\",\n    \"example\": 116,\n    \"start_line\": 2055\n  },\n  {\n    \"end_line\": 2103,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n<p>okay.</p>\\n\",\n    \"markdown\": \"<table>\\n  <tr>\\n    <td>\\n           hi\\n    </td>\\n  </tr>\\n</table>\\n\\nokay.\\n\",\n    \"example\": 117,\n    \"start_line\": 2084\n  },\n  {\n    \"end_line\": 2114,\n    \"section\": \"HTML blocks\",\n    \"html\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"markdown\": \" <div>\\n  *hello*\\n         <foo><a>\\n\",\n    \"example\": 118,\n    \"start_line\": 2106\n  },\n  {\n    \"end_line\": 2125,\n    \"section\": \"HTML blocks\",\n    \"html\": \"</div>\\n*foo*\\n\",\n    \"markdown\": \"</div>\\n*foo*\\n\",\n    \"example\": 119,\n    \"start_line\": 2119\n  },\n  {\n    \"end_line\": 2140,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<DIV CLASS=\\\"foo\\\">\\n<p><em>Markdown</em></p>\\n</DIV>\\n\",\n    \"markdown\": \"<DIV CLASS=\\\"foo\\\">\\n\\n*Markdown*\\n\\n</DIV>\\n\",\n    \"example\": 120,\n    \"start_line\": 2130\n  },\n  {\n    \"end_line\": 2154,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"markdown\": \"<div id=\\\"foo\\\"\\n  class=\\\"bar\\\">\\n</div>\\n\",\n    \"example\": 121,\n    \"start_line\": 2146\n  },\n  {\n    \"end_line\": 2165,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"markdown\": \"<div id=\\\"foo\\\" class=\\\"bar\\n  baz\\\">\\n</div>\\n\",\n    \"example\": 122,\n    \"start_line\": 2157\n  },\n  {\n    \"end_line\": 2178,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div>\\n*foo*\\n<p><em>bar</em></p>\\n\",\n    \"markdown\": \"<div>\\n*foo*\\n\\n*bar*\\n\",\n    \"example\": 123,\n    \"start_line\": 2169\n  },\n  {\n    \"end_line\": 2191,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"markdown\": \"<div id=\\\"foo\\\"\\n*hi*\\n\",\n    \"example\": 124,\n    \"start_line\": 2185\n  },\n  {\n    \"end_line\": 2200,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div class\\nfoo\\n\",\n    \"markdown\": \"<div class\\nfoo\\n\",\n    \"example\": 125,\n    \"start_line\": 2194\n  },\n  {\n    \"end_line\": 2212,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"markdown\": \"<div *???-&&&-<---\\n*foo*\\n\",\n    \"example\": 126,\n    \"start_line\": 2206\n  },\n  {\n    \"end_line\": 2222,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"markdown\": \"<div><a href=\\\"bar\\\">*foo*</a></div>\\n\",\n    \"example\": 127,\n    \"start_line\": 2218\n  },\n  {\n    \"end_line\": 2233,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"markdown\": \"<table><tr><td>\\nfoo\\n</td></tr></table>\\n\",\n    \"example\": 128,\n    \"start_line\": 2225\n  },\n  {\n    \"end_line\": 2252,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"markdown\": \"<div></div>\\n``` c\\nint x = 33;\\n```\\n\",\n    \"example\": 129,\n    \"start_line\": 2242\n  },\n  {\n    \"end_line\": 2267,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"markdown\": \"<a href=\\\"foo\\\">\\n*bar*\\n</a>\\n\",\n    \"example\": 130,\n    \"start_line\": 2259\n  },\n  {\n    \"end_line\": 2280,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"markdown\": \"<Warning>\\n*bar*\\n</Warning>\\n\",\n    \"example\": 131,\n    \"start_line\": 2272\n  },\n  {\n    \"end_line\": 2291,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"markdown\": \"<i class=\\\"foo\\\">\\n*bar*\\n</i>\\n\",\n    \"example\": 132,\n    \"start_line\": 2283\n  },\n  {\n    \"end_line\": 2300,\n    \"section\": \"HTML blocks\",\n    \"html\": \"</ins>\\n*bar*\\n\",\n    \"markdown\": \"</ins>\\n*bar*\\n\",\n    \"example\": 133,\n    \"start_line\": 2294\n  },\n  {\n    \"end_line\": 2317,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"markdown\": \"<del>\\n*foo*\\n</del>\\n\",\n    \"example\": 134,\n    \"start_line\": 2309\n  },\n  {\n    \"end_line\": 2334,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<del>\\n<p><em>foo</em></p>\\n</del>\\n\",\n    \"markdown\": \"<del>\\n\\n*foo*\\n\\n</del>\\n\",\n    \"example\": 135,\n    \"start_line\": 2324\n  },\n  {\n    \"end_line\": 2346,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<p><del><em>foo</em></del></p>\\n\",\n    \"markdown\": \"<del>*foo*</del>\\n\",\n    \"example\": 136,\n    \"start_line\": 2342\n  },\n  {\n    \"end_line\": 2374,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\n<p>okay</p>\\n\",\n    \"markdown\": \"<pre language=\\\"haskell\\\"><code>\\nimport Text.HTML.TagSoup\\n\\nmain :: IO ()\\nmain = print $ parseTags tags\\n</code></pre>\\nokay\\n\",\n    \"example\": 137,\n    \"start_line\": 2358\n  },\n  {\n    \"end_line\": 2393,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\n<p>okay</p>\\n\",\n    \"markdown\": \"<script type=\\\"text/javascript\\\">\\n// JavaScript example\\n\\ndocument.getElementById(\\\"demo\\\").innerHTML = \\\"Hello JavaScript!\\\";\\n</script>\\nokay\\n\",\n    \"example\": 138,\n    \"start_line\": 2379\n  },\n  {\n    \"end_line\": 2414,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\n<p>okay</p>\\n\",\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\nh1 {color:red;}\\n\\np {color:blue;}\\n</style>\\nokay\\n\",\n    \"example\": 139,\n    \"start_line\": 2398\n  },\n  {\n    \"end_line\": 2431,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"markdown\": \"<style\\n  type=\\\"text/css\\\">\\n\\nfoo\\n\",\n    \"example\": 140,\n    \"start_line\": 2421\n  },\n  {\n    \"end_line\": 2445,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<blockquote>\\n<div>\\nfoo\\n</blockquote>\\n<p>bar</p>\\n\",\n    \"markdown\": \"> <div>\\n> foo\\n\\nbar\\n\",\n    \"example\": 141,\n    \"start_line\": 2434\n  },\n  {\n    \"end_line\": 2458,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<ul>\\n<li>\\n<div>\\n</li>\\n<li>foo</li>\\n</ul>\\n\",\n    \"markdown\": \"- <div>\\n- foo\\n\",\n    \"example\": 142,\n    \"start_line\": 2448\n  },\n  {\n    \"end_line\": 2469,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<style>p{color:red;}</style>\\n<p><em>foo</em></p>\\n\",\n    \"markdown\": \"<style>p{color:red;}</style>\\n*foo*\\n\",\n    \"example\": 143,\n    \"start_line\": 2463\n  },\n  {\n    \"end_line\": 2478,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<!-- foo -->*bar*\\n<p><em>baz</em></p>\\n\",\n    \"markdown\": \"<!-- foo -->*bar*\\n*baz*\\n\",\n    \"example\": 144,\n    \"start_line\": 2472\n  },\n  {\n    \"end_line\": 2492,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"markdown\": \"<script>\\nfoo\\n</script>1. *bar*\\n\",\n    \"example\": 145,\n    \"start_line\": 2484\n  },\n  {\n    \"end_line\": 2509,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<!-- Foo\\n\\nbar\\n   baz -->\\n<p>okay</p>\\n\",\n    \"markdown\": \"<!-- Foo\\n\\nbar\\n   baz -->\\nokay\\n\",\n    \"example\": 146,\n    \"start_line\": 2497\n  },\n  {\n    \"end_line\": 2529,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<?php\\n\\n  echo '>';\\n\\n?>\\n<p>okay</p>\\n\",\n    \"markdown\": \"<?php\\n\\n  echo '>';\\n\\n?>\\nokay\\n\",\n    \"example\": 147,\n    \"start_line\": 2515\n  },\n  {\n    \"end_line\": 2538,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<!DOCTYPE html>\\n\",\n    \"markdown\": \"<!DOCTYPE html>\\n\",\n    \"example\": 148,\n    \"start_line\": 2534\n  },\n  {\n    \"end_line\": 2571,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\n<p>okay</p>\\n\",\n    \"markdown\": \"<![CDATA[\\nfunction matchwo(a,b)\\n{\\n  if (a < b && a < 0) then {\\n    return 1;\\n\\n  } else {\\n\\n    return 0;\\n  }\\n}\\n]]>\\nokay\\n\",\n    \"example\": 149,\n    \"start_line\": 2543\n  },\n  {\n    \"end_line\": 2584,\n    \"section\": \"HTML blocks\",\n    \"html\": \"  <!-- foo -->\\n<pre><code>&lt;!-- foo --&gt;\\n</code></pre>\\n\",\n    \"markdown\": \"  <!-- foo -->\\n\\n    <!-- foo -->\\n\",\n    \"example\": 150,\n    \"start_line\": 2576\n  },\n  {\n    \"end_line\": 2595,\n    \"section\": \"HTML blocks\",\n    \"html\": \"  <div>\\n<pre><code>&lt;div&gt;\\n</code></pre>\\n\",\n    \"markdown\": \"  <div>\\n\\n    <div>\\n\",\n    \"example\": 151,\n    \"start_line\": 2587\n  },\n  {\n    \"end_line\": 2611,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<p>Foo</p>\\n<div>\\nbar\\n</div>\\n\",\n    \"markdown\": \"Foo\\n<div>\\nbar\\n</div>\\n\",\n    \"example\": 152,\n    \"start_line\": 2601\n  },\n  {\n    \"end_line\": 2627,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"markdown\": \"<div>\\nbar\\n</div>\\n*foo*\\n\",\n    \"example\": 153,\n    \"start_line\": 2617\n  },\n  {\n    \"end_line\": 2640,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<p>Foo\\n<a href=\\\"bar\\\">\\nbaz</p>\\n\",\n    \"markdown\": \"Foo\\n<a href=\\\"bar\\\">\\nbaz\\n\",\n    \"example\": 154,\n    \"start_line\": 2632\n  },\n  {\n    \"end_line\": 2683,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div>\\n<p><em>Emphasized</em> text.</p>\\n</div>\\n\",\n    \"markdown\": \"<div>\\n\\n*Emphasized* text.\\n\\n</div>\\n\",\n    \"example\": 155,\n    \"start_line\": 2673\n  },\n  {\n    \"end_line\": 2694,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"markdown\": \"<div>\\n*Emphasized* text.\\n</div>\\n\",\n    \"example\": 156,\n    \"start_line\": 2686\n  },\n  {\n    \"end_line\": 2728,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<table>\\n<tr>\\n<td>\\nHi\\n</td>\\n</tr>\\n</table>\\n\",\n    \"markdown\": \"<table>\\n\\n<tr>\\n\\n<td>\\nHi\\n</td>\\n\\n</tr>\\n\\n</table>\\n\",\n    \"example\": 157,\n    \"start_line\": 2708\n  },\n  {\n    \"end_line\": 2756,\n    \"section\": \"HTML blocks\",\n    \"html\": \"<table>\\n  <tr>\\n<pre><code>&lt;td&gt;\\n  Hi\\n&lt;/td&gt;\\n</code></pre>\\n  </tr>\\n</table>\\n\",\n    \"markdown\": \"<table>\\n\\n  <tr>\\n\\n    <td>\\n      Hi\\n    </td>\\n\\n  </tr>\\n\\n</table>\\n\",\n    \"example\": 158,\n    \"start_line\": 2735\n  },\n  {\n    \"end_line\": 2789,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"example\": 159,\n    \"start_line\": 2783\n  },\n  {\n    \"end_line\": 2800,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"the title\\\">foo</a></p>\\n\",\n    \"markdown\": \"   [foo]: \\n      /url  \\n           'the title'  \\n\\n[foo]\\n\",\n    \"example\": 160,\n    \"start_line\": 2792\n  },\n  {\n    \"end_line\": 2809,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"my_(url)\\\" title=\\\"title (with parens)\\\">Foo*bar]</a></p>\\n\",\n    \"markdown\": \"[Foo*bar\\\\]]:my_(url) 'title (with parens)'\\n\\n[Foo*bar\\\\]]\\n\",\n    \"example\": 161,\n    \"start_line\": 2803\n  },\n  {\n    \"end_line\": 2820,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"my%20url\\\" title=\\\"title\\\">Foo bar</a></p>\\n\",\n    \"markdown\": \"[Foo bar]:\\n<my%20url>\\n'title'\\n\\n[Foo bar]\\n\",\n    \"example\": 162,\n    \"start_line\": 2812\n  },\n  {\n    \"end_line\": 2839,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"\\ntitle\\nline1\\nline2\\n\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]: /url '\\ntitle\\nline1\\nline2\\n'\\n\\n[foo]\\n\",\n    \"example\": 163,\n    \"start_line\": 2825\n  },\n  {\n    \"end_line\": 2854,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>[foo]: /url 'title</p>\\n<p>with blank line'</p>\\n<p>[foo]</p>\\n\",\n    \"markdown\": \"[foo]: /url 'title\\n\\nwith blank line'\\n\\n[foo]\\n\",\n    \"example\": 164,\n    \"start_line\": 2844\n  },\n  {\n    \"end_line\": 2866,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]:\\n/url\\n\\n[foo]\\n\",\n    \"example\": 165,\n    \"start_line\": 2859\n  },\n  {\n    \"end_line\": 2878,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>[foo]:</p>\\n<p>[foo]</p>\\n\",\n    \"markdown\": \"[foo]:\\n\\n[foo]\\n\",\n    \"example\": 166,\n    \"start_line\": 2871\n  },\n  {\n    \"end_line\": 2890,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url%5Cbar*baz\\\" title=\\\"foo&quot;bar\\\\baz\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]: /url\\\\bar\\\\*baz \\\"foo\\\\\\\"bar\\\\baz\\\"\\n\\n[foo]\\n\",\n    \"example\": 167,\n    \"start_line\": 2884\n  },\n  {\n    \"end_line\": 2901,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"url\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]\\n\\n[foo]: url\\n\",\n    \"example\": 168,\n    \"start_line\": 2895\n  },\n  {\n    \"end_line\": 2914,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"first\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]\\n\\n[foo]: first\\n[foo]: second\\n\",\n    \"example\": 169,\n    \"start_line\": 2907\n  },\n  {\n    \"end_line\": 2926,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\">Foo</a></p>\\n\",\n    \"markdown\": \"[FOO]: /url\\n\\n[Foo]\\n\",\n    \"example\": 170,\n    \"start_line\": 2920\n  },\n  {\n    \"end_line\": 2935,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/%CF%86%CE%BF%CF%85\\\">αγω</a></p>\\n\",\n    \"markdown\": \"[ΑΓΩ]: /φου\\n\\n[αγω]\\n\",\n    \"example\": 171,\n    \"start_line\": 2929\n  },\n  {\n    \"end_line\": 2944,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"\",\n    \"markdown\": \"[foo]: /url\\n\",\n    \"example\": 172,\n    \"start_line\": 2941\n  },\n  {\n    \"end_line\": 2956,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>bar</p>\\n\",\n    \"markdown\": \"[\\nfoo\\n]: /url\\nbar\\n\",\n    \"example\": 173,\n    \"start_line\": 2949\n  },\n  {\n    \"end_line\": 2966,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>[foo]: /url &quot;title&quot; ok</p>\\n\",\n    \"markdown\": \"[foo]: /url \\\"title\\\" ok\\n\",\n    \"example\": 174,\n    \"start_line\": 2962\n  },\n  {\n    \"end_line\": 2976,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>&quot;title&quot; ok</p>\\n\",\n    \"markdown\": \"[foo]: /url\\n\\\"title\\\" ok\\n\",\n    \"example\": 175,\n    \"start_line\": 2971\n  },\n  {\n    \"end_line\": 2990,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<pre><code>[foo]: /url &quot;title&quot;\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"markdown\": \"    [foo]: /url \\\"title\\\"\\n\\n[foo]\\n\",\n    \"example\": 176,\n    \"start_line\": 2982\n  },\n  {\n    \"end_line\": 3006,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<pre><code>[foo]: /url\\n</code></pre>\\n<p>[foo]</p>\\n\",\n    \"markdown\": \"```\\n[foo]: /url\\n```\\n\\n[foo]\\n\",\n    \"example\": 177,\n    \"start_line\": 2996\n  },\n  {\n    \"end_line\": 3020,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p>Foo\\n[bar]: /baz</p>\\n<p>[bar]</p>\\n\",\n    \"markdown\": \"Foo\\n[bar]: /baz\\n\\n[bar]\\n\",\n    \"example\": 178,\n    \"start_line\": 3011\n  },\n  {\n    \"end_line\": 3035,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<h1><a href=\\\"/url\\\">Foo</a></h1>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"# [Foo]\\n[foo]: /url\\n> bar\\n\",\n    \"example\": 179,\n    \"start_line\": 3026\n  },\n  {\n    \"end_line\": 3054,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/foo-url\\\" title=\\\"foo\\\">foo</a>,\\n<a href=\\\"/bar-url\\\" title=\\\"bar\\\">bar</a>,\\n<a href=\\\"/baz-url\\\">baz</a></p>\\n\",\n    \"markdown\": \"[foo]: /foo-url \\\"foo\\\"\\n[bar]: /bar-url\\n  \\\"bar\\\"\\n[baz]: /baz-url\\n\\n[foo],\\n[bar],\\n[baz]\\n\",\n    \"example\": 180,\n    \"start_line\": 3041\n  },\n  {\n    \"end_line\": 3070,\n    \"section\": \"Link reference definitions\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a></p>\\n<blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \"[foo]\\n\\n> [foo]: /url\\n\",\n    \"example\": 181,\n    \"start_line\": 3062\n  },\n  {\n    \"end_line\": 3092,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"markdown\": \"aaa\\n\\nbbb\\n\",\n    \"example\": 182,\n    \"start_line\": 3085\n  },\n  {\n    \"end_line\": 3108,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n<p>ccc\\nddd</p>\\n\",\n    \"markdown\": \"aaa\\nbbb\\n\\nccc\\nddd\\n\",\n    \"example\": 183,\n    \"start_line\": 3097\n  },\n  {\n    \"end_line\": 3121,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa</p>\\n<p>bbb</p>\\n\",\n    \"markdown\": \"aaa\\n\\n\\nbbb\\n\",\n    \"example\": 184,\n    \"start_line\": 3113\n  },\n  {\n    \"end_line\": 3132,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"markdown\": \"  aaa\\n bbb\\n\",\n    \"example\": 185,\n    \"start_line\": 3126\n  },\n  {\n    \"end_line\": 3146,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa\\nbbb\\nccc</p>\\n\",\n    \"markdown\": \"aaa\\n             bbb\\n                                       ccc\\n\",\n    \"example\": 186,\n    \"start_line\": 3138\n  },\n  {\n    \"end_line\": 3158,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa\\nbbb</p>\\n\",\n    \"markdown\": \"   aaa\\nbbb\\n\",\n    \"example\": 187,\n    \"start_line\": 3152\n  },\n  {\n    \"end_line\": 3168,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<pre><code>aaa\\n</code></pre>\\n<p>bbb</p>\\n\",\n    \"markdown\": \"    aaa\\nbbb\\n\",\n    \"example\": 188,\n    \"start_line\": 3161\n  },\n  {\n    \"end_line\": 3181,\n    \"section\": \"Paragraphs\",\n    \"html\": \"<p>aaa<br />\\nbbb</p>\\n\",\n    \"markdown\": \"aaa     \\nbbb     \\n\",\n    \"example\": 189,\n    \"start_line\": 3175\n  },\n  {\n    \"end_line\": 3204,\n    \"section\": \"Blank lines\",\n    \"html\": \"<p>aaa</p>\\n<h1>aaa</h1>\\n\",\n    \"markdown\": \"  \\n\\naaa\\n  \\n\\n# aaa\\n\\n  \\n\",\n    \"example\": 190,\n    \"start_line\": 3192\n  },\n  {\n    \"end_line\": 3268,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> # Foo\\n> bar\\n> baz\\n\",\n    \"example\": 191,\n    \"start_line\": 3258\n  },\n  {\n    \"end_line\": 3283,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"markdown\": \"># Foo\\n>bar\\n> baz\\n\",\n    \"example\": 192,\n    \"start_line\": 3273\n  },\n  {\n    \"end_line\": 3298,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"markdown\": \"   > # Foo\\n   > bar\\n > baz\\n\",\n    \"example\": 193,\n    \"start_line\": 3288\n  },\n  {\n    \"end_line\": 3312,\n    \"section\": \"Block quotes\",\n    \"html\": \"<pre><code>&gt; # Foo\\n&gt; bar\\n&gt; baz\\n</code></pre>\\n\",\n    \"markdown\": \"    > # Foo\\n    > bar\\n    > baz\\n\",\n    \"example\": 194,\n    \"start_line\": 3303\n  },\n  {\n    \"end_line\": 3328,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<h1>Foo</h1>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> # Foo\\n> bar\\nbaz\\n\",\n    \"example\": 195,\n    \"start_line\": 3318\n  },\n  {\n    \"end_line\": 3344,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz\\nfoo</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> bar\\nbaz\\n> foo\\n\",\n    \"example\": 196,\n    \"start_line\": 3334\n  },\n  {\n    \"end_line\": 3366,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<hr />\\n\",\n    \"markdown\": \"> foo\\n---\\n\",\n    \"example\": 197,\n    \"start_line\": 3358\n  },\n  {\n    \"end_line\": 3390,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</blockquote>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"markdown\": \"> - foo\\n- bar\\n\",\n    \"example\": 198,\n    \"start_line\": 3378\n  },\n  {\n    \"end_line\": 3406,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<pre><code>foo\\n</code></pre>\\n</blockquote>\\n<pre><code>bar\\n</code></pre>\\n\",\n    \"markdown\": \">     foo\\n    bar\\n\",\n    \"example\": 199,\n    \"start_line\": 3396\n  },\n  {\n    \"end_line\": 3419,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<pre><code></code></pre>\\n</blockquote>\\n<p>foo</p>\\n<pre><code></code></pre>\\n\",\n    \"markdown\": \"> ```\\nfoo\\n```\\n\",\n    \"example\": 200,\n    \"start_line\": 3409\n  },\n  {\n    \"end_line\": 3433,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo\\n- bar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> foo\\n    - bar\\n\",\n    \"example\": 201,\n    \"start_line\": 3425\n  },\n  {\n    \"end_line\": 3454,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \">\\n\",\n    \"example\": 202,\n    \"start_line\": 3449\n  },\n  {\n    \"end_line\": 3464,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \">\\n>  \\n> \\n\",\n    \"example\": 203,\n    \"start_line\": 3457\n  },\n  {\n    \"end_line\": 3477,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n\",\n    \"markdown\": \">\\n> foo\\n>  \\n\",\n    \"example\": 204,\n    \"start_line\": 3469\n  },\n  {\n    \"end_line\": 3493,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n</blockquote>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> foo\\n\\n> bar\\n\",\n    \"example\": 205,\n    \"start_line\": 3482\n  },\n  {\n    \"end_line\": 3512,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> foo\\n> bar\\n\",\n    \"example\": 206,\n    \"start_line\": 3504\n  },\n  {\n    \"end_line\": 3526,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>foo</p>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> foo\\n>\\n> bar\\n\",\n    \"example\": 207,\n    \"start_line\": 3517\n  },\n  {\n    \"end_line\": 3539,\n    \"section\": \"Block quotes\",\n    \"html\": \"<p>foo</p>\\n<blockquote>\\n<p>bar</p>\\n</blockquote>\\n\",\n    \"markdown\": \"foo\\n> bar\\n\",\n    \"example\": 208,\n    \"start_line\": 3531\n  },\n  {\n    \"end_line\": 3557,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>aaa</p>\\n</blockquote>\\n<hr />\\n<blockquote>\\n<p>bbb</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> aaa\\n***\\n> bbb\\n\",\n    \"example\": 209,\n    \"start_line\": 3545\n  },\n  {\n    \"end_line\": 3571,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>bar\\nbaz</p>\\n</blockquote>\\n\",\n    \"markdown\": \"> bar\\nbaz\\n\",\n    \"example\": 210,\n    \"start_line\": 3563\n  },\n  {\n    \"end_line\": 3583,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"markdown\": \"> bar\\n\\nbaz\\n\",\n    \"example\": 211,\n    \"start_line\": 3574\n  },\n  {\n    \"end_line\": 3595,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<p>bar</p>\\n</blockquote>\\n<p>baz</p>\\n\",\n    \"markdown\": \"> bar\\n>\\nbaz\\n\",\n    \"example\": 212,\n    \"start_line\": 3586\n  },\n  {\n    \"end_line\": 3614,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \"> > > foo\\nbar\\n\",\n    \"example\": 213,\n    \"start_line\": 3602\n  },\n  {\n    \"end_line\": 3631,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<blockquote>\\n<p>foo\\nbar\\nbaz</p>\\n</blockquote>\\n</blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \">>> foo\\n> bar\\n>>baz\\n\",\n    \"example\": 214,\n    \"start_line\": 3617\n  },\n  {\n    \"end_line\": 3651,\n    \"section\": \"Block quotes\",\n    \"html\": \"<blockquote>\\n<pre><code>code\\n</code></pre>\\n</blockquote>\\n<blockquote>\\n<p>not code</p>\\n</blockquote>\\n\",\n    \"markdown\": \">     code\\n\\n>    not code\\n\",\n    \"example\": 215,\n    \"start_line\": 3639\n  },\n  {\n    \"end_line\": 3709,\n    \"section\": \"List items\",\n    \"html\": \"<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n\",\n    \"markdown\": \"A paragraph\\nwith two lines.\\n\\n    indented code\\n\\n> A block quote.\\n\",\n    \"example\": 216,\n    \"start_line\": 3694\n  },\n  {\n    \"end_line\": 3735,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    > A block quote.\\n\",\n    \"example\": 217,\n    \"start_line\": 3716\n  },\n  {\n    \"end_line\": 3758,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n\",\n    \"markdown\": \"- one\\n\\n two\\n\",\n    \"example\": 218,\n    \"start_line\": 3749\n  },\n  {\n    \"end_line\": 3772,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- one\\n\\n  two\\n\",\n    \"example\": 219,\n    \"start_line\": 3761\n  },\n  {\n    \"end_line\": 3785,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>one</li>\\n</ul>\\n<pre><code> two\\n</code></pre>\\n\",\n    \"markdown\": \" -    one\\n\\n     two\\n\",\n    \"example\": 220,\n    \"start_line\": 3775\n  },\n  {\n    \"end_line\": 3799,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \" -    one\\n\\n      two\\n\",\n    \"example\": 221,\n    \"start_line\": 3788\n  },\n  {\n    \"end_line\": 3825,\n    \"section\": \"List items\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ol>\\n<li>\\n<p>one</p>\\n<p>two</p>\\n</li>\\n</ol>\\n</blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \"   > > 1.  one\\n>>\\n>>     two\\n\",\n    \"example\": 222,\n    \"start_line\": 3810\n  },\n  {\n    \"end_line\": 3850,\n    \"section\": \"List items\",\n    \"html\": \"<blockquote>\\n<blockquote>\\n<ul>\\n<li>one</li>\\n</ul>\\n<p>two</p>\\n</blockquote>\\n</blockquote>\\n\",\n    \"markdown\": \">>- one\\n>>\\n  >  > two\\n\",\n    \"example\": 223,\n    \"start_line\": 3837\n  },\n  {\n    \"end_line\": 3863,\n    \"section\": \"List items\",\n    \"html\": \"<p>-one</p>\\n<p>2.two</p>\\n\",\n    \"markdown\": \"-one\\n\\n2.two\\n\",\n    \"example\": 224,\n    \"start_line\": 3856\n  },\n  {\n    \"end_line\": 3881,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n\\n\\n  bar\\n\",\n    \"example\": 225,\n    \"start_line\": 3869\n  },\n  {\n    \"end_line\": 3908,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n<p>baz</p>\\n<blockquote>\\n<p>bam</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1.  foo\\n\\n    ```\\n    bar\\n    ```\\n\\n    baz\\n\\n    > bam\\n\",\n    \"example\": 226,\n    \"start_line\": 3886\n  },\n  {\n    \"end_line\": 3932,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>Foo</p>\\n<pre><code>bar\\n\\n\\nbaz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- Foo\\n\\n      bar\\n\\n\\n      baz\\n\",\n    \"example\": 227,\n    \"start_line\": 3914\n  },\n  {\n    \"end_line\": 3942,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"123456789\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"markdown\": \"123456789. ok\\n\",\n    \"example\": 228,\n    \"start_line\": 3936\n  },\n  {\n    \"end_line\": 3949,\n    \"section\": \"List items\",\n    \"html\": \"<p>1234567890. not ok</p>\\n\",\n    \"markdown\": \"1234567890. not ok\\n\",\n    \"example\": 229,\n    \"start_line\": 3945\n  },\n  {\n    \"end_line\": 3960,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"0\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"markdown\": \"0. ok\\n\",\n    \"example\": 230,\n    \"start_line\": 3954\n  },\n  {\n    \"end_line\": 3969,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"3\\\">\\n<li>ok</li>\\n</ol>\\n\",\n    \"markdown\": \"003. ok\\n\",\n    \"example\": 231,\n    \"start_line\": 3963\n  },\n  {\n    \"end_line\": 3978,\n    \"section\": \"List items\",\n    \"html\": \"<p>-1. not ok</p>\\n\",\n    \"markdown\": \"-1. not ok\\n\",\n    \"example\": 232,\n    \"start_line\": 3974\n  },\n  {\n    \"end_line\": 4010,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n\\n      bar\\n\",\n    \"example\": 233,\n    \"start_line\": 3998\n  },\n  {\n    \"end_line\": 4027,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>\\n<p>foo</p>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"  10.  foo\\n\\n           bar\\n\",\n    \"example\": 234,\n    \"start_line\": 4015\n  },\n  {\n    \"end_line\": 4046,\n    \"section\": \"List items\",\n    \"html\": \"<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n\",\n    \"markdown\": \"    indented code\\n\\nparagraph\\n\\n    more code\\n\",\n    \"example\": 235,\n    \"start_line\": 4034\n  },\n  {\n    \"end_line\": 4065,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1.     indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"example\": 236,\n    \"start_line\": 4049\n  },\n  {\n    \"end_line\": 4087,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code> indented code\\n</code></pre>\\n<p>paragraph</p>\\n<pre><code>more code\\n</code></pre>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1.      indented code\\n\\n   paragraph\\n\\n       more code\\n\",\n    \"example\": 237,\n    \"start_line\": 4071\n  },\n  {\n    \"end_line\": 4105,\n    \"section\": \"List items\",\n    \"html\": \"<p>foo</p>\\n<p>bar</p>\\n\",\n    \"markdown\": \"   foo\\n\\nbar\\n\",\n    \"example\": 238,\n    \"start_line\": 4098\n  },\n  {\n    \"end_line\": 4117,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n<p>bar</p>\\n\",\n    \"markdown\": \"-    foo\\n\\n  bar\\n\",\n    \"example\": 239,\n    \"start_line\": 4108\n  },\n  {\n    \"end_line\": 4136,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>bar</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"-  foo\\n\\n   bar\\n\",\n    \"example\": 240,\n    \"start_line\": 4125\n  },\n  {\n    \"end_line\": 4174,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>\\n<pre><code>bar\\n</code></pre>\\n</li>\\n<li>\\n<pre><code>baz\\n</code></pre>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"-\\n  foo\\n-\\n  ```\\n  bar\\n  ```\\n-\\n      baz\\n\",\n    \"example\": 241,\n    \"start_line\": 4153\n  },\n  {\n    \"end_line\": 4186,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n</ul>\\n\",\n    \"markdown\": \"-   \\n  foo\\n\",\n    \"example\": 242,\n    \"start_line\": 4179\n  },\n  {\n    \"end_line\": 4202,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n<p>foo</p>\\n\",\n    \"markdown\": \"-\\n\\n  foo\\n\",\n    \"example\": 243,\n    \"start_line\": 4193\n  },\n  {\n    \"end_line\": 4217,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n-\\n- bar\\n\",\n    \"example\": 244,\n    \"start_line\": 4207\n  },\n  {\n    \"end_line\": 4232,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n-   \\n- bar\\n\",\n    \"example\": 245,\n    \"start_line\": 4222\n  },\n  {\n    \"end_line\": 4247,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li></li>\\n<li>bar</li>\\n</ol>\\n\",\n    \"markdown\": \"1. foo\\n2.\\n3. bar\\n\",\n    \"example\": 246,\n    \"start_line\": 4237\n  },\n  {\n    \"end_line\": 4258,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li></li>\\n</ul>\\n\",\n    \"markdown\": \"*\\n\",\n    \"example\": 247,\n    \"start_line\": 4252\n  },\n  {\n    \"end_line\": 4273,\n    \"section\": \"List items\",\n    \"html\": \"<p>foo\\n*</p>\\n<p>foo\\n1.</p>\\n\",\n    \"markdown\": \"foo\\n*\\n\\nfoo\\n1.\\n\",\n    \"example\": 248,\n    \"start_line\": 4262\n  },\n  {\n    \"end_line\": 4303,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \" 1.  A paragraph\\n     with two lines.\\n\\n         indented code\\n\\n     > A block quote.\\n\",\n    \"example\": 249,\n    \"start_line\": 4284\n  },\n  {\n    \"end_line\": 4327,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"  1.  A paragraph\\n      with two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"example\": 250,\n    \"start_line\": 4308\n  },\n  {\n    \"end_line\": 4351,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"   1.  A paragraph\\n       with two lines.\\n\\n           indented code\\n\\n       > A block quote.\\n\",\n    \"example\": 251,\n    \"start_line\": 4332\n  },\n  {\n    \"end_line\": 4371,\n    \"section\": \"List items\",\n    \"html\": \"<pre><code>1.  A paragraph\\n    with two lines.\\n\\n        indented code\\n\\n    &gt; A block quote.\\n</code></pre>\\n\",\n    \"markdown\": \"    1.  A paragraph\\n        with two lines.\\n\\n            indented code\\n\\n        > A block quote.\\n\",\n    \"example\": 252,\n    \"start_line\": 4356\n  },\n  {\n    \"end_line\": 4405,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<p>A paragraph\\nwith two lines.</p>\\n<pre><code>indented code\\n</code></pre>\\n<blockquote>\\n<p>A block quote.</p>\\n</blockquote>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"  1.  A paragraph\\nwith two lines.\\n\\n          indented code\\n\\n      > A block quote.\\n\",\n    \"example\": 253,\n    \"start_line\": 4386\n  },\n  {\n    \"end_line\": 4418,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>A paragraph\\nwith two lines.</li>\\n</ol>\\n\",\n    \"markdown\": \"  1.  A paragraph\\n    with two lines.\\n\",\n    \"example\": 254,\n    \"start_line\": 4410\n  },\n  {\n    \"end_line\": 4437,\n    \"section\": \"List items\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"markdown\": \"> 1. > Blockquote\\ncontinued here.\\n\",\n    \"example\": 255,\n    \"start_line\": 4423\n  },\n  {\n    \"end_line\": 4454,\n    \"section\": \"List items\",\n    \"html\": \"<blockquote>\\n<ol>\\n<li>\\n<blockquote>\\n<p>Blockquote\\ncontinued here.</p>\\n</blockquote>\\n</li>\\n</ol>\\n</blockquote>\\n\",\n    \"markdown\": \"> 1. > Blockquote\\n> continued here.\\n\",\n    \"example\": 256,\n    \"start_line\": 4440\n  },\n  {\n    \"end_line\": 4488,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>baz\\n<ul>\\n<li>boo</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n      - boo\\n\",\n    \"example\": 257,\n    \"start_line\": 4467\n  },\n  {\n    \"end_line\": 4505,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n<li>baz</li>\\n<li>boo</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n - bar\\n  - baz\\n   - boo\\n\",\n    \"example\": 258,\n    \"start_line\": 4493\n  },\n  {\n    \"end_line\": 4521,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo\\n<ul>\\n<li>bar</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"10) foo\\n    - bar\\n\",\n    \"example\": 259,\n    \"start_line\": 4510\n  },\n  {\n    \"end_line\": 4536,\n    \"section\": \"List items\",\n    \"html\": \"<ol start=\\\"10\\\">\\n<li>foo</li>\\n</ol>\\n<ul>\\n<li>bar</li>\\n</ul>\\n\",\n    \"markdown\": \"10) foo\\n   - bar\\n\",\n    \"example\": 260,\n    \"start_line\": 4526\n  },\n  {\n    \"end_line\": 4551,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<ul>\\n<li>foo</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- - foo\\n\",\n    \"example\": 261,\n    \"start_line\": 4541\n  },\n  {\n    \"end_line\": 4568,\n    \"section\": \"List items\",\n    \"html\": \"<ol>\\n<li>\\n<ul>\\n<li>\\n<ol start=\\\"2\\\">\\n<li>foo</li>\\n</ol>\\n</li>\\n</ul>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1. - 2. foo\\n\",\n    \"example\": 262,\n    \"start_line\": 4554\n  },\n  {\n    \"end_line\": 4587,\n    \"section\": \"List items\",\n    \"html\": \"<ul>\\n<li>\\n<h1>Foo</h1>\\n</li>\\n<li>\\n<h2>Bar</h2>\\nbaz</li>\\n</ul>\\n\",\n    \"markdown\": \"- # Foo\\n- Bar\\n  ---\\n  baz\\n\",\n    \"example\": 263,\n    \"start_line\": 4573\n  },\n  {\n    \"end_line\": 4821,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<ul>\\n<li>baz</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n- bar\\n+ baz\\n\",\n    \"example\": 264,\n    \"start_line\": 4809\n  },\n  {\n    \"end_line\": 4836,\n    \"section\": \"Lists\",\n    \"html\": \"<ol>\\n<li>foo</li>\\n<li>bar</li>\\n</ol>\\n<ol start=\\\"3\\\">\\n<li>baz</li>\\n</ol>\\n\",\n    \"markdown\": \"1. foo\\n2. bar\\n3) baz\\n\",\n    \"example\": 265,\n    \"start_line\": 4824\n  },\n  {\n    \"end_line\": 4853,\n    \"section\": \"Lists\",\n    \"html\": \"<p>Foo</p>\\n<ul>\\n<li>bar</li>\\n<li>baz</li>\\n</ul>\\n\",\n    \"markdown\": \"Foo\\n- bar\\n- baz\\n\",\n    \"example\": 266,\n    \"start_line\": 4843\n  },\n  {\n    \"end_line\": 4926,\n    \"section\": \"Lists\",\n    \"html\": \"<p>The number of windows in my house is\\n14.  The number of doors is 6.</p>\\n\",\n    \"markdown\": \"The number of windows in my house is\\n14.  The number of doors is 6.\\n\",\n    \"example\": 267,\n    \"start_line\": 4920\n  },\n  {\n    \"end_line\": 4938,\n    \"section\": \"Lists\",\n    \"html\": \"<p>The number of windows in my house is</p>\\n<ol>\\n<li>The number of doors is 6.</li>\\n</ol>\\n\",\n    \"markdown\": \"The number of windows in my house is\\n1.  The number of doors is 6.\\n\",\n    \"example\": 268,\n    \"start_line\": 4930\n  },\n  {\n    \"end_line\": 4963,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n</li>\\n<li>\\n<p>bar</p>\\n</li>\\n<li>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n\\n- bar\\n\\n\\n- baz\\n\",\n    \"example\": 269,\n    \"start_line\": 4944\n  },\n  {\n    \"end_line\": 4987,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>foo\\n<ul>\\n<li>bar\\n<ul>\\n<li>\\n<p>baz</p>\\n<p>bim</p>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n  - bar\\n    - baz\\n\\n\\n      bim\\n\",\n    \"example\": 270,\n    \"start_line\": 4965\n  },\n  {\n    \"end_line\": 5013,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>foo</li>\\n<li>bar</li>\\n</ul>\\n<!-- -->\\n<ul>\\n<li>baz</li>\\n<li>bim</li>\\n</ul>\\n\",\n    \"markdown\": \"- foo\\n- bar\\n\\n<!-- -->\\n\\n- baz\\n- bim\\n\",\n    \"example\": 271,\n    \"start_line\": 4995\n  },\n  {\n    \"end_line\": 5039,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<p>notcode</p>\\n</li>\\n<li>\\n<p>foo</p>\\n</li>\\n</ul>\\n<!-- -->\\n<pre><code>code\\n</code></pre>\\n\",\n    \"markdown\": \"-   foo\\n\\n    notcode\\n\\n-   foo\\n\\n<!-- -->\\n\\n    code\\n\",\n    \"example\": 272,\n    \"start_line\": 5016\n  },\n  {\n    \"end_line\": 5069,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>b</li>\\n<li>c</li>\\n<li>d</li>\\n<li>e</li>\\n<li>f</li>\\n<li>g</li>\\n<li>h</li>\\n<li>i</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n - b\\n  - c\\n   - d\\n    - e\\n   - f\\n  - g\\n - h\\n- i\\n\",\n    \"example\": 273,\n    \"start_line\": 5047\n  },\n  {\n    \"end_line\": 5090,\n    \"section\": \"Lists\",\n    \"html\": \"<ol>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1. a\\n\\n  2. b\\n\\n    3. c\\n\",\n    \"example\": 274,\n    \"start_line\": 5072\n  },\n  {\n    \"end_line\": 5113,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n- b\\n\\n- c\\n\",\n    \"example\": 275,\n    \"start_line\": 5096\n  },\n  {\n    \"end_line\": 5133,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li></li>\\n<li>\\n<p>c</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"* a\\n*\\n\\n* c\\n\",\n    \"example\": 276,\n    \"start_line\": 5118\n  },\n  {\n    \"end_line\": 5159,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n- b\\n\\n  c\\n- d\\n\",\n    \"example\": 277,\n    \"start_line\": 5140\n  },\n  {\n    \"end_line\": 5180,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n</li>\\n<li>\\n<p>b</p>\\n</li>\\n<li>\\n<p>d</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n- b\\n\\n  [ref]: /url\\n- d\\n\",\n    \"example\": 278,\n    \"start_line\": 5162\n  },\n  {\n    \"end_line\": 5204,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a</li>\\n<li>\\n<pre><code>b\\n\\n\\n</code></pre>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n- ```\\n  b\\n\\n\\n  ```\\n- c\\n\",\n    \"example\": 279,\n    \"start_line\": 5185\n  },\n  {\n    \"end_line\": 5229,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>\\n<p>b</p>\\n<p>c</p>\\n</li>\\n</ul>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n  - b\\n\\n    c\\n- d\\n\",\n    \"example\": 280,\n    \"start_line\": 5211\n  },\n  {\n    \"end_line\": 5249,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n</li>\\n<li>c</li>\\n</ul>\\n\",\n    \"markdown\": \"* a\\n  > b\\n  >\\n* c\\n\",\n    \"example\": 281,\n    \"start_line\": 5235\n  },\n  {\n    \"end_line\": 5273,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a\\n<blockquote>\\n<p>b</p>\\n</blockquote>\\n<pre><code>c\\n</code></pre>\\n</li>\\n<li>d</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n  > b\\n  ```\\n  c\\n  ```\\n- d\\n\",\n    \"example\": 282,\n    \"start_line\": 5255\n  },\n  {\n    \"end_line\": 5284,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n\",\n    \"example\": 283,\n    \"start_line\": 5278\n  },\n  {\n    \"end_line\": 5298,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>a\\n<ul>\\n<li>b</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n  - b\\n\",\n    \"example\": 284,\n    \"start_line\": 5287\n  },\n  {\n    \"end_line\": 5318,\n    \"section\": \"Lists\",\n    \"html\": \"<ol>\\n<li>\\n<pre><code>foo\\n</code></pre>\\n<p>bar</p>\\n</li>\\n</ol>\\n\",\n    \"markdown\": \"1. ```\\n   foo\\n   ```\\n\\n   bar\\n\",\n    \"example\": 285,\n    \"start_line\": 5304\n  },\n  {\n    \"end_line\": 5338,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>foo</p>\\n<ul>\\n<li>bar</li>\\n</ul>\\n<p>baz</p>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"* foo\\n  * bar\\n\\n  baz\\n\",\n    \"example\": 286,\n    \"start_line\": 5323\n  },\n  {\n    \"end_line\": 5366,\n    \"section\": \"Lists\",\n    \"html\": \"<ul>\\n<li>\\n<p>a</p>\\n<ul>\\n<li>b</li>\\n<li>c</li>\\n</ul>\\n</li>\\n<li>\\n<p>d</p>\\n<ul>\\n<li>e</li>\\n<li>f</li>\\n</ul>\\n</li>\\n</ul>\\n\",\n    \"markdown\": \"- a\\n  - b\\n  - c\\n\\n- d\\n  - e\\n  - f\\n\",\n    \"example\": 287,\n    \"start_line\": 5341\n  },\n  {\n    \"end_line\": 5379,\n    \"section\": \"Inlines\",\n    \"html\": \"<p><code>hi</code>lo`</p>\\n\",\n    \"markdown\": \"`hi`lo`\\n\",\n    \"example\": 288,\n    \"start_line\": 5375\n  },\n  {\n    \"end_line\": 5393,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\\\]^_`{|}~</p>\\n\",\n    \"markdown\": \"\\\\!\\\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\\\\\\\\\]\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~\\n\",\n    \"example\": 289,\n    \"start_line\": 5389\n  },\n  {\n    \"end_line\": 5403,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p>\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«</p>\\n\",\n    \"markdown\": \"\\\\\\t\\\\A\\\\a\\\\ \\\\3\\\\φ\\\\«\\n\",\n    \"example\": 290,\n    \"start_line\": 5399\n  },\n  {\n    \"end_line\": 5427,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p>*not emphasized*\\n&lt;br/&gt; not a tag\\n[not a link](/foo)\\n`not code`\\n1. not a list\\n* not a list\\n# not a heading\\n[foo]: /url &quot;not a reference&quot;</p>\\n\",\n    \"markdown\": \"\\\\*not emphasized*\\n\\\\<br/> not a tag\\n\\\\[not a link](/foo)\\n\\\\`not code`\\n1\\\\. not a list\\n\\\\* not a list\\n\\\\# not a heading\\n\\\\[foo]: /url \\\"not a reference\\\"\\n\",\n    \"example\": 291,\n    \"start_line\": 5409\n  },\n  {\n    \"end_line\": 5436,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p>\\\\<em>emphasis</em></p>\\n\",\n    \"markdown\": \"\\\\\\\\*emphasis*\\n\",\n    \"example\": 292,\n    \"start_line\": 5432\n  },\n  {\n    \"end_line\": 5447,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"markdown\": \"foo\\\\\\nbar\\n\",\n    \"example\": 293,\n    \"start_line\": 5441\n  },\n  {\n    \"end_line\": 5457,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p><code>\\\\[\\\\`</code></p>\\n\",\n    \"markdown\": \"`` \\\\[\\\\` ``\\n\",\n    \"example\": 294,\n    \"start_line\": 5453\n  },\n  {\n    \"end_line\": 5465,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"markdown\": \"    \\\\[\\\\]\\n\",\n    \"example\": 295,\n    \"start_line\": 5460\n  },\n  {\n    \"end_line\": 5475,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<pre><code>\\\\[\\\\]\\n</code></pre>\\n\",\n    \"markdown\": \"~~~\\n\\\\[\\\\]\\n~~~\\n\",\n    \"example\": 296,\n    \"start_line\": 5468\n  },\n  {\n    \"end_line\": 5482,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p><a href=\\\"http://example.com?find=%5C*\\\">http://example.com?find=\\\\*</a></p>\\n\",\n    \"markdown\": \"<http://example.com?find=\\\\*>\\n\",\n    \"example\": 297,\n    \"start_line\": 5478\n  },\n  {\n    \"end_line\": 5489,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"markdown\": \"<a href=\\\"/bar\\\\/)\\\">\\n\",\n    \"example\": 298,\n    \"start_line\": 5485\n  },\n  {\n    \"end_line\": 5499,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo](/bar\\\\* \\\"ti\\\\*tle\\\")\\n\",\n    \"example\": 299,\n    \"start_line\": 5495\n  },\n  {\n    \"end_line\": 5508,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<p><a href=\\\"/bar*\\\" title=\\\"ti*tle\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]\\n\\n[foo]: /bar\\\\* \\\"ti\\\\*tle\\\"\\n\",\n    \"example\": 300,\n    \"start_line\": 5502\n  },\n  {\n    \"end_line\": 5518,\n    \"section\": \"Backslash escapes\",\n    \"html\": \"<pre><code class=\\\"language-foo+bar\\\">foo\\n</code></pre>\\n\",\n    \"markdown\": \"``` foo\\\\+bar\\nfoo\\n```\\n\",\n    \"example\": 301,\n    \"start_line\": 5511\n  },\n  {\n    \"end_line\": 5546,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p>  &amp; © Æ Ď\\n¾ ℋ ⅆ\\n∲ ≧̸</p>\\n\",\n    \"markdown\": \"&nbsp; &amp; &copy; &AElig; &Dcaron;\\n&frac34; &HilbertSpace; &DifferentialD;\\n&ClockwiseContourIntegral; &ngE;\\n\",\n    \"example\": 302,\n    \"start_line\": 5538\n  },\n  {\n    \"end_line\": 5561,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p># Ӓ Ϡ � �</p>\\n\",\n    \"markdown\": \"&#35; &#1234; &#992; &#98765432; &#0;\\n\",\n    \"example\": 303,\n    \"start_line\": 5557\n  },\n  {\n    \"end_line\": 5574,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p>&quot; ആ ಫ</p>\\n\",\n    \"markdown\": \"&#X22; &#XD06; &#xcab;\\n\",\n    \"example\": 304,\n    \"start_line\": 5570\n  },\n  {\n    \"end_line\": 5585,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;\\n&amp;ThisIsNotDefined; &amp;hi?;</p>\\n\",\n    \"markdown\": \"&nbsp &x; &#; &#x;\\n&ThisIsNotDefined; &hi?;\\n\",\n    \"example\": 305,\n    \"start_line\": 5579\n  },\n  {\n    \"end_line\": 5596,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p>&amp;copy</p>\\n\",\n    \"markdown\": \"&copy\\n\",\n    \"example\": 306,\n    \"start_line\": 5592\n  },\n  {\n    \"end_line\": 5606,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p>&amp;MadeUpEntity;</p>\\n\",\n    \"markdown\": \"&MadeUpEntity;\\n\",\n    \"example\": 307,\n    \"start_line\": 5602\n  },\n  {\n    \"end_line\": 5617,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"markdown\": \"<a href=\\\"&ouml;&ouml;.html\\\">\\n\",\n    \"example\": 308,\n    \"start_line\": 5613\n  },\n  {\n    \"end_line\": 5624,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo](/f&ouml;&ouml; \\\"f&ouml;&ouml;\\\")\\n\",\n    \"example\": 309,\n    \"start_line\": 5620\n  },\n  {\n    \"end_line\": 5633,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p><a href=\\\"/f%C3%B6%C3%B6\\\" title=\\\"föö\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]\\n\\n[foo]: /f&ouml;&ouml; \\\"f&ouml;&ouml;\\\"\\n\",\n    \"example\": 310,\n    \"start_line\": 5627\n  },\n  {\n    \"end_line\": 5643,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<pre><code class=\\\"language-föö\\\">foo\\n</code></pre>\\n\",\n    \"markdown\": \"``` f&ouml;&ouml;\\nfoo\\n```\\n\",\n    \"example\": 311,\n    \"start_line\": 5636\n  },\n  {\n    \"end_line\": 5653,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<p><code>f&amp;ouml;&amp;ouml;</code></p>\\n\",\n    \"markdown\": \"`f&ouml;&ouml;`\\n\",\n    \"example\": 312,\n    \"start_line\": 5649\n  },\n  {\n    \"end_line\": 5661,\n    \"section\": \"Entity and numeric character references\",\n    \"html\": \"<pre><code>f&amp;ouml;f&amp;ouml;\\n</code></pre>\\n\",\n    \"markdown\": \"    f&ouml;f&ouml;\\n\",\n    \"example\": 313,\n    \"start_line\": 5656\n  },\n  {\n    \"end_line\": 5682,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"markdown\": \"`foo`\\n\",\n    \"example\": 314,\n    \"start_line\": 5678\n  },\n  {\n    \"end_line\": 5692,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo ` bar</code></p>\\n\",\n    \"markdown\": \"`` foo ` bar  ``\\n\",\n    \"example\": 315,\n    \"start_line\": 5688\n  },\n  {\n    \"end_line\": 5702,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>``</code></p>\\n\",\n    \"markdown\": \"` `` `\\n\",\n    \"example\": 316,\n    \"start_line\": 5698\n  },\n  {\n    \"end_line\": 5713,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo</code></p>\\n\",\n    \"markdown\": \"``\\nfoo\\n``\\n\",\n    \"example\": 317,\n    \"start_line\": 5707\n  },\n  {\n    \"end_line\": 5724,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo bar baz</code></p>\\n\",\n    \"markdown\": \"`foo   bar\\n  baz`\\n\",\n    \"example\": 318,\n    \"start_line\": 5719\n  },\n  {\n    \"end_line\": 5734,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>a  b</code></p>\\n\",\n    \"markdown\": \"`a  b`\\n\",\n    \"example\": 319,\n    \"start_line\": 5730\n  },\n  {\n    \"end_line\": 5754,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo `` bar</code></p>\\n\",\n    \"markdown\": \"`foo `` bar`\\n\",\n    \"example\": 320,\n    \"start_line\": 5750\n  },\n  {\n    \"end_line\": 5764,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>foo\\\\</code>bar`</p>\\n\",\n    \"markdown\": \"`foo\\\\`bar`\\n\",\n    \"example\": 321,\n    \"start_line\": 5760\n  },\n  {\n    \"end_line\": 5780,\n    \"section\": \"Code spans\",\n    \"html\": \"<p>*foo<code>*</code></p>\\n\",\n    \"markdown\": \"*foo`*`\\n\",\n    \"example\": 322,\n    \"start_line\": 5776\n  },\n  {\n    \"end_line\": 5789,\n    \"section\": \"Code spans\",\n    \"html\": \"<p>[not a <code>link](/foo</code>)</p>\\n\",\n    \"markdown\": \"[not a `link](/foo`)\\n\",\n    \"example\": 323,\n    \"start_line\": 5785\n  },\n  {\n    \"end_line\": 5799,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>\\n\",\n    \"markdown\": \"`<a href=\\\"`\\\">`\\n\",\n    \"example\": 324,\n    \"start_line\": 5795\n  },\n  {\n    \"end_line\": 5808,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><a href=\\\"`\\\">`</p>\\n\",\n    \"markdown\": \"<a href=\\\"`\\\">`\\n\",\n    \"example\": 325,\n    \"start_line\": 5804\n  },\n  {\n    \"end_line\": 5817,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><code>&lt;http://foo.bar.</code>baz&gt;`</p>\\n\",\n    \"markdown\": \"`<http://foo.bar.`baz>`\\n\",\n    \"example\": 326,\n    \"start_line\": 5813\n  },\n  {\n    \"end_line\": 5826,\n    \"section\": \"Code spans\",\n    \"html\": \"<p><a href=\\\"http://foo.bar.%60baz\\\">http://foo.bar.`baz</a>`</p>\\n\",\n    \"markdown\": \"<http://foo.bar.`baz>`\\n\",\n    \"example\": 327,\n    \"start_line\": 5822\n  },\n  {\n    \"end_line\": 5836,\n    \"section\": \"Code spans\",\n    \"html\": \"<p>```foo``</p>\\n\",\n    \"markdown\": \"```foo``\\n\",\n    \"example\": 328,\n    \"start_line\": 5832\n  },\n  {\n    \"end_line\": 5843,\n    \"section\": \"Code spans\",\n    \"html\": \"<p>`foo</p>\\n\",\n    \"markdown\": \"`foo\\n\",\n    \"example\": 329,\n    \"start_line\": 5839\n  },\n  {\n    \"end_line\": 5852,\n    \"section\": \"Code spans\",\n    \"html\": \"<p>`foo<code>bar</code></p>\\n\",\n    \"markdown\": \"`foo``bar``\\n\",\n    \"example\": 330,\n    \"start_line\": 5848\n  },\n  {\n    \"end_line\": 6065,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"markdown\": \"*foo bar*\\n\",\n    \"example\": 331,\n    \"start_line\": 6061\n  },\n  {\n    \"end_line\": 6075,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>a * foo bar*</p>\\n\",\n    \"markdown\": \"a * foo bar*\\n\",\n    \"example\": 332,\n    \"start_line\": 6071\n  },\n  {\n    \"end_line\": 6086,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>a*&quot;foo&quot;*</p>\\n\",\n    \"markdown\": \"a*\\\"foo\\\"*\\n\",\n    \"example\": 333,\n    \"start_line\": 6082\n  },\n  {\n    \"end_line\": 6095,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>* a *</p>\\n\",\n    \"markdown\": \"* a *\\n\",\n    \"example\": 334,\n    \"start_line\": 6091\n  },\n  {\n    \"end_line\": 6104,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo<em>bar</em></p>\\n\",\n    \"markdown\": \"foo*bar*\\n\",\n    \"example\": 335,\n    \"start_line\": 6100\n  },\n  {\n    \"end_line\": 6111,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>5<em>6</em>78</p>\\n\",\n    \"markdown\": \"5*6*78\\n\",\n    \"example\": 336,\n    \"start_line\": 6107\n  },\n  {\n    \"end_line\": 6120,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo bar</em></p>\\n\",\n    \"markdown\": \"_foo bar_\\n\",\n    \"example\": 337,\n    \"start_line\": 6116\n  },\n  {\n    \"end_line\": 6130,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_ foo bar_</p>\\n\",\n    \"markdown\": \"_ foo bar_\\n\",\n    \"example\": 338,\n    \"start_line\": 6126\n  },\n  {\n    \"end_line\": 6140,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>a_&quot;foo&quot;_</p>\\n\",\n    \"markdown\": \"a_\\\"foo\\\"_\\n\",\n    \"example\": 339,\n    \"start_line\": 6136\n  },\n  {\n    \"end_line\": 6149,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo_bar_</p>\\n\",\n    \"markdown\": \"foo_bar_\\n\",\n    \"example\": 340,\n    \"start_line\": 6145\n  },\n  {\n    \"end_line\": 6156,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>5_6_78</p>\\n\",\n    \"markdown\": \"5_6_78\\n\",\n    \"example\": 341,\n    \"start_line\": 6152\n  },\n  {\n    \"end_line\": 6163,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>пристаням_стремятся_</p>\\n\",\n    \"markdown\": \"пристаням_стремятся_\\n\",\n    \"example\": 342,\n    \"start_line\": 6159\n  },\n  {\n    \"end_line\": 6173,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>aa_&quot;bb&quot;_cc</p>\\n\",\n    \"markdown\": \"aa_\\\"bb\\\"_cc\\n\",\n    \"example\": 343,\n    \"start_line\": 6169\n  },\n  {\n    \"end_line\": 6184,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo-<em>(bar)</em></p>\\n\",\n    \"markdown\": \"foo-_(bar)_\\n\",\n    \"example\": 344,\n    \"start_line\": 6180\n  },\n  {\n    \"end_line\": 6196,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_foo*</p>\\n\",\n    \"markdown\": \"_foo*\\n\",\n    \"example\": 345,\n    \"start_line\": 6192\n  },\n  {\n    \"end_line\": 6206,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*foo bar *</p>\\n\",\n    \"markdown\": \"*foo bar *\\n\",\n    \"example\": 346,\n    \"start_line\": 6202\n  },\n  {\n    \"end_line\": 6217,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*foo bar\\n*</p>\\n\",\n    \"markdown\": \"*foo bar\\n*\\n\",\n    \"example\": 347,\n    \"start_line\": 6211\n  },\n  {\n    \"end_line\": 6228,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*(*foo)</p>\\n\",\n    \"markdown\": \"*(*foo)\\n\",\n    \"example\": 348,\n    \"start_line\": 6224\n  },\n  {\n    \"end_line\": 6238,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"markdown\": \"*(*foo*)*\\n\",\n    \"example\": 349,\n    \"start_line\": 6234\n  },\n  {\n    \"end_line\": 6247,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo</em>bar</p>\\n\",\n    \"markdown\": \"*foo*bar\\n\",\n    \"example\": 350,\n    \"start_line\": 6243\n  },\n  {\n    \"end_line\": 6260,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_foo bar _</p>\\n\",\n    \"markdown\": \"_foo bar _\\n\",\n    \"example\": 351,\n    \"start_line\": 6256\n  },\n  {\n    \"end_line\": 6270,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_(_foo)</p>\\n\",\n    \"markdown\": \"_(_foo)\\n\",\n    \"example\": 352,\n    \"start_line\": 6266\n  },\n  {\n    \"end_line\": 6279,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>(<em>foo</em>)</em></p>\\n\",\n    \"markdown\": \"_(_foo_)_\\n\",\n    \"example\": 353,\n    \"start_line\": 6275\n  },\n  {\n    \"end_line\": 6288,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_foo_bar</p>\\n\",\n    \"markdown\": \"_foo_bar\\n\",\n    \"example\": 354,\n    \"start_line\": 6284\n  },\n  {\n    \"end_line\": 6295,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_пристаням_стремятся</p>\\n\",\n    \"markdown\": \"_пристаням_стремятся\\n\",\n    \"example\": 355,\n    \"start_line\": 6291\n  },\n  {\n    \"end_line\": 6302,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo_bar_baz</em></p>\\n\",\n    \"markdown\": \"_foo_bar_baz_\\n\",\n    \"example\": 356,\n    \"start_line\": 6298\n  },\n  {\n    \"end_line\": 6313,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>(bar)</em>.</p>\\n\",\n    \"markdown\": \"_(bar)_.\\n\",\n    \"example\": 357,\n    \"start_line\": 6309\n  },\n  {\n    \"end_line\": 6322,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"markdown\": \"**foo bar**\\n\",\n    \"example\": 358,\n    \"start_line\": 6318\n  },\n  {\n    \"end_line\": 6332,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>** foo bar**</p>\\n\",\n    \"markdown\": \"** foo bar**\\n\",\n    \"example\": 359,\n    \"start_line\": 6328\n  },\n  {\n    \"end_line\": 6343,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>a**&quot;foo&quot;**</p>\\n\",\n    \"markdown\": \"a**\\\"foo\\\"**\\n\",\n    \"example\": 360,\n    \"start_line\": 6339\n  },\n  {\n    \"end_line\": 6352,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo<strong>bar</strong></p>\\n\",\n    \"markdown\": \"foo**bar**\\n\",\n    \"example\": 361,\n    \"start_line\": 6348\n  },\n  {\n    \"end_line\": 6361,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo bar</strong></p>\\n\",\n    \"markdown\": \"__foo bar__\\n\",\n    \"example\": 362,\n    \"start_line\": 6357\n  },\n  {\n    \"end_line\": 6371,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__ foo bar__</p>\\n\",\n    \"markdown\": \"__ foo bar__\\n\",\n    \"example\": 363,\n    \"start_line\": 6367\n  },\n  {\n    \"end_line\": 6381,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__\\nfoo bar__</p>\\n\",\n    \"markdown\": \"__\\nfoo bar__\\n\",\n    \"example\": 364,\n    \"start_line\": 6375\n  },\n  {\n    \"end_line\": 6391,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>a__&quot;foo&quot;__</p>\\n\",\n    \"markdown\": \"a__\\\"foo\\\"__\\n\",\n    \"example\": 365,\n    \"start_line\": 6387\n  },\n  {\n    \"end_line\": 6400,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo__bar__</p>\\n\",\n    \"markdown\": \"foo__bar__\\n\",\n    \"example\": 366,\n    \"start_line\": 6396\n  },\n  {\n    \"end_line\": 6407,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>5__6__78</p>\\n\",\n    \"markdown\": \"5__6__78\\n\",\n    \"example\": 367,\n    \"start_line\": 6403\n  },\n  {\n    \"end_line\": 6414,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>пристаням__стремятся__</p>\\n\",\n    \"markdown\": \"пристаням__стремятся__\\n\",\n    \"example\": 368,\n    \"start_line\": 6410\n  },\n  {\n    \"end_line\": 6421,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo, <strong>bar</strong>, baz</strong></p>\\n\",\n    \"markdown\": \"__foo, __bar__, baz__\\n\",\n    \"example\": 369,\n    \"start_line\": 6417\n  },\n  {\n    \"end_line\": 6432,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo-<strong>(bar)</strong></p>\\n\",\n    \"markdown\": \"foo-__(bar)__\\n\",\n    \"example\": 370,\n    \"start_line\": 6428\n  },\n  {\n    \"end_line\": 6445,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**foo bar **</p>\\n\",\n    \"markdown\": \"**foo bar **\\n\",\n    \"example\": 371,\n    \"start_line\": 6441\n  },\n  {\n    \"end_line\": 6458,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**(**foo)</p>\\n\",\n    \"markdown\": \"**(**foo)\\n\",\n    \"example\": 372,\n    \"start_line\": 6454\n  },\n  {\n    \"end_line\": 6468,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"markdown\": \"*(**foo**)*\\n\",\n    \"example\": 373,\n    \"start_line\": 6464\n  },\n  {\n    \"end_line\": 6477,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.\\n<em>Asclepias physocarpa</em>)</strong></p>\\n\",\n    \"markdown\": \"**Gomphocarpus (*Gomphocarpus physocarpus*, syn.\\n*Asclepias physocarpa*)**\\n\",\n    \"example\": 374,\n    \"start_line\": 6471\n  },\n  {\n    \"end_line\": 6484,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>\\n\",\n    \"markdown\": \"**foo \\\"*bar*\\\" foo**\\n\",\n    \"example\": 375,\n    \"start_line\": 6480\n  },\n  {\n    \"end_line\": 6493,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo</strong>bar</p>\\n\",\n    \"markdown\": \"**foo**bar\\n\",\n    \"example\": 376,\n    \"start_line\": 6489\n  },\n  {\n    \"end_line\": 6505,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__foo bar __</p>\\n\",\n    \"markdown\": \"__foo bar __\\n\",\n    \"example\": 377,\n    \"start_line\": 6501\n  },\n  {\n    \"end_line\": 6515,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__(__foo)</p>\\n\",\n    \"markdown\": \"__(__foo)\\n\",\n    \"example\": 378,\n    \"start_line\": 6511\n  },\n  {\n    \"end_line\": 6525,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>(<strong>foo</strong>)</em></p>\\n\",\n    \"markdown\": \"_(__foo__)_\\n\",\n    \"example\": 379,\n    \"start_line\": 6521\n  },\n  {\n    \"end_line\": 6534,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__foo__bar</p>\\n\",\n    \"markdown\": \"__foo__bar\\n\",\n    \"example\": 380,\n    \"start_line\": 6530\n  },\n  {\n    \"end_line\": 6541,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__пристаням__стремятся</p>\\n\",\n    \"markdown\": \"__пристаням__стремятся\\n\",\n    \"example\": 381,\n    \"start_line\": 6537\n  },\n  {\n    \"end_line\": 6548,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo__bar__baz</strong></p>\\n\",\n    \"markdown\": \"__foo__bar__baz__\\n\",\n    \"example\": 382,\n    \"start_line\": 6544\n  },\n  {\n    \"end_line\": 6559,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>(bar)</strong>.</p>\\n\",\n    \"markdown\": \"__(bar)__.\\n\",\n    \"example\": 383,\n    \"start_line\": 6555\n  },\n  {\n    \"end_line\": 6571,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\">bar</a></em></p>\\n\",\n    \"markdown\": \"*foo [bar](/url)*\\n\",\n    \"example\": 384,\n    \"start_line\": 6567\n  },\n  {\n    \"end_line\": 6580,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo\\nbar</em></p>\\n\",\n    \"markdown\": \"*foo\\nbar*\\n\",\n    \"example\": 385,\n    \"start_line\": 6574\n  },\n  {\n    \"end_line\": 6590,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"markdown\": \"_foo __bar__ baz_\\n\",\n    \"example\": 386,\n    \"start_line\": 6586\n  },\n  {\n    \"end_line\": 6597,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <em>bar</em> baz</em></p>\\n\",\n    \"markdown\": \"_foo _bar_ baz_\\n\",\n    \"example\": 387,\n    \"start_line\": 6593\n  },\n  {\n    \"end_line\": 6604,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><em>foo</em> bar</em></p>\\n\",\n    \"markdown\": \"__foo_ bar_\\n\",\n    \"example\": 388,\n    \"start_line\": 6600\n  },\n  {\n    \"end_line\": 6611,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <em>bar</em></em></p>\\n\",\n    \"markdown\": \"*foo *bar**\\n\",\n    \"example\": 389,\n    \"start_line\": 6607\n  },\n  {\n    \"end_line\": 6618,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <strong>bar</strong> baz</em></p>\\n\",\n    \"markdown\": \"*foo **bar** baz*\\n\",\n    \"example\": 390,\n    \"start_line\": 6614\n  },\n  {\n    \"end_line\": 6624,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo<strong>bar</strong>baz</em></p>\\n\",\n    \"markdown\": \"*foo**bar**baz*\\n\",\n    \"example\": 391,\n    \"start_line\": 6620\n  },\n  {\n    \"end_line\": 6649,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><strong>foo</strong> bar</em></p>\\n\",\n    \"markdown\": \"***foo** bar*\\n\",\n    \"example\": 392,\n    \"start_line\": 6645\n  },\n  {\n    \"end_line\": 6656,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <strong>bar</strong></em></p>\\n\",\n    \"markdown\": \"*foo **bar***\\n\",\n    \"example\": 393,\n    \"start_line\": 6652\n  },\n  {\n    \"end_line\": 6663,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo<strong>bar</strong></em></p>\\n\",\n    \"markdown\": \"*foo**bar***\\n\",\n    \"example\": 394,\n    \"start_line\": 6659\n  },\n  {\n    \"end_line\": 6672,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>\\n\",\n    \"markdown\": \"*foo **bar *baz* bim** bop*\\n\",\n    \"example\": 395,\n    \"start_line\": 6668\n  },\n  {\n    \"end_line\": 6679,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <a href=\\\"/url\\\"><em>bar</em></a></em></p>\\n\",\n    \"markdown\": \"*foo [*bar*](/url)*\\n\",\n    \"example\": 396,\n    \"start_line\": 6675\n  },\n  {\n    \"end_line\": 6688,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>** is not an empty emphasis</p>\\n\",\n    \"markdown\": \"** is not an empty emphasis\\n\",\n    \"example\": 397,\n    \"start_line\": 6684\n  },\n  {\n    \"end_line\": 6695,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**** is not an empty strong emphasis</p>\\n\",\n    \"markdown\": \"**** is not an empty strong emphasis\\n\",\n    \"example\": 398,\n    \"start_line\": 6691\n  },\n  {\n    \"end_line\": 6708,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\">bar</a></strong></p>\\n\",\n    \"markdown\": \"**foo [bar](/url)**\\n\",\n    \"example\": 399,\n    \"start_line\": 6704\n  },\n  {\n    \"end_line\": 6717,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo\\nbar</strong></p>\\n\",\n    \"markdown\": \"**foo\\nbar**\\n\",\n    \"example\": 400,\n    \"start_line\": 6711\n  },\n  {\n    \"end_line\": 6727,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"markdown\": \"__foo _bar_ baz__\\n\",\n    \"example\": 401,\n    \"start_line\": 6723\n  },\n  {\n    \"end_line\": 6734,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <strong>bar</strong> baz</strong></p>\\n\",\n    \"markdown\": \"__foo __bar__ baz__\\n\",\n    \"example\": 402,\n    \"start_line\": 6730\n  },\n  {\n    \"end_line\": 6741,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong><strong>foo</strong> bar</strong></p>\\n\",\n    \"markdown\": \"____foo__ bar__\\n\",\n    \"example\": 403,\n    \"start_line\": 6737\n  },\n  {\n    \"end_line\": 6748,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <strong>bar</strong></strong></p>\\n\",\n    \"markdown\": \"**foo **bar****\\n\",\n    \"example\": 404,\n    \"start_line\": 6744\n  },\n  {\n    \"end_line\": 6755,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <em>bar</em> baz</strong></p>\\n\",\n    \"markdown\": \"**foo *bar* baz**\\n\",\n    \"example\": 405,\n    \"start_line\": 6751\n  },\n  {\n    \"end_line\": 6762,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo<em>bar</em>baz</strong></p>\\n\",\n    \"markdown\": \"**foo*bar*baz**\\n\",\n    \"example\": 406,\n    \"start_line\": 6758\n  },\n  {\n    \"end_line\": 6769,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong><em>foo</em> bar</strong></p>\\n\",\n    \"markdown\": \"***foo* bar**\\n\",\n    \"example\": 407,\n    \"start_line\": 6765\n  },\n  {\n    \"end_line\": 6776,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <em>bar</em></strong></p>\\n\",\n    \"markdown\": \"**foo *bar***\\n\",\n    \"example\": 408,\n    \"start_line\": 6772\n  },\n  {\n    \"end_line\": 6787,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <em>bar <strong>baz</strong>\\nbim</em> bop</strong></p>\\n\",\n    \"markdown\": \"**foo *bar **baz**\\nbim* bop**\\n\",\n    \"example\": 409,\n    \"start_line\": 6781\n  },\n  {\n    \"end_line\": 6794,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo <a href=\\\"/url\\\"><em>bar</em></a></strong></p>\\n\",\n    \"markdown\": \"**foo [*bar*](/url)**\\n\",\n    \"example\": 410,\n    \"start_line\": 6790\n  },\n  {\n    \"end_line\": 6803,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__ is not an empty emphasis</p>\\n\",\n    \"markdown\": \"__ is not an empty emphasis\\n\",\n    \"example\": 411,\n    \"start_line\": 6799\n  },\n  {\n    \"end_line\": 6810,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>____ is not an empty strong emphasis</p>\\n\",\n    \"markdown\": \"____ is not an empty strong emphasis\\n\",\n    \"example\": 412,\n    \"start_line\": 6806\n  },\n  {\n    \"end_line\": 6820,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo ***</p>\\n\",\n    \"markdown\": \"foo ***\\n\",\n    \"example\": 413,\n    \"start_line\": 6816\n  },\n  {\n    \"end_line\": 6827,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"markdown\": \"foo *\\\\**\\n\",\n    \"example\": 414,\n    \"start_line\": 6823\n  },\n  {\n    \"end_line\": 6834,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"markdown\": \"foo *_*\\n\",\n    \"example\": 415,\n    \"start_line\": 6830\n  },\n  {\n    \"end_line\": 6841,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo *****</p>\\n\",\n    \"markdown\": \"foo *****\\n\",\n    \"example\": 416,\n    \"start_line\": 6837\n  },\n  {\n    \"end_line\": 6848,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"markdown\": \"foo **\\\\***\\n\",\n    \"example\": 417,\n    \"start_line\": 6844\n  },\n  {\n    \"end_line\": 6855,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"markdown\": \"foo **_**\\n\",\n    \"example\": 418,\n    \"start_line\": 6851\n  },\n  {\n    \"end_line\": 6866,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*<em>foo</em></p>\\n\",\n    \"markdown\": \"**foo*\\n\",\n    \"example\": 419,\n    \"start_line\": 6862\n  },\n  {\n    \"end_line\": 6873,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo</em>*</p>\\n\",\n    \"markdown\": \"*foo**\\n\",\n    \"example\": 420,\n    \"start_line\": 6869\n  },\n  {\n    \"end_line\": 6880,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*<strong>foo</strong></p>\\n\",\n    \"markdown\": \"***foo**\\n\",\n    \"example\": 421,\n    \"start_line\": 6876\n  },\n  {\n    \"end_line\": 6887,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>***<em>foo</em></p>\\n\",\n    \"markdown\": \"****foo*\\n\",\n    \"example\": 422,\n    \"start_line\": 6883\n  },\n  {\n    \"end_line\": 6894,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo</strong>*</p>\\n\",\n    \"markdown\": \"**foo***\\n\",\n    \"example\": 423,\n    \"start_line\": 6890\n  },\n  {\n    \"end_line\": 6901,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo</em>***</p>\\n\",\n    \"markdown\": \"*foo****\\n\",\n    \"example\": 424,\n    \"start_line\": 6897\n  },\n  {\n    \"end_line\": 6911,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo ___</p>\\n\",\n    \"markdown\": \"foo ___\\n\",\n    \"example\": 425,\n    \"start_line\": 6907\n  },\n  {\n    \"end_line\": 6918,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <em>_</em></p>\\n\",\n    \"markdown\": \"foo _\\\\__\\n\",\n    \"example\": 426,\n    \"start_line\": 6914\n  },\n  {\n    \"end_line\": 6925,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <em>*</em></p>\\n\",\n    \"markdown\": \"foo _*_\\n\",\n    \"example\": 427,\n    \"start_line\": 6921\n  },\n  {\n    \"end_line\": 6932,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo _____</p>\\n\",\n    \"markdown\": \"foo _____\\n\",\n    \"example\": 428,\n    \"start_line\": 6928\n  },\n  {\n    \"end_line\": 6939,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <strong>_</strong></p>\\n\",\n    \"markdown\": \"foo __\\\\___\\n\",\n    \"example\": 429,\n    \"start_line\": 6935\n  },\n  {\n    \"end_line\": 6946,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>foo <strong>*</strong></p>\\n\",\n    \"markdown\": \"foo __*__\\n\",\n    \"example\": 430,\n    \"start_line\": 6942\n  },\n  {\n    \"end_line\": 6953,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_<em>foo</em></p>\\n\",\n    \"markdown\": \"__foo_\\n\",\n    \"example\": 431,\n    \"start_line\": 6949\n  },\n  {\n    \"end_line\": 6964,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo</em>_</p>\\n\",\n    \"markdown\": \"_foo__\\n\",\n    \"example\": 432,\n    \"start_line\": 6960\n  },\n  {\n    \"end_line\": 6971,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_<strong>foo</strong></p>\\n\",\n    \"markdown\": \"___foo__\\n\",\n    \"example\": 433,\n    \"start_line\": 6967\n  },\n  {\n    \"end_line\": 6978,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>___<em>foo</em></p>\\n\",\n    \"markdown\": \"____foo_\\n\",\n    \"example\": 434,\n    \"start_line\": 6974\n  },\n  {\n    \"end_line\": 6985,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo</strong>_</p>\\n\",\n    \"markdown\": \"__foo___\\n\",\n    \"example\": 435,\n    \"start_line\": 6981\n  },\n  {\n    \"end_line\": 6992,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo</em>___</p>\\n\",\n    \"markdown\": \"_foo____\\n\",\n    \"example\": 436,\n    \"start_line\": 6988\n  },\n  {\n    \"end_line\": 7002,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"markdown\": \"**foo**\\n\",\n    \"example\": 437,\n    \"start_line\": 6998\n  },\n  {\n    \"end_line\": 7009,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"markdown\": \"*_foo_*\\n\",\n    \"example\": 438,\n    \"start_line\": 7005\n  },\n  {\n    \"end_line\": 7016,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong>foo</strong></p>\\n\",\n    \"markdown\": \"__foo__\\n\",\n    \"example\": 439,\n    \"start_line\": 7012\n  },\n  {\n    \"end_line\": 7023,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><em>foo</em></em></p>\\n\",\n    \"markdown\": \"_*foo*_\\n\",\n    \"example\": 440,\n    \"start_line\": 7019\n  },\n  {\n    \"end_line\": 7033,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"markdown\": \"****foo****\\n\",\n    \"example\": 441,\n    \"start_line\": 7029\n  },\n  {\n    \"end_line\": 7040,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong><strong>foo</strong></strong></p>\\n\",\n    \"markdown\": \"____foo____\\n\",\n    \"example\": 442,\n    \"start_line\": 7036\n  },\n  {\n    \"end_line\": 7051,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><strong><strong><strong>foo</strong></strong></strong></p>\\n\",\n    \"markdown\": \"******foo******\\n\",\n    \"example\": 443,\n    \"start_line\": 7047\n  },\n  {\n    \"end_line\": 7060,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><strong>foo</strong></em></p>\\n\",\n    \"markdown\": \"***foo***\\n\",\n    \"example\": 444,\n    \"start_line\": 7056\n  },\n  {\n    \"end_line\": 7067,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em><strong><strong>foo</strong></strong></em></p>\\n\",\n    \"markdown\": \"_____foo_____\\n\",\n    \"example\": 445,\n    \"start_line\": 7063\n  },\n  {\n    \"end_line\": 7076,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo _bar</em> baz_</p>\\n\",\n    \"markdown\": \"*foo _bar* baz_\\n\",\n    \"example\": 446,\n    \"start_line\": 7072\n  },\n  {\n    \"end_line\": 7083,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>foo <strong>bar *baz bim</strong> bam</em></p>\\n\",\n    \"markdown\": \"*foo __bar *baz bim__ bam*\\n\",\n    \"example\": 447,\n    \"start_line\": 7079\n  },\n  {\n    \"end_line\": 7092,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**foo <strong>bar baz</strong></p>\\n\",\n    \"markdown\": \"**foo **bar baz**\\n\",\n    \"example\": 448,\n    \"start_line\": 7088\n  },\n  {\n    \"end_line\": 7099,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*foo <em>bar baz</em></p>\\n\",\n    \"markdown\": \"*foo *bar baz*\\n\",\n    \"example\": 449,\n    \"start_line\": 7095\n  },\n  {\n    \"end_line\": 7108,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">bar*</a></p>\\n\",\n    \"markdown\": \"*[bar*](/url)\\n\",\n    \"example\": 450,\n    \"start_line\": 7104\n  },\n  {\n    \"end_line\": 7115,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>_foo <a href=\\\"/url\\\">bar_</a></p>\\n\",\n    \"markdown\": \"_foo [bar_](/url)\\n\",\n    \"example\": 451,\n    \"start_line\": 7111\n  },\n  {\n    \"end_line\": 7122,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>*<img src=\\\"foo\\\" title=\\\"*\\\"/></p>\\n\",\n    \"markdown\": \"*<img src=\\\"foo\\\" title=\\\"*\\\"/>\\n\",\n    \"example\": 452,\n    \"start_line\": 7118\n  },\n  {\n    \"end_line\": 7129,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**<a href=\\\"**\\\"></p>\\n\",\n    \"markdown\": \"**<a href=\\\"**\\\">\\n\",\n    \"example\": 453,\n    \"start_line\": 7125\n  },\n  {\n    \"end_line\": 7136,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__<a href=\\\"__\\\"></p>\\n\",\n    \"markdown\": \"__<a href=\\\"__\\\">\\n\",\n    \"example\": 454,\n    \"start_line\": 7132\n  },\n  {\n    \"end_line\": 7143,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>a <code>*</code></em></p>\\n\",\n    \"markdown\": \"*a `*`*\\n\",\n    \"example\": 455,\n    \"start_line\": 7139\n  },\n  {\n    \"end_line\": 7150,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p><em>a <code>_</code></em></p>\\n\",\n    \"markdown\": \"_a `_`_\\n\",\n    \"example\": 456,\n    \"start_line\": 7146\n  },\n  {\n    \"end_line\": 7157,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>**a<a href=\\\"http://foo.bar/?q=**\\\">http://foo.bar/?q=**</a></p>\\n\",\n    \"markdown\": \"**a<http://foo.bar/?q=**>\\n\",\n    \"example\": 457,\n    \"start_line\": 7153\n  },\n  {\n    \"end_line\": 7164,\n    \"section\": \"Emphasis and strong emphasis\",\n    \"html\": \"<p>__a<a href=\\\"http://foo.bar/?q=__\\\">http://foo.bar/?q=__</a></p>\\n\",\n    \"markdown\": \"__a<http://foo.bar/?q=__>\\n\",\n    \"example\": 458,\n    \"start_line\": 7160\n  },\n  {\n    \"end_line\": 7245,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/uri \\\"title\\\")\\n\",\n    \"example\": 459,\n    \"start_line\": 7241\n  },\n  {\n    \"end_line\": 7254,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/uri)\\n\",\n    \"example\": 460,\n    \"start_line\": 7250\n  },\n  {\n    \"end_line\": 7263,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"markdown\": \"[link]()\\n\",\n    \"example\": 461,\n    \"start_line\": 7259\n  },\n  {\n    \"end_line\": 7270,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](<>)\\n\",\n    \"example\": 462,\n    \"start_line\": 7266\n  },\n  {\n    \"end_line\": 7280,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link](/my uri)</p>\\n\",\n    \"markdown\": \"[link](/my uri)\\n\",\n    \"example\": 463,\n    \"start_line\": 7276\n  },\n  {\n    \"end_line\": 7287,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link](&lt;/my uri&gt;)</p>\\n\",\n    \"markdown\": \"[link](</my uri>)\\n\",\n    \"example\": 464,\n    \"start_line\": 7283\n  },\n  {\n    \"end_line\": 7296,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link](foo\\nbar)</p>\\n\",\n    \"markdown\": \"[link](foo\\nbar)\\n\",\n    \"example\": 465,\n    \"start_line\": 7290\n  },\n  {\n    \"end_line\": 7305,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link](<foo\\nbar>)</p>\\n\",\n    \"markdown\": \"[link](<foo\\nbar>)\\n\",\n    \"example\": 466,\n    \"start_line\": 7299\n  },\n  {\n    \"end_line\": 7313,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"(foo)\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](\\\\(foo\\\\))\\n\",\n    \"example\": 467,\n    \"start_line\": 7309\n  },\n  {\n    \"end_line\": 7322,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo(and(bar))\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](foo(and(bar)))\\n\",\n    \"example\": 468,\n    \"start_line\": 7318\n  },\n  {\n    \"end_line\": 7331,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](foo\\\\(and\\\\(bar\\\\))\\n\",\n    \"example\": 469,\n    \"start_line\": 7327\n  },\n  {\n    \"end_line\": 7338,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo(and(bar)\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](<foo(and(bar)>)\\n\",\n    \"example\": 470,\n    \"start_line\": 7334\n  },\n  {\n    \"end_line\": 7348,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo):\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](foo\\\\)\\\\:)\\n\",\n    \"example\": 471,\n    \"start_line\": 7344\n  },\n  {\n    \"end_line\": 7363,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"#fragment\\\">link</a></p>\\n<p><a href=\\\"http://example.com#fragment\\\">link</a></p>\\n<p><a href=\\\"http://example.com?foo=3#frag\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](#fragment)\\n\\n[link](http://example.com#fragment)\\n\\n[link](http://example.com?foo=3#frag)\\n\",\n    \"example\": 472,\n    \"start_line\": 7353\n  },\n  {\n    \"end_line\": 7373,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo%5Cbar\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](foo\\\\bar)\\n\",\n    \"example\": 473,\n    \"start_line\": 7369\n  },\n  {\n    \"end_line\": 7389,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"foo%20b%C3%A4\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](foo%20b&auml;)\\n\",\n    \"example\": 474,\n    \"start_line\": 7385\n  },\n  {\n    \"end_line\": 7400,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"%22title%22\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](\\\"title\\\")\\n\",\n    \"example\": 475,\n    \"start_line\": 7396\n  },\n  {\n    \"end_line\": 7413,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a>\\n<a href=\\\"/url\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/url \\\"title\\\")\\n[link](/url 'title')\\n[link](/url (title))\\n\",\n    \"example\": 476,\n    \"start_line\": 7405\n  },\n  {\n    \"end_line\": 7423,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;&quot;\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/url \\\"title \\\\\\\"&quot;\\\")\\n\",\n    \"example\": 477,\n    \"start_line\": 7419\n  },\n  {\n    \"end_line\": 7433,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url%C2%A0%22title%22\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/url \\\"title\\\")\\n\",\n    \"example\": 478,\n    \"start_line\": 7429\n  },\n  {\n    \"end_line\": 7442,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>\\n\",\n    \"markdown\": \"[link](/url \\\"title \\\"and\\\" title\\\")\\n\",\n    \"example\": 479,\n    \"start_line\": 7438\n  },\n  {\n    \"end_line\": 7451,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title &quot;and&quot; title\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](/url 'title \\\"and\\\" title')\\n\",\n    \"example\": 480,\n    \"start_line\": 7447\n  },\n  {\n    \"end_line\": 7476,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\" title=\\\"title\\\">link</a></p>\\n\",\n    \"markdown\": \"[link](   /uri\\n  \\\"title\\\"  )\\n\",\n    \"example\": 481,\n    \"start_line\": 7471\n  },\n  {\n    \"end_line\": 7486,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link] (/uri)</p>\\n\",\n    \"markdown\": \"[link] (/uri)\\n\",\n    \"example\": 482,\n    \"start_line\": 7482\n  },\n  {\n    \"end_line\": 7496,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"markdown\": \"[link [foo [bar]]](/uri)\\n\",\n    \"example\": 483,\n    \"start_line\": 7492\n  },\n  {\n    \"end_line\": 7503,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link] bar](/uri)</p>\\n\",\n    \"markdown\": \"[link] bar](/uri)\\n\",\n    \"example\": 484,\n    \"start_line\": 7499\n  },\n  {\n    \"end_line\": 7510,\n    \"section\": \"Links\",\n    \"html\": \"<p>[link <a href=\\\"/uri\\\">bar</a></p>\\n\",\n    \"markdown\": \"[link [bar](/uri)\\n\",\n    \"example\": 485,\n    \"start_line\": 7506\n  },\n  {\n    \"end_line\": 7517,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"markdown\": \"[link \\\\[bar](/uri)\\n\",\n    \"example\": 486,\n    \"start_line\": 7513\n  },\n  {\n    \"end_line\": 7526,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"markdown\": \"[link *foo **bar** `#`*](/uri)\\n\",\n    \"example\": 487,\n    \"start_line\": 7522\n  },\n  {\n    \"end_line\": 7533,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"markdown\": \"[![moon](moon.jpg)](/uri)\\n\",\n    \"example\": 488,\n    \"start_line\": 7529\n  },\n  {\n    \"end_line\": 7542,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>](/uri)</p>\\n\",\n    \"markdown\": \"[foo [bar](/uri)](/uri)\\n\",\n    \"example\": 489,\n    \"start_line\": 7538\n  },\n  {\n    \"end_line\": 7549,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <em>[bar <a href=\\\"/uri\\\">baz</a>](/uri)</em>](/uri)</p>\\n\",\n    \"markdown\": \"[foo *[bar [baz](/uri)](/uri)*](/uri)\\n\",\n    \"example\": 490,\n    \"start_line\": 7545\n  },\n  {\n    \"end_line\": 7556,\n    \"section\": \"Links\",\n    \"html\": \"<p><img src=\\\"uri3\\\" alt=\\\"[foo](uri2)\\\" /></p>\\n\",\n    \"markdown\": \"![[[foo](uri1)](uri2)](uri3)\\n\",\n    \"example\": 491,\n    \"start_line\": 7552\n  },\n  {\n    \"end_line\": 7566,\n    \"section\": \"Links\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"markdown\": \"*[foo*](/uri)\\n\",\n    \"example\": 492,\n    \"start_line\": 7562\n  },\n  {\n    \"end_line\": 7573,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"baz*\\\">foo *bar</a></p>\\n\",\n    \"markdown\": \"[foo *bar](baz*)\\n\",\n    \"example\": 493,\n    \"start_line\": 7569\n  },\n  {\n    \"end_line\": 7583,\n    \"section\": \"Links\",\n    \"html\": \"<p><em>foo [bar</em> baz]</p>\\n\",\n    \"markdown\": \"*foo [bar* baz]\\n\",\n    \"example\": 494,\n    \"start_line\": 7579\n  },\n  {\n    \"end_line\": 7593,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <bar attr=\\\"](baz)\\\"></p>\\n\",\n    \"markdown\": \"[foo <bar attr=\\\"](baz)\\\">\\n\",\n    \"example\": 495,\n    \"start_line\": 7589\n  },\n  {\n    \"end_line\": 7600,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo<code>](/uri)</code></p>\\n\",\n    \"markdown\": \"[foo`](/uri)`\\n\",\n    \"example\": 496,\n    \"start_line\": 7596\n  },\n  {\n    \"end_line\": 7607,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo<a href=\\\"http://example.com/?search=%5D(uri)\\\">http://example.com/?search=](uri)</a></p>\\n\",\n    \"markdown\": \"[foo<http://example.com/?search=](uri)>\\n\",\n    \"example\": 497,\n    \"start_line\": 7603\n  },\n  {\n    \"end_line\": 7647,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"example\": 498,\n    \"start_line\": 7641\n  },\n  {\n    \"end_line\": 7662,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [foo [bar]]</a></p>\\n\",\n    \"markdown\": \"[link [foo [bar]]][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 499,\n    \"start_line\": 7656\n  },\n  {\n    \"end_line\": 7671,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link [bar</a></p>\\n\",\n    \"markdown\": \"[link \\\\[bar][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 500,\n    \"start_line\": 7665\n  },\n  {\n    \"end_line\": 7682,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>\\n\",\n    \"markdown\": \"[link *foo **bar** `#`*][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 501,\n    \"start_line\": 7676\n  },\n  {\n    \"end_line\": 7691,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\"><img src=\\\"moon.jpg\\\" alt=\\\"moon\\\" /></a></p>\\n\",\n    \"markdown\": \"[![moon](moon.jpg)][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 502,\n    \"start_line\": 7685\n  },\n  {\n    \"end_line\": 7702,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <a href=\\\"/uri\\\">bar</a>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"markdown\": \"[foo [bar](/uri)][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 503,\n    \"start_line\": 7696\n  },\n  {\n    \"end_line\": 7711,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <em>bar <a href=\\\"/uri\\\">baz</a></em>]<a href=\\\"/uri\\\">ref</a></p>\\n\",\n    \"markdown\": \"[foo *bar [baz][ref]*][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 504,\n    \"start_line\": 7705\n  },\n  {\n    \"end_line\": 7726,\n    \"section\": \"Links\",\n    \"html\": \"<p>*<a href=\\\"/uri\\\">foo*</a></p>\\n\",\n    \"markdown\": \"*[foo*][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 505,\n    \"start_line\": 7720\n  },\n  {\n    \"end_line\": 7735,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo *bar</a></p>\\n\",\n    \"markdown\": \"[foo *bar][ref]\\n\\n[ref]: /uri\\n\",\n    \"example\": 506,\n    \"start_line\": 7729\n  },\n  {\n    \"end_line\": 7747,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo <bar attr=\\\"][ref]\\\"></p>\\n\",\n    \"markdown\": \"[foo <bar attr=\\\"][ref]\\\">\\n\\n[ref]: /uri\\n\",\n    \"example\": 507,\n    \"start_line\": 7741\n  },\n  {\n    \"end_line\": 7756,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo<code>][ref]</code></p>\\n\",\n    \"markdown\": \"[foo`][ref]`\\n\\n[ref]: /uri\\n\",\n    \"example\": 508,\n    \"start_line\": 7750\n  },\n  {\n    \"end_line\": 7765,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo<a href=\\\"http://example.com/?search=%5D%5Bref%5D\\\">http://example.com/?search=][ref]</a></p>\\n\",\n    \"markdown\": \"[foo<http://example.com/?search=][ref]>\\n\\n[ref]: /uri\\n\",\n    \"example\": 509,\n    \"start_line\": 7759\n  },\n  {\n    \"end_line\": 7776,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][BaR]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"example\": 510,\n    \"start_line\": 7770\n  },\n  {\n    \"end_line\": 7787,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\">Толпой</a> is a Russian word.</p>\\n\",\n    \"markdown\": \"[Толпой][Толпой] is a Russian word.\\n\\n[ТОЛПОЙ]: /url\\n\",\n    \"example\": 511,\n    \"start_line\": 7781\n  },\n  {\n    \"end_line\": 7800,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\">Baz</a></p>\\n\",\n    \"markdown\": \"[Foo\\n  bar]: /url\\n\\n[Baz][Foo bar]\\n\",\n    \"example\": 512,\n    \"start_line\": 7793\n  },\n  {\n    \"end_line\": 7812,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo] <a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"markdown\": \"[foo] [bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"example\": 513,\n    \"start_line\": 7806\n  },\n  {\n    \"end_line\": 7823,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo]\\n<a href=\\\"/url\\\" title=\\\"title\\\">bar</a></p>\\n\",\n    \"markdown\": \"[foo]\\n[bar]\\n\\n[bar]: /url \\\"title\\\"\\n\",\n    \"example\": 514,\n    \"start_line\": 7815\n  },\n  {\n    \"end_line\": 7864,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"markdown\": \"[foo]: /url1\\n\\n[foo]: /url2\\n\\n[bar][foo]\\n\",\n    \"example\": 515,\n    \"start_line\": 7856\n  },\n  {\n    \"end_line\": 7877,\n    \"section\": \"Links\",\n    \"html\": \"<p>[bar][foo!]</p>\\n\",\n    \"markdown\": \"[bar][foo\\\\!]\\n\\n[foo!]: /url\\n\",\n    \"example\": 516,\n    \"start_line\": 7871\n  },\n  {\n    \"end_line\": 7890,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo][ref[]</p>\\n<p>[ref[]: /uri</p>\\n\",\n    \"markdown\": \"[foo][ref[]\\n\\n[ref[]: /uri\\n\",\n    \"example\": 517,\n    \"start_line\": 7883\n  },\n  {\n    \"end_line\": 7900,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo][ref[bar]]</p>\\n<p>[ref[bar]]: /uri</p>\\n\",\n    \"markdown\": \"[foo][ref[bar]]\\n\\n[ref[bar]]: /uri\\n\",\n    \"example\": 518,\n    \"start_line\": 7893\n  },\n  {\n    \"end_line\": 7910,\n    \"section\": \"Links\",\n    \"html\": \"<p>[[[foo]]]</p>\\n<p>[[[foo]]]: /url</p>\\n\",\n    \"markdown\": \"[[[foo]]]\\n\\n[[[foo]]]: /url\\n\",\n    \"example\": 519,\n    \"start_line\": 7903\n  },\n  {\n    \"end_line\": 7919,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][ref\\\\[]\\n\\n[ref\\\\[]: /uri\\n\",\n    \"example\": 520,\n    \"start_line\": 7913\n  },\n  {\n    \"end_line\": 7930,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/uri\\\">bar\\\\</a></p>\\n\",\n    \"markdown\": \"[bar\\\\\\\\]: /uri\\n\\n[bar\\\\\\\\]\\n\",\n    \"example\": 521,\n    \"start_line\": 7924\n  },\n  {\n    \"end_line\": 7942,\n    \"section\": \"Links\",\n    \"html\": \"<p>[]</p>\\n<p>[]: /uri</p>\\n\",\n    \"markdown\": \"[]\\n\\n[]: /uri\\n\",\n    \"example\": 522,\n    \"start_line\": 7935\n  },\n  {\n    \"end_line\": 7956,\n    \"section\": \"Links\",\n    \"html\": \"<p>[\\n]</p>\\n<p>[\\n]: /uri</p>\\n\",\n    \"markdown\": \"[\\n ]\\n\\n[\\n ]: /uri\\n\",\n    \"example\": 523,\n    \"start_line\": 7945\n  },\n  {\n    \"end_line\": 7974,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 524,\n    \"start_line\": 7968\n  },\n  {\n    \"end_line\": 7983,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"markdown\": \"[*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"example\": 525,\n    \"start_line\": 7977\n  },\n  {\n    \"end_line\": 7994,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"markdown\": \"[Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 526,\n    \"start_line\": 7988\n  },\n  {\n    \"end_line\": 8009,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a>\\n[]</p>\\n\",\n    \"markdown\": \"[foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 527,\n    \"start_line\": 8001\n  },\n  {\n    \"end_line\": 8027,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 528,\n    \"start_line\": 8021\n  },\n  {\n    \"end_line\": 8036,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a></p>\\n\",\n    \"markdown\": \"[*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"example\": 529,\n    \"start_line\": 8030\n  },\n  {\n    \"end_line\": 8045,\n    \"section\": \"Links\",\n    \"html\": \"<p>[<a href=\\\"/url\\\" title=\\\"title\\\"><em>foo</em> bar</a>]</p>\\n\",\n    \"markdown\": \"[[*foo* bar]]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"example\": 530,\n    \"start_line\": 8039\n  },\n  {\n    \"end_line\": 8054,\n    \"section\": \"Links\",\n    \"html\": \"<p>[[bar <a href=\\\"/url\\\">foo</a></p>\\n\",\n    \"markdown\": \"[[bar [foo]\\n\\n[foo]: /url\\n\",\n    \"example\": 531,\n    \"start_line\": 8048\n  },\n  {\n    \"end_line\": 8065,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\" title=\\\"title\\\">Foo</a></p>\\n\",\n    \"markdown\": \"[Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 532,\n    \"start_line\": 8059\n  },\n  {\n    \"end_line\": 8076,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url\\\">foo</a> bar</p>\\n\",\n    \"markdown\": \"[foo] bar\\n\\n[foo]: /url\\n\",\n    \"example\": 533,\n    \"start_line\": 8070\n  },\n  {\n    \"end_line\": 8088,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo]</p>\\n\",\n    \"markdown\": \"\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 534,\n    \"start_line\": 8082\n  },\n  {\n    \"end_line\": 8100,\n    \"section\": \"Links\",\n    \"html\": \"<p>*<a href=\\\"/url\\\">foo*</a></p>\\n\",\n    \"markdown\": \"[foo*]: /url\\n\\n*[foo*]\\n\",\n    \"example\": 535,\n    \"start_line\": 8094\n  },\n  {\n    \"end_line\": 8113,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][bar]\\n\\n[foo]: /url1\\n[bar]: /url2\\n\",\n    \"example\": 536,\n    \"start_line\": 8106\n  },\n  {\n    \"end_line\": 8121,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo][]\\n\\n[foo]: /url1\\n\",\n    \"example\": 537,\n    \"start_line\": 8115\n  },\n  {\n    \"end_line\": 8131,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"\\\">foo</a></p>\\n\",\n    \"markdown\": \"[foo]()\\n\\n[foo]: /url1\\n\",\n    \"example\": 538,\n    \"start_line\": 8125\n  },\n  {\n    \"end_line\": 8139,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url1\\\">foo</a>(not a link)</p>\\n\",\n    \"markdown\": \"[foo](not a link)\\n\\n[foo]: /url1\\n\",\n    \"example\": 539,\n    \"start_line\": 8133\n  },\n  {\n    \"end_line\": 8150,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo]<a href=\\\"/url\\\">bar</a></p>\\n\",\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url\\n\",\n    \"example\": 540,\n    \"start_line\": 8144\n  },\n  {\n    \"end_line\": 8163,\n    \"section\": \"Links\",\n    \"html\": \"<p><a href=\\\"/url2\\\">foo</a><a href=\\\"/url1\\\">baz</a></p>\\n\",\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[bar]: /url2\\n\",\n    \"example\": 541,\n    \"start_line\": 8156\n  },\n  {\n    \"end_line\": 8176,\n    \"section\": \"Links\",\n    \"html\": \"<p>[foo]<a href=\\\"/url1\\\">bar</a></p>\\n\",\n    \"markdown\": \"[foo][bar][baz]\\n\\n[baz]: /url1\\n[foo]: /url2\\n\",\n    \"example\": 542,\n    \"start_line\": 8169\n  },\n  {\n    \"end_line\": 8196,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![foo](/url \\\"title\\\")\\n\",\n    \"example\": 543,\n    \"start_line\": 8192\n  },\n  {\n    \"end_line\": 8205,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"markdown\": \"![foo *bar*]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"example\": 544,\n    \"start_line\": 8199\n  },\n  {\n    \"end_line\": 8212,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"markdown\": \"![foo ![bar](/url)](/url2)\\n\",\n    \"example\": 545,\n    \"start_line\": 8208\n  },\n  {\n    \"end_line\": 8219,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url2\\\" alt=\\\"foo bar\\\" /></p>\\n\",\n    \"markdown\": \"![foo [bar](/url)](/url2)\\n\",\n    \"example\": 546,\n    \"start_line\": 8215\n  },\n  {\n    \"end_line\": 8235,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"markdown\": \"![foo *bar*][]\\n\\n[foo *bar*]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"example\": 547,\n    \"start_line\": 8229\n  },\n  {\n    \"end_line\": 8244,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"train &amp; tracks\\\" /></p>\\n\",\n    \"markdown\": \"![foo *bar*][foobar]\\n\\n[FOOBAR]: train.jpg \\\"train & tracks\\\"\\n\",\n    \"example\": 548,\n    \"start_line\": 8238\n  },\n  {\n    \"end_line\": 8251,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"train.jpg\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"markdown\": \"![foo](train.jpg)\\n\",\n    \"example\": 549,\n    \"start_line\": 8247\n  },\n  {\n    \"end_line\": 8258,\n    \"section\": \"Images\",\n    \"html\": \"<p>My <img src=\\\"/path/to/train.jpg\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"My ![foo bar](/path/to/train.jpg  \\\"title\\\"   )\\n\",\n    \"example\": 550,\n    \"start_line\": 8254\n  },\n  {\n    \"end_line\": 8265,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"markdown\": \"![foo](<url>)\\n\",\n    \"example\": 551,\n    \"start_line\": 8261\n  },\n  {\n    \"end_line\": 8272,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"\\\" /></p>\\n\",\n    \"markdown\": \"![](/url)\\n\",\n    \"example\": 552,\n    \"start_line\": 8268\n  },\n  {\n    \"end_line\": 8283,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"markdown\": \"![foo][bar]\\n\\n[bar]: /url\\n\",\n    \"example\": 553,\n    \"start_line\": 8277\n  },\n  {\n    \"end_line\": 8292,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" /></p>\\n\",\n    \"markdown\": \"![foo][bar]\\n\\n[BAR]: /url\\n\",\n    \"example\": 554,\n    \"start_line\": 8286\n  },\n  {\n    \"end_line\": 8303,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 555,\n    \"start_line\": 8297\n  },\n  {\n    \"end_line\": 8312,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![*foo* bar][]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"example\": 556,\n    \"start_line\": 8306\n  },\n  {\n    \"end_line\": 8323,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![Foo][]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 557,\n    \"start_line\": 8317\n  },\n  {\n    \"end_line\": 8337,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" />\\n[]</p>\\n\",\n    \"markdown\": \"![foo] \\n[]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 558,\n    \"start_line\": 8329\n  },\n  {\n    \"end_line\": 8348,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 559,\n    \"start_line\": 8342\n  },\n  {\n    \"end_line\": 8357,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"foo bar\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![*foo* bar]\\n\\n[*foo* bar]: /url \\\"title\\\"\\n\",\n    \"example\": 560,\n    \"start_line\": 8351\n  },\n  {\n    \"end_line\": 8369,\n    \"section\": \"Images\",\n    \"html\": \"<p>![[foo]]</p>\\n<p>[[foo]]: /url &quot;title&quot;</p>\\n\",\n    \"markdown\": \"![[foo]]\\n\\n[[foo]]: /url \\\"title\\\"\\n\",\n    \"example\": 561,\n    \"start_line\": 8362\n  },\n  {\n    \"end_line\": 8380,\n    \"section\": \"Images\",\n    \"html\": \"<p><img src=\\\"/url\\\" alt=\\\"Foo\\\" title=\\\"title\\\" /></p>\\n\",\n    \"markdown\": \"![Foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 562,\n    \"start_line\": 8374\n  },\n  {\n    \"end_line\": 8392,\n    \"section\": \"Images\",\n    \"html\": \"<p>![foo]</p>\\n\",\n    \"markdown\": \"!\\\\[foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 563,\n    \"start_line\": 8386\n  },\n  {\n    \"end_line\": 8404,\n    \"section\": \"Images\",\n    \"html\": \"<p>!<a href=\\\"/url\\\" title=\\\"title\\\">foo</a></p>\\n\",\n    \"markdown\": \"\\\\![foo]\\n\\n[foo]: /url \\\"title\\\"\\n\",\n    \"example\": 564,\n    \"start_line\": 8398\n  },\n  {\n    \"end_line\": 8435,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"http://foo.bar.baz\\\">http://foo.bar.baz</a></p>\\n\",\n    \"markdown\": \"<http://foo.bar.baz>\\n\",\n    \"example\": 565,\n    \"start_line\": 8431\n  },\n  {\n    \"end_line\": 8442,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean\\\">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>\\n\",\n    \"markdown\": \"<http://foo.bar.baz/test?q=hello&id=22&boolean>\\n\",\n    \"example\": 566,\n    \"start_line\": 8438\n  },\n  {\n    \"end_line\": 8449,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"irc://foo.bar:2233/baz\\\">irc://foo.bar:2233/baz</a></p>\\n\",\n    \"markdown\": \"<irc://foo.bar:2233/baz>\\n\",\n    \"example\": 567,\n    \"start_line\": 8445\n  },\n  {\n    \"end_line\": 8458,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"MAILTO:FOO@BAR.BAZ\\\">MAILTO:FOO@BAR.BAZ</a></p>\\n\",\n    \"markdown\": \"<MAILTO:FOO@BAR.BAZ>\\n\",\n    \"example\": 568,\n    \"start_line\": 8454\n  },\n  {\n    \"end_line\": 8470,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"a+b+c:d\\\">a+b+c:d</a></p>\\n\",\n    \"markdown\": \"<a+b+c:d>\\n\",\n    \"example\": 569,\n    \"start_line\": 8466\n  },\n  {\n    \"end_line\": 8477,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"made-up-scheme://foo,bar\\\">made-up-scheme://foo,bar</a></p>\\n\",\n    \"markdown\": \"<made-up-scheme://foo,bar>\\n\",\n    \"example\": 570,\n    \"start_line\": 8473\n  },\n  {\n    \"end_line\": 8484,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"http://../\\\">http://../</a></p>\\n\",\n    \"markdown\": \"<http://../>\\n\",\n    \"example\": 571,\n    \"start_line\": 8480\n  },\n  {\n    \"end_line\": 8491,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"localhost:5001/foo\\\">localhost:5001/foo</a></p>\\n\",\n    \"markdown\": \"<localhost:5001/foo>\\n\",\n    \"example\": 572,\n    \"start_line\": 8487\n  },\n  {\n    \"end_line\": 8500,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt;http://foo.bar/baz bim&gt;</p>\\n\",\n    \"markdown\": \"<http://foo.bar/baz bim>\\n\",\n    \"example\": 573,\n    \"start_line\": 8496\n  },\n  {\n    \"end_line\": 8509,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"http://example.com/%5C%5B%5C\\\">http://example.com/\\\\[\\\\</a></p>\\n\",\n    \"markdown\": \"<http://example.com/\\\\[\\\\>\\n\",\n    \"example\": 574,\n    \"start_line\": 8505\n  },\n  {\n    \"end_line\": 8531,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"mailto:foo@bar.example.com\\\">foo@bar.example.com</a></p>\\n\",\n    \"markdown\": \"<foo@bar.example.com>\\n\",\n    \"example\": 575,\n    \"start_line\": 8527\n  },\n  {\n    \"end_line\": 8538,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p><a href=\\\"mailto:foo+special@Bar.baz-bar0.com\\\">foo+special@Bar.baz-bar0.com</a></p>\\n\",\n    \"markdown\": \"<foo+special@Bar.baz-bar0.com>\\n\",\n    \"example\": 576,\n    \"start_line\": 8534\n  },\n  {\n    \"end_line\": 8547,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt;foo+@bar.example.com&gt;</p>\\n\",\n    \"markdown\": \"<foo\\\\+@bar.example.com>\\n\",\n    \"example\": 577,\n    \"start_line\": 8543\n  },\n  {\n    \"end_line\": 8556,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt;&gt;</p>\\n\",\n    \"markdown\": \"<>\\n\",\n    \"example\": 578,\n    \"start_line\": 8552\n  },\n  {\n    \"end_line\": 8563,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt; http://foo.bar &gt;</p>\\n\",\n    \"markdown\": \"< http://foo.bar >\\n\",\n    \"example\": 579,\n    \"start_line\": 8559\n  },\n  {\n    \"end_line\": 8570,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt;m:abc&gt;</p>\\n\",\n    \"markdown\": \"<m:abc>\\n\",\n    \"example\": 580,\n    \"start_line\": 8566\n  },\n  {\n    \"end_line\": 8577,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>&lt;foo.bar.baz&gt;</p>\\n\",\n    \"markdown\": \"<foo.bar.baz>\\n\",\n    \"example\": 581,\n    \"start_line\": 8573\n  },\n  {\n    \"end_line\": 8584,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>http://example.com</p>\\n\",\n    \"markdown\": \"http://example.com\\n\",\n    \"example\": 582,\n    \"start_line\": 8580\n  },\n  {\n    \"end_line\": 8591,\n    \"section\": \"Autolinks\",\n    \"html\": \"<p>foo@bar.example.com</p>\\n\",\n    \"markdown\": \"foo@bar.example.com\\n\",\n    \"example\": 583,\n    \"start_line\": 8587\n  },\n  {\n    \"end_line\": 8673,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p><a><bab><c2c></p>\\n\",\n    \"markdown\": \"<a><bab><c2c>\\n\",\n    \"example\": 584,\n    \"start_line\": 8669\n  },\n  {\n    \"end_line\": 8682,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p><a/><b2/></p>\\n\",\n    \"markdown\": \"<a/><b2/>\\n\",\n    \"example\": 585,\n    \"start_line\": 8678\n  },\n  {\n    \"end_line\": 8693,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p><a  /><b2\\ndata=\\\"foo\\\" ></p>\\n\",\n    \"markdown\": \"<a  /><b2\\ndata=\\\"foo\\\" >\\n\",\n    \"example\": 586,\n    \"start_line\": 8687\n  },\n  {\n    \"end_line\": 8704,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p><a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 /></p>\\n\",\n    \"markdown\": \"<a foo=\\\"bar\\\" bam = 'baz <em>\\\"</em>'\\n_boolean zoop:33=zoop:33 />\\n\",\n    \"example\": 587,\n    \"start_line\": 8698\n  },\n  {\n    \"end_line\": 8713,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>Foo <responsive-image src=\\\"foo.jpg\\\" /></p>\\n\",\n    \"markdown\": \"Foo <responsive-image src=\\\"foo.jpg\\\" />\\n\",\n    \"example\": 588,\n    \"start_line\": 8709\n  },\n  {\n    \"end_line\": 8722,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;33&gt; &lt;__&gt;</p>\\n\",\n    \"markdown\": \"<33> <__>\\n\",\n    \"example\": 589,\n    \"start_line\": 8718\n  },\n  {\n    \"end_line\": 8731,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>\\n\",\n    \"markdown\": \"<a h*#ref=\\\"hi\\\">\\n\",\n    \"example\": 590,\n    \"start_line\": 8727\n  },\n  {\n    \"end_line\": 8740,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>\\n\",\n    \"markdown\": \"<a href=\\\"hi'> <a href=hi'>\\n\",\n    \"example\": 591,\n    \"start_line\": 8736\n  },\n  {\n    \"end_line\": 8751,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt; a&gt;&lt;\\nfoo&gt;&lt;bar/ &gt;</p>\\n\",\n    \"markdown\": \"< a><\\nfoo><bar/ >\\n\",\n    \"example\": 592,\n    \"start_line\": 8745\n  },\n  {\n    \"end_line\": 8760,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;a href='bar'title=title&gt;</p>\\n\",\n    \"markdown\": \"<a href='bar'title=title>\\n\",\n    \"example\": 593,\n    \"start_line\": 8756\n  },\n  {\n    \"end_line\": 8769,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p></a></foo ></p>\\n\",\n    \"markdown\": \"</a></foo >\\n\",\n    \"example\": 594,\n    \"start_line\": 8765\n  },\n  {\n    \"end_line\": 8778,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;/a href=&quot;foo&quot;&gt;</p>\\n\",\n    \"markdown\": \"</a href=\\\"foo\\\">\\n\",\n    \"example\": 595,\n    \"start_line\": 8774\n  },\n  {\n    \"end_line\": 8789,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <!-- this is a\\ncomment - with hyphen --></p>\\n\",\n    \"markdown\": \"foo <!-- this is a\\ncomment - with hyphen -->\\n\",\n    \"example\": 596,\n    \"start_line\": 8783\n  },\n  {\n    \"end_line\": 8796,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>\\n\",\n    \"markdown\": \"foo <!-- not a comment -- two hyphens -->\\n\",\n    \"example\": 597,\n    \"start_line\": 8792\n  },\n  {\n    \"end_line\": 8808,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo &lt;!--&gt; foo --&gt;</p>\\n<p>foo &lt;!-- foo---&gt;</p>\\n\",\n    \"markdown\": \"foo <!--> foo -->\\n\\nfoo <!-- foo--->\\n\",\n    \"example\": 598,\n    \"start_line\": 8801\n  },\n  {\n    \"end_line\": 8817,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <?php echo $a; ?></p>\\n\",\n    \"markdown\": \"foo <?php echo $a; ?>\\n\",\n    \"example\": 599,\n    \"start_line\": 8813\n  },\n  {\n    \"end_line\": 8826,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <!ELEMENT br EMPTY></p>\\n\",\n    \"markdown\": \"foo <!ELEMENT br EMPTY>\\n\",\n    \"example\": 600,\n    \"start_line\": 8822\n  },\n  {\n    \"end_line\": 8835,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <![CDATA[>&<]]></p>\\n\",\n    \"markdown\": \"foo <![CDATA[>&<]]>\\n\",\n    \"example\": 601,\n    \"start_line\": 8831\n  },\n  {\n    \"end_line\": 8845,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <a href=\\\"&ouml;\\\"></p>\\n\",\n    \"markdown\": \"foo <a href=\\\"&ouml;\\\">\\n\",\n    \"example\": 602,\n    \"start_line\": 8841\n  },\n  {\n    \"end_line\": 8854,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>foo <a href=\\\"\\\\*\\\"></p>\\n\",\n    \"markdown\": \"foo <a href=\\\"\\\\*\\\">\\n\",\n    \"example\": 603,\n    \"start_line\": 8850\n  },\n  {\n    \"end_line\": 8861,\n    \"section\": \"Raw HTML\",\n    \"html\": \"<p>&lt;a href=&quot;&quot;&quot;&gt;</p>\\n\",\n    \"markdown\": \"<a href=\\\"\\\\\\\"\\\">\\n\",\n    \"example\": 604,\n    \"start_line\": 8857\n  },\n  {\n    \"end_line\": 8877,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"markdown\": \"foo  \\nbaz\\n\",\n    \"example\": 605,\n    \"start_line\": 8871\n  },\n  {\n    \"end_line\": 8889,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"markdown\": \"foo\\\\\\nbaz\\n\",\n    \"example\": 606,\n    \"start_line\": 8883\n  },\n  {\n    \"end_line\": 8900,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo<br />\\nbaz</p>\\n\",\n    \"markdown\": \"foo       \\nbaz\\n\",\n    \"example\": 607,\n    \"start_line\": 8894\n  },\n  {\n    \"end_line\": 8911,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"markdown\": \"foo  \\n     bar\\n\",\n    \"example\": 608,\n    \"start_line\": 8905\n  },\n  {\n    \"end_line\": 8920,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo<br />\\nbar</p>\\n\",\n    \"markdown\": \"foo\\\\\\n     bar\\n\",\n    \"example\": 609,\n    \"start_line\": 8914\n  },\n  {\n    \"end_line\": 8932,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"markdown\": \"*foo  \\nbar*\\n\",\n    \"example\": 610,\n    \"start_line\": 8926\n  },\n  {\n    \"end_line\": 8941,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><em>foo<br />\\nbar</em></p>\\n\",\n    \"markdown\": \"*foo\\\\\\nbar*\\n\",\n    \"example\": 611,\n    \"start_line\": 8935\n  },\n  {\n    \"end_line\": 8951,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><code>code span</code></p>\\n\",\n    \"markdown\": \"`code  \\nspan`\\n\",\n    \"example\": 612,\n    \"start_line\": 8946\n  },\n  {\n    \"end_line\": 8959,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><code>code\\\\ span</code></p>\\n\",\n    \"markdown\": \"`code\\\\\\nspan`\\n\",\n    \"example\": 613,\n    \"start_line\": 8954\n  },\n  {\n    \"end_line\": 8970,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><a href=\\\"foo  \\nbar\\\"></p>\\n\",\n    \"markdown\": \"<a href=\\\"foo  \\nbar\\\">\\n\",\n    \"example\": 614,\n    \"start_line\": 8964\n  },\n  {\n    \"end_line\": 8979,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p><a href=\\\"foo\\\\\\nbar\\\"></p>\\n\",\n    \"markdown\": \"<a href=\\\"foo\\\\\\nbar\\\">\\n\",\n    \"example\": 615,\n    \"start_line\": 8973\n  },\n  {\n    \"end_line\": 8990,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo\\\\</p>\\n\",\n    \"markdown\": \"foo\\\\\\n\",\n    \"example\": 616,\n    \"start_line\": 8986\n  },\n  {\n    \"end_line\": 8997,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<p>foo</p>\\n\",\n    \"markdown\": \"foo  \\n\",\n    \"example\": 617,\n    \"start_line\": 8993\n  },\n  {\n    \"end_line\": 9004,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<h3>foo\\\\</h3>\\n\",\n    \"markdown\": \"### foo\\\\\\n\",\n    \"example\": 618,\n    \"start_line\": 9000\n  },\n  {\n    \"end_line\": 9011,\n    \"section\": \"Hard line breaks\",\n    \"html\": \"<h3>foo</h3>\\n\",\n    \"markdown\": \"### foo  \\n\",\n    \"example\": 619,\n    \"start_line\": 9007\n  },\n  {\n    \"end_line\": 9028,\n    \"section\": \"Soft line breaks\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"markdown\": \"foo\\nbaz\\n\",\n    \"example\": 620,\n    \"start_line\": 9022\n  },\n  {\n    \"end_line\": 9040,\n    \"section\": \"Soft line breaks\",\n    \"html\": \"<p>foo\\nbaz</p>\\n\",\n    \"markdown\": \"foo \\n baz\\n\",\n    \"example\": 621,\n    \"start_line\": 9034\n  },\n  {\n    \"end_line\": 9058,\n    \"section\": \"Textual content\",\n    \"html\": \"<p>hello $.;'there</p>\\n\",\n    \"markdown\": \"hello $.;'there\\n\",\n    \"example\": 622,\n    \"start_line\": 9054\n  },\n  {\n    \"end_line\": 9065,\n    \"section\": \"Textual content\",\n    \"html\": \"<p>Foo χρῆν</p>\\n\",\n    \"markdown\": \"Foo χρῆν\\n\",\n    \"example\": 623,\n    \"start_line\": 9061\n  },\n  {\n    \"end_line\": 9074,\n    \"section\": \"Textual content\",\n    \"html\": \"<p>Multiple     spaces</p>\\n\",\n    \"markdown\": \"Multiple     spaces\\n\",\n    \"example\": 624,\n    \"start_line\": 9070\n  }\n]\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#143.support-image-dimensions.html",
    "content": "<p><img src=\"./pic/pic1_50.png\" alt=\"my image\" width=\"100px\" height=\"20px\" /></p>\n<p><img src=\"./pic/pic1_50.png\" alt=\"my image2\" width=\"100px\" height=\"20px\" /></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#143.support-image-dimensions.md",
    "content": "![my image](./pic/pic1_50.png =100pxx20px)\n\n![my image2][1]\n\n[1]: ./pic/pic1_50.png =100pxx20px\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.1.simple-autolink.html",
    "content": "<p>foo.bar</p>\n<p>www.foobar</p>\n<p><a href=\"http://www.foobar.com\">www.foobar.com</a></p>\n<p><a href=\"http://foobar.com\">http://foobar.com</a></p>\n<p><a href=\"https://www.foobar.com/baz?bazinga=nhecos\">https://www.foobar.com/baz?bazinga=nhecos</a>;</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.1.simple-autolink.md",
    "content": "foo.bar\n\nwww.foobar\n\nwww.foobar.com\n\nhttp://foobar.com\n\nhttps://www.foobar.com/baz?bazinga=nhecos;\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.2.disallow-underscore-emphasis-mid-word.html",
    "content": "<p>this is a sentence_with_mid underscores</p>\n<p>this is a sentence with just_one underscore</p>\n<p>this <em>should be parsed</em> as emphasis</p>\n<p>this is double__underscore__mid word</p>\n<p>this has just__one double underscore</p>\n<p>this <strong>should be parsed</strong> as bold</p>\n<p>emphasis at <em>end of sentence</em></p>\n<p><em>emphasis at</em> line start</p>\n<p>multi <em>line emphasis\nyeah it is</em> yeah</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.2.disallow-underscore-emphasis-mid-word.md",
    "content": "this is a sentence_with_mid underscores\n\nthis is a sentence with just_one underscore\n\nthis _should be parsed_ as emphasis\n\nthis is double__underscore__mid word\n\nthis has just__one double underscore\n\nthis __should be parsed__ as bold\n\nemphasis at _end of sentence_\n\n_emphasis at_ line start\n\nmulti _line emphasis\nyeah it is_ yeah\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.3.strikethrough.html",
    "content": "<p>a <del>strikethrough</del> word</p>\n<p>this should~~not be parsed</p>\n<p><del>strike-through text</del></p>\n<p><code>~~strikethough inside code span~~</code></p>\n<p>escaped ~~strikethrough~~</p>\n<p>escaped ~~strikethrough~~</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.3.strikethrough.md",
    "content": "a ~~strikethrough~~ word\n\nthis should~~not be parsed\n\n~~strike-through text~~\n\n`~~strikethough inside code span~~`\n\nescaped \\~~strikethrough~~\n\nescaped \\~~strikethrough\\~~\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.4.tasklists.html",
    "content": "<h1 id=\"mythings\">my things</h1>\n<ul>\n    <li>foo</li>\n    <li>[] bar</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"> baz</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\" checked> bazinga</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\" checked> bazinga 2</li>\n</ul>\n<p>otherthings</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#164.4.tasklists.md",
    "content": "# my things\n\n -  foo\n - [] bar\n - [ ] baz\n - [x] bazinga\n - [X] bazinga 2\n\notherthings\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#178.markdown-inside-html-does-not-parse.html",
    "content": "<h1 id=\"somemarkdown\">some markdown</h1>\n<p>blabla</p>\n<div>This is **not parsed**</div>\n<div markdown=\"1\"><p>This is <strong>parsed</strong></p></div>\n<div>This is **not parsed**</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#178.markdown-inside-html-does-not-parse.md",
    "content": "# some markdown\n\nblabla\n<div>This is **not parsed**</div>\n<div markdown=\"1\">This is **parsed**</div>\n<div>This is **not parsed**</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#198.literalMidWordUnderscores-changes-behavior-of-asterisk.html",
    "content": "<p>foo *bar *baz</p>\n<p>foo **bar **baz</p>\n<p>foo _bar _baz</p>\n<p>foo __bar __baz</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#198.literalMidWordUnderscores-changes-behavior-of-asterisk.md",
    "content": "foo *bar *baz\n\nfoo **bar **baz\n\nfoo _bar _baz\n\nfoo __bar __baz\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#204.certain-links-with-at-and-dot-break-url.html",
    "content": "<p><a href=\"http://website.com/img@x2.jpg\">http://website.com/img@x2.jpg</a></p>\n<p><a href=\"http://website.com/img-x2.jpg\">http://website.com/img-x2.jpg</a></p>\n<p><a href=\"http://website.com/img@x2\">http://website.com/img@x2</a></p>\n<p><a href=\"http://website.com/img@.jpg\">http://website.com/img@.jpg</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#204.certain-links-with-at-and-dot-break-url.md",
    "content": "http://website.com/img@x2.jpg\n\nhttp://website.com/img-x2.jpg\n\nhttp://website.com/img@x2\n\nhttp://website.com/img@.jpg\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#206.treat-single-line-breaks-as-br.html",
    "content": "<p>a simple<br />\nwrapped line</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#206.treat-single-line-breaks-as-br.md",
    "content": "a simple\nwrapped line\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#214.escaped-markdown-chars-break-strikethrough.html",
    "content": "<p>Your friend <del><a href=\"www.google.com\"><strong>test*</strong></a></del> (<del><a href=\"www.google.com\"><em>@test</em></a></del>) updated his/her description</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#214.escaped-markdown-chars-break-strikethrough.md",
    "content": "Your friend ~~[**test\\***](www.google.com)~~ (~~[*@test*](www.google.com)~~) updated his/her description\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#259.es6-template-strings-indentation-issues.html",
    "content": "<h2 id=\"markdowndoc\">markdown doc</h2>\n<p>you can use markdown for card documentation</p>\n<ul>\n    <li>foo</li>\n    <li>bar</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#259.es6-template-strings-indentation-issues.md",
    "content": "      ## markdown doc\n      \n      you can use markdown for card documentation\n        - foo\n        - bar\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#284.simplifiedAutoLink-does-not-match-GFM-style.html",
    "content": "<p>this is a link to <a href=\"http://www.github.com\">www.github.com</a></p>\n<p>this is a link to <a href=\"http://www.google.com\">www.google.com</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#284.simplifiedAutoLink-does-not-match-GFM-style.md",
    "content": "this is a link to www.github.com\n\nthis is a link to <www.google.com>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#316.new-simpleLineBreaks-option-breaks-lists.html",
    "content": "<ol>\n  <li>One</li>\n  <li>Two<ul>\n      <li>A</li>\n      <li>B</li></ul></li>\n  <li>Three</li>\n</ol>\n<blockquote>\n  <p>this has<br />\n    simple linebreaks</p>\n</blockquote>\n<pre><code>testing\nsome\ncode\n</code></pre>\n<ol>\n  <li><p>paragraphed list</p>\n    <p>this belongs<br />\n      to the first list item</p></li>\n  <li><p>This text<br />\n    also</p></li>\n</ol>\n<p>simple<br />\n  text</p>\n<ul>\n  <li>a list<br />\n    item</li>\n  <li>another<br />\n    list item</li>\n</ul>\n<p>simple<br />\n  text</p>\n<ul>\n  <li><p>some item</p>\n    <p>another<br />\n      paragraph</p>\n    <ul>\n      <li><p>And<br />\n          now</p>\n        <p>paragraph<br />\n          sublist</p>\n        <ul>\n          <li><p>and<br />\n              even</p>\n              <p>another<br />\n                one</p></li></ul></li></ul></li>\n  <li><p>foo</p></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/features/#316.new-simpleLineBreaks-option-breaks-lists.md",
    "content": "1. One\n2. Two\n    - A\n    - B\n3. Three\n\n> this has\n> simple linebreaks\n\n    testing\n    some\n    code\n\n 1. paragraphed list\n\n    this belongs\n    to the first list item\n    \n 2. This text\n    also\n\nsimple\ntext\n\n - a list\n   item\n - another\n   list item\n\nsimple\ntext\n\n  - some item\n \n    another\n    paragraph\n   \n      - And\n        now\n     \n        paragraph\n        sublist\n     \n          - and\n            even\n       \n            another\n            one\n\n - foo\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#318.simpleLineBreaks-does-not-work-with-chinese-characters.html",
    "content": "<p>foo烫<br />\nbar</p>\n<p>foo<br />\nbar</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#318.simpleLineBreaks-does-not-work-with-chinese-characters.md",
    "content": "foo烫\nbar\n\nfoo\nbar\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#320.github-compatible-generated-header-id.html",
    "content": "<h1 id=\"some-header\">some header</h1>\n<h1 id=\"some-header-with--chars\">some header with &amp;+$,/:;=?@\\\"#{}|^~[]`\\*()%.!' chars</h1>\n<h1 id=\"another-header--with--chars\">another header &gt; with &lt; chars</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#320.github-compatible-generated-header-id.md",
    "content": "# some header\n\n# some header with &+$,/:;=?@\\\"#{}|^~[]`\\\\*()%.!' chars\n\n# another header > with < chars\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#323.simpleLineBreaks-breaks-with-strong.html",
    "content": "<p><strong>Nom :</strong> aaaa<br />\n<strong>Nom :</strong> aaa</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#323.simpleLineBreaks-breaks-with-strong.md",
    "content": "**Nom :** aaaa\n**Nom :** aaa\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#330.simplifiedAutoLink-drops-character-before-and-after-linked-mail.html",
    "content": "<p>Just an example <a href=\"mailto:info@example.com\">info@example.com</a> ok?​</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#330.simplifiedAutoLink-drops-character-before-and-after-linked-mail.md",
    "content": "Just an example info@example.com ok?​\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#331.allow-escaping-of-tilde.html",
    "content": "<p>~~test~~</p>\n<p><del>test</del></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#331.allow-escaping-of-tilde.md",
    "content": "\\~~test~~\n\n~~test~~\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#355.simplifiedAutoLink-URLs-inside-parenthesis-followed-by-another-character-are-not-parsed-correctly.html",
    "content": "<p>(<a href=\"https://www.google.com\">https://www.google.com</a>)!</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#355.simplifiedAutoLink-URLs-inside-parenthesis-followed-by-another-character-are-not-parsed-correctly.md",
    "content": "(https://www.google.com)!\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#374.escape-html-tags.html",
    "content": "<p>&lt;div&gt;foo&lt;/div&gt;</p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/#374.escape-html-tags.md",
    "content": "\\<div>foo\\</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#378.simplifiedAutoLinks-with-excludeTrailingPunctuationFromURLs.html",
    "content": "<p>Example <a href=\"http://example.com\">http://example.com</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#378.simplifiedAutoLinks-with-excludeTrailingPunctuationFromURLs.md",
    "content": "Example <http://example.com>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#379.openLinksInNewWindow-breaks-em-markdup.html",
    "content": "<p>My <a href=\"http://example.com\" rel=\"noopener noreferrer\" target=\"_blank\">link</a> is <em>important</em></p>\n<p>My <a href=\"http://example.com\" rel=\"noopener noreferrer\" target=\"_blank\">link</a> is <strong>important</strong></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#379.openLinksInNewWindow-breaks-em-markdup.md",
    "content": "My [link](http://example.com) is _important_\n\nMy [link](http://example.com) is __important__\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#398.literalMidWordAsterisks-treats-non-word-characters-as-characters.html",
    "content": "<p>strippers, <strong>hitler</strong>, and stalin</p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/#398.literalMidWordAsterisks-treats-non-word-characters-as-characters.md",
    "content": "strippers, **hitler**, and stalin"
  },
  {
    "path": "test/functional/makehtml/cases/features/#69.header-level-start.html",
    "content": "<h3 id=\"given\">Given</h3>\n<h3 id=\"when\">When</h3>\n<h3 id=\"then\">Then</h3>\n<h3 id=\"foo\">foo</h3>\n<h4 id=\"bar\">bar</h4>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#69.header-level-start.md",
    "content": "#Given\n\n#When\n\n#Then\n\nfoo\n===\n\nbar\n---\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#709.allow-whitespaces-after-end-in-metadata.html",
    "content": "<p><strong>some</strong> markdown text</p>\n<ul>\n    <li>a list</li>\n    <li>another list ---</li>\n    <li>and stuff</li>\n</ul>\n<p>a paragraph --- with dashes</p>\n<hr />\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/#709.allow-whitespaces-after-end-in-metadata.md",
    "content": "---         \n\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\n\n---       \n**some** markdown text\n\n- a list\n- another list ---\n- and stuff\n\na paragraph --- with dashes\n\n---\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/completeHTMLOutput/simple.html",
    "content": "<!DOCTYPE HTML>\n<html>\n<head>\n<meta charset=\"utf-8\">\n</head>\n<body>\n<p>This is a <strong>markdown</strong> file</p>\n<p>Converted into a full HTML document</p>\n<ul>\n<li>this</li>\n<li>is</li>\n<li>awesome</li>\n</ul>\n</body>\n</html>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/completeHTMLOutput/simple.md",
    "content": "This is a **markdown** file\n\nConverted into a full HTML document\n\n - this\n - is\n - awesome\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/customizedHeaderId-simple.html",
    "content": "<h1 id=\"simple\">Просто заголовок</h1>\n<h1 id=\"headerwithoutcurlybraces\">Header without curly braces</h1>\n<h1 id=\"cool\">Headers with multiple braces {braces} {are}</h1>\n<h1 id=\"withoutspace\">Header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/customizedHeaderId-simple.md",
    "content": "# Просто заголовок {simple}\n# Header without curly braces\n# Headers with multiple braces {braces} {are} {cool}\n# Header{withoutspace}\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disable-email-encoding.html",
    "content": "<p>this email <a href=\"mailto:foobar@example.com\">foobar@example.com</a> should not be encoded</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disable-email-encoding.md",
    "content": "this email <foobar@example.com> should not be encoded\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disable-gh-codeblocks.html",
    "content": "<p>this is some text</p>\n<p><code>php\nfunction thisThing() {\necho \"some weird formatted code!\";\n}\n</code></p>\n<p>some other text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disable-gh-codeblocks.md",
    "content": "this is some text\n\n```php\nfunction thisThing() {\n  echo \"some weird formatted code!\";\n}\n```\n\nsome other text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disableForced4SpacesIndentedSublists/.gitkeep",
    "content": ""
  },
  {
    "path": "test/functional/makehtml/cases/features/disableForced4SpacesIndentedSublists.html",
    "content": "<ul>\n  <li>foo<ul>\n    <li>bar</li></ul></li>\n</ul>\n<hr />\n<ul>\n  <li>baz<ol>\n    <li>bazinga</li></ol></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/disableForced4SpacesIndentedSublists.md",
    "content": "* foo\n  * bar\n\n---\n\n* baz\n  1. bazinga\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/ellipsis/ellipsis.html",
    "content": "<p>ellipsis in text...</p>\n<p>…</p>\n<ol>\n    <li>foo...</li>\n    <li>bar</li>\n</ol>\n<blockquote>\n    <p>ellipsis in blockquote...</p>\n</blockquote>\n<pre><code>ellipsis in code...\n</code></pre>\n<pre><code>ellipsis in code...\n</code></pre>\n<h1 id=\"ellipsisinheader\">ellipsis in header...</h1>\n<p>1...</p>\n<ol>\n    <li>..</li>\n</ol>\n<p>1…</p>\n<p><a href=\"https://gitlab.com/gitlab-org/gitlab-ce/compare/v11.5.4...v11.5.5\" title=\"title\">Link</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/ellipsis/ellipsis.md",
    "content": "ellipsis in text...\n\n…\n\n1. foo...\n2. bar\n\n> ellipsis in blockquote...\n\n```\nellipsis in code...\n```\n\n    ellipsis in code...\n\n# ellipsis in header...\n\n1...\n\n1. ..\n\n1…\n\n[Link](https://gitlab.com/gitlab-org/gitlab-ce/compare/v11.5.4...v11.5.5 \"title\")"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/complex.html",
    "content": "<p>foo🍎bar</p>\n<p>foo: apple :bar</p>\n<p>:foo 🍎 bar:</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/complex.md",
    "content": "foo:apple:bar\n\nfoo: apple :bar\n\n:foo :apple: bar:\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/links.html",
    "content": "<p>this link <a href=\"http://www.example.com/some:apple:url\">somelink</a></p>\n<p>emoji <a href=\"http://www.example.com/some:apple:url\">🍎</a></p>\n<p><a href=\"http://www.example.com/some:apple:url\">🍎</a></p>\n<p><a href=\"http://www.example.com/some:apple:url\">🍎</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/links.md",
    "content": "this link [somelink](http://www.example.com/some:apple:url)\n\nemoji [:apple:](http://www.example.com/some:apple:url)\n\n[:apple:][apple]\n\n[:apple:][]\n\n\n[apple]: http://www.example.com/some:apple:url\n[:apple:]: http://www.example.com/some:apple:url"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/simple.html",
    "content": "<p>🍎 and 💋</p>\n<p>💋my🍎</p>\n<p>👩‍❤️‍💋‍👨</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/simple.md",
    "content": ":apple: and :kiss:\n\n:kiss:my:apple:\n\n:couplekiss_man_woman:\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/simplifiedautolinks.html",
    "content": "<p><a href=\"http://www.example.com/some:apple:url\">http://www.example.com/some:apple:url</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/simplifiedautolinks.md",
    "content": "http://www.example.com/some:apple:url\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/special.html",
    "content": "<p>this is showdown's emoji <img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAS1BMVEX///8jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS0jJS3b1q3b1q3b1q3b1q3b1q3b1q3b1q3b1q0565CIAAAAGXRSTlMAQHCAYCCw/+DQwPCQUBAwoHCAEP+wwFBgS2fvBgAAAUZJREFUeAHs1cGy7BAUheFFsEDw/k97VTq3T6ge2EmdM+pvrP6Iwd74XV9Kb52xuMU4/uc1YNgZLFOeV8FGdhGrNk5SEgUyPxAEdj4LlMRDyhVAMVEa2M7TBSeVZAFPdqHgzSZJwPKgcLFLAooHDJo4EDCw4gAtBoJA5UFj4Ng5LOGLwVXZuoIlji/jeQHFk7+baHxrCjeUwB9+s88KndvlhcyBN5BSkYNQIVVb4pV+Npm7hhuKDs/uMP5KxT3WzSNNLIuuoDpMmuAVMruMSeDyQBi24DTr43LAY7ILA1QYaWkgfHzFthYYzg67SQsCbB8GhJUEGCtO9n0rSaCLxgJQjS/JSgMTg2eBDEHAJ+H350AsjYNYscrErgI2e/l+mdR967TCX/v6N0EhPECYCP0i+IAoYQOE8BogNhQMEMdrgAQWHaMAAGi5I5euoY9NAAAAAElFTkSuQmCC\"></p>\n<p>and this is github's emoji <img width=\"20\" height=\"20\" align=\"absmiddle\" src=\"https://github.githubassets.com/images/icons/emoji/octocat.png?v8\"></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/emojis/special.md",
    "content": "this is showdown's emoji :showdown:\n\nand this is github's emoji :octocat:"
  },
  {
    "path": "test/functional/makehtml/cases/features/excludeTrailingPunctuationFromURLs-option.html",
    "content": "<p>url <a href=\"http://www.google.com\">http://www.google.com</a>.</p>\n<p>url <a href=\"http://www.google.com\">http://www.google.com</a>!</p>\n<p>url <a href=\"http://www.google.com\">http://www.google.com</a>? foo</p>\n<p>url (<a href=\"http://www.google.com\">http://www.google.com</a>) bazinga</p>\n<p>url [<a href=\"http://www.google.com\">http://www.google.com</a>] bazinga</p>\n<p>url <a href=\"http://www.google.com\">http://www.google.com</a>, bar</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/excludeTrailingPunctuationFromURLs-option.md",
    "content": "url http://www.google.com.\n\nurl http://www.google.com!\n\nurl http://www.google.com? foo\n\nurl (http://www.google.com) bazinga\n\nurl [http://www.google.com] bazinga\n\nurl http://www.google.com, bar\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/ghMentions.html",
    "content": "<p>hello <a href=\"https://github.com/tivie\">@tivie</a> how are you?</p>\n<p>this email foo@gmail.com is not parsed</p>\n<p>this @mentions is not parsed</p>\n<p><a href=\"https://github.com/john.doe\">@john.doe</a></p>\n<p><a href=\"https://github.com/john-doe\">@john-doe</a></p>\n<p><a href=\"https://github.com/john_doe\">@john_doe</a></p>\n<p>@.johndoe</p>\n<p>@_johndoe</p>\n<p>@-johndoe</p>\n<p><a href=\"https://github.com/johndoe\">@johndoe</a>.</p>\n<p><a href=\"https://github.com/johndoe\">@johndoe</a>-</p>\n<p><a href=\"https://github.com/johndoe\">@johndoe</a>_</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/ghMentions.md",
    "content": "hello @tivie how are you?\n\nthis email foo@gmail.com is not parsed\n\nthis \\@mentions is not parsed\n\n@john.doe\n\n@john-doe\n\n@john_doe\n\n@.johndoe\n\n@_johndoe\n\n@-johndoe\n\n@johndoe.\n\n@johndoe-\n\n@johndoe_\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordAsterisks/basic.html",
    "content": "<p>this is a sentence*with*mid asterisks</p>\n<p>this is a sentence**with**two mid asterisks</p>\n<p>this is a sentence***with***three mid asterisks</p>\n<p>this is double*asterisk*mid word with another**asterisk**word</p>\n<p>this is double**asterisk**mid word with another**asterisk**word</p>\n<p>this is double***asterisk***mid word with another***asterisk***word</p>\n<p>this is double*asterisk**mid word with another***asterisk*word</p>\n<p>this is double**asterisk*mid word with another***asterisk**word</p>\n<p>this is a sentence with just*one asterisk</p>\n<p>this is a sentence with just**one asterisk</p>\n<p>this is a sentence with just***one asterisk</p>\n<p>this is double**asterisk**mid word</p>\n<p>this has just**one double asterisk</p>\n<p>this has just***one triple asterisk</p>\n<p>this <em>should be parsed</em> as emphasis</p>\n<p>this <strong>should be parsed</strong> as bold</p>\n<p>this <strong><em>should be parsed</em></strong> as bold and emphasis</p>\n<p>emphasis at <em>end of sentence</em></p>\n<p>bold at <strong>end of sentence</strong></p>\n<p>bold and emphasis at <strong><em>end of sentence</em></strong></p>\n<p><em>emphasis at</em> line start</p>\n<p><strong>bold at</strong> line start</p>\n<p><strong><em>bold and emphasis at</em></strong> line start</p>\n<p>multi <em>line emphasis\nyeah it is</em> yeah</p>\n<p>multi <strong>line emphasis\nyeah it is</strong> yeah</p>\n<p>multi <strong><em>line emphasis\nyeah it is</em></strong> yeah</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordAsterisks/basic.md",
    "content": "this is a sentence*with*mid asterisks\n\nthis is a sentence**with**two mid asterisks\n\nthis is a sentence***with***three mid asterisks\n\nthis is double*asterisk*mid word with another**asterisk**word\n\nthis is double**asterisk**mid word with another**asterisk**word\n\nthis is double***asterisk***mid word with another***asterisk***word\n\nthis is double*asterisk**mid word with another***asterisk*word\n\nthis is double**asterisk*mid word with another***asterisk**word\n\nthis is a sentence with just*one asterisk\n\nthis is a sentence with just**one asterisk\n\nthis is a sentence with just***one asterisk\n\nthis is double**asterisk**mid word\n\nthis has just**one double asterisk\n\nthis has just***one triple asterisk\n\nthis *should be parsed* as emphasis\n\nthis **should be parsed** as bold\n\nthis ***should be parsed*** as bold and emphasis\n\nemphasis at *end of sentence*\n\nbold at **end of sentence**\n\nbold and emphasis at ***end of sentence***\n\n*emphasis at* line start\n\n**bold at** line start\n\n***bold and emphasis at*** line start\n\nmulti *line emphasis\nyeah it is* yeah\n\n\nmulti **line emphasis\nyeah it is** yeah\n\n\nmulti ***line emphasis\nyeah it is*** yeah\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordAsterisks/punctation-test.html",
    "content": "<p><strong>Bold:</strong></p>\n<p><strong>Bold</strong></p>\n<p><strong>Bold</strong>:</p>\n<ul>\n    <li><strong>Bold</strong><ul>\n        <li>Tier 2</li></ul></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordAsterisks/punctation-test.md",
    "content": "**Bold:**\n\n**Bold**\n\n**Bold**:\n\n- **Bold**\n    - Tier 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordUnderscores/basic.html",
    "content": "<p>some <em>foo</em> yeah</p>\n<p>some <strong>foo</strong> yeah</p>\n<p>some <strong><em>foo</em></strong> yeah</p>\n<p>some word_foo_yeah</p>\n<p>some word__foo__yeah</p>\n<p>some word___foo___yeah</p>\n<p>strippers, <em>hitler</em>, and stalin</p>\n<p>strippers, <strong>hitler</strong>, and stalin</p>\n<p>strippers, <strong><em>hitler</em></strong>, and stalin</p>\n<p><strong><em>multiple</em></strong> italics and bolds in a <strong><em>paragraph</em></strong></p>\n<p><strong>multiple</strong> bolds in a <strong>paragraph</strong></p>\n<p><em>multiple</em> italics in a <em>paragraph</em></p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordUnderscores/basic.md",
    "content": "some _foo_ yeah\n\nsome __foo__ yeah\n\nsome ___foo___ yeah\n\nsome word_foo_yeah\n\nsome word__foo__yeah\n\nsome word___foo___yeah\n\nstrippers, _hitler_, and stalin\n\nstrippers, __hitler__, and stalin\n\nstrippers, ___hitler___, and stalin\n\n___multiple___ italics and bolds in a ___paragraph___\n\n__multiple__ bolds in a __paragraph__\n\n_multiple_ italics in a _paragraph_"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordUnderscores/punctation-test.html",
    "content": "<p><strong>Bold:</strong></p>\n<p><strong>Bold</strong></p>\n<p><strong>Bold</strong>:</p>\n<ul>\n    <li><strong>Bold</strong><ul>\n        <li>Tier 2</li></ul></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/literalMidWordUnderscores/punctation-test.md",
    "content": "__Bold:__\n\n__Bold__\n\n__Bold__:\n\n- __Bold__\n    - Tier 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/dashes-conflict.html",
    "content": "<p><strong>some</strong> markdown text</p>\n<ul>\n    <li>a list</li>\n    <li>another list ---</li>\n    <li>and stuff</li>\n</ul>\n<p>a paragraph --- with dashes</p>\n<hr />\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/dashes-conflict.md",
    "content": "---\n\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\n\n---\n**some** markdown text\n\n - a list\n - another list ---\n - and stuff\n\na paragraph --- with dashes\n\n---\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-in-output.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n    <title>This is the document title</title>\n    <meta charset=\"utf-8\">\n    <meta name=\"language\" content=\"en\">\n    <meta name=\"author\" content=\"Tivie\">\n    <meta name=\"contributors\" content=\"John, Mary, Steve\">\n    <meta name=\"description\" content=\"This is a long text and so it spans on multiple lines. It must be indented, for showdown to parse it correctly. Markdown **such as bold** is not parsed and it will be rendered as plain text.\">\n    <meta name=\"date\" content=\"01-01-2010\">\n    <meta name=\"keywords\" content=\"foo, bar, baz\">\n</head>\n<body>\n<p><strong>some</strong> markdown text</p>\n</body>\n</html>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-in-output.md",
    "content": "«««\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\nkeywords: foo, bar, baz\n»»»\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-two-consecutive-metadata-blocks-different-symbols.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n    <title>This is the document title</title>\n    <meta charset=\"utf-8\">\n    <meta name=\"language\" content=\"en\">\n    <meta name=\"author\" content=\"Tivie\">\n    <meta name=\"contributors\" content=\"John, Mary, Steve\">\n    <meta name=\"keywords\" content=\"foo, bar, baz\">\n</head>\n<body>\n<hr />\n<p>description: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown <strong>such as bold</strong> is not parsed\n    and it will be rendered as plain text.</p>\n<h2 id=\"date01012010\">date: 01-01-2010</h2>\n<p><strong>some</strong> markdown text</p>\n</body>\n</html>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-two-consecutive-metadata-blocks-different-symbols.md",
    "content": "«««\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\nkeywords: foo, bar, baz\n»»»\n---\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\n---\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-two-consecutive-metadata-blocks.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n    <title>This is the document title</title>\n    <meta charset=\"utf-8\">\n    <meta name=\"language\" content=\"en\">\n    <meta name=\"author\" content=\"Tivie\">\n    <meta name=\"contributors\" content=\"John, Mary, Steve\">\n    <meta name=\"keywords\" content=\"foo, bar, baz\">\n</head>\n<body>\n<hr />\n<p>description: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown <strong>such as bold</strong> is not parsed\n    and it will be rendered as plain text.</p>\n<h2 id=\"date01012010\">date: 01-01-2010</h2>\n<p><strong>some</strong> markdown text</p>\n</body>\n</html>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/embeded-two-consecutive-metadata-blocks.md",
    "content": "---\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\nkeywords: foo, bar, baz\n---\n---\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\n---\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/ignore-metadata.html",
    "content": "<hr />\n<p>title: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\ndescription: This is a long text and so it\nspans on multiple lines.\nIt must be indented,\nfor showdown to parse it correctly.\nMarkdown <strong>such as bold</strong> is not parsed\nand it will be rendered as plain text.\ndate: 01-01-2010\nkeywords: foo, bar, baz</p>\n<hr />\n<p><strong>some</strong> markdown text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/ignore-metadata.md",
    "content": "---\n\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\nkeywords: foo, bar, baz\n\n---\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-angled-for-method.html",
    "content": "<p>some <strong>text</strong></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-angled-for-method.md",
    "content": "«««\nfoo: bar\nbaz: bazinga\n»»»\n\nsome **text**\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-angled-quotes.html",
    "content": "<p><strong>some</strong> markdown text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-angled-quotes.md",
    "content": "«««\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\nkeywords: foo, bar, baz\n»»»\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-three-dashes.html",
    "content": "<p><strong>some</strong> markdown text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-three-dashes.md",
    "content": "---\ntitle: This is the document title\nlanguage: en\nauthor: Tivie\ncontributors: John, Mary, Steve\ndescription: This is a long text and so it\n    spans on multiple lines.\n    It must be indented,\n    for showdown to parse it correctly.\n    Markdown **such as bold** is not parsed\n    and it will be rendered as plain text.\ndate: 01-01-2010\nkeywords: foo, bar, baz\n---\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-with-format.html",
    "content": "<p><strong>some</strong> markdown text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/metadata/simple-with-format.md",
    "content": "---YAML\nfoo: bar\nbaz:\n - bazinga\n - bling\n - blang\n---\n\n**some** markdown text\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/moreStyling/tasklists-with-styling.html",
    "content": "<ul>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"> test</li>\n    <li class=\"task-list-item task-list-item-complete\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\" checked> testing complete</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/moreStyling/tasklists-with-styling.md",
    "content": "- [ ] test\n- [x] testing complete\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/hash-links-open-in-same-page.html",
    "content": "<p>this link is in the <a href=\"#same-page\">same page</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/hash-links-open-in-same-page.md",
    "content": "this link is in the [same page](#same-page)\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simple-cases.html",
    "content": "<p><a href=\"www.google.com\" rel=\"noopener noreferrer\" target=\"_blank\">foo</a></p>\n<p>a link <a href=\"http://www.google.com\" rel=\"noopener noreferrer\" target=\"_blank\">http://www.google.com</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simple-cases.md",
    "content": "[foo](www.google.com)\n\na link <http://www.google.com>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simple.html",
    "content": "<p><a href=\"www.google.com\" rel=\"noopener noreferrer\" target=\"_blank\">foo</a></p>\n<p>a link <a href=\"http://www.google.com\" rel=\"noopener noreferrer\" target=\"_blank\">http://www.google.com</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simple.md",
    "content": "[foo](www.google.com)\n\na link <http://www.google.com>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simplifiedAutoLink.html",
    "content": "<p>this is <a href=\"http://www.google.com\" rel=\"noopener noreferrer\" target=\"_blank\">http://www.google.com</a> autolink</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/openLinksInNewWindow/simplifiedAutoLink.md",
    "content": "this is http://www.google.com autolink\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-simple.html",
    "content": "<h1 id=\"sectionfooheader\">foo header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-simple.md",
    "content": "# foo header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string-and-ghCompatibleHeaderId.html",
    "content": "<h1 id=\"my-prefix-foo-header\">foo header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string-and-ghCompatibleHeaderId.md",
    "content": "# foo header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string-and-ghCompatibleHeaderId2.html",
    "content": "<h1 id=\"my-prefix-foo-header\">foo header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string-and-ghCompatibleHeaderId2.md",
    "content": "# foo header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string.html",
    "content": "<h1 id=\"myprefixfooheader\">foo header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/prefixHeaderId-string.md",
    "content": "# foo header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawHeaderId/simple.html",
    "content": "<h1 id=\"123-my#very/-strange-\\header*`^ªº-_.,-yeah\">123 My#very/ strange \\header*`^ªº-_., yeah</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawHeaderId/simple.md",
    "content": "# 123 My#very/ strange \\header*`^ªº-_., yeah\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawHeaderId/with-prefixHeaderId.html",
    "content": "<h1 id=\"/prefix/some-header\">some header</h1>\n<h1 id=\"/prefix/another-!-#$%&/()=?»@£§{[]}«--header\">another !\"#$%&amp;/()=?»@£§{[]}«' header</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawHeaderId/with-prefixHeaderId.md",
    "content": "# some header\n\n# another !\"#$%&/()=?»@£§{[]}«' header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawPrefixHeaderId/simple-with-prefixHeaderId.html",
    "content": "<h1 id=\"/prefix/someheaderfoo\">some header &amp;/) foo</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/rawPrefixHeaderId/simple-with-prefixHeaderId.md",
    "content": "# some header &/) foo\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/relativePathBaseUrl.html",
    "content": "<p><a href=\"http://my.site.com/that_dude_mike.js\">inline relative linky</a></p>\n<p><a href=\"ftp://wikis.com/micky.txt\">inline absolute linky</a></p>\n<p><a href=\"http://my.site.com/painters/Michelangelo.html\">global relative linky</a></p>\n<p><a href=\"https://www.my-wikis-site.com/peeps/Michelangelo.html\">global absolute linky</a></p>\n<p><img src=\"http://my.site.com/mona-lisa.png\" alt=\"inline relative image\" /></p>\n<p><img src=\"http://images.com/mona-lisa.png\" alt=\"inline absolute image\" /></p>\n<p><img src=\"http://my.site.com/mona-lisa.png\" alt=\"global relative image\" /></p>\n<p><img src=\"https://www.my-photo-site.com/mona-lisa.png\" alt=\"global absolute image\" /></p>\n<p><a href=\"#holdin_it_down\">just an anchor</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/relativePathBaseUrl.md",
    "content": "[inline relative linky](that_dude_mike.js)\n\n[inline absolute linky](ftp://wikis.com/micky.txt)\n\n[global relative linky][relative_linky]\n\n[global absolute linky][absolute_linky]\n\n![inline relative image](mona-lisa.png)\n\n![inline absolute image](http://images.com/mona-lisa.png)\n\n![global relative image][relative_image]\n\n![global absolute image][absolute_image]\n\n[just an anchor](#holdin_it_down)\n\n[relative_linky]: painters/Michelangelo.html\n[relative_image]: ./mona-lisa.png\n[absolute_linky]: https://www.my-wikis-site.com/peeps/Michelangelo.html\n[absolute_image]: https://www.my-photo-site.com/mona-lisa.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/requireSpaceBeforeHeadingText.html",
    "content": "<h1 id=\"header\">header</h1>\n<p>#header</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/requireSpaceBeforeHeadingText.md",
    "content": "# header\n\n#header\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simpleLineBreaks-handle-html-pre.html",
    "content": "<p>hmm</p>\n<pre>\nthis is `a\\_test` and this\\_too and finally_this_is\n</pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simpleLineBreaks-handle-html-pre.md",
    "content": "hmm\n<pre>\nthis is `a\\_test` and this\\_too and finally_this_is\n</pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simpleLineBreaks2.html",
    "content": "<ol>\n    <li><p>One</p></li>\n    <li><p>Two<br />\n        foo</p>\n        <p>bar<br />\n        bazinga</p>\n        <p>nhecos</p></li>\n    <li><p>Three</p>\n        <ul>\n        <li><p>foo</p></li>\n        <li><p>bar</p></li></ul></li>\n</ol>\n   "
  },
  {
    "path": "test/functional/makehtml/cases/features/simpleLineBreaks2.md",
    "content": " 1. One\n 2. Two\n    foo\n    \n    bar\n    bazinga\n    \n    \n    \n    \n    nhecos\n    \n 3. Three\n    \n    - foo\n    \n    - bar\n   "
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/autolinks-with-magic-chars.html",
    "content": "<p><a href=\"http://www.foobar.com/blegh#**foobar**bazinga\">http://www.foobar.com/blegh#**foobar**bazinga</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/autolinks-with-magic-chars.md",
    "content": "http://www.foobar.com/blegh#**foobar**bazinga"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/blockquote.html",
    "content": "<blockquote>\n    <p><a href=\"http://www.google.com\">http://www.google.com</a></p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/blockquote.md",
    "content": "> http://www.google.com\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/codespans.html",
    "content": "<p><code>http://www.gmail.com</code></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/codespans.md",
    "content": "`http://www.gmail.com`\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/complete-test-case.html",
    "content": "<!-- SHOULD PASS -->\n<p><a href=\"http://foo.com/blah_blah\">http://foo.com/blah_blah</a></p>\n<p><a href=\"http://foo.com/blah_blah/\">http://foo.com/blah_blah/</a></p>\n<p><a href=\"http://foo.com/blah_blah_(wikipedia)\">http://foo.com/blah_blah_(wikipedia)</a></p>\n<p><a href=\"http://foo.com/blah_blah_(wikipedia)_(again)\">http://foo.com/blah_blah_(wikipedia)_(again)</a></p>\n<p><a href=\"http://www.example.com/wpstyle/?p=364\">http://www.example.com/wpstyle/?p=364</a></p>\n<p><a href=\"https://www.example.com/foo/?bar=baz&inga=42&quux\">https://www.example.com/foo/?bar=baz&inga=42&quux</a></p>\n<p><a href=\"http://✪df.ws/123\">http://✪df.ws/123</a></p>\n<p><a href=\"http://userid:password@example.com:8080\">http://userid:password@example.com:8080</a></p>\n<p><a href=\"http://userid:password@example.com:8080/\">http://userid:password@example.com:8080/</a></p>\n<p><a href=\"http://userid@example.com\">http://userid@example.com</a></p>\n<p><a href=\"http://userid@example.com/\">http://userid@example.com/</a></p>\n<p><a href=\"http://userid@example.com:8080\">http://userid@example.com:8080</a></p>\n<p><a href=\"http://userid@example.com:8080/\">http://userid@example.com:8080/</a></p>\n<p><a href=\"http://userid:password@example.com\">http://userid:password@example.com</a></p>\n<p><a href=\"http://userid:password@example.com/\">http://userid:password@example.com/</a></p>\n<p><a href=\"http://142.42.1.1/\">http://142.42.1.1/</a></p>\n<p><a href=\"http://142.42.1.1:8080/\">http://142.42.1.1:8080/</a></p>\n<p><a href=\"http://➡.ws/䨹\">http://➡.ws/䨹</a></p>\n<p><a href=\"http://⌘.ws\">http://⌘.ws</a></p>\n<p><a href=\"http://⌘.ws/\">http://⌘.ws/</a></p>\n<p><a href=\"http://foo.com/blah_(wikipedia)#cite-1\">http://foo.com/blah_(wikipedia)#cite-1</a></p>\n<p><a href=\"http://foo.com/blah_(wikipedia)_blah#cite-1\">http://foo.com/blah_(wikipedia)_blah#cite-1</a></p>\n<p><a href=\"http://foo.com/unicode_(✪)_in_parens\">http://foo.com/unicode_(✪)_in_parens</a></p>\n<p><a href=\"http://foo.com/(something)?after=parens\">http://foo.com/(something)?after=parens</a></p>\n<p><a href=\"http://☺.damowmow.com/\">http://☺.damowmow.com/</a></p>\n<p><a href=\"http://code.google.com/events/#&product=browser\">http://code.google.com/events/#&product=browser</a></p>\n<p><a href=\"http://j.mp\">http://j.mp</a></p>\n<p><a href=\"ftp://foo.bar/baz\">ftp://foo.bar/baz</a></p>\n<p><a href=\"http://foo.bar/?q=Test%20URL-encoded%20stuff\">http://foo.bar/?q=Test%20URL-encoded%20stuff</a></p>\n<!-- http://مثال.إختبار -->\n<!-- http://例子.测试 -->\n<!-- http://उदाहरण.परीक्षा -->\n<p><a href=\"http://1337.net\">http://1337.net</a></p>\n<p><a href=\"http://a.b-c.de\">http://a.b-c.de</a></p>\n<p><a href=\"http://223.255.255.254\">http://223.255.255.254</a></p>\n<p><a href=\"https://foo_bar.example.com/\">https://foo_bar.example.com/</a></p>\n<!-- WEIRD BUT SHOULD ALSO PASS -->\n<p><a href=\"http://www.foo.bar./\">http://www.foo.bar./</a></p>\n<p><a href=\"http://a.b--c.de/\">http://a.b--c.de/</a></p>\n<!-- SHOULD PARTIALLY PASS -->\n<p><a href=\"http://foo.bar/foo(bar)baz\">http://foo.bar/foo(bar)baz</a> quux</p>\n<p><a href=\"http://foo.bar?q=Spaces\">http://foo.bar?q=Spaces</a> should be encoded</p>\n<p>http://.<a href=\"http://www.foo.bar/\">www.foo.bar/</a></p>\n<p>http://.<a href=\"http://www.foo.bar./\">www.foo.bar./</a></p>\n<!-- THESE ARE INVALID IPS BUT WE WILL LET THEM PASS -->\n<p><a href=\"http://10.1.1.1\">http://10.1.1.1</a></p>\n<p><a href=\"http://10.1.1.254\">http://10.1.1.254</a></p>\n<p><a href=\"http://0.0.0.0\">http://0.0.0.0</a></p>\n<p><a href=\"http://10.1.1.0\">http://10.1.1.0</a></p>\n<p><a href=\"http://10.1.1.255\">http://10.1.1.255</a></p>\n<p><a href=\"http://224.1.1.1\">http://224.1.1.1</a></p>\n<p><a href=\"http://1.1.1.1.1\">http://1.1.1.1.1</a></p>\n<p><a href=\"http://123.123.123\">http://123.123.123</a></p>\n<!-- SHOULD FAIL -->\n<p>http://</p>\n<p>http://.</p>\n<p>http://..</p>\n<p>http://../</p>\n<p>http://?</p>\n<p>http://??</p>\n<p>http://??/</p>\n<p>http://#</p>\n<p>http://##</p>\n<p>http://##/</p>\n<p>//</p>\n<p>//a</p>\n<p>///a</p>\n<p>///</p>\n<p>http:///a</p>\n<p>foo.com</p>\n<p>rdar://1234</p>\n<p>h://test</p>\n<p>http:// shouldfail.com</p>\n<p>:// should fail</p>\n<p>http://-error-.invalid/</p>\n<p>http://-a.b.co</p>\n<p>http://3628126748</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/complete-test-case.md",
    "content": "<!-- SHOULD PASS -->\n\nhttp://foo.com/blah_blah\n\nhttp://foo.com/blah_blah/\n\nhttp://foo.com/blah_blah_(wikipedia)\n\nhttp://foo.com/blah_blah_(wikipedia)_(again)\n\nhttp://www.example.com/wpstyle/?p=364\n\nhttps://www.example.com/foo/?bar=baz&inga=42&quux\n\nhttp://✪df.ws/123\n\nhttp://userid:password@example.com:8080\n\nhttp://userid:password@example.com:8080/\n\nhttp://userid@example.com\n\nhttp://userid@example.com/\n\nhttp://userid@example.com:8080\n\nhttp://userid@example.com:8080/\n\nhttp://userid:password@example.com\n\nhttp://userid:password@example.com/\n\nhttp://142.42.1.1/\n\nhttp://142.42.1.1:8080/\n\nhttp://➡.ws/䨹\n\nhttp://⌘.ws\n\nhttp://⌘.ws/\n\nhttp://foo.com/blah_(wikipedia)#cite-1\n\nhttp://foo.com/blah_(wikipedia)_blah#cite-1\n\nhttp://foo.com/unicode_(✪)_in_parens\n\nhttp://foo.com/(something)?after=parens\n\nhttp://☺.damowmow.com/\n\nhttp://code.google.com/events/#&product=browser\n\nhttp://j.mp\n\nftp://foo.bar/baz\n\nhttp://foo.bar/?q=Test%20URL-encoded%20stuff\n\n<!-- http://مثال.إختبار -->\n\n<!-- http://例子.测试 -->\n\n<!-- http://उदाहरण.परीक्षा -->\n\nhttp://1337.net\n\nhttp://a.b-c.de\n\nhttp://223.255.255.254\n\nhttps://foo_bar.example.com/\n\n<!-- WEIRD BUT SHOULD ALSO PASS -->\n\nhttp://www.foo.bar./\n\nhttp://a.b--c.de/\n\n<!-- SHOULD PARTIALLY PASS -->\n\nhttp://foo.bar/foo(bar)baz quux\n\nhttp://foo.bar?q=Spaces should be encoded\n\nhttp://.www.foo.bar/\n\nhttp://.www.foo.bar./\n\n<!-- THESE ARE INVALID IPS BUT WE WILL LET THEM PASS -->\nhttp://10.1.1.1\n\nhttp://10.1.1.254\n\nhttp://0.0.0.0\n\nhttp://10.1.1.0\n\nhttp://10.1.1.255\n\nhttp://224.1.1.1\n\nhttp://1.1.1.1.1\n\nhttp://123.123.123\n\n\n<!-- SHOULD FAIL -->\n\nhttp://\n\nhttp://.\n\nhttp://..\n\nhttp://../\n\nhttp://?\n\nhttp://??\n\nhttp://??/\n\nhttp://#\n\nhttp://##\n\nhttp://##/\n\n//\n\n//a\n\n///a\n\n///\n\nhttp:///a\n\nfoo.com\n\nrdar://1234\n\nh://test\n\nhttp:// shouldfail.com\n\n:// should fail\n\nhttp://-error-.invalid/\n\nhttp://-a.b.co\n\nhttp://3628126748\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/disallow-underscores.html",
    "content": "<p><a href=\"http://en.wikipedia.org/wiki/Tourism_in_Germany\">http://en.wikipedia.org/wiki/Tourism_in_Germany</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/disallow-underscores.md",
    "content": "http://en.wikipedia.org/wiki/Tourism_in_Germany\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-inside-a-tags.html",
    "content": "<p><a href=\"http://www.google.com\">www.google.com</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-inside-a-tags.md",
    "content": "<a href=\"http://www.google.com\">www.google.com</a>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-inside-code.html",
    "content": "<pre><code>some code with\na link\nwww.google.com\n\nand another link http://www.google.com\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-inside-code.md",
    "content": "    some code with\n    a link\n    www.google.com\n    \n    and another link http://www.google.com\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-reference-links.html",
    "content": "<p><img src=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\" alt=\"Showdown\" /></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/does-not-parse-reference-links.md",
    "content": "![Showdown][sd-logo]\n\n[sd-logo]: https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/emphasis-and-strikethrough.html",
    "content": "<p><em><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></em></p>\n<p><strong><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></strong></p>\n<p><strong><em><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></em></strong></p>\n<p><del><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></del></p>\n<p><em><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></em></p>\n<p><strong><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></strong></p>\n<p><strong><em><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></em></strong></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/emphasis-and-strikethrough.md",
    "content": "*http://www.google.com/foobar*\n\n**http://www.google.com/foobar**\n\n***http://www.google.com/foobar***\n\n~~http://www.google.com/foobar~~\n\n_http://www.google.com/foobar_\n\n__http://www.google.com/foobar__\n\n___http://www.google.com/foobar___"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/ordered-lists.html",
    "content": "<ol>\n    <li><a href=\"http://www.google.com/listitem1\">http://www.google.com/listitem1</a></li>\n    <li><a href=\"http://www.google.com/listitem2\">http://www.google.com/listitem2</a></li>\n    <li><a href=\"http://www.google.com/listitem3\">http://www.google.com/listitem3</a></li>\n</ol>\n<p>foo</p>\n<ol>\n    <li><p><a href=\"http://www.google.com/listitem1\">http://www.google.com/listitem1</a></p></li>\n    <li><p><a href=\"http://www.google.com/listitem2\">http://www.google.com/listitem2</a></p></li>\n    <li><p><a href=\"http://www.google.com/listitem3\">http://www.google.com/listitem3</a></p></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/ordered-lists.md",
    "content": "1. http://www.google.com/listitem1\n2. http://www.google.com/listitem2\n3. http://www.google.com/listitem3\n\nfoo\n\n1. http://www.google.com/listitem1\n\n2. http://www.google.com/listitem2\n\n3. http://www.google.com/listitem3"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/text.html",
    "content": "<p><a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a></p>\n<p><a href=\"http://www.google.com/foobar\">www.google.com/foobar</a></p>\n<p><a href=\"ftp://user:password@host.com:port/path\">ftp://user:password@host.com:port/path</a></p>\n<p>this has some <a href=\"http://www.google.com/foobar\">http://www.google.com/foobar</a> in text</p>\n<p>this has some <a href=\"http://www.google.com/foobar\">www.google.com/foobar</a> in text</p>\n<p>this has some <a href=\"ftp://user:password@host.com:port/path\">ftp://user:password@host.com:port/path</a> in text</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/text.md",
    "content": "http://www.google.com/foobar\n\nwww.google.com/foobar\n\nftp://user:password@host.com:port/path\n\nthis has some http://www.google.com/foobar in text\n\nthis has some www.google.com/foobar in text\n\nthis has some ftp://user:password@host.com:port/path in text\n\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/trailing-punctuation.html",
    "content": "<p><a href=\"http://www.google.com\">http://www.google.com</a>!</p>\n<p><a href=\"http://www.google.com\">http://www.google.com</a>!!!!!!!!!!!!!!!!</p>\n<p><a href=\"http://www.google.com/!!!!!!!!!!!!!!!!foobar\">http://www.google.com/!!!!!!!!!!!!!!!!foobar</a></p>\n<p><a href=\"http://www.google.com/\">http://www.google.com/</a>!!!!!!!!!!!!!!!! foobar</p>\n<p>(<a href=\"http://www.google.com/\">http://www.google.com/</a>?!.)</p>\n<p><a href=\"http://www.google.com/?!.(\">http://www.google.com/?!.(</a></p>\n<p><a href=\"http://www.google.com/a()\">http://www.google.com/a()</a></p>\n<p><a href=\"http://www.google.com/a?!.()\">http://www.google.com/a?!.()</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/trailing-punctuation.md",
    "content": "http://www.google.com!\n\nhttp://www.google.com!!!!!!!!!!!!!!!!\n\nhttp://www.google.com/!!!!!!!!!!!!!!!!foobar\n\nhttp://www.google.com/!!!!!!!!!!!!!!!! foobar\n\n(http://www.google.com/?!.)\n\nhttp://www.google.com/?!.(\n\nhttp://www.google.com/a()\n\nhttp://www.google.com/a?!.()\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/unordered-lists.html",
    "content": "<ul>\n <li><a href=\"http://www.google.com/foo\">http://www.google.com/foo</a></li>\n <li><a href=\"http://www.google.com/bar\">http://www.google.com/bar</a></li>\n <li><a href=\"http://www.google.com/baz\">http://www.google.com/baz</a></li>\n</ul>\n<p>a</p>\n<ul>\n <li><p><a href=\"http://www.google.com/foo\">http://www.google.com/foo</a></p></li>\n <li><p><a href=\"http://www.google.com/bar\">http://www.google.com/bar</a></p></li>\n <li><p><a href=\"http://www.google.com/baz\">http://www.google.com/baz</a></p></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/unordered-lists.md",
    "content": " - http://www.google.com/foo\n - http://www.google.com/bar\n - http://www.google.com/baz\n\na\n\n - http://www.google.com/foo\n\n - http://www.google.com/bar\n\n - http://www.google.com/baz\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/wrapping-parenthesis.html",
    "content": "<p>(<a href=\"https://www.google.com\">https://www.google.com</a>)</p>\n<p>(<a href=\"https://www.google.com\">https://www.google.com</a>!?;)</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/simplifiedAutoLink/wrapping-parenthesis.md",
    "content": "(https://www.google.com)\n\n(https://www.google.com!?;)\n\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/splitAdjacentBlockquotes/basic.html",
    "content": "<blockquote>\n    <h1 id=\"blockquote1\">Block quote  1</h1>\n    <p>This is my first block quote.</p>\n</blockquote>\n<blockquote>\n    <h1 id=\"blockquote2\">Block quote 2</h1>\n    <p>This is my second block quote.</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/splitAdjacentBlockquotes/basic.md",
    "content": "> # Block quote  1\n>\n> This is my first block quote.\n\n> # Block quote 2\n>\n> This is my second block quote.\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/splitAdjacentBlockquotes/multiline-paragraph.html",
    "content": "<blockquote>\n<p>This is my second block quote\nyeah\neverythong is ok.</p>\n</blockquote>\n<p>This is not a blockquote</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/splitAdjacentBlockquotes/multiline-paragraph.md",
    "content": "> This is my second block quote\nyeah\neverythong is ok.\n\nThis is not a blockquote\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#179.parse-md-in-table-ths.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th><em>foo</em></th>\n      <th><strong>bar</strong></th>\n      <th><del>baz</del></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>100</td>\n      <td>blabla</td>\n      <td>aaa</td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#179.parse-md-in-table-ths.md",
    "content": "| *foo* | **bar** | ~~baz~~ |\n|-------|---------|---------|\n| 100   | blabla  |  aaa    |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#256.table-header-separators-should-not-require-3-dashes.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>key</th>\n        <th>value</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>My Key</td>\n        <td>My Value</td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#256.table-header-separators-should-not-require-3-dashes.md",
    "content": "|key|value|\n|--|--| \n|My Key|My Value|\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#345.escape-pipe-character.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>Operator</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>&amp;</td>\n        <td>Logical AND</td>\n    </tr>\n    <tr>\n        <td>&amp;&amp;</td>\n        <td>Shortcut AND</td>\n    </tr>\n    <tr>\n        <td>|</td>\n        <td>Logical OR</td>\n    </tr>\n    <tr>\n        <td>||</td>\n        <td>Shortcut OR</td>\n    </tr>\n    <tr>\n        <td>^</td>\n        <td>Logical XOR</td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#345.escape-pipe-character.md",
    "content": "| Operator | Description |\n|----------|-------------|\n| & | Logical AND |\n| && | Shortcut AND |\n| \\| | Logical OR |\n| \\|\\| | Shortcut OR |\n| ^ | Logical XOR |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#406.does-not-render-one-column-tables.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>some content</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th>some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th>some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>some content</td>\n    </tr>\n    <tr>\n        <td>some content</td>\n    </tr>\n    <tr>\n        <td>some content</td>\n    </tr>\n    <tr>\n        <td>some content</td>\n    </tr>\n    <tr>\n        <td>some content</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th style=\"text-align:left;\">some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td style=\"text-align:left;\">some content</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th style=\"text-align:right;\">some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td style=\"text-align:right;\">some content</td>\n    </tr>\n    </tbody>\n</table>\n<table>\n    <thead>\n    <tr>\n        <th style=\"text-align:center;\">some header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td style=\"text-align:center;\">some content</td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#406.does-not-render-one-column-tables.md",
    "content": "|some header |\n|------------|\n|some content|\n\n|some header |\n|------------|\n\n|some header |\n|------------|\n|some content|\n|some content|\n|some content|\n|some content|\n|some content|\n\n|some header |\n|:-----------|\n|some content|\n\n|some header |\n|-----------:|\n|some content|\n\n|some header |\n|:----------:|\n|some content|"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#442.trailing-spaces-break-one-column-tables.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th style=\"text-align:left;\">Single column</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td style=\"text-align:left;\">Row one</td>\n    </tr>\n    <tr>\n        <td style=\"text-align:left;\">Row two</td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#442.trailing-spaces-break-one-column-tables.md",
    "content": "| Single column |  \n|:--------------|   \n|    Row one    |                                      \n|    Row two    |               \n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#443.2.table-followed-by-list-does-not-parse-correctly.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>Tables</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td><strong>col 3 is</strong></td>\n    </tr>\n    <tr>\n        <td>col 2 is</td>\n    </tr>\n    <tr>\n        <td>zebra stripes</td>\n    </tr>\n    </tbody>\n</table>\n<ol>\n    <li>test</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#443.2.table-followed-by-list-does-not-parse-correctly.md",
    "content": "| Tables        |\n| ------------- |\n| **col 3 is**  |\n| col 2 is      |\n| zebra stripes |\n\n1. test"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#443.table-followed-by-list-does-not-parse-correctly.html",
    "content": "<table>\n<thead>\n<tr>\n    <th>Tables</th>\n    <th style=\"text-align:center;\">Are</th>\n    <th style=\"text-align:right;\">Cool</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n    <td><strong>col 3 is</strong></td>\n    <td style=\"text-align:center;\">right-aligned</td>\n    <td style=\"text-align:right;\">$1600</td>\n</tr>\n<tr>\n    <td>col 2 is</td>\n    <td style=\"text-align:center;\"><em>centered</em></td>\n    <td style=\"text-align:right;\">$12</td>\n</tr>\n<tr>\n    <td>zebra stripes</td>\n    <td style=\"text-align:center;\">are neat</td>\n    <td style=\"text-align:right;\">$1</td>\n</tr>\n</tbody>\n</table>\n<ol>\n    <li>test</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#443.table-followed-by-list-does-not-parse-correctly.md",
    "content": "| Tables        | Are           | Cool  |\n| ------------- |:-------------:| -----:|\n| **col 3 is**  | right-aligned | $1600 |\n| col 2 is      | *centered*    |   $12 |\n| zebra stripes | are neat      |    $1 |\n\n1. test\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#465.code-spans-with-pipes-break-table.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>PowerShell command</th>\n        <th>Example</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td>Get-Service</td>\n        <td><code>Get-Service | Stop-Service -WhatIf</code></td>\n    </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#465.code-spans-with-pipes-break-table.md",
    "content": "|PowerShell command|Example|\n|--|--|\n|Get-Service|`Get-Service | Stop-Service -WhatIf`|\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#471.ol-is-not-rendered-correctly-inside-table.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th style=\"text-align:right;\">h1</th>\n        <th style=\"text-align:left;\">h2</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td style=\"text-align:right;\">asdf</td>\n        <td style=\"text-align:left;\">one <code>two &lt;ol&gt; three</code></td>\n    </tr>\n    </tbody>\n</table>"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/#471.ol-is-not-rendered-correctly-inside-table.md",
    "content": "|  h1     |  h2                  |\n|--------:|:---------------------|\n| asdf    | one `two <ol> three` |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic-alignment.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th style=\"text-align:left;\">First Header</th>\n      <th style=\"text-align:left;\">Second Header</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align:left;\">Row 1 Cell 1</td>\n      <td style=\"text-align:left;\">Row 1 Cell 2</td>\n    </tr>\n    <tr>\n      <td style=\"text-align:left;\">Row 2 Cell 1</td>\n      <td style=\"text-align:left;\">Row 2 Cell 2</td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic-alignment.md",
    "content": "| First Header  | Second Header |\n| :------------ | :------------ |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic-with-header-ids.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th id=\"first_header\">First Header</th>\n            <th id=\"second_header\">Second Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Row 1 Cell 1</td>\n            <td>Row 1 Cell 2</td>\n        </tr>\n        <tr>\n            <td>Row 2 Cell 1</td>\n            <td>Row 2 Cell 2</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic-with-header-ids.md",
    "content": "| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Row 1 Cell 1</td>\n            <td>Row 1 Cell 2</td>\n        </tr>\n        <tr>\n            <td>Row 2 Cell 1</td>\n            <td>Row 2 Cell 2</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/basic.md",
    "content": "| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/gh-style-tables.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n            <th>Third Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Content Cell</td>\n            <td>Content Cell</td>\n            <td>C</td>\n        </tr>\n        <tr>\n            <td>Content Cell</td>\n            <td>Content Cell</td>\n            <td>C</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/gh-style-tables.md",
    "content": "First Header  | Second Header|Third Header\n------------- | -------------|---\nContent Cell  | Content Cell|C\nContent Cell  | Content Cell|C\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/large-table-with-allignments.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th style=\"text-align:left;\">First Header</th>\n            <th style=\"text-align:center;\">Second Header</th>\n            <th style=\"text-align:right;\">Third Header</th>\n            <th>Fourth Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td style=\"text-align:left;\">Row 1 Cell 1</td>\n            <td style=\"text-align:center;\">Row 1 Cell 2</td>\n            <td style=\"text-align:right;\">Row 1 Cell 3</td>\n            <td>Row 1 Cell 4</td>\n        </tr>\n        <tr>\n            <td style=\"text-align:left;\">Row 2 Cell 1</td>\n            <td style=\"text-align:center;\">Row 2 Cell 2</td>\n            <td style=\"text-align:right;\">Row 2 Cell 3</td>\n            <td>Row 2 Cell 4</td>\n        </tr>\n        <tr>\n            <td style=\"text-align:left;\">Row 3 Cell 1</td>\n            <td style=\"text-align:center;\">Row 3 Cell 2</td>\n            <td style=\"text-align:right;\">Row 3 Cell 3</td>\n            <td>Row 3 Cell 4</td>\n        </tr>\n        <tr>\n            <td style=\"text-align:left;\">Row 4 Cell 1</td>\n            <td style=\"text-align:center;\">Row 4 Cell 2</td>\n            <td style=\"text-align:right;\">Row 4 Cell 3</td>\n            <td>Row 4 Cell 4</td>\n        </tr>\n        <tr>\n            <td style=\"text-align:left;\">Row 5 Cell 1</td>\n            <td style=\"text-align:center;\">Row 5 Cell 2</td>\n            <td style=\"text-align:right;\">Row 5 Cell 3</td>\n            <td>Row 5 Cell 4</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/large-table-with-allignments.md",
    "content": "| First Header  | Second Header | Third Header  | Fourth Header |\n| :------------ |: ----------- :| ------------ :| ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  | Row 1 Cell 3  | Row 1 Cell 4  |\n| Row 2 Cell 1  | Row 2 Cell 2  | Row 2 Cell 3  | Row 2 Cell 4  |\n| Row 3 Cell 1  | Row 3 Cell 2  | Row 3 Cell 3  | Row 3 Cell 4  |\n| Row 4 Cell 1  | Row 4 Cell 2  | Row 4 Cell 3  | Row 4 Cell 4  |\n| Row 5 Cell 1  | Row 5 Cell 2  | Row 5 Cell 3  | Row 5 Cell 4  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/large.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n            <th>Third Header</th>\n            <th>Fourth Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Row 1 Cell 1</td>\n            <td>Row 1 Cell 2</td>\n            <td>Row 1 Cell 3</td>\n            <td>Row 1 Cell 4</td>\n        </tr>\n        <tr>\n            <td>Row 2 Cell 1</td>\n            <td>Row 2 Cell 2</td>\n            <td>Row 2 Cell 3</td>\n            <td>Row 2 Cell 4</td>\n        </tr>\n        <tr>\n            <td>Row 3 Cell 1</td>\n            <td>Row 3 Cell 2</td>\n            <td>Row 3 Cell 3</td>\n            <td>Row 3 Cell 4</td>\n        </tr>\n        <tr>\n            <td>Row 4 Cell 1</td>\n            <td>Row 4 Cell 2</td>\n            <td>Row 4 Cell 3</td>\n            <td>Row 4 Cell 4</td>\n        </tr>\n        <tr>\n            <td>Row 5 Cell 1</td>\n            <td>Row 5 Cell 2</td>\n            <td>Row 5 Cell 3</td>\n            <td>Row 5 Cell 4</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/large.md",
    "content": "| First Header  | Second Header | Third Header  | Fourth Header |\n| ------------- | ------------- | ------------  | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  | Row 1 Cell 3  | Row 1 Cell 4  |\n| Row 2 Cell 1  | Row 2 Cell 2  | Row 2 Cell 3  | Row 2 Cell 4  |\n| Row 3 Cell 1  | Row 3 Cell 2  | Row 3 Cell 3  | Row 3 Cell 4  |\n| Row 4 Cell 1  | Row 4 Cell 2  | Row 4 Cell 3  | Row 4 Cell 4  |\n| Row 5 Cell 1  | Row 5 Cell 2  | Row 5 Cell 3  | Row 5 Cell 4  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/mixed-alignment.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <th style=\"text-align:left;\">Left-Aligned</th>\n      <th style=\"text-align:center;\">Center-Aligned</th>\n      <th style=\"text-align:right;\">Right-Aligned</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align:left;\">col 3 is</td>\n      <td style=\"text-align:center;\">some wordy paragraph</td>\n      <td style=\"text-align:right;\">$1600</td>\n    </tr>\n    <tr>\n      <td style=\"text-align:left;\">col 2 is</td>\n      <td style=\"text-align:center;\">centered</td>\n      <td style=\"text-align:right;\">$12</td>\n    </tr>\n    <tr>\n      <td style=\"text-align:left;\">zebra stripes</td>\n      <td style=\"text-align:center;\">are neat</td>\n      <td style=\"text-align:right;\">$1</td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/mixed-alignment.md",
    "content": "| Left-Aligned  |    Center-Aligned    | Right-Aligned |\n| :------------ |:--------------------:| -------------:|\n| col 3 is      | some wordy paragraph |         $1600 |\n| col 2 is      |       centered       |           $12 |\n| zebra stripes |       are neat       |            $1 |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/multiple-tables.html",
    "content": "<h1 id=\"tabletest\">Table Test</h1>\n<h2 id=\"section1\">section 1</h2>\n<table>\n    <thead>\n        <tr>\n            <th>header1</th>\n            <th>header2</th>\n            <th>header3</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Value1</td>\n            <td>Value2</td>\n            <td>Value3</td>\n        </tr>\n    </tbody>\n</table>\n<h2 id=\"section2\">section 2</h2>\n<table>\n    <thead>\n        <tr>\n            <th>headerA</th>\n            <th>headerB</th>\n            <th>headerC</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>ValueA</td>\n            <td>ValueB</td>\n            <td>ValueC</td>\n        </tr>\n    </tbody>\n</table>"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/multiple-tables.md",
    "content": "Table Test\n============\n\nsection 1\n------------\n\n|header1    |header2    |header3|\n|-----------|-----------|---------|\n|Value1     |Value2     |Value3   |\n\n\nsection 2\n-----------\n\n|headerA    |headerB    |headerC|\n|-----------|-----------|---------|\n|ValueA     |ValueB     |ValueC   |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/table-inside-codeblock.html",
    "content": "<p>some text</p>\n<pre><code>| Tables        | Are           | Cool  |\n| ------------- |:-------------:| -----:|\n| **col 3 is**  | right-aligned | $1600 |\n| col 2 is      | *centered*    |   $12 |\n| zebra stripes | ~~are neat~~  |    $1 |\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/table-inside-codeblock.md",
    "content": "some text\n\n\n    | Tables        | Are           | Cool  |\n    | ------------- |:-------------:| -----:|\n    | **col 3 is**  | right-aligned | $1600 |\n    | col 2 is      | *centered*    |   $12 |\n    | zebra stripes | ~~are neat~~  |    $1 |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/table-without-leading-pipe.html",
    "content": "\n<h3 id=\"stats\">Stats</h3>\n<table>\n<thead>\n<tr>\n<th>Status</th>\n<th>AGENT1</th>\n<th>AGENT2</th>\n<th>AGENT3</th>\n<th>AGENT4</th>\n<th>AGENT5</th>\n<th>AGENT6</th>\n<th>AGENT7</th>\n<th>AGENT8</th>\n<th>AGENT9</th>\n<th>TOTAL</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>AGENT ERROR</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td></td>\n</tr>\n<tr>\n<td>APPROVED</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/table-without-leading-pipe.md",
    "content": "\n### Stats\n\n\nStatus | AGENT1 | AGENT2 | AGENT3 | AGENT4 | AGENT5 | AGENT6 | AGENT7 | AGENT8 | AGENT9 | TOTAL |\n--- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\nAGENT ERROR | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\nAPPROVED | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-equals.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Row 1 Cell 1</td>\n            <td>Row 1 Cell 2</td>\n        </tr>\n        <tr>\n            <td>Row 2 Cell 1</td>\n            <td>Row 2 Cell 2</td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-equals.md",
    "content": "| First Header  | Second Header |\n| ============= | ============= |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-span-elements.html",
    "content": "<table>\n    <thead>\n    <tr>\n        <th>First Header</th>\n        <th>Second Header</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr>\n        <td><strong>bold</strong></td>\n        <td><img src=\"foo.jpg\" alt=\"img\" /></td>\n    </tr>\n    <tr>\n        <td><em>italic</em></td>\n        <td><a href=\"bla.html\">link</a></td>\n    </tr>\n    <tr>\n        <td><code>some code</code></td>\n        <td><a href=\"www.google.com\">google</a></td>\n    </tr>\n    <tr>\n        <td><a href=\"http://www.foo.com\">www.foo.com</a></td>\n        <td>normal</td>\n    </tr>\n    </tbody>\n</table>"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-span-elements.md",
    "content": "| First Header  | Second Header     |\n| ------------- | ----------------- |\n| **bold**      | ![img](foo.jpg)   |\n| _italic_      | [link](bla.html)  |\n| `some code`   | [google][1]       |\n| <www.foo.com> | normal            |\n\n\n  [1]: www.google.com\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-surroundings.html",
    "content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nisi est, \nullamcorper euismod iaculis sed, tristique at neque. Nullam metus risus, \nmalesuada vitae imperdiet ac, tincidunt eget lacus. Proin ullamcorper \nvulputate dictum. Vestibulum consequat ultricies nibh, sed tempus nisl mattis a.</p>\n<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Row 1 Cell 1</td>\n            <td>Row 1 Cell 2</td>\n        </tr>\n        <tr>\n            <td>Row 2 Cell 1</td>\n            <td>Row 2 Cell 2</td>\n        </tr>\n    </tbody>\n</table>\n<p>Phasellus ac porttitor quam. Integer cursus accumsan mauris nec interdum. \nEtiam iaculis urna vitae risus facilisis faucibus eu quis risus. Sed aliquet \nrutrum dictum. Vivamus pulvinar malesuada ultricies. Pellentesque in commodo \nnibh. Maecenas justo erat, sodales vel bibendum a, dignissim in orci. Duis \nblandit ornare mi non facilisis. Aliquam rutrum fringilla lacus in semper. \nSed vel pretium lorem.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/with-surroundings.md",
    "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nisi est, \nullamcorper euismod iaculis sed, tristique at neque. Nullam metus risus, \nmalesuada vitae imperdiet ac, tincidunt eget lacus. Proin ullamcorper \nvulputate dictum. Vestibulum consequat ultricies nibh, sed tempus nisl mattis a.\n\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n\nPhasellus ac porttitor quam. Integer cursus accumsan mauris nec interdum. \nEtiam iaculis urna vitae risus facilisis faucibus eu quis risus. Sed aliquet \nrutrum dictum. Vivamus pulvinar malesuada ultricies. Pellentesque in commodo \nnibh. Maecenas justo erat, sodales vel bibendum a, dignissim in orci. Duis \nblandit ornare mi non facilisis. Aliquam rutrum fringilla lacus in semper. \nSed vel pretium lorem.\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/without-body.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>First Header</th>\n            <th>Second Header</th>\n        </tr>\n    </thead>\n    <tbody>\n    </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/without-body.md",
    "content": "| First Header  | Second Header |\n| ------------- | ------------- |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/without-header-delimiter.html",
    "content": "<p>| First Header  | Second Header |</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/tables/without-header-delimiter.md",
    "content": "| First Header  | Second Header |\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/underline/fulltext.html",
    "content": "<h1 id=\"markdowntestadaptedfrombitbucket\">Markdown test adapted from BitBucket</h1>\n<p><a href=\"http://daringfireball.net/projects/markdown/\">Markdown</a> for readmes is pretty popular.  So, I've given you a demo\n    here of all the markup we support. In some cases, I copied the doc/examples entirely from the Fireball Markdown site. </p>\n<p>I didn't duplicate all the Markdown doc everything tho. For the entire docs and a deeper explanation of Markdown, you still need to go to the <a href=\"http://daringfireball.net/projects/markdown/\">Markdown</a> site.</p>\n<p>You can also use <a href=\"https://confluence.atlassian.com/x/xTAvEw\">Markdown mark up</a> in comments, issues, and commit messages.</p>\n<p>On this page:</p>\n<ul>\n    <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-span-elements\">Span Elements</a></p>\n        <ul>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-emphasis\">Emphasis</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-strikethrough\">Strikethrough</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-preformatted-code\">Preformatted code</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-links\">Links</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-images\">Images</a></p></li></ul></li>\n    <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-block-elements\">Block Elements</a></p>\n        <ul>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-headings\">Headings</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-paragraphs-and-blockquotes\">Paragraphs and blockquotes</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-lists\">Lists</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-tables\">Tables</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-code-and-syntax-highlighting\">Code and Syntax highlighting</a></p></li>\n            <li><p><a href=\"https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-horizontal-rules\">Horizontal rules</a></p></li></ul></li>\n</ul>\n<hr />\n<h1 id=\"spanelements\">Span Elements</h1>\n<p>These elements occur within a line of text.  So, for example font changes or links.</p>\n<h2 id=\"emphasis\">Emphasis</h2>\n<p>Markdown treats * (asterisk) as emphasis markers. </p>\n<p><em>single asterisks</em>\n    <strong>double asterisks</strong></p>\n<p>All are created from this:</p>\n<pre><code>*single asterisks*\n\n**double asterisks**\n</code></pre>\n<h2 id=\"underlineexperimental\">Underline [experimental]</h2>\n<p><u>double underscores</u></p>\n<p><u>triple underscores</u></p>\n<p>All are created from this:</p>\n<pre><code>__double underscores__\n\n___triple underscores___\n</code></pre>\n<p>You must use the same character must be used to open and close an emphasis span. Emphasis can be used in the mi<em>dd</em>le of a word.</p>\n<pre><code>Emphasis can be used in the mi*dd*le of a word.\n</code></pre>\n<p>But if you surround an * or _ with spaces, it will be treated as a literal asterisk or underscore.</p>\n<p>To produce a literal asterisk or underscore at a position where it would otherwise be used as an emphasis delimiter, you can backslash escape it:</p>\n<pre><code>\\*this text is surrounded by literal asterisks\\*\n</code></pre>\n<h2 id=\"strikethrough\">Strikethrough</h2>\n<p>Markdown's Markdown parser supports strikethrough by wrapping text in <code>~~</code>:</p>\n<p>~~text that has been struckthrough~~</p>\n<p>is created from:</p>\n<pre><code>~~text that has been struckthrough~~\n</code></pre>\n<h2 id=\"preformattedcode\">Preformatted code</h2>\n<p>To indicate a span of code, wrap it with <code>`</code> (backtick). Unlike a pre-formatted code block, a code span indicates code within a normal paragraph. For example:</p>\n<p>Use the <code>printf()</code> function.</p>\n<p>is produced from:</p>\n<pre><code>Use the `printf()` function.\n</code></pre>\n<p>To include a literal backtick character within a code span, you can use multiple backticks as the opening and closing delimiters:</p>\n<p><code>There is a literal backtick (`) here.</code>    </p>\n<h2 id=\"links\">Links</h2>\n<p>Markdown supports inline and reference links. In both styles, the link text is delimited by [square brackets]. To create an inline link, use this syntax:</p>\n<pre><code>[ Text for the link ](URL)\n</code></pre>\n<p>So an inline link to <a href=\"http://www.yahoo.com\">Yahoo</a> looks like this:</p>\n<pre><code>So an inline link to [Yahoo](http://www.yahoo.com) looks like this:\n</code></pre>\n<p>Reference-style links use a second set of square brackets, inside which you place a label of your choosing to identify the link:</p>\n<pre><code>This is [an example][id] reference-style link.\n</code></pre>\n<p>Which gives you a link like this:</p>\n<p>This is <a href=\"http://example.com/\" title=\"Optional Title Here\">an example</a> reference-style link.</p>\n<p>Elsewhere in the document, usually at the bottom of the file, you define your link label on a line by itself:</p>\n<pre><code>[id]: http://example.com/  \"Optional Title Here\"\n</code></pre>\n<p>Links can get pretty fancy, so if you want the long form version, visit the\n    official <a href=\"http://daringfireball.net/projects/markdown/\">Markdown</a> docs.</p>\n<h2 id=\"images\">Images</h2>\n<p>Markdown uses an image syntax that is intended to resemble the syntax for links, allowing for two styles: inline and reference. Images appear like this:</p>\n<p><img src=\"http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png\" alt=\"Alt text\" /></p>\n<pre><code>![Alt text](http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png)\n\n![Alt text](http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png \"Optional title\")\n</code></pre>\n<hr />\n<h1 id=\"blockelements\">Block Elements</h1>\n<p>These are elements that are a single or multiple lines in length</p>\n<h2 id=\"headings\">Headings</h2>\n<p>You can create Atx-style headings by prefixing with a # (hash mark)</p>\n<h1 id=\"heading1markupheading1\">Heading 1 markup  <code># Heading 1</code></h1>\n<h1 id=\"\"> </h1>\n<h2 id=\"heading2markupheading2\">Heading 2 markup  <code>## Heading 2</code></h2>\n<h2 id=\"-1\"> </h2>\n<h3 id=\"heading3markupheading3\">Heading 3 markup   <code>### Heading 3</code></h3>\n<h3 id=\"-2\"> </h3>\n<h4 id=\"heading4markupheading4\">Heading 4 markup  <code>#### Heading 4</code></h4>\n<h4 id=\"-3\"> </h4>\n<h5 id=\"heading5markupheading5\">Heading 5 markup  <code>##### Heading 5</code></h5>\n<h5 id=\"-4\"> </h5>\n<h6 id=\"heading6markupheading6\">Heading 6 markup  <code>###### Heading 6</code></h6>\n<h6 id=\"-5\"> </h6>\n<p>You can also create Setext-style headings which have two levels.</p>\n<h1 id=\"level1markupuseanequalsignequalsign\">Level 1 markup use an equal sign = (equal sign) </h1>\n<pre><code> Level 1 markup use an equal sign = (equal sign)        \n ==============================\n</code></pre>\n<h2 id=\"level2markupusesdashes\">Level 2 markup uses - (dashes) </h2>\n<pre><code>Level 2 markup uses - (dashes) \n-------------\n</code></pre>\n<h2 id=\"paragraphsandblockquotes\">PARAGRAPHS and BLOCKQUOTES</h2>\n<p>A paragraph is one or more consecutive lines of text separated by one or more\n    blank lines. A blank line contains nothing but spaces or tabs. Do not indent\n    normal paragraphs with spaces or tabs. New lines/carriage returns within paragraphs require two spaces at the end of the preceding line.</p>\n<p>This is one paragraph.</p>\n<p>This is a second.</p>\n<pre><code>This is one paragraph.\n\nThis is a second.\n</code></pre>\n<p>Markdown uses email-style &gt; (greater than) characters for blockquoting. If youâ€™re familiar with quoting passages of text in an email message, then you know how to create a blockquote in Markdown. It looks best if you hard wrap the text and put a &gt; before every line:</p>\n<blockquote>\n    <p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n        consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.</p>\n    <p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n        id sem consectetuer libero luctus adipiscing.</p>\n</blockquote>\n<pre><code>&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n&gt; consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n&gt; \n&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n&gt; id sem consectetuer libero luctus adipiscing.\n</code></pre>\n<p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote):</p>\n<blockquote>\n    <p>This is the first level of quoting.</p>\n    <blockquote>\n        <p>This is nested blockquote.</p>\n    </blockquote>\n    <p>Back to the first level.</p>\n</blockquote>\n<pre><code>&gt; This is the first level of quoting.\n&gt;\n&gt; &gt; This is nested blockquote.\n&gt;\n&gt; Back to the first level.\n</code></pre>\n<p>Blockquotes can contain other Markdown elements, including headers, lists, and code blocks:</p>\n<blockquote>\n    <h2 id=\"thisisaheader\">This is a header.</h2>\n    <ol>\n        <li>This is the first list item.</li>\n        <li>This is the second list item.</li>\n    </ol>\n    <p>Here's some example code:</p>\n    <pre><code>return shell_exec(\"echo $input | $markdown_script\");\n</code></pre>\n</blockquote>\n<pre><code>&gt; ## This is a header.\n&gt; \n&gt; 1.   This is the first list item.\n&gt; 2.   This is the second list item.\n&gt; \n&gt; Here's some example code:\n&gt; \n&gt;     return shell_exec(\"echo $input | $markdown_script\");\n</code></pre>\n<h2 id=\"lists\">Lists</h2>\n<p>Markdown supports ordered (numbered) and unordered (bulleted) lists.  List markers typically start at the left margin, but may be indented by up to three spaces. List markers must be followed by one or more spaces or a tab.</p>\n<p>Form bulleted lists with any of * (asterisk), + (plus), or - (dash). You can one or any or mix of these to form a list:</p>\n<ul>\n    <li><p>Red </p></li>\n    <li><p>Green </p></li>\n    <li><p>Blue</p>\n        <pre><code>* Red\n+ Green\n- Blue\n</code></pre></li>\n</ul>\n<p>Ordered lists require a numeric character followed by a . (period).</p>\n<ol>\n    <li><p>Item one</p></li>\n    <li><p>Item two </p></li>\n    <li><p>Item three</p>\n        <pre><code>1. Item one\n1. Item two \n1. Item three\n</code></pre></li>\n</ol>\n<p>Notice the actual value of the number doesn't matter in the list result. However, for readability better to use this markup:</p>\n<pre><code>    1. Item one\n    2. Item two \n    3. Item three\n</code></pre>\n<p>Lists can be embedded in lists. List items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either 4 spaces or one tab:</p>\n<ul>\n    <li><p>Red </p></li>\n    <li><p>Green </p>\n        <ul>\n            <li>dark  green </li>\n            <li>lime    </li></ul></li>\n    <li><p>Blue        </p>\n        <ol>\n            <li><p>Item one</p>\n                <ol>\n                    <li>subitem 1 </li>\n                    <li>subitem 2</li></ol></li>\n            <li><p>Item two </p>\n                <p>This is is a first paragraph. </p>\n                <ul>\n                    <li>Green </li>\n                    <li>Blue</li></ul>\n                <p>This is a second paragraph.</p></li>\n            <li><p>Item three</p></li></ol></li>\n</ul>\n<p>The code for these embedded lists or paragraphs is:</p>\n<pre><code>        * Red \n        + Green \n            * dark  green \n            * lime    \n        - Blue        \n            1. Item one\n                1. subitem 1\n                1. subitem 2\n            1. Item two \n\n                This is is a first paragraph. \n\n                * Green \n                * Blue\n\n                This is a second paragraph.\n\n            1. Item three\n</code></pre>\n<p>You can also embed blockquotes in a list.</p>\n<ul>\n    <li>Green</li>\n</ul>\n<blockquote>\n    <p>What is this?  It is embedded blockquote.  Mix 'em and match 'em.</p>\n    <ul>\n        <li>Blue</li>\n        <li>Red</li>\n    </ul>\n</blockquote>\n<pre><code>    * Green\n    &gt; What is this?  It is embedded blockquote.  Mix 'em and match 'em.\n    * Blue\n    * Red\n</code></pre>\n<p>You can also embed code blocks in a list.</p>\n<ul>\n    <li><p>Green</p>\n        <p>Try this code:</p>\n        <pre><code>This is an embedded code block.\n</code></pre>\n        <p>Then this:</p>\n        <pre><code>More code!\n</code></pre></li>\n    <li><p>Blue</p></li>\n    <li><p>Red</p>\n        <pre><code>* Green\n\n    Try this code:\n\n        This is an embedded code block.\n\n    Then this:\n\n        More code!\n\n* Blue\n* Red\n</code></pre></li>\n</ul>\n<h2 id=\"tables\">Tables</h2>\n<p>Markdown does not support <code>&lt;html&gt;</code> so you need to use the - (dash) and the | (pipe) symbols to construct a table. The first line contains column headers. Separate columns with the pipe symbol.</p>\n<p>The  second line must be a mandatory separator line between the headers and the content. Subsequent lines are table rows. Columns are always separated by the pipe (|) character.  For example this table:</p>\n<p>First Header  | Second Header\n    ------------- | -------------\n    Content Cell  | Content Cell\n    Content Cell  | Content Cell</p>\n<p>Comes from this code:</p>\n<pre><code>First Header  | Second Header\n------------- | -------------\nContent Cell  | Content Cell\nContent Cell  | Content Cell\n</code></pre>\n<p>You can only put simple lines in a table.</p>\n<p>You can specify alignment for each column by adding colons to separator lines. A colon at the left of the separator line, left-aligns the column. A colon on the right, right-aligns the column. Add colons to both sides to center the column is center-aligned.</p>\n<p>Right     | Left   | Center\n    ---------:| :----- |:-----:\n    Computer  |  $1600 | one\n    Phone     |    $12 | three\n    Pipe      |     $1 | eleven</p>\n<pre><code>Right     | Left   | Center \n---------:| :----- |:-----:\nComputer  |  $1600 | one\nPhone     |    $12 | three\nPipe      |     $1 | eleven\n</code></pre>\n<p>You can apply inline formatting (span-level changes such as fonts or links) to the content of each cell using regular Markdown syntax:</p>\n<p>| Function name | Description                    |\n    | ------------- | ------------------------------ |\n    | <code>help()</code>      | Display the <u>help</u> window.   |\n    | <code>destroy()</code>   | <strong>Destroy your computer!</strong>     |</p>\n<pre><code>| Function name | Description                    |\n| ------------- | ------------------------------ |\n| `help()`      | Display the __help__ window.   |\n| `destroy()`   | **Destroy your computer!**     |\n</code></pre>\n<ul>\n    <li>-  -</li>\n</ul>\n<h2 id=\"codeandsyntaxhighlighting\">Code and Syntax highlighting</h2>\n<p>Pre-formatted code blocks are used for writing about programming or markup source code. Rather than forming normal paragraphs, the code block linesare interpreted literally.  Markdown wraps a code block in both <code>&lt;pre&gt;</code> and <code>&lt;code&gt;</code> tags.</p>\n<p>To produce a code block in Markdown, indent every line of the block by at least 4 spaces or 1 tab. For :</p>\n<p>This is a normal paragraph:</p>\n<pre><code>This is a code block.\n</code></pre>\n<p>The code reveals the indentation.</p>\n<pre><code>    This is a normal paragraph:\n\n        This is a code block.\n</code></pre>\n<p>A code block continues until it reaches a line that is not indented (or the end of the page).</p>\n<p>Within a code block, &amp; (ampersands) and < > (angle brackets) are automatically converted into HTML entities. This makes it very easy to include example HTML source code using Markdown â€” just paste it and indent it. Markdown will handle the hassle of encoding the ampersands and angle brackets. For example, this:</p>\n<p>Here is an example of AppleScript:</p>\n<pre><code>&lt;p&gt;Here is an example of AppleScript:&lt;/p&gt;\n</code></pre>\n<p>To produce a code block in Markdown, simply indent every line of the block by at least 4 spaces or 1 tab. For example, given this input:</p>\n<p>You can also highlight snippets of text (Markdown uses the excellent <a href=\"http://pygments.org/\">Pygments</a> library) to allow you to use code highlighting  Here's an example of some Python code:</p>\n<pre><code>#!python\n#\ndef wiki_rocks(text): formatter = lambda t: \"funky\"+t return formatter(text)         \n</code></pre>\n<p>To do this, do not indent the block. Start the block with <code>```</code> three ticks. Then, provide the comment with the type of syntax you are using.  There is a <a href=\"http://pygments.org/docs/lexers/\">the vast library of Pygment lexers</a>. Markdown accepts the 'short name' or the 'mimetype' of anything in there.</p>\n<p>You can also use a fence style for code.</p>\n<pre><code>This is a code block, fenced-style\n</code></pre>\n<p>Which you create with this code:</p>\n<pre><code>```\nThis is a code block, fenced-style\n```\n</code></pre>\n<p>See <a href=\"http://michelf.ca/projects/php-markdown/extra/\">Michel Fortin's blog</a> to try out more examples of this coding style. Not everything he demos is guaranteed to work though.</p>\n<hr />\n<h1 id=\"horizontalrules\">Horizontal Rules</h1>\n<p>You can produce a horizontal line with any of the following codes:</p>\n<pre><code>* * *\n\n***\n\n*****\n\n- - - -\n\n-----------------------\n</code></pre>\n<p>The output looks like this:</p>\n<hr />\n<hr />\n<hr />\n<hr />\n<hr />\n<hr />\n"
  },
  {
    "path": "test/functional/makehtml/cases/features/underline/fulltext.md",
    "content": "Markdown test adapted from BitBucket\n====================\n\n[Markdown][fireball] for readmes is pretty popular.  So, I've given you a demo\nhere of all the markup we support. In some cases, I copied the doc/examples entirely from the Fireball Markdown site. \n\nI didn't duplicate all the Markdown doc everything tho. For the entire docs and a deeper explanation of Markdown, you still need to go to the [Markdown][fireball] site.\n\nYou can also use [Markdown mark up][BBmarkup] in comments, issues, and commit messages.\n\nOn this page:\n\n\n* [Span Elements](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-span-elements)\n    * [Emphasis](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-emphasis)\n\n    * [Strikethrough](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-strikethrough)\n    \n    * [Preformatted code](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-preformatted-code)\n\n    * [Links](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-links)\n\n    * [Images](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-images)\n\n* [Block Elements](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-block-elements)\n    * [Headings](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-headings)\n\n    * [Paragraphs and blockquotes](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-paragraphs-and-blockquotes)\n\n    * [Lists](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-lists)\n\n    * [Tables](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-tables)\n\n    * [Code and Syntax highlighting](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-code-and-syntax-highlighting)\n\n    * [Horizontal rules](https://Markdown.org/tutorials/markdowndemo/overview#markdown-header-horizontal-rules)\n\n- - -\n\n# Span Elements\n\nThese elements occur within a line of text.  So, for example font changes or links.\n\n \n## Emphasis\n\nMarkdown treats * (asterisk) as emphasis markers. \n\n*single asterisks*\n**double asterisks**\n\nAll are created from this:\n\n    *single asterisks*\n\n    **double asterisks**\n\n\n## Underline [experimental]\n\n\n__double underscores__\n\n___triple underscores___\n\n\nAll are created from this:\n\n\n    __double underscores__\n\n    ___triple underscores___\n\n\nYou must use the same character must be used to open and close an emphasis span. Emphasis can be used in the mi*dd*le of a word.\n\n    Emphasis can be used in the mi*dd*le of a word.\n\nBut if you surround an * or _ with spaces, it will be treated as a literal asterisk or underscore.\n\nTo produce a literal asterisk or underscore at a position where it would otherwise be used as an emphasis delimiter, you can backslash escape it:\n\n    \\*this text is surrounded by literal asterisks\\*\n\n## Strikethrough\n\nMarkdown's Markdown parser supports strikethrough by wrapping text in `~~`:\n\n~~text that has been struckthrough~~\n\nis created from:\n\n    ~~text that has been struckthrough~~\n\n## Preformatted code\n\nTo indicate a span of code, wrap it with `` ` `` (backtick). Unlike a pre-formatted code block, a code span indicates code within a normal paragraph. For example:\n\nUse the `printf()` function.\n\nis produced from:\n\n    Use the `printf()` function.\n    \nTo include a literal backtick character within a code span, you can use multiple backticks as the opening and closing delimiters:\n\n``There is a literal backtick (`) here.``    \n\n\n## Links\n\nMarkdown supports inline and reference links. In both styles, the link text is delimited by [square brackets]. To create an inline link, use this syntax:\n\n    [ Text for the link ](URL)\n\nSo an inline link to [Yahoo](http://www.yahoo.com) looks like this:\n\n    So an inline link to [Yahoo](http://www.yahoo.com) looks like this:\n\nReference-style links use a second set of square brackets, inside which you place a label of your choosing to identify the link:\n\n    This is [an example][id] reference-style link.\n    \nWhich gives you a link like this:\n\nThis is [an example][id] reference-style link.\n    \nElsewhere in the document, usually at the bottom of the file, you define your link label on a line by itself:\n\n    [id]: http://example.com/  \"Optional Title Here\"\n    \nLinks can get pretty fancy, so if you want the long form version, visit the \n official [Markdown][fireball] docs.\n\n\n## Images\n\nMarkdown uses an image syntax that is intended to resemble the syntax for links, allowing for two styles: inline and reference. Images appear like this:\n\n![Alt text](http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png)\n\n\n\n    ![Alt text](http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png)\n\n    ![Alt text](http://www.addictedtoibiza.com/wp-content/uploads/2012/12/example.png \"Optional title\")\n    \n- - -\n# Block Elements\n\nThese are elements that are a single or multiple lines in length\n\n\n\n## Headings\nYou can create Atx-style headings by prefixing with a # (hash mark)\n\n# Heading 1 markup  `# Heading 1`\n# \n## Heading 2 markup  `## Heading 2`\n## \n### Heading 3 markup   `### Heading 3`\n### \n#### Heading 4 markup  `#### Heading 4`\n#### \n##### Heading 5 markup  `##### Heading 5`\n##### \n###### Heading 6 markup  `###### Heading 6`\n###### \nYou can also create Setext-style headings which have two levels.\n\nLevel 1 markup use an equal sign = (equal sign) \n==============================\n\n\n     Level 1 markup use an equal sign = (equal sign)        \n     ==============================\n     \nLevel 2 markup uses - (dashes) \n-------------\n\n\n    Level 2 markup uses - (dashes) \n    -------------\n\n\n\n\n## PARAGRAPHS and BLOCKQUOTES\n\n\nA paragraph is one or more consecutive lines of text separated by one or more\nblank lines. A blank line contains nothing but spaces or tabs. Do not indent\nnormal paragraphs with spaces or tabs. New lines/carriage returns within paragraphs require two spaces at the end of the preceding line.\n\nThis is one paragraph.\n\nThis is a second.\n\n    This is one paragraph.\n\n    This is a second.\n\nMarkdown uses email-style > (greater than) characters for blockquoting. If youâ€™re familiar with quoting passages of text in an email message, then you know how to create a blockquote in Markdown. It looks best if you hard wrap the text and put a > before every line:\n\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> \n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.\n\n\n    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n    > \n    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n    > id sem consectetuer libero luctus adipiscing.\n    \nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote):\n\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n\n    > This is the first level of quoting.\n    >\n    > > This is nested blockquote.\n    >\n    > Back to the first level.\n\nBlockquotes can contain other Markdown elements, including headers, lists, and code blocks:\n\n> ## This is a header.\n> \n> 1.   This is the first list item.\n> 2.   This is the second list item.\n> \n> Here's some example code:\n> \n>     return shell_exec(\"echo $input | $markdown_script\");\n\n\n    > ## This is a header.\n    > \n    > 1.   This is the first list item.\n    > 2.   This is the second list item.\n    > \n    > Here's some example code:\n    > \n    >     return shell_exec(\"echo $input | $markdown_script\");\n    \n\n\n\n## Lists\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.  List markers typically start at the left margin, but may be indented by up to three spaces. List markers must be followed by one or more spaces or a tab.\n\nForm bulleted lists with any of * (asterisk), + (plus), or - (dash). You can one or any or mix of these to form a list:\n\n* Red \n+ Green \n- Blue\n\n\n        * Red\n        + Green\n        - Blue\n    \nOrdered lists require a numeric character followed by a . (period).\n\n1. Item one\n1. Item two \n1. Item three\n\n        1. Item one\n        1. Item two \n        1. Item three\n    \nNotice the actual value of the number doesn't matter in the list result. However, for readability better to use this markup:\n\n        1. Item one\n        2. Item two \n        3. Item three\n        \nLists can be embedded in lists. List items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either 4 spaces or one tab:\n\n* Red \n+ Green \n    * dark  green \n    * lime    \n- Blue        \n    1. Item one\n        1. subitem 1 \n        1. subitem 2\n    1. Item two \n    \n        This is is a first paragraph. \n        \n        * Green \n        * Blue\n        \n        This is a second paragraph.\n        \n    1. Item three\n    \nThe code for these embedded lists or paragraphs is:\n\n            * Red \n            + Green \n                * dark  green \n                * lime    \n            - Blue        \n                1. Item one\n                    1. subitem 1\n                    1. subitem 2\n                1. Item two \n    \n                    This is is a first paragraph. \n        \n                    * Green \n                    * Blue\n        \n                    This is a second paragraph.\n        \n                1. Item three\n\nYou can also embed blockquotes in a list.\n\n* Green\n> What is this?  It is embedded blockquote.  Mix 'em and match 'em.\n* Blue\n* Red\n\n        * Green\n        > What is this?  It is embedded blockquote.  Mix 'em and match 'em.\n        * Blue\n        * Red\n\n\n\nYou can also embed code blocks in a list.\n\n* Green\n\n    Try this code:\n\n        This is an embedded code block.\n\n    Then this:\n\n        More code!\n\n* Blue\n* Red\n\n        * Green\n\n            Try this code:\n\n                This is an embedded code block.\n\n            Then this:\n\n                More code!\n\n        * Blue\n        * Red\n\n\n## Tables\n\n\n\nMarkdown does not support `<html>` so you need to use the - (dash) and the | (pipe) symbols to construct a table. The first line contains column headers. Separate columns with the pipe symbol.\n\nThe  second line must be a mandatory separator line between the headers and the content. Subsequent lines are table rows. Columns are always separated by the pipe (|) character.  For example this table:\n\nFirst Header  | Second Header\n------------- | -------------\nContent Cell  | Content Cell\nContent Cell  | Content Cell\n\nComes from this code:\n\n    First Header  | Second Header\n    ------------- | -------------\n    Content Cell  | Content Cell\n    Content Cell  | Content Cell\n    \n    \nYou can only put simple lines in a table.\n\nYou can specify alignment for each column by adding colons to separator lines. A colon at the left of the separator line, left-aligns the column. A colon on the right, right-aligns the column. Add colons to both sides to center the column is center-aligned.\n\nRight     | Left   | Center \n---------:| :----- |:-----:\nComputer  |  $1600 | one\nPhone     |    $12 | three\nPipe      |     $1 | eleven\n\n    Right     | Left   | Center \n    ---------:| :----- |:-----:\n    Computer  |  $1600 | one\n    Phone     |    $12 | three\n    Pipe      |     $1 | eleven\n\n\nYou can apply inline formatting (span-level changes such as fonts or links) to the content of each cell using regular Markdown syntax:\n\n\n| Function name | Description                    |\n| ------------- | ------------------------------ |\n| `help()`      | Display the __help__ window.   |\n| `destroy()`   | **Destroy your computer!**     |\n\n    | Function name | Description                    |\n    | ------------- | ------------------------------ |\n    | `help()`      | Display the __help__ window.   |\n    | `destroy()`   | **Destroy your computer!**     |\n\n\n\n\n- -  -\n\n\n## Code and Syntax highlighting\n\n\nPre-formatted code blocks are used for writing about programming or markup source code. Rather than forming normal paragraphs, the code block linesare interpreted literally.  Markdown wraps a code block in both `<pre>` and `<code>` tags.\n\nTo produce a code block in Markdown, indent every line of the block by at least 4 spaces or 1 tab. For :\n\nThis is a normal paragraph:\n\n    This is a code block.\n\nThe code reveals the indentation.\n\n        This is a normal paragraph:\n\n            This is a code block.\n\nA code block continues until it reaches a line that is not indented (or the end of the page).\n\nWithin a code block, & (ampersands) and < > (angle brackets) are automatically converted into HTML entities. This makes it very easy to include example HTML source code using Markdown â€” just paste it and indent it. Markdown will handle the hassle of encoding the ampersands and angle brackets. For example, this:\n\n<p>Here is an example of AppleScript:</p>\n\n    <p>Here is an example of AppleScript:</p>\n\nTo produce a code block in Markdown, simply indent every line of the block by at least 4 spaces or 1 tab. For example, given this input:\n\n\nYou can also highlight snippets of text (Markdown uses the excellent [Pygments][] library) to allow you to use code highlighting  Here's an example of some Python code:\n\n```\n#!python\n#\ndef wiki_rocks(text): formatter = lambda t: \"funky\"+t return formatter(text)         \n```\n\nTo do this, do not indent the block. Start the block with ` ``` ` three ticks. Then, provide the comment with the type of syntax you are using.  There is a [the vast library of Pygment lexers][lexers]. Markdown accepts the 'short name' or the 'mimetype' of anything in there.\n\nYou can also use a fence style for code.\n\n```\nThis is a code block, fenced-style\n```\n\nWhich you create with this code:\n\n    ```\n    This is a code block, fenced-style\n    ```\n    \nSee [Michel Fortin's blog][extra] to try out more examples of this coding style. Not everything he demos is guaranteed to work though.\n\n\n- - -\n\n# Horizontal Rules\n\nYou can produce a horizontal line with any of the following codes:\n\n    * * *\n\n    ***\n\n    *****\n\n    - - - -\n\n    -----------------------\n    \nThe output looks like this:\n\n* * *\n\n***\n\n*****\n\n- - - \n\n-----------------------\n\n- - -\n\n\n\n[lexers]: http://pygments.org/docs/lexers/\n[fireball]: http://daringfireball.net/projects/markdown/ \n[Pygments]: http://pygments.org/ \n[Extra]: http://michelf.ca/projects/php-markdown/extra/\n[id]: http://example.com/  \"Optional Title Here\"\n[BBmarkup]: https://confluence.atlassian.com/x/xTAvEw"
  },
  {
    "path": "test/functional/makehtml/cases/features/underline/simple.html",
    "content": "<p>this is <u>underlined</u> word</p>\n<p><u>an underlined sentence</u></p>\n<p><u>three underscores are fine</u></p>\n<p>_single_ underscores are left alone</p>\n<p><u>multiple</u> underlines in a <u>paragraph</u></p>"
  },
  {
    "path": "test/functional/makehtml/cases/features/underline/simple.md",
    "content": "this is __underlined__ word\n\n__an underlined sentence__\n\n___three underscores are fine___\n\n_single_ underscores are left alone\n\n__multiple__ underlines in a __paragraph__"
  },
  {
    "path": "test/functional/makehtml/cases/ghost/markdown-magic.html",
    "content": "<h3 id=\"automaticlinks\">Automatic Links</h3>\n<pre><code>https://ghost.org\n</code></pre>\n<p><a href=\"https://ghost.org\">https://ghost.org</a></p>\n<h3 id=\"markdownfootnotes\">Markdown Footnotes</h3>\n<pre><code>The quick brown fox[^1] jumped over the lazy dog[^2].\n\n    [^1]: Foxes are red\n    [^2]: Dogs are usually not red\n</code></pre>\n<p>The quick brown fox[^1] jumped over the lazy dog[^2].</p>\n<h3 id=\"syntaxhighlighting\">Syntax Highlighting</h3>\n<pre><code>```language-javascript\n    [...]\n    ```\n</code></pre>\n<p>Combined with <a href=\"http://prismjs.com/\">Prism.js</a> in the Ghost theme:</p>\n<pre><code class=\"language-javascript language-language-javascript\">// # Notifications API\n// RESTful API for creating notifications\nvar Promise            = require('bluebird'),\n_                  = require('lodash'),\ncanThis            = require('../permissions').canThis,\nerrors             = require('../errors'),\nutils              = require('./utils'),\n\n// Holds the persistent notifications\nnotificationsStore = [],\n// Holds the last used id\nnotificationCounter = 0,\nnotifications;\n</code></pre>"
  },
  {
    "path": "test/functional/makehtml/cases/ghost/markdown-magic.md",
    "content": "### Automatic Links\n\n```\nhttps://ghost.org\n```\n\nhttps://ghost.org\n\n### Markdown Footnotes\n\n```\nThe quick brown fox[^1] jumped over the lazy dog[^2].\n\n[^1]: Foxes are red\n[^2]: Dogs are usually not red\n```\n\nThe quick brown fox[^1] jumped over the lazy dog[^2].\n\n\n### Syntax Highlighting\n\n    ```language-javascript\n       [...]\n    ```\n\nCombined with [Prism.js](http://prismjs.com/) in the Ghost theme:\n\n```language-javascript\n// # Notifications API\n// RESTful API for creating notifications\nvar Promise            = require('bluebird'),\n    _                  = require('lodash'),\n    canThis            = require('../permissions').canThis,\n    errors             = require('../errors'),\n    utils              = require('./utils'),\n\n    // Holds the persistent notifications\n    notificationsStore = [],\n    // Holds the last used id\n    notificationCounter = 0,\n    notifications;\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/ghost/underscore.html",
    "content": "<p>foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</p>\n<p><em>baz_bar_foo</em></p>\n<p><strong>baz_bar_foo</strong></p>\n<p><strong><em>baz_bar_foo</em></strong></p>\n<p>baz bar foo <em>baz_bar_foo foo bar baz</em> and foo</p>\n<p>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</p>\n<p><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></p>\n<pre><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n</code></pre>\n<pre><code class=\"html language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n</code></pre>\n<pre>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</pre>\n<pre><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n<pre class=\"lang-html\"><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n<script>\n    var strike = \"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\";\n    var foo_bar_baz_bar_foo = \"foo_bar_\";\n</script>\n<p><a href=\"http://myurl.com/foo_bar_baz_bar_foo\">foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</a></p>\n<p><a href=\"http://myurl.com/foo_bar_baz_bar_foo\" title=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</a></p>\n<p><img src=\"http://myurl.com/foo_bar_baz_bar_foo\" alt=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\"></p>\n<h2 id=\"foo_bar_bazfoo_bar_baz_bar_foo_foo_barbaz_bar_baz_foo\">foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</h2>\n<h3 id=\"foo_bar_bazfoo_bar_baz_bar_foo_foo_barbaz_bar_baz_foo-1\">foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</h3>\n<ol>\n<li>foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</li>\n<li>foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</li>\n</ol>\n<blockquote>\n<p>blockquote foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</p>\n</blockquote>\n<ul>\n<li>foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</li>\n<li>foo_bar_baz foo_bar_baz_bar_foo <em>foo_bar baz_bar</em> baz_foo</li>\n</ul>\n<hr />\n<p><a href=\"http://en.wikipedia.org/wiki/Tourism_in_Germany\">http://en.wikipedia.org/wiki/Tourism_in_Germany</a></p>\n<p><a href=\"http://en.wikipedia.org/wiki/Tourism_in_Germany\">an example</a></p>\n<p>Another <a href=\"http://en.wikipedia.org/wiki/Tourism_in_Germany\">example</a> of a link</p>\n<p><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></p>\n<!-- These two cases still have bad <ems> because showdown handles them incorrectly -->\n<p><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></p>\n<p><img src=\"http://myurl.com/foo_bar_baz_bar_foo\" alt=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\" /></p>\n<p><a href=\"http://myurl.com/foo_bar_baz_bar_foo\">http://myurl.com/foo_bar_baz_bar_foo</a></p>\n<p><a href=\"http://myurl.com/foo_bar_baz_bar_foo\">http://myurl.com/foo_bar_baz_bar_foo</a></p>\n<p><em>italics</em>.</p>\n<p><em>italics</em>   .</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/ghost/underscore.md",
    "content": "foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n_baz_bar_foo_\n\n__baz_bar_foo__\n\n___baz_bar_foo___\n\nbaz bar foo _baz_bar_foo foo bar baz_ and foo\n\nfoo\\_bar\\_baz foo\\_bar\\_baz\\_bar\\_foo \\_foo\\_bar baz\\_bar\\_ baz\\_foo\n\n`foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo`\n\n\n    foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n\n```html\nfoo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n```\n\n<pre>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</pre>\n\n<pre><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n\n<pre class=\"lang-html\"><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n\n<script>\nvar strike = \"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\";\nvar foo_bar_baz_bar_foo = \"foo_bar_\";\n</script>\n\n[foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo](http://myurl.com/foo_bar_baz_bar_foo)\n\n<a href=\"http://myurl.com/foo_bar_baz_bar_foo\" title=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</a>\n\n<img src=\"http://myurl.com/foo_bar_baz_bar_foo\" alt=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\">\n\nfoo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n-----\n\n### foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n1. foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n2. foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n> blockquote foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n* foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n* foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n-------\n\nhttp://en.wikipedia.org/wiki/Tourism_in_Germany\n\n[an example] [wiki]\n\nAnother [example][wiki] of a link\n\n[wiki]: http://en.wikipedia.org/wiki/Tourism_in_Germany\n\n<p><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></p>\n\n<!-- These two cases still have bad <ems> because showdown handles them incorrectly -->\n\n<code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code>\n\n![foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo](http://myurl.com/foo_bar_baz_bar_foo)\n\nhttp://myurl.com/foo_bar_baz_bar_foo\n\n<http://myurl.com/foo_bar_baz_bar_foo>\n\n_italics_.\n\n_italics_   .\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#107.inner-underscore-parse-to-block.html",
    "content": "<p>escaped word_with_underscores</p>\n<p>escaped word__with__double underscores</p>\n<p>escaped word<em>_with_</em>single italic underscore</p>\n<p>escaped word*with*asterixs</p>\n<p>escaped word**with**asterixs</p>\n<p>escaped word<strong>*with*</strong>bold asterixs</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#107.inner-underscore-parse-to-block.md",
    "content": "escaped word\\_with\\_underscores\n\nescaped word\\_\\_with\\_\\_double underscores\n\nescaped word_\\_with\\__single italic underscore\n\nescaped word\\*with*asterixs\n\nescaped word\\*\\*with\\*\\*asterixs\n\nescaped word**\\*with\\***bold asterixs\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#142.odd-behaviour-for-multiple-consecutive-lists.html",
    "content": "<ul>\n    <li>Item 1</li>\n    <li>Item 2</li>\n</ul>\n<ol>\n    <li>Item 1</li>\n    <li>Item 2</li>\n</ol>\n<ul>\n    <li>Item 1</li>\n    <li>Item 2</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#142.odd-behaviour-for-multiple-consecutive-lists.md",
    "content": "* Item 1\n* Item 2\n\n1. Item 1\n2. Item 2\n\n- Item 1\n- Item 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#150.hyphens-are-getting-removed.html",
    "content": "<p>2015-10-04</p>"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#150.hyphens-are-getting-removed.md",
    "content": "2015-10-04\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#183.gh-code-blocks-within-lists-do-not-render-properly.html",
    "content": "<ol>\n<li><p>Hi, I am a thing</p>\n<pre><code class=\"sh language-sh\">$ git clone thing.git\n\ndfgdfg\n</code></pre></li>\n<li><p>I am another thing!</p>\n<pre><code class=\"sh language-sh\">$ git clone other-thing.git\n\nfoobar\n</code></pre></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#183.gh-code-blocks-within-lists-do-not-render-properly.md",
    "content": "1. Hi, I am a thing\n\n    ```sh\n    \n    $ git clone thing.git\n   \n    dfgdfg\n    ```\n\n1. I am another thing!\n\n    ```sh\n   \n    $ git clone other-thing.git\n\n    foobar\n    ```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#191.blockquote-followed-by-an-heading.html",
    "content": "<blockquote>\n    <p>a blockquote</p>\n    <h1 id=\"followedbyanheading\">followed by an heading</h1>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#191.blockquote-followed-by-an-heading.md",
    "content": "> a blockquote\n# followed by an heading\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#196.entity-in-code-block-in-nested-list.html",
    "content": "<p>Test pre in a list</p>\n<ul>\n    <li>&amp; &lt;</li>\n    <li><code>&amp; &lt;</code><ul>\n        <li>&amp; &lt;</li>\n        <li><code>&amp; &lt;</code><ul>\n            <li>&amp; &lt;</li>\n            <li><code>&amp; &lt;</code><ul>\n                <li>&amp; &lt;</li>\n                <li><code>&amp; &lt;</code></li></ul></li></ul></li></ul></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#196.entity-in-code-block-in-nested-list.md",
    "content": "Test pre in a list\n\n- & <\n- `& <`\n    - & <\n    - `& <`\n        - & <\n        - `& <`\n            - & <\n            - `& <`\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#220.html-breaks-markdown-parsing.html",
    "content": "<h2 id=\"title1\">Title 1</h2>\n<div></div>\n<h1 id=\"title2\">Title 2</h1>\n<div>\n</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#220.html-breaks-markdown-parsing.md",
    "content": "Title 1\n-------\n\n<div></div>\n\n\n# Title 2\n\n\n<div>\n</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#229.2.code-being-parsed-inside-HTML-code-tags.html",
    "content": "<pre lang=\"no-highlight\"><code>\nfoo\n\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\nbar\n</code></pre>\n<p>this is a long paragraph</p>\n<p>this is another long paragraph</p>\n<pre lang=\"no-highlight\"><code>```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#229.2.code-being-parsed-inside-HTML-code-tags.md",
    "content": "<pre lang=\"no-highlight\"><code>\nfoo\n\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\nbar\n</code></pre>\n\nthis is a long paragraph\n\nthis is another long paragraph\n\n<pre lang=\"no-highlight\"><code>```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#229.code-being-parsed-inside-HTML-code-tags.html",
    "content": "<pre lang=\"no-highlight\"><code>\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n\n```\nNo language indicated, so no syntax highlighting.\nBut let's throw in a &lt;b&gt;tag&lt;/b&gt;.\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#229.code-being-parsed-inside-HTML-code-tags.md",
    "content": "<pre lang=\"no-highlight\"><code>\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n\n```\nNo language indicated, so no syntax highlighting.\nBut let's throw in a <b>tag</b>.\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#230.paragraphs-are-ignored-between-code-tags.html",
    "content": "<pre lang=\"no-highlight\"><code>```python\nvar s;\n```\n</code></pre>\n<p>this is a long paragraph</p>\n<pre lang=\"no-highlight\"><code>\n```javascript\nvar s;\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#230.paragraphs-are-ignored-between-code-tags.md",
    "content": "<pre lang=\"no-highlight\"><code>```python\nvar s;\n```\n</code></pre>\n\nthis is a long paragraph\n\n<pre lang=\"no-highlight\"><code>\n```javascript\nvar s;\n```\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#236.wrong-lt-parsing-when-attached-to-word.html",
    "content": "<p>this should be <parsed></parsed></p>\n<p>this should be <parsed></p>\n<p>this should be <parsed/></p>\n<p>this should&gt; appear</p>\n<p>this text &lt;should appear</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#236.wrong-lt-parsing-when-attached-to-word.md",
    "content": "this should be <parsed></parsed>\n\nthis should be <parsed>\n\nthis should be <parsed/>\n\nthis should> appear\n\nthis text <should appear\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.mix-images-with-links.html",
    "content": "<p><img src=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\" alt=\"sd-inline\" /> <a href=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\">sd-ref</a></p>\n<p>foo</p>\n<p><a href=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\">sd-inline</a> <img src=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\" alt=\"sd-ref\" /></p>\n<p>foo</p>\n<p><img src=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\" alt=\"sd-ref\" /> <a href=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\">sd-inline</a></p>\n<p>foo</p>\n<p><a href=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\">sd-ref</a> <img src=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\" alt=\"sd-inline\" /></p>\n<p>foo</p>\n<p><a href=\"http://www.google.com/\"><img src=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\" alt=\"sd-ref\" /></a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.mix-images-with-links.md",
    "content": "![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) [sd-ref][sd-logo]\n\nfoo\n\n[sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) ![sd-ref][sd-logo]\n\nfoo\n\n![sd-ref][sd-logo] [sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\nfoo\n\n[sd-ref][sd-logo] ![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\nfoo\n\n[![sd-ref][sd-logo]](http://www.google.com/)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.reference-style-image-after-inline-style-image-does-not-work-correctely.html",
    "content": "<p><img src=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\" alt=\"sd-inline\" /> <img src=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\" alt=\"sd-ref\" /></p>\n<p>foo</p>\n<p><img src=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\" alt=\"sd-ref\" /> <img src=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\" alt=\"sd-inline\" /></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.reference-style-image-after-inline-style-image-does-not-work-correctely.md",
    "content": "![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) ![sd-ref][sd-logo]\n\nfoo\n\n![sd-ref][sd-logo] ![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.reference-style-link-after-inline-style-link-does-not-work-correctely.html",
    "content": "<p><a href=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\">sd-inline</a> <a href=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\">sd-ref</a></p>\n<p>foo</p>\n<p><a href=\"https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\">sd-ref</a> <a href=\"https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png\">sd-inline</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#261.reference-style-link-after-inline-style-link-does-not-work-correctely.md",
    "content": "[sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) [sd-ref][sd-logo]\n\nfoo\n\n[sd-ref][sd-logo] [sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#288.code-blocks-containing-xml-comments-are-not-converted-correctly-when-nested-in-list-items.html",
    "content": "<ul>\n<li><p>list item 1</p>\n<pre><code>&lt;parent&gt;\n&lt;child&gt;child1&lt;/child&gt;\n&lt;!-- This is a comment --&gt;\n&lt;child&gt;child2&lt;/child&gt;\n&lt;child&gt;some text &lt;!-- a comment --&gt;&lt;/child&gt;\n&lt;/parent&gt;\n</code></pre></li>\n<li><p>list item 2</p></li>\n</ul>\n<pre><code>&lt;parent&gt;\n&lt;child&gt;child1&lt;/child&gt;\n&lt;!-- This is a comment --&gt;\n&lt;child&gt;child2&lt;/child&gt;\n&lt;child&gt;some text &lt;!-- a comment --&gt;&lt;/child&gt;\n&lt;/parent&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#288.code-blocks-containing-xml-comments-are-not-converted-correctly-when-nested-in-list-items.md",
    "content": "* list item 1\n\n    ```\n    <parent>\n    <child>child1</child>\n    <!-- This is a comment -->\n    <child>child2</child>\n    <child>some text <!-- a comment --></child>\n    </parent>\n    ```\n\n* list item 2\n\n```\n<parent>\n<child>child1</child>\n<!-- This is a comment -->\n<child>child2</child>\n<child>some text <!-- a comment --></child>\n</parent>\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior-2.html",
    "content": "<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one<ol>\n        <li>two</li></ol></li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>one</li>\n    <li>two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>one</li>\n    <li>two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>one</li>\n    <li>two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>one</li>\n    <li>two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>one<ul>\n        <li>two</li></ul></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior-2.md",
    "content": " * one\n 1. two\n\nfoo\n\n  * one\n  1. two\n\nfoo\n\n   * one\n   1. two\n\nfoo\n\n   * one\n     1. two\n\nfoo\n\n * one\n * two\n\nfoo\n\n  * one\n  * two\n\nfoo\n\n   * one\n   * two\n\nfoo\n\n   * one\n* two\n\nfoo\n\n   * one\n    * two\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior-3.html",
    "content": "<ul>\n    <li>one long paragraph of\ntext</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one long paragraph of\ntext</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior-3.md",
    "content": " * one long paragraph of\ntext\n 1. two\n\nfoo\n\n  * one long paragraph of\ntext\n   1. two\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior.html",
    "content": "<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>one</li>\n</ul>\n<ol>\n    <li>two</li>\n</ol>\n<p>foo</p>\n<ul>\n    <li>uli one</li>\n    <li>uli two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>uli one</li>\n    <li>uli two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>uli one</li>\n    <li>uli two</li>\n</ul>\n<p>foo</p>\n<ul>\n    <li>uli one</li>\n    <li>uli two</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#299.nested-ordered-unordered-list-inconsistent-behavior.md",
    "content": "* one\n1. two\n\nfoo\n\n* one\n 1. two\n\nfoo\n\n* one\n  1. two\n\nfoo\n\n* one\n   1. two\n\nfoo\n\n* uli one\n* uli two\n\nfoo\n\n* uli one\n * uli two\n\nfoo\n\n* uli one\n  * uli two\n\nfoo\n\n* uli one\n   * uli two\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char.html",
    "content": "<ul>\n<li>- - a</li>\n</ul>\n<p>a</p>\n<ul>\n<li>- * - - + a</li>\n</ul>\n<p>a</p>\n<ol>\n<li>2. 3. 4. 5.</li>\n</ol>\n<p>a</p>\n<ol>\n<li>2. 3. 4. 5. a</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char.md",
    "content": "- - - a\n\na\n\n+ - * - - + a\n\na\n\n1. 2. 3. 4. 5.\n\na\n\n1. 2. 3. 4. 5. a\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char2.html",
    "content": "<ul>\n<li><p>- - a</p></li>\n<li><p>- * - - + a</p></li>\n</ul>\n<ol>\n<li><p>2. 3. 4. 5.</p></li>\n<li><p>2. 3. 4. 5. a</p></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char2.md",
    "content": "- - - a\n\n+ - * - - + a\n\n1. 2. 3. 4. 5.\n\n1. 2. 3. 4. 5. a\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char3.html",
    "content": "<ul>\n<li>-\na</li>\n</ul>\n<p>fooo</p>\n<ul>\n<li><p>- - aaaaa</p>\n<p>bbbbb</p></li>\n</ul>\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char3.md",
    "content": "- - \na\n\n\nfooo\n\n\n- - - aaaaa\n\n   bbbbb\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char4.html",
    "content": "<ul>\n<li>- - - -- - - - - - - -- - - - - - - - - - -    - - - - - - - - -  abcd</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#312.spaced-dashes-followed-by-char4.md",
    "content": "- - - - -- - - - - - - -- - - - - - - - - - -    - - - - - - - - -  abcd\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#317.spaces-before-hr.html",
    "content": "<hr />\n<hr />\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#317.spaces-before-hr.md",
    "content": "   ---\n\n   - - -\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#332.inconsistent-behavior-of-emphasis-and-strong.html",
    "content": "<p>foo *bar *baz</p>\n<p>foo **bar **baz</p>\n<p>foo ***bar ***baz</p>\n<p>foo _bar _baz</p>\n<p>foo __bar __baz</p>\n<p>foo ___bar ___baz</p>\n<p>foo *bar *baz *bazinga</p>\n<p>foo **bar **baz **bazinga</p>\n<p>foo ***bar ***baz ***bazinga</p>\n<p>foo _bar _baz __bazinga</p>\n<p>foo __bar __baz __bazinga</p>\n<p>foo ___bar ___baz ___bazinga</p>\n<p><em>f</em></p>\n<p><strong>f</strong></p>\n<p><em>f</em></p>\n<p><strong>f</strong></p>\n<p>foo **bar **baz <strong>bazinga bla</strong></p>\n<p>foo <strong>bar **baz **bazinga bla</strong></p>\n<p>foo <strong>**bar **baz **bazinga bla</strong></p>\n<p>this is <strong><a href=\"//google.com/foo**bar\">imbued link with strong</a></strong></p>\n<p>this is <strong><a href=\"google.com/foo__bar\">imbued link with strong</a></strong></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#332.inconsistent-behavior-of-emphasis-and-strong.md",
    "content": "foo *bar *baz\n\nfoo **bar **baz\n\nfoo ***bar ***baz\n\nfoo _bar _baz\n\nfoo __bar __baz\n\nfoo ___bar ___baz\n\nfoo *bar *baz *bazinga\n\nfoo **bar **baz **bazinga\n\nfoo ***bar ***baz ***bazinga\n\nfoo _bar _baz __bazinga\n\nfoo __bar __baz __bazinga\n\nfoo ___bar ___baz ___bazinga\n\n*f*\n\n**f**\n\n_f_\n\n__f__\n\nfoo **bar **baz **bazinga bla**\n\nfoo __bar **baz **bazinga bla__\n\nfoo __**bar **baz **bazinga bla__\n\nthis is **<a href=\"//google.com/foo**bar\">imbued link with strong</a>**\n\nthis is __<a href=\"google.com/foo__bar\">imbued link with strong</a>__\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#345.no-escape-for-the-pipe-character.html",
    "content": "<p>this |</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#345.no-escape-for-the-pipe-character.md",
    "content": "this \\|\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#390.brackets-in-URL-break-images.html",
    "content": "<p>This is an <img src=\"./image/cat(1).png\" alt=\"image\" /></p>\n<p>This is another <img src=\"./image/cat(1).png\" alt=\"image\" /></p>\n<p><a href=\"http://example.com\"><img src=\"./image/cat(1).png\" alt=\"image link\" /></a></p>\n<p><a href=\"http://example.com\"><img src=\"./image/cat1).png\" alt=\"image link\" /></a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#390.brackets-in-URL-break-images.md",
    "content": "This is an ![image][]\n\n[image]: ./image/cat(1).png\n\nThis is another ![image](./image/cat(1).png)\n\n[![image link](./image/cat(1).png)](http://example.com)\n\n[![image link](<./image/cat1).png>)](http://example.com)\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#390.brackets-in-URL-break-links.html",
    "content": "<p>This is a <a href=\"https://en.wikipedia.org/wiki/Textile_(markup_language)\" title=\"Textile\">link</a>.</p>\n<p>This is another <a href=\"https://en.wikipedia.org/wiki/Textile_(markup_language)\" title=\"Textile\">link2</a>.</p>\n<p><a href=\"./image/cat1).png\" title=\"title\">link3</a></p>\n<p><a href=\"https://en.wikipedia.org/wiki/Textile_(markup_language)\" title=\"Textile\">link4</a>(this should work)</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#390.brackets-in-URL-break-links.md",
    "content": "This is a [link][].\n\n[link]: https://en.wikipedia.org/wiki/Textile_(markup_language) \"Textile\"\n\nThis is another [link2](https://en.wikipedia.org/wiki/Textile_(markup_language) \"Textile\").\n\n[link3](<./image/cat1).png> \"title\")\n\n[link4](https://en.wikipedia.org/wiki/Textile_(markup_language) \"Textile\")(this should work)\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#393.showdown-hangs-with-malformed-html.html",
    "content": "<p><p>malformed<p></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#393.showdown-hangs-with-malformed-html.md",
    "content": "<p>malformed<p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#397.unordered-list-strange-behavior.html",
    "content": "<ul>\n    <li><p><strong>Customer</strong> – Opens the Customer List. Refer to the document “Customer Management”.</p>\n        <ul>\n            <li>Customer List</li>\n            <li>New Customer</li>\n            <li>Customer Prices</li>\n            <li>Appointments</li></ul></li>\n    <li><p><strong>Designer</strong> - Opens the Designer List. Refer to the document “Designer Commissions”.</p>\n        <ul>\n            <li>Designer List</li>\n            <li>New Designer</li>\n            <li>Designer Payment List</li>\n            <li>New Designer Payment</li></ul></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#397.unordered-list-strange-behavior.md",
    "content": "- **Customer** – Opens the Customer List. Refer to the document “Customer Management”.\n    - Customer List\n    - New Customer\n    - Customer Prices\n    - Appointments\n\n- **Designer** - Opens the Designer List. Refer to the document “Designer Commissions”.\n    - Designer List\n    - New Designer\n    - Designer Payment List\n    - New Designer Payment"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#429.multiline-base64-image-support.html",
    "content": "<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\" alt=\"foo\" /></p>\n<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\" alt=\"bar\" /></p>\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#429.multiline-base64-image-support.md",
    "content": "![foo](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAAXNSR0IArs4c6QAAAARnQU1BAA\nCxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=)\n\n![bar][]\n\n\n[bar]:\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAAXNSR0IArs4c6QAAAARnQU1BAA\nCxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYSURBVBhXYwCC/2AAZYEoOAMs8Z+BgQEAXdcR7/Q1gssAAAAASUVORK5CYII=\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#467.header-ids-for-subheadings.html",
    "content": "<h2 id=\"headeridinh2\">header id in h2</h2>\n<h3 id=\"headeridinh3\">header id in h3</h3>\n<h4 id=\"headeridinh4\">header id in h4</h4>\n<h5 id=\"headeridinh5\">header id in h5</h5>\n<h6 id=\"headeridinh6\">header id in h6</h6>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#467.header-ids-for-subheadings.md",
    "content": "## header id in h2\n\n### header id in h3\n\n#### header id in h4\n\n##### header id in h5\n\n###### header id in h6\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#494.enumerated-code-blocks-are-partially-escaped-when-including-empy-lines-between-code-2.html",
    "content": "<pre><code>public static void main(String[] args) {\n\n    for (int i = 0; i &lt; 10 &amp;&amp; true; i++) {\n    \n        System.out.println(\"Hello World\");\n    }\n\n    // stuff here is affected as well &lt;&gt;&amp;&amp;%\n}\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#494.enumerated-code-blocks-are-partially-escaped-when-including-empy-lines-between-code-2.md",
    "content": "```\npublic static void main(String[] args) {\n\n    for (int i = 0; i < 10 && true; i++) {\n\n        System.out.println(\"Hello World\");\n    }\n\n    // stuff here is affected as well <>&&%\n}\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#494.enumerated-code-blocks-are-partially-escaped-when-including-empy-lines-between-code.html",
    "content": "<ol>\n    <li><p>Code block as part of list</p>\n<pre><code>public static void main(String[] args) {\n\n    for (int i = 0; i &lt; 10 &amp;&amp; true; i++) {\n    \n        System.out.println(\"Hello World\");\n    }\n\n    // stuff here is affected as well &lt;&gt;&amp;&amp;%\n}\n</code></pre></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#494.enumerated-code-blocks-are-partially-escaped-when-including-empy-lines-between-code.md",
    "content": "1. Code block as part of list\n\n    ```\n    public static void main(String[] args) {\n\n        for (int i = 0; i < 10 && true; i++) {\n\n            System.out.println(\"Hello World\");\n        }\n\n        // stuff here is affected as well <>&&%\n    }\n    ```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#495.headings-different-behavior-in-paragraphs-and-lists.html",
    "content": "<ul>\n  <li>Increase the number of water changes.</li>\n  <li><h1 id=\"proteinskimmers\">Protein skimmers:</h1>\n    <p>This remove dissolved</p></li>\n  <li><h1 id=\"chemicalfiltermedia\">Chemical filter media:</h1>\n    <p>When placed in your filter</p></li>\n<li>#</li>\n<li>something</li>\n<li>#\n  something</li>\n<li># something</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#495.headings-different-behavior-in-paragraphs-and-lists.md",
    "content": "- Increase the number of water changes.\n- # Protein skimmers:\n  This remove dissolved\n- # Chemical filter media:\n  When placed in your filter\n- #\n- something\n- #\nsomething\n- \\# something\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#510.specific-string-gets-removed-from-text.html",
    "content": "<p>[^1]:a</p>\n<p>[^1]:a</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#510.specific-string-gets-removed-from-text.md",
    "content": "\\[^1]:a\n\n[^1]\\:a\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#523.leading-space-breaks-gfm-code-blocks.html",
    "content": "<pre><code class=\"javascript language-javascript\">var test = test;\nfunction foo() {\n  return 'bar';\n}\n</code></pre>\n<pre><code class=\"javascript language-javascript\">var test = test;\nfunction foo() {\n  return 'bar';\n}\n</code></pre>\n<pre><code class=\"javascript language-javascript\">var test = test;\nfunction foo() {\n  return 'bar';\n}\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#523.leading-space-breaks-gfm-code-blocks.md",
    "content": " ```javascript\nvar test = test;\nfunction foo() {\n  return 'bar';\n}\n ```\n\n  ```javascript\nvar test = test;\nfunction foo() {\n  return 'bar';\n}\n  ```\n\n   ```javascript\nvar test = test;\nfunction foo() {\n  return 'bar';\n}\n   ```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#585.error-when-using-image-references.html",
    "content": "<p>[<img src=\"http://example.com/foo.png\" alt=\"the-image\" />]</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#585.error-when-using-image-references.md",
    "content": "[![the-image]]\n\n[the-image]: http://example.com/foo.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#697.space-between-inline-elements.html",
    "content": "<p><em>one</em> <em>two</em> <em>three</em></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#697.space-between-inline-elements.md",
    "content": "*one* *two* *three*\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#83.parsed-text-links-with-underscores.html",
    "content": "<p>plain text link http://test.com/this_has/one.html with underscores</p>\n<p>legit·word_with·1·underscore</p>\n<p>a word<em>with</em>2underscores (gets em)</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#83.parsed-text-links-with-underscores.md",
    "content": "plain text link http://test.com/this_has/one.html with underscores\n\nlegit·word_with·1·underscore\n\na word_with_2underscores (gets em)\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#856.gfm-codeblock-with-language-with-spaces.html",
    "content": "<pre><code class=\"json language-json\">{\n    \"custom\": true\n}\n</code></pre>\n<pre><code class=\"json language-json\">{\n    \"custom\": false\n}\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#856.gfm-codeblock-with-language-with-spaces.md",
    "content": "```json custom data\n{\n    \"custom\": true\n}\n```\n\n```json custom data\n{\n    \"custom\": false\n}\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#96.underscores-in-links.html",
    "content": "<p>this is a underscore_test <img src=\"http://myserver.com/my_kitty.jpg\" alt=\"my cat\" /></p>\n<p>another <img src=\"http://myserver.com/my_kitty.jpg\" alt=\"my cat\" /> underscore_test bla</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/#96.underscores-in-links.md",
    "content": "this is a underscore_test ![my cat](http://myserver.com/my_kitty.jpg)\n\nanother ![my cat](http://myserver.com/my_kitty.jpg) underscore_test bla\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/URLs-with-multiple-parenthesis.html",
    "content": "<p><a href=\"./images(1)/cat(1).png\">link</a></p>\n<p><a href=\"./images(1)/cat(1).png\" title=\"title\">link</a></p>\n<p><img src=\"./images(1)/cat(1).png\" alt=\"image\" /></p>\n<p><img src=\"./images(1)/cat(1).png\" alt=\"image\" title=\"title\" /></p>\n<p><img src=\"./images(1)/cat(1).png\" alt=\"image\" title=\"title\" width=\"800\" height=\"600\" /></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/URLs-with-multiple-parenthesis.md",
    "content": "[link](<./images(1)/cat(1).png>)\n\n[link](<./images(1)/cat(1).png> \"title\")\n\n![image](<./images(1)/cat(1).png>)\n\n![image](<./images(1)/cat(1).png> \"title\")\n\n![image](<./images(1)/cat(1).png> =800x600 \"title\")\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/crazy-urls.html",
    "content": "<p><img src=\"images(1)/cat(1).png\" alt=\"my cat\" /></p>\n<p><a href=\"images(1)/cat(1).png\">my cat</a></p>\n<p><img src=\"some.com/crazy url with spaces\" alt=\"foo\" /></p>\n<p><img src=\"some.com/crazy url with spaces\" alt=\"foo\" title=\"title\" /></p>\n<p><a href=\"some.com/crazy url with spaces\">foo</a></p>\n<p><a href=\"some.com/crazy url with spaces\" title=\"title\">foo</a></p>\n<p><img src=\"\" alt=\"empty\" /></p>\n<p><a href=\"\">empty</a></p>\n<p><img src=\"\" alt=\"empty\" title=\"title\" /></p>\n<p><a href=\"\" title=\"title\">empty</a></p>\n<p><img src=\"\" alt=\"empty\" /></p>\n<p><a href=\"\">empty</a></p>\n<p><img src=\"\" alt=\"empty\" title=\"title\" /></p>\n<p><a href=\"\" title=\"title\">empty</a></p>\n<p><a href=\"\">empty</a></p>\n<p><a href=\"\" title=\"title\">empty</a></p>\n<p><a href=\"\"></a></p>\n<p><a href=\"\"></a></p>\n<p><a href=\"\" title=\"title\"></a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/crazy-urls.md",
    "content": "![my cat](<images(1)/cat(1).png>)\n\n[my cat](<images(1)/cat(1).png>)\n\n![foo](<some.com/crazy url with spaces>)\n\n![foo](<some.com/crazy url with spaces> \"title\")\n\n[foo](<some.com/crazy url with spaces>)\n\n[foo](<some.com/crazy url with spaces> \"title\")\n\n![empty](<>)\n\n[empty](<>)\n\n![empty](<> \"title\")\n\n[empty](<> \"title\")\n\n![empty](< >)\n\n[empty](< >)\n\n![empty](< > \"title\")\n\n[empty](< > \"title\")\n\n[empty]()\n\n[empty](\"title\")\n\n[]()\n\n[](<>)\n\n[](\"title\")\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/deeply-nested-HTML-blocks.html",
    "content": "<div>\n  <div>\n    <div>\n      <div>\n        text\n      </div>\n      <div>\n        text\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/deeply-nested-HTML-blocks.md",
    "content": "<div>\n  <div>\n    <div>\n      <div>\n        text\n      </div>\n      <div>\n        text\n      </div>\n    </div>\n  </div>\n</div>"
  },
  {
    "path": "test/functional/makehtml/cases/issues/handle-html-pre.html",
    "content": "<p>hmm</p>\n<pre>\nthis is `a\\_test` and this\\_too and finally_this_is\n</pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/handle-html-pre.md",
    "content": "hmm\n<pre>\nthis is `a\\_test` and this\\_too and finally_this_is\n</pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/one-line-HTML-input.html",
    "content": "<div><div>a</div><div>b</div></div>\n<pre><code>&lt;div&gt;**foobar**&lt;/div&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/one-line-HTML-input.md",
    "content": "<div><div>a</div><div>b</div></div>\n\n    <div>**foobar**</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/reference-link-impostors.html",
    "content": "<p>[We] are going to show [you]: sunshine!</p>\n<p>[x]: take out the garbage<br />\n[ ]: bring up the coal</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/issues/reference-link-impostors.md",
    "content": "[We] are going to show [you]: sunshine!\n\n[x]: take out the garbage  \n[ ]: bring up the coal\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-hard-return-spaces.html",
    "content": "<p>This is a first paragraph,\non multiple lines.</p>\n<p>This is a second paragraph.\nThere are spaces in between the two.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-hard-return-spaces.md",
    "content": "This is a first paragraph,\non multiple lines.\n     \nThis is a second paragraph.\nThere are spaces in between the two.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-hard-return.html",
    "content": "<p>This is a first paragraph,\non multiple lines.</p>\n<p>This is a second paragraph\nwhich has multiple lines too.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-hard-return.md",
    "content": "This is a first paragraph,\non multiple lines.\n\nThis is a second paragraph\nwhich has multiple lines too.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-returns.html",
    "content": "<p>A first paragraph.</p>\n<p>A second paragraph after 3 CR (carriage return).</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-returns.md",
    "content": "A first paragraph.\n\n\n\nA second paragraph after 3 CR (carriage return).\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-spaces.html",
    "content": "<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>\n<p>A few spaces and a new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-spaces.md",
    "content": "This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n     \nA few spaces and a new long long long long long long long long long long long long long long long long paragraph on 1 line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-tab.html",
    "content": "<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>\n<p>1 tab to separate them and a new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line-tab.md",
    "content": "This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n\t\n1 tab to separate them and a new long long long long long long long long long long long long long long long long paragraph on 1 line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line.html",
    "content": "<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>\n<p>A new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/2-paragraphs-line.md",
    "content": "This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n\nA new long long long long long long long long long long long long long long long long paragraph on 1 line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-CR+LF.html",
    "content": "<p>These lines all end with end of line (EOL) sequences.</p>\n<p>Seriously, they really do.</p>\n<p>If you don't believe me: HEX EDIT!</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-CR+LF.md",
    "content": "These lines all end with end of line (EOL) sequences.\n\nSeriously, they really do.\n\nIf you don't believe me: HEX EDIT!\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-CR.html",
    "content": "<p>These lines all end with end of line (EOL) sequences.</p>\r<p>Seriously, they really do.</p>\r<p>If you don't believe me: HEX EDIT!</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-CR.md",
    "content": "These lines all end with end of line (EOL) sequences.\r\rSeriously, they really do.\r\rIf you don't believe me: HEX EDIT!\r\r"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-LF.html",
    "content": "<p>These lines all end with end of line (EOL) sequences.</p>\n<p>Seriously, they really do.</p>\n<p>If you don't believe me: HEX EDIT!</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/EOL-LF.md",
    "content": "These lines all end with end of line (EOL) sequences.\n\nSeriously, they really do.\n\nIf you don't believe me: HEX EDIT!\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ampersand-text-flow.html",
    "content": "<p>An ampersand &amp; in the text flow is escaped as an html entity.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ampersand-text-flow.md",
    "content": "An ampersand & in the text flow is escaped as an html entity.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ampersand-uri.html",
    "content": "<p>There is an <a href=\"http://validator.w3.org/check?uri=http://www.w3.org/&verbose=1\">ampersand</a> in the URI.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ampersand-uri.md",
    "content": "There is an [ampersand](http://validator.w3.org/check?uri=http://www.w3.org/&verbose=1) in the URI.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/asterisk-near-text.html",
    "content": "<p>This is *an asterisk which should stay as is.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/asterisk-near-text.md",
    "content": "This is \\*an asterisk which should stay as is.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/asterisk.html",
    "content": "<p>This is * an asterisk which should stay as is.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/asterisk.md",
    "content": "This is * an asterisk which should stay as is.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/backslash-escape.html",
    "content": "<p>\\   backslash\n`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+   plus sign\n-   minus sign (hyphen)\n.   dot\n!   exclamation mark</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/backslash-escape.md",
    "content": "\\\\   backslash\n\\`   backtick\n\\*   asterisk\n\\_   underscore\n\\{\\}  curly braces\n\\[\\]  square brackets\n\\(\\)  parentheses\n\\#   hash mark\n\\+   plus sign\n\\-   minus sign (hyphen)\n\\.   dot\n\\!   exclamation mark\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-added-markup.html",
    "content": "<blockquote>\n<h1>heading level 1</h1>\n<p>paragraph</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-added-markup.md",
    "content": "> # heading level 1\n> \n> paragraph\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-line-2-paragraphs.html",
    "content": "<blockquote>\n<p>A blockquote with a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.</p>\n<p>and a second very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-line-2-paragraphs.md",
    "content": ">A blockquote with a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.\n\n>and a second very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-line.html",
    "content": "<blockquote>\n<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a blockquote.</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-line.md",
    "content": ">This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a blockquote.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-1-space-begin.html",
    "content": "<blockquote>\n<p>A blockquote\non multiple lines\nlike this.</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-1-space-begin.md",
    "content": "> A blockquote\n> on multiple lines\n> like this.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-1-space-end.html",
    "content": "<blockquote>\n<p>A blockquote \non multiple lines \nlike this. </p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-1-space-end.md",
    "content": ">A blockquote \n>on multiple lines \n>like this. \n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-2-paragraphs.html",
    "content": "<blockquote>\n<p>A blockquote\non multiple lines\nlike this.</p>\n<p>But it has\ntwo paragraphs.</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline-2-paragraphs.md",
    "content": ">A blockquote\n>on multiple lines\n>like this.\n>\n>But it has\n>two paragraphs.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline.html",
    "content": "<blockquote>\n<p>A blockquote\non multiple lines\nlike this</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-multiline.md",
    "content": ">A blockquote\n>on multiple lines\n>like this\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-multiplereturn-level1.html",
    "content": "<blockquote>\n<p>This is the first level of quoting.</p>\n<blockquote>\n<p>This is nested blockquote.</p>\n</blockquote>\n<p>Back to the first level.</p>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-multiplereturn-level1.md",
    "content": "> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-multiplereturn.html",
    "content": "<blockquote>\n<p>This is the first level of quoting.</p>\n<blockquote>\n<p>This is nested blockquote.</p>\n</blockquote>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-multiplereturn.md",
    "content": "> This is the first level of quoting.\n>\n> > This is nested blockquote.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-return-level1.html",
    "content": "<blockquote>\n<p>This is the first level of quoting.</p>\n<blockquote>\n<p>This is nested blockquote.\nBack to the first level.</p>\n</blockquote>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested-return-level1.md",
    "content": "> This is the first level of quoting.\n> > This is nested blockquote.\n> Back to the first level.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested.html",
    "content": "<blockquote>\n<p>This is the first level of quoting.</p>\n<blockquote>\n<p>This is nested blockquote.</p>\n</blockquote>\n</blockquote>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/blockquote-nested.md",
    "content": "> This is the first level of quoting.\n> > This is nested blockquote.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-1-tab.html",
    "content": "<pre><code>10 PRINT HELLO INFINITE\n20 GOTO 10\n</code></pre>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-1-tab.md",
    "content": "\t10 PRINT HELLO INFINITE\n\t20 GOTO 10\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-4-spaces-escaping.html",
    "content": "<pre><code>10 PRINT &lt; &gt; &amp;\n20 GOTO 10\n</code></pre>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-4-spaces-escaping.md",
    "content": "    10 PRINT < > &\n    20 GOTO 10\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-4-spaces.html",
    "content": "<pre><code>10 PRINT HELLO INFINITE\n20 GOTO 10\n</code></pre>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/code-4-spaces.md",
    "content": "    10 PRINT HELLO INFINITE\n    20 GOTO 10\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-middle-word.html",
    "content": "<p>as<em>te</em>risks</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-middle-word.md",
    "content": "as*te*risks\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-star.html",
    "content": "<p><em>single asterisks</em></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-star.md",
    "content": "*single asterisks*\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-underscore.html",
    "content": "<p><em>single underscores</em></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/em-underscore.md",
    "content": "_single underscores_\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/entities-text-flow.html",
    "content": "<p>HTML entities are written using ampersand notation: &copy;</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/entities-text-flow.md",
    "content": "HTML entities are written using ampersand notation: &copy;\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-equal-underlined.html",
    "content": "<h1>This is an H1</h1>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-equal-underlined.md",
    "content": "This is an H1\n=============\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-closed.html",
    "content": "<h1>This is an H1</h1>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-closed.md",
    "content": "# This is an H1 #\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-trailing-1-space.html",
    "content": "<p># This is an H1</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-trailing-1-space.md",
    "content": " # This is an H1\n "
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-trailing-2-spaces.html",
    "content": "<h1>this is an h1 with two trailing spaces</h1>\n<p>A new paragraph.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign-trailing-2-spaces.md",
    "content": "# this is an h1 with two trailing spaces  \nA new paragraph.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign.html",
    "content": "<h1>This is an H1</h1>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level1-hash-sign.md",
    "content": "# This is an H1\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-dash-underlined.html",
    "content": "<h2>This is an H2</h2>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-dash-underlined.md",
    "content": "This is an H2\n-------------\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-hash-sign-closed.html",
    "content": "<h2>This is an H2</h2>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-hash-sign-closed.md",
    "content": "## This is an H2 ##\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-hash-sign.html",
    "content": "<h2>This is an H2</h2>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level2-hash-sign.md",
    "content": "## This is an H2\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level3-hash-sign-closed.html",
    "content": "<h3>This is an H3</h3>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level3-hash-sign-closed.md",
    "content": "### This is an H3 ###\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level3-hash-sign.html",
    "content": "<h3>This is an H3</h3>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level3-hash-sign.md",
    "content": "### This is an H3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level4-hash-sign-closed.html",
    "content": "<h4>This is an H4</h4>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level4-hash-sign-closed.md",
    "content": "#### This is an H4 ####\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level4-hash-sign.html",
    "content": "<h4>This is an H4</h4>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level4-hash-sign.md",
    "content": "#### This is an H4\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level5-hash-sign-closed.html",
    "content": "<h5>This is an H5</h5>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level5-hash-sign-closed.md",
    "content": "##### This is an H5 #####\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level5-hash-sign.html",
    "content": "<h5>This is an H5</h5>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level5-hash-sign.md",
    "content": "##### This is an H5\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level6-hash-sign-closed.html",
    "content": "<h6>This is an H6</h6>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level6-hash-sign-closed.md",
    "content": "###### This is an H6  ######\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level6-hash-sign.html",
    "content": "<h6>This is an H6</h6>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/header-level6-hash-sign.md",
    "content": "###### This is an H6\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-dashes-spaces.html",
    "content": "<hr />"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-dashes-spaces.md",
    "content": "- - -\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-dashes.html",
    "content": "<hr />"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-dashes.md",
    "content": "---\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-stars.html",
    "content": "<hr />"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-stars.md",
    "content": "***\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-underscores.html",
    "content": "<hr />"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-3-underscores.md",
    "content": "___\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-7-dashes.html",
    "content": "<hr />"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/horizontal-rule-7-dashes.md",
    "content": "-------\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-idref-title.html",
    "content": "<p><img src=\"http://www.w3.org/html/logo/img/mark-word-icon.png\" alt=\"HTML5\" title=\"HTML5 for everyone\" /></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-idref-title.md",
    "content": "![HTML5][h5]\n\n[h5]: http://www.w3.org/html/logo/img/mark-word-icon.png \"HTML5 for everyone\"\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-idref.html",
    "content": "<p><img src=\"http://www.w3.org/html/logo/img/mark-word-icon.png\" alt=\"HTML5\" /></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-idref.md",
    "content": "![HTML5][h5]\n\n[h5]: http://www.w3.org/html/logo/img/mark-word-icon.png\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-title.html",
    "content": "<p><img src=\"http://www.w3.org/html/logo/img/mark-word-icon.png\" alt=\"HTML5\" title=\"HTML5 logo for everyone\" /></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img-title.md",
    "content": "![HTML5](http://www.w3.org/html/logo/img/mark-word-icon.png \"HTML5 logo for everyone\")\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img.html",
    "content": "<p><img src=\"http://www.w3.org/html/logo/img/mark-word-icon.png\" alt=\"HTML5\" /></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/img.md",
    "content": "![HTML5](http://www.w3.org/html/logo/img/mark-word-icon.png)\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code-escaping-entities.html",
    "content": "<p>We love <code>&lt;code&gt; and &amp;</code> for everything</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code-escaping-entities.md",
    "content": "We love `<code> and &` for everything\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code-with-visible-backtick.html",
    "content": "<p><code>We love `code` for everything</code></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code-with-visible-backtick.md",
    "content": "``We love `code` for everything``\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code.html",
    "content": "<p><code>We love `code` for everything</code></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/inline-code.md",
    "content": "``We love `code` for everything``\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/line-break-2-spaces.html",
    "content": "<p>A first sentence<br />\nand a line break.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/line-break-2-spaces.md",
    "content": "A first sentence  \nand a line break.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/line-break-5-spaces.html",
    "content": "<p>A first sentence<br />\nand a line break.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/line-break-5-spaces.md",
    "content": "A first sentence     \nand a line break.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-automatic.html",
    "content": "<p>This is an automatic link <a href=\"http://www.w3.org/\">http://www.w3.org/</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-automatic.md",
    "content": "This is an automatic link <http://www.w3.org/>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-bracket-paranthesis-title.html",
    "content": "<p><a href=\"http://www.w3.org/\" title=\"Discover w3c\">W3C</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-bracket-paranthesis-title.md",
    "content": "[W3C](http://www.w3.org/ \"Discover w3c\")\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-bracket-paranthesis.html",
    "content": "<p><a href=\"http://www.w3.org/\">W3C</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-bracket-paranthesis.md",
    "content": "[W3C](http://www.w3.org/)\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-angle-bracket.html",
    "content": "<p><a href=\"http://www.w3.org/\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-angle-bracket.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: <http://www.w3.org/>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-implicit-spaces.html",
    "content": "<p><a href=\"http://www.w3.org/\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-implicit-spaces.md",
    "content": "[World Wide Web Consortium][]\n\n[World Wide Web Consortium]: http://www.w3.org/\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-implicit.html",
    "content": "<p><a href=\"http://www.w3.org/\">w3c</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-implicit.md",
    "content": "[w3c][]\n\n[w3c]: http://www.w3.org/\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-space.html",
    "content": "<p><a href=\"http://www.w3.org/\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-space.md",
    "content": "[World Wide Web Consortium] [w3c]\n\n[w3c]: http://www.w3.org/\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-next-line.html",
    "content": "<p><a href=\"http://www.w3.org/\" title=\"Discover W3C\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-next-line.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/\n   \"Discover W3C\"\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-paranthesis.html",
    "content": "<p><a href=\"http://www.w3.org/\" title=\"Discover w3c\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-paranthesis.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ (Discover w3c)\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-single-quote.html",
    "content": "<p><a href=\"http://www.w3.org/\" title=\"Discover w3c\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title-single-quote.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ 'Discover w3c'\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title.html",
    "content": "<p><a href=\"http://www.w3.org/\" title=\"Discover w3c\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref-title.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ \"Discover w3c\"\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref.html",
    "content": "<p><a href=\"http://www.w3.org/\">World Wide Web Consortium</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/link-idref.md",
    "content": "[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-blockquote.html",
    "content": "<ul>\n<li><p>a list containing a blockquote</p>\n<blockquote>\n<p>this the blockquote in the list</p>\n</blockquote></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-blockquote.md",
    "content": "*   a list containing a blockquote\n\n    > this the blockquote in the list\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-code.html",
    "content": "<ul>\n    <li><p>a list containing a block of code</p>\n        <pre><code>10 PRINT HELLO INFINITE\n20 GOTO 10\n</code></pre></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-code.md",
    "content": "*   a list containing a block of code\n\n\t    10 PRINT HELLO INFINITE\n\t    20 GOTO 10\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-multiparagraphs-tab.html",
    "content": "<ul>\n<li><p>This is a list item with two paragraphs. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit. Aliquam hendrerit\nmi posuere lectus.</p>\n<p>Vestibulum enim wisi, viverra nec, fringilla in, laoreet\nvitae, risus. Donec sit amet nisl. Aliquam semper ipsum\nsit amet velit.</p></li>\n<li><p>Suspendisse id sem consectetuer libero luctus adipiscing.</p></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-multiparagraphs-tab.md",
    "content": "*   This is a list item with two paragraphs. Lorem ipsum dolor\n\tsit amet, consectetuer adipiscing elit. Aliquam hendrerit\n\tmi posuere lectus.\n\n\tVestibulum enim wisi, viverra nec, fringilla in, laoreet\n\tvitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n\tsit amet velit.\n\n*   Suspendisse id sem consectetuer libero luctus adipiscing.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-multiparagraphs.html",
    "content": "<ul>\n<li><p>This is a list item with two paragraphs. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit. Aliquam hendrerit\nmi posuere lectus.</p>\n<p>Vestibulum enim wisi, viverra nec, fringilla in, laoreet\nvitae, risus. Donec sit amet nisl. Aliquam semper ipsum\nsit amet velit.</p></li>\n<li><p>Suspendisse id sem consectetuer libero luctus adipiscing.</p></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/list-multiparagraphs.md",
    "content": "*   This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n*   Suspendisse id sem consectetuer libero luctus adipiscing.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-escaped.html",
    "content": "<p>1. ordered list escape</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-escaped.md",
    "content": "1\\. ordered list escape\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-inner-par-list.html",
    "content": "<ol>\n  <li><p>1</p>\n    <ul>\n      <li>inner par list</li></ul></li>\n  <li><p>2</p></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-inner-par-list.md",
    "content": "1. 1\n\n    - inner par list\n\n2. 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-items-random-number.html",
    "content": "<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ol>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-items-random-number.md",
    "content": "1. list item 1\n8. list item 2\n1. list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-items.html",
    "content": "<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ol>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/ordered-list-items.md",
    "content": "1. list item 1\n2. list item 2\n3. list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-hard-return.html",
    "content": "<p>This is a paragraph\non multiple lines\nwith hard return.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-hard-return.md",
    "content": "This is a paragraph\non multiple lines\nwith hard return.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-line.html",
    "content": "<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-line.md",
    "content": "This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-trailing-leading-spaces.html",
    "content": "<p>This is a paragraph with a trailing and leading space. </p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-trailing-leading-spaces.md",
    "content": " This is a paragraph with a trailing and leading space. \n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-trailing-tab.html",
    "content": "<p>This is a paragraph with 1 trailing tab.    </p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraph-trailing-tab.md",
    "content": "This is a paragraph with 1 trailing tab.\t\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-2-leading-spaces.html",
    "content": "<p>This is a paragraph with 2 leading spaces.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-2-leading-spaces.md",
    "content": "  This is a paragraph with 2 leading spaces.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-3-leading-spaces.html",
    "content": "<p>This is a paragraph with 3 leading spaces.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-3-leading-spaces.md",
    "content": "   This is a paragraph with 3 leading spaces.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-leading-space.html",
    "content": "<p>This is a paragraph with 1 leading space.</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-leading-space.md",
    "content": " This is a paragraph with 1 leading space.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-trailing-spaces.html",
    "content": "<p>This is a paragraph with a trailing space. </p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/paragraphs-trailing-spaces.md",
    "content": "This is a paragraph with a trailing space. "
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-middle-word.html",
    "content": "<p>as<strong>te</strong>risks</p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-middle-word.md",
    "content": "as**te**risks\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-star.html",
    "content": "<p><strong>double asterisks</strong></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-star.md",
    "content": "**double asterisks**\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-underscore.html",
    "content": "<p><strong>double underscores</strong></p>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/strong-underscore.md",
    "content": "__double underscores__\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-asterisk.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-asterisk.md",
    "content": "* list item 1\n* list item 2\n* list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-dashsign.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-dashsign.md",
    "content": "- list item 1\n- list item 2\n- list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-1space.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-1space.md",
    "content": " * list item 1\n * list item 2\n * list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-2spaces.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-2spaces.md",
    "content": "  * list item 1\n  * list item 2\n  * list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-3spaces.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-leading-3spaces.md",
    "content": "   * list item 1\n   * list item 2\n   * list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-plussign.html",
    "content": "<ul>\n    <li>list item 1</li>\n    <li>list item 2</li>\n    <li>list item 3</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-items-plussign.md",
    "content": "+ list item 1\n+ list item 2\n+ list item 3\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-paragraphs.html",
    "content": "<ul>\n<li><p>list item in paragraph</p></li>\n<li><p>another list item in paragraph</p></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-paragraphs.md",
    "content": "* list item in paragraph\n\n* another list item in paragraph\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-unindented-content.html",
    "content": "<ul>\n<li>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a list.</li>\n<li>and yet another long long long long long long long long long long long long long long long long long long long long long long line.</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-unindented-content.md",
    "content": "*   This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a list.\n*   and yet another long long long long long long long long long long long long long long long long long long long long long long line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-with-indented-content.html",
    "content": "<ul>\n<li>This is a list item\nwith the content on\nmultiline and indented.</li>\n<li>And this another list item\nwith the same principle.</li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/karlcow/unordered-list-with-indented-content.md",
    "content": "*   This is a list item\n    with the content on\n    multiline and indented.\n*   And this another list item\n    with the same principle.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-fragments.html",
    "content": "<p><a href=\"#Declare\">Declare options</a></p>\n<p><a href=\"#Declare%20current%20operation%20options\">Declare options</a></p>\n<p><a href=\"#Declare current operation options\">Declare options</a></p>\n<p><a href=\"https://spec.commonmark.org/0.30/#example-500\">Common Mark Example</a></p>\n<p><a href=\"spec.commonmark.org/0.30/#example-500\">Common Mark Example</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-fragments.md",
    "content": "[Declare options](#Declare)\n\n[Declare options](#Declare%20current%20operation%20options)\n\n[Declare options](<#Declare current operation options>)\n\n[Common Mark Example](https://spec.commonmark.org/0.30/#example-500)\n\n[Common Mark Example](spec.commonmark.org/0.30/#example-500)"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-javacript-identifiers.html",
    "content": "<p>Reserved Keywords found at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar</p>\n<p><a href=\"\">break</a></p>\n<p><a href=\"\">case</a></p>\n<p><a href=\"\">catch</a></p>\n<p><a href=\"\">class</a></p>\n<p><a href=\"\">const</a></p>\n<p><a href=\"\">continue</a></p>\n<p><a href=\"\">debugger</a></p>\n<p><a href=\"\">default</a></p>\n<p><a href=\"\">delete</a></p>\n<p><a href=\"\">do</a></p>\n<p><a href=\"\">else</a></p>\n<p><a href=\"\">export</a></p>\n<p><a href=\"\">extends</a></p>\n<p><a href=\"\">finally</a></p>\n<p><a href=\"\">for</a></p>\n<p><a href=\"\">function</a></p>\n<p><a href=\"\">if</a></p>\n<p><a href=\"\">import</a></p>\n<p><a href=\"\">in</a></p>\n<p><a href=\"\">instanceof</a></p>\n<p><a href=\"\">new</a></p>\n<p><a href=\"\">return</a></p>\n<p><a href=\"\">super</a></p>\n<p><a href=\"\">switch</a></p>\n<p><a href=\"\">this</a></p>\n<p><a href=\"\">throw</a></p>\n<p><a href=\"\">try</a></p>\n<p><a href=\"\">typeof</a></p>\n<p><a href=\"\">var</a></p>\n<p><a href=\"\">void</a></p>\n<p><a href=\"\">while</a></p>\n<p><a href=\"\">with</a></p>\n<p><a href=\"\">yield</a></p>\n<p><a href=\"\">enum</a></p>\n<p><a href=\"\">implements</a></p>\n<p><a href=\"\">interface</a></p>\n<p><a href=\"\">let</a></p>\n<p><a href=\"\">package</a></p>\n<p><a href=\"\">private</a></p>\n<p><a href=\"\">protected</a></p>\n<p><a href=\"\">public</a></p>\n<p><a href=\"\">static</a></p>\n<p><a href=\"\">yield</a></p>\n<p><a href=\"\">await</a></p>\n<p><a href=\"\">abstract</a></p>\n<p><a href=\"\">boolean</a></p>\n<p><a href=\"\">byte</a></p>\n<p><a href=\"\">char</a></p>\n<p><a href=\"\">double</a></p>\n<p><a href=\"\">final</a></p>\n<p><a href=\"\">float</a></p>\n<p><a href=\"\">goto</a></p>\n<p><a href=\"\">int</a></p>\n<p><a href=\"\">long</a></p>\n<p><a href=\"\">native</a></p>\n<p><a href=\"\">short</a></p>\n<p><a href=\"\">synchronized</a></p>\n<p><a href=\"\">throws</a></p>\n<p><a href=\"\">transient</a></p>\n<p><a href=\"\">volatile</a></p>\n<p><a href=\"\">null</a></p>\n<p><a href=\"\">true</a></p>\n<p><a href=\"\">false</a></p>\n<p><a href=\"\">arguments</a></p>\n<p><a href=\"\">get</a></p>\n<p><a href=\"\">set</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-javacript-identifiers.md",
    "content": "Reserved Keywords found at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar\n\n[break]()\n\n[case]()\n\n[catch]()\n\n[class]()\n\n[const]()\n\n[continue]()\n\n[debugger]()\n\n[default]()\n\n[delete]()\n\n[do]()\n\n[else]()\n\n[export]()\n\n[extends]()\n\n[finally]()\n\n[for]()\n\n[function]()\n\n[if]()\n\n[import]()\n\n[in]()\n\n[instanceof]()\n\n[new]()\n\n[return]()\n\n[super]()\n\n[switch]()\n\n[this]()\n\n[throw]()\n\n[try]()\n\n[typeof]()\n\n[var]()\n\n[void]()\n\n[while]()\n\n[with]()\n\n[yield]()\n\n[enum]()\n\n[implements]()\n\n[interface]()\n\n[let]()\n\n[package]()\n\n[private]()\n\n[protected]()\n\n[public]()\n\n[static]()\n\n[yield]()\n\n[await]()\n\n[abstract]()\n\n[boolean]()\n\n[byte]()\n\n[char]()\n\n[double]()\n\n[final]()\n\n[float]()\n\n[goto]()\n\n[int]()\n\n[long]()\n\n[native]()\n\n[short]()\n\n[synchronized]()\n\n[throws]()\n\n[transient]()\n\n[volatile]()\n\n[null]()\n\n[true]()\n\n[false]()\n\n[arguments]()\n\n[get]()\n\n[set]()\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-no-protocols.html",
    "content": "<p><a href=\"/uri\">link</a></p>\n<p><a href=\"http://example.com/\">link</a></p>\n<p><a href=\"http://example.com\">link</a></p>\n<p><a href=\"https://example.com\">link</a></p>\n<p><a href=\"https://example.com/\">link</a></p>\n<p><a href=\"example.com\">link</a></p>\n<p><a href=\"www.example.com\">link</a></p>\n<p><a href=\"file://example.com\">link</a></p>\n<p><a href=\"file://www.example.com\">link</a></p>\n<p><a href=\"example.jpg\">link</a></p>\n<p><a href=\"example.io\">link</a></p>\n<p><a href=\"http://baidu.com\" title=\"百度\">百度</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-no-protocols.md",
    "content": "[link](/uri)\n\n[link](http://example.com/)\n\n[link](http://example.com)\n\n[link](https://example.com)\n\n[link](https://example.com/)\n\n[link](example.com)\n\n[link](www.example.com)\n\n[link](file://example.com)\n\n[link](file://www.example.com)\n\n[link](example.jpg)\n\n[link](example.io)\n\n[百度](http://baidu.com \"百度\")"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-object-property-names.html",
    "content": "<p>Object property names found at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object</p>\n<p><a href=\"\">assign</a></p>\n<p><a href=\"\">create</a></p>\n<p><a href=\"\">defineProperty</a></p>\n<p><a href=\"\">defineProperties</a></p>\n<p><a href=\"\">entries</a></p>\n<p><a href=\"\">freeze</a></p>\n<p><a href=\"\">fromEntries</a></p>\n<p><a href=\"\">getOwnPropertyDescriptor</a></p>\n<p><a href=\"\">getOwnPropertyDescriptors</a></p>\n<p><a href=\"\">getOwnPropertyNames</a></p>\n<p><a href=\"\">getOwnPropertySymbols</a></p>\n<p><a href=\"\">getPrototypeOf</a></p>\n<p><a href=\"\">is</a></p>\n<p><a href=\"\">isExtensible</a></p>\n<p><a href=\"\">isFrozen</a></p>\n<p><a href=\"\">isSealed</a></p>\n<p><a href=\"\">keys</a></p>\n<p><a href=\"\">preventExtensions</a></p>\n<p><a href=\"\">seal</a></p>\n<p><a href=\"\">setPrototypeOf</a></p>\n<p><a href=\"\">values</a></p>\n<p><a href=\"\">prototype.constructor</a></p>\n<p><a href=\"\">prototype.<strong>proto</strong></a></p>\n<p><a href=\"\">prototype.<strong>defineGetter</strong></a></p>\n<p><a href=\"\">prototype.<strong>defineSetter</strong></a></p>\n<p><a href=\"\">prototype.<strong>lookupGetter</strong></a></p>\n<p><a href=\"\">prototype.<strong>lookupSetter</strong></a></p>\n<p><a href=\"\">prototype.hasOwnProperty</a></p>\n<p><a href=\"\">prototype.isPrototypeOf</a></p>\n<p><a href=\"\">prototype.propertyIsEnumerable</a></p>\n<p><a href=\"\">prototype.toLocaleString</a></p>\n<p><a href=\"\">prototype.toString</a></p>\n<p><a href=\"\">prototype.valueOf</a></p>\n<p><a href=\"\">constructor</a></p>\n<p><a href=\"\"><strong>proto</strong></a></p>\n<p><a href=\"\"><strong>defineGetter</strong></a></p>\n<p><a href=\"\"><strong>defineSetter</strong></a></p>\n<p><a href=\"\"><strong>lookupGetter</strong></a></p>\n<p><a href=\"\"><strong>lookupSetter</strong></a></p>\n<p><a href=\"\">hasOwnProperty</a></p>\n<p><a href=\"\">isPrototypeOf</a></p>\n<p><a href=\"\">propertyIsEnumerable</a></p>\n<p><a href=\"\">toLocaleString</a></p>\n<p><a href=\"\">toString</a></p>\n<p><a href=\"\">valueOf</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-allow-object-property-names.md",
    "content": "Object property names found at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n\n[assign]()\n\n[create]()\n\n[defineProperty]()\n\n[defineProperties]()\n\n[entries]()\n\n[freeze]()\n\n[fromEntries]()\n\n[getOwnPropertyDescriptor]()\n\n[getOwnPropertyDescriptors]()\n\n[getOwnPropertyNames]()\n\n[getOwnPropertySymbols]()\n\n[getPrototypeOf]()\n\n[is]()\n\n[isExtensible]()\n\n[isFrozen]()\n\n[isSealed]()\n\n[keys]()\n\n[preventExtensions]()\n\n[seal]()\n\n[setPrototypeOf]()\n\n[values]()\n\n[prototype.constructor]()\n\n[prototype.__proto__]()\n\n[prototype.__defineGetter__]()\n\n[prototype.__defineSetter__]()\n\n[prototype.__lookupGetter__]()\n\n[prototype.__lookupSetter__]()\n\n[prototype.hasOwnProperty]()\n\n[prototype.isPrototypeOf]()\n\n[prototype.propertyIsEnumerable]()\n\n[prototype.toLocaleString]()\n\n[prototype.toString]()\n\n[prototype.valueOf]()\n\n[constructor]()\n\n[__proto__]()\n\n[__defineGetter__]()\n\n[__defineSetter__]()\n\n[__lookupGetter__]()\n\n[__lookupSetter__]()\n\n[hasOwnProperty]()\n\n[isPrototypeOf]()\n\n[propertyIsEnumerable]()\n\n[toLocaleString]()\n\n[toString]()\n\n[valueOf]()\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-by-reference.html",
    "content": "<p>This is <a href=\"http://example.com/\" title=\"Optional Title Here\">an example</a> reference-style link.\n  This is <a href=\"http://example.com/\" title=\"Optional Title Here\">another</a> reference-style link.\n  This is <a href=\"http://example.com/\" title=\"Optional Title Here\">a third</a> reference-style link.\n  This is <a href=\"http://example.com/\" title=\"Optional Title Here\">a fourth</a> reference-style link.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-by-reference.md",
    "content": "\nThis is [an example][id] reference-style link.\nThis is [another] [foo] reference-style link.\nThis is [a third][bar] reference-style link.\nThis is [a fourth][4] reference-style link.\n\n  [id]: http://example.com/  \"Optional Title Here\"\n  [foo]: http://example.com/  (Optional Title Here)\n  [bar]: http://example.com/  (Optional Title Here)\n  [4]: <http://example.com/>\n    \"Optional Title Here\"\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-followed-by-brakets.html",
    "content": "<p>This is a <a href=\"https://en.wikipedia.org/wiki/Textile\">link</a> (some other text)</p>\n<p>This is a <a href=\"https://en.wikipedia.org/wiki/Textile_(markup\">link</a> (some other text)</p>\n<p>This is a <a href=\"https://en.wikipedia.org/wiki/Textile_(markup_language)\">link</a> (some other text)</p>\n<p>This is a <a href=\"https://en.wikipedia.org/wiki/Textile_(markup_language)/foo\">link</a> (some other text)</p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/anchors-followed-by-brakets.md",
    "content": "This is a [link](https://en.wikipedia.org/wiki/Textile) (some other text)\n\nThis is a [link](https://en.wikipedia.org/wiki/Textile_(markup) (some other text)\n\nThis is a [link](https://en.wikipedia.org/wiki/Textile_(markup_language)) (some other text)\n\nThis is a [link](https://en.wikipedia.org/wiki/Textile_(markup_language)/foo) (some other text)\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/automatic-anchors.html",
    "content": "<p><a href=\"http://example.com/\">http://example.com/</a></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/automatic-anchors.md",
    "content": "\n<http://example.com/>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-followed-by-code.html",
    "content": "<blockquote>\n    <p>a blockquote\nwith a 4 space indented line (not code)</p>\n</blockquote>\n<p>sep</p>\n<blockquote>\n    <p>a blockquote</p>\n</blockquote>\n<pre><code>with some code after\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-followed-by-code.md",
    "content": "> a blockquote\n    with a 4 space indented line (not code)\n\nsep\n\n> a blockquote\n\n    with some code after\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-inside-code.html",
    "content": "<pre><code>&gt; this is a pseudo blockquote\n    &gt; inside a code block\n</code></pre>\n<p>foo</p>\n<pre><code>&gt; this is another bq\n    inside code\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-inside-code.md",
    "content": "    > this is a pseudo blockquote\n    > inside a code block\n\nfoo\n\n    > this is another bq\n    inside code\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-nested-markdown.html",
    "content": "<blockquote>\n  <h2 id=\"thisisaheader\">This is a header.</h2>\n  <ol>\n    <li>This is the first list item.</li>\n    <li>This is the second list item.</li>\n  </ol>\n  <p>Here's some example code:</p>\n    <pre><code>return shell_exec(\"echo $input | $markdown_script\");\n    </code></pre>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote-nested-markdown.md",
    "content": "> ## This is a header.\n>\n> 1.   This is the first list item.\n> 2.   This is the second list item.\n>\n> Here's some example code:\n>\n>     return shell_exec(\"echo $input | $markdown_script\");\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote.html",
    "content": "<blockquote>\n  <p>This is a multi line blockquote test</p>\n  <p>With more than one line.</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/blockquote.md",
    "content": "  \n  > This is a multi line blockquote test\n  >\n  > With more than one line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block-html-escape.html",
    "content": "<p>This is some HTML:</p>\n<pre><code>&lt;h1&gt;Heading&lt;/h1&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block-html-escape.md",
    "content": "\nThis is some HTML:\n\n    <h1>Heading</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block-with-special-chars.html",
    "content": "<pre><code>//**this** code _has_ special chars\nvar arr = ['foo', 'bar', 'baz'];\nfunction () {\n    return 'foo';\n}\n\\n\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block-with-special-chars.md",
    "content": "    //**this** code _has_ special chars\n    var arr = ['foo', 'bar', 'baz'];\n    function () {\n        return 'foo';\n    }\n    \\n\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block.html",
    "content": "<p>This is a normal paragraph:</p>\n<pre><code>This is a code block.\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/code-block.md",
    "content": "\nThis is a normal paragraph:\n\n    This is a code block.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/double-emphasis.html",
    "content": "<p>a <strong><em>strong and em</em></strong> thingy</p>\n<p>bar<strong><em>bazinga</em></strong>bar</p>\n<p>a <strong><em>strong and em</em></strong> thingy</p>\n<p>bar<strong><em>bazinga</em></strong>bar</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/double-emphasis.md",
    "content": "a ___strong and em___ thingy\n\nbar___bazinga___bar\n\na ***strong and em*** thingy\n\nbar***bazinga***bar\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/doubline-list.html",
    "content": "<ul>\n  <li><p>Bird</p></li>\n  <li><p>Magic</p></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/doubline-list.md",
    "content": "\n *  Bird\n\n *  Magic\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ellipsis.html",
    "content": "<p>ellipsis in text…</p>\n<p>…</p>\n<ol>\n    <li>foo…</li>\n    <li>bar</li>\n</ol>\n<blockquote>\n    <p>ellipsis in blockquote…</p>\n</blockquote>\n<pre><code>ellipsis in code...\n</code></pre>\n<pre><code>ellipsis in code...\n</code></pre>\n<h1 id=\"ellipsisinheader\">ellipsis in header…</h1>\n<p>1…</p>\n<ol>\n    <li>..</li>\n</ol>\n<p>1…</p>\n<p><a href=\"https://gitlab.com/gitlab-org/gitlab-ce/compare/v11.5.4...v11.5.5\" title=\"title\">Link</a></p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ellipsis.md",
    "content": "ellipsis in text...\n\n...\n\n1. foo...\n2. bar\n\n> ellipsis in blockquote...\n\n```\nellipsis in code...\n```\n\n    ellipsis in code...\n\n# ellipsis in header...\n\n1...\n\n1. ..\n\n1...\n\n[Link](https://gitlab.com/gitlab-org/gitlab-ce/compare/v11.5.4...v11.5.5 \"title\")"
  },
  {
    "path": "test/functional/makehtml/cases/standard/emphasis-inside-inline-code.html",
    "content": "<p>some text <code>**foo**</code></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/emphasis-inside-inline-code.md",
    "content": "some text `**foo**`\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/emphasis.html",
    "content": "<p><em>single asterisks</em></p>\n<p><em>single underscores</em></p>\n<p><strong>double asterisks</strong></p>\n<p><strong>double underscores</strong></p>\n<p>text <em>with italic sentence</em> in middle</p>\n<p>text <strong>with bold sentence</strong> in middle</p>\n<p>text with <strong>bold text that\n  spans across multiple</strong> lines</p>\n<p>underscored_word</p>\n<p>doubleunderscore__word</p>\n<p>asterix*word</p>\n<p>doubleasterix**word</p>\n<p>line with_underscored word</p>\n<p>line with__doubleunderscored word</p>\n<p>line with*asterixed word</p>\n<p>line with**doubleasterixed word</p>\n<p>some line<em>with</em>inner underscores</p>\n<p>some line<strong>with</strong>inner double underscores</p>\n<p>some line<em>with</em>inner asterixs</p>\n<p>some line<strong>with</strong>inner double asterixs</p>\n<p>another line with just _one underscore</p>\n<p>another line with just __one double underscore</p>\n<p>another line with just *one asterix</p>\n<p>another line with just **one double asterix</p>\n<p>a sentence with<em>underscore and another</em>underscore</p>\n<p>a sentence with<strong>doubleunderscore and another</strong>doubleunderscore</p>\n<p>a sentence with<em>asterix and another</em>asterix</p>\n<p>a sentence with<strong>doubleasterix and another</strong>doubleasterix</p>\n<p>escaped word_with_underscores</p>\n<p>escaped word__with__double underscores</p>\n<p>escaped word<em>_with_</em>single italic underscore</p>\n<p>escaped word*with*asterixs</p>\n<p>escaped word**with**asterixs</p>\n<p>escaped word<strong>*with*</strong>bold asterixs</p>\n<p>foo<strong>bar</strong>baz</p>\n<p>foo<strong>bar</strong>baz</p>\n<p>this is <strong><a href=\"//google.com\">imbued link with strong</a></strong></p>\n<p>this is <strong><a href=\"//google.com\">imbued link with strong</a></strong></p>\n<p>this link has underscore <a href=\"http://www.google.com/some_link\">some_link</a></p>\n<p><strong><em>multiple</em></strong> italics and bolds with underscores in a <strong><em>paragraph</em></strong></p>\n<p><strong><em>multiple</em></strong> italics and bolds with asterisks in a <strong><em>paragraph</em></strong></p>\n<p><strong>multiple</strong> bolds with underscores in a <strong>paragraph</strong></p>\n<p><strong>multiple</strong> bolds with asterisks in a <strong>paragraph</strong></p>\n<p><em>multiple</em> italics with underscores in a <em>paragraph</em></p>\n<p><em>multiple</em> italics with asterisks in a <em>paragraph</em></p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/emphasis.md",
    "content": "*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__\n\ntext *with italic sentence* in middle\n\ntext __with bold sentence__ in middle\n\ntext with __bold text that\nspans across multiple__ lines\n\nunderscored_word\n\ndoubleunderscore__word\n\nasterix*word\n\ndoubleasterix**word\n\nline with_underscored word\n\nline with__doubleunderscored word\n\nline with*asterixed word\n\nline with**doubleasterixed word\n\nsome line_with_inner underscores\n\nsome line__with__inner double underscores\n\nsome line*with*inner asterixs\n\nsome line**with**inner double asterixs\n\nanother line with just _one underscore\n\nanother line with just __one double underscore\n\nanother line with just *one asterix\n\nanother line with just **one double asterix\n\na sentence with_underscore and another_underscore\n\na sentence with__doubleunderscore and another__doubleunderscore\n\na sentence with*asterix and another*asterix\n\na sentence with**doubleasterix and another**doubleasterix\n\nescaped word\\_with\\_underscores\n\nescaped word\\_\\_with\\_\\_double underscores\n\nescaped word_\\_with\\__single italic underscore\n\nescaped word\\*with*asterixs\n\nescaped word\\*\\*with\\*\\*asterixs\n\nescaped word**\\*with\\***bold asterixs\n\nfoo**bar**baz\n\nfoo__bar__baz\n\nthis is **<a href=\"//google.com\">imbued link with strong</a>**\n\nthis is __<a href=\"//google.com\">imbued link with strong</a>__\n\nthis link has underscore [some_link](http://www.google.com/some_link)\n\n___multiple___ italics and bolds with underscores in a ___paragraph___\n\n***multiple*** italics and bolds with asterisks in a ***paragraph***\n\n__multiple__ bolds with underscores in a __paragraph__\n\n**multiple** bolds with asterisks in a **paragraph**\n\n_multiple_ italics with underscores in a _paragraph_\n\n_multiple_ italics with asterisks in a _paragraph_\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/encodeHTMLCodeTags.html",
    "content": "<p>this is code <code>some &lt;span&gt;text&lt;/span&gt;</code> yeah!</p>\n<pre><code>\n&lt;div&gt;foo&lt;/div&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/encodeHTMLCodeTags.md",
    "content": "this is code <code>some <span>text</span></code> yeah!\n\n<pre><code>\n<div>foo</div>\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/escaped-number-period.html",
    "content": "<p>It happened in 1986. What a great season.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/escaped-number-period.md",
    "content": "It happened in 1986\\. What a great season.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/escaping.html",
    "content": "<p>These should all be escaped:</p>\n<p>\\</p>\n<p>`</p>\n<p>*</p>\n<p>_</p>\n<p>{</p>\n<p>}</p>\n<p>[</p>\n<p>]</p>\n<p>(</p>\n<p>)</p>\n<p>#</p>\n<p>+</p>\n<p>-</p>\n<p>.</p>\n<p>!</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/escaping.md",
    "content": "\nThese should all be escaped:\n\n\\\\\n\n\\`\n\n\\*\n\n\\_\n\n\\{\n\n\\}\n\n\\[\n\n\\]\n\n\\(\n\n\\)\n\n\\#\n\n\\+\n\n\\-\n\n\\.\n\n\\!\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-at-start.html",
    "content": "<pre><code>function MyFunc(a) {\n  // ...\n  }\n</code></pre>\n<p>That is some code!</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-at-start.md",
    "content": "```\nfunction MyFunc(a) {\n    // ...\n}\n```\n\nThat is some code!\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-codeblock-inside-quote.html",
    "content": "<blockquote>\n<p>Define a function in javascript:</p>\n<pre><code>function MyFunc(a) {\n  var s = '`';\n  }\n</code></pre>\n<blockquote>\n<p>And some nested quote</p>\n<pre><code class=\"html language-html\">&lt;div&gt;HTML!&lt;/div&gt;\n</code></pre>\n</blockquote>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-codeblock-inside-quote.md",
    "content": "> Define a function in javascript:\n>\n> ```\n> function MyFunc(a) {\n>     var s = '`';\n> }\n> ```\n>\n>> And some nested quote\n>>\n>> ```html\n>> <div>HTML!</div>\n>> ```\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-codeblock.html",
    "content": "<p>Define a function in javascript:</p>\n<pre><code>function MyFunc(a) {\n  var s = '`';\n  }\n</code></pre>\n<p>And some HTML</p>\n<pre><code class=\"html language-html\">&lt;div&gt;HTML!&lt;/div&gt;\n</code></pre>\n<p>And some CSS with spaces before the language declaration</p>\n<pre><code class=\"css language-css\">body {\nfont-size: 1.5em;\n}\n</code></pre>\n<p>Use more than 3 backticks</p>\n<pre><code>some code\n</code></pre>\n<p>Use tilde as delimiter</p>\n<pre><code>another piece of code\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-codeblock.md",
    "content": "\nDefine a function in javascript:\n\n```\nfunction MyFunc(a) {\n    var s = '`';\n}\n```\n\nAnd some HTML\n\n```html\n<div>HTML!</div>\n```\n\nAnd some CSS with spaces before the language declaration\n\n```    css\nbody {\n    font-size: 1.5em;\n}\n```\n\nUse more than 3 backticks\n\n`````\nsome code\n`````\n\nUse tilde as delimiter\n\n~~~\nanother piece of code\n~~~\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-linebreaks.html",
    "content": "<pre><code>code can go here\n  this is rendered on a second line\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/github-style-linebreaks.md",
    "content": "```\ncode can go here\nthis is rendered on a second line\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-double-hash.html",
    "content": "<h1 id=\"thisisanh1\">This is an H1</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-double-hash.md",
    "content": "# This is an H1 #\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-equals.html",
    "content": "<h1 id=\"thisisanh1\">This is an H1</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-equals.md",
    "content": "This is an H1\n=============\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-single-hash.html",
    "content": "<h1 id=\"thisisanh1\">This is an H1</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h1-with-single-hash.md",
    "content": "# This is an H1\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-dashes.html",
    "content": "<h2 id=\"thisisanh2\">This is an H2</h2>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-dashes.md",
    "content": "This is an H2\n-------------\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-double-hash.html",
    "content": "<h2 id=\"thisisanh2\">This is an H2</h2>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-double-hash.md",
    "content": "## This is an H2 ##\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-single-hash.html",
    "content": "<h2 id=\"thisisanh2\">This is an H2</h2>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h2-with-single-hash.md",
    "content": "## This is an H2\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h3-with-double-hash.html",
    "content": "<h3 id=\"thisisanh3\">This is an H3</h3>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h3-with-double-hash.md",
    "content": "### This is an H3 ###\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h3-with-single-hash.html",
    "content": "<h3 id=\"thisisanh3\">This is an H3</h3>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h3-with-single-hash.md",
    "content": "### This is an H3\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h4-with-single-hash.html",
    "content": "<h4 id=\"thisisanh4\">This is an H4</h4>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h4-with-single-hash.md",
    "content": "#### This is an H4\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h5-with-single-hash.html",
    "content": "<h5 id=\"thisisanh5\">This is an H5</h5>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h5-with-single-hash.md",
    "content": "##### This is an H5\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h6-with-single-hash.html",
    "content": "<h6 id=\"thisisanh6\">This is an H6</h6>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/h6-with-single-hash.md",
    "content": "###### This is an H6\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/horizontal-rules.html",
    "content": "<hr />\n<hr />\n<hr />\n<hr />\n<hr />\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/horizontal-rules.md",
    "content": "\n* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html-comments.html",
    "content": "<!-- a comment -->\n<!-- a comment with *bogus* __markdown__ inside -->\n<p>words <!-- a comment --> words</p>\n<!-- comment -->\n<p>words</p>\n   <!-- comment -->\n<pre><code>&lt;!-- comment --&gt;\n</code></pre>\n<p>&lt;!----------------------------------------------------------------------------------------------------------------------------------------------------</p>\n<!-------------------------------------------------------------------->\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html-comments.md",
    "content": "<!-- a comment -->\n\n<!-- a comment with *bogus* __markdown__ inside -->\n\nwords <!-- a comment --> words\n\n<!-- comment --> words\n\n   <!-- comment -->\n\n    <!-- comment -->\n\n<!----------------------------------------------------------------------------------------------------------------------------------------------------\n\n<!-------------------------------------------------------------------->\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html-inside-listed-code.html",
    "content": "<ul>\n    <li><p>list item 1</p>\n<pre><code class=\"html language-html\">&lt;a href=\"www.google.com\"&gt;google&lt;/a&gt;\n&lt;div&gt;\n&lt;div&gt;some div&lt;/div&gt;\n&lt;/div&gt;\n</code></pre></li>\n</ul>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html-inside-listed-code.md",
    "content": "  - list item 1\n\n    ```html\n    <a href=\"www.google.com\">google</a>\n    <div>\n      <div>some div</div>\n    </div>\n    ```\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html5-strutural-tags.html",
    "content": "<p>These HTML5 tags should pass through just fine.</p>\n<section>hello</section>\n<header>head</header>\n<footer>footsies</footer>\n<nav>navigation</nav>\n<article>read me</article>\n<aside>ignore me</aside>\n<article>read\n  me</article>\n<aside>\n  ignore me\n</aside>\n<p>the end</p>\n<table class=\"test\">\n  <tr>\n    <td>Foo</td>\n  </tr>\n  <tr>\n    <td>Bar</td>\n  </tr>\n</table>\n<table class=\"test\">\n  <thead>\n  <tr>\n    <td>Foo</td>\n  </tr>\n  </thead>\n  <tr>\n    <td>Bar</td>\n  </tr>\n  <tfoot>\n  <tr>\n    <td>Bar</td>\n  </tr>\n  </tfoot>\n</table>\n<audio class=\"podcastplayer\" controls>\n  <source src=\"foobar.mp3\" type=\"audio/mp3\" preload=\"none\"></source>\n  <source src=\"foobar.off\" type=\"audio/ogg\" preload=\"none\"></source>\n</audio>\n<video src=\"foo.ogg\">\n  <track kind=\"subtitles\" src=\"foo.en.vtt\" srclang=\"en\" label=\"English\">\n  <track kind=\"subtitles\" src=\"foo.sv.vtt\" srclang=\"sv\" label=\"Svenska\">\n</video>\n<address>My street</address>\n<canvas id=\"canvas\" width=\"300\" height=\"300\">\n  Sorry, your browser doesn't support the &lt;canvas&gt; element.\n</canvas>\n<figure>\n  <img src=\"mypic.png\" alt=\"An awesome picture\">\n  <figcaption>Caption for the awesome picture</figcaption>\n</figure>\n<hgroup>\n  <h1>Main title</h1>\n  <h2>Secondary title</h2>\n</hgroup>\n<output name=\"result\"></output>\n<details>\n  <summary>Summarise me</summary>\n  <p>Explain the details</p>\n</details>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/html5-strutural-tags.md",
    "content": "These HTML5 tags should pass through just fine.\n\n<section>hello</section>\n<header>head</header>\n<footer>footsies</footer>\n<nav>navigation</nav>\n<article>read me</article>\n<aside>ignore me</aside>\n<article>read\nme</article>\n<aside>\nignore me\n</aside>\n\nthe end\n\n<table class=\"test\">\n    <tr>\n        <td>Foo</td>\n    </tr>\n    <tr>\n        <td>Bar</td>\n    </tr>\n</table>\n\n<table class=\"test\">\n    <thead>\n        <tr>\n            <td>Foo</td>\n        </tr>\n    </thead>\n    <tr>\n        <td>Bar</td>\n    </tr>\n    <tfoot>\n        <tr>\n            <td>Bar</td>\n        </tr>\n    </tfoot>\n</table>\n\n<audio class=\"podcastplayer\" controls>\n    <source src=\"foobar.mp3\" type=\"audio/mp3\" preload=\"none\"></source>\n    <source src=\"foobar.off\" type=\"audio/ogg\" preload=\"none\"></source>\n</audio>\n\n<video src=\"foo.ogg\">\n    <track kind=\"subtitles\" src=\"foo.en.vtt\" srclang=\"en\" label=\"English\">\n    <track kind=\"subtitles\" src=\"foo.sv.vtt\" srclang=\"sv\" label=\"Svenska\">\n</video>\n\n<address>My street</address>\n\n<canvas id=\"canvas\" width=\"300\" height=\"300\">\n    Sorry, your browser doesn't support the &lt;canvas&gt; element.\n</canvas>\n\n<figure>\n    <img src=\"mypic.png\" alt=\"An awesome picture\">\n    <figcaption>Caption for the awesome picture</figcaption>\n</figure>\n\n<hgroup>\n  <h1>Main title</h1>\n  <h2>Secondary title</h2>\n</hgroup>\n\n<output name=\"result\"></output>\n\n<details>\n  <summary>Summarise me</summary>\n  <p>Explain the details</p>\n</details>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/images-followed-by-brackets.html",
    "content": "<p><img src=\"./image/cat1.png\" alt=\"image link\" />(some text between brackets)</p>\n<p><img src=\"./image/cat(1).png\" alt=\"image link\" />(some text between brackets)</p>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/images-followed-by-brackets.md",
    "content": "![image link](<./image/cat1.png>)(some text between brackets)\n\n![image link](<./image/cat(1).png>)(some text between brackets)\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/images.html",
    "content": "<p><img src=\"/path/to/img.jpg\" alt=\"Alt text\" /></p>\n<p><img src=\"/path/to/img.jpg\" alt=\"Alt text\" title=\"Optional title\" /></p>\n<p><img src=\"url/to/image.jpg\" alt=\"Alt text\" title=\"Optional title attribute\" /></p>\n<p><img src=\"url/to/image2.jpg\" alt=\"My Image\" title=\"Optional title attribute\" /></p>\n<p>![leave me alone]</p>\n<p>![leave me alone][]</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/images.md",
    "content": "![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \"Optional title\")\n\n![Alt text][id]\n\n![My Image]\n\n![leave me alone]\n\n![leave me alone][]\n\n  [id]: url/to/image.jpg  \"Optional title attribute\"\n  [My Image]: url/to/image2.jpg \"Optional title attribute\"\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/implicit-anchors.html",
    "content": "<p>Search the web at <a href=\"http://google.com/\">Google</a> or <a href=\"http://daringfireball.net/\">Daring Fireball</a>.</p>\n<p>Search the web at <a href=\"http://google.com/\">Google</a> or <a href=\"http://daringfireball.net/\">Daring Fireball</a>.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/implicit-anchors.md",
    "content": "Search the web at [Google][] or [Daring Fireball][].\n\nSearch the web at [Google] or [Daring Fireball].\n\n\n  [Google]: http://google.com/\n  [Daring Fireball]: http://daringfireball.net/\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-anchors.html",
    "content": "<p>This is <a href=\"http://example.com/\" title=\"Title\">an example</a> inline link.</p>\n<p><a href=\"http://example.net/\">This link</a> has no title attribute.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-anchors.md",
    "content": "This is [an example](http://example.com/ \"Title\") inline link.\n\n[This link](http://example.net/) has no title attribute.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-code.html",
    "content": "<p>Create a new <code>function</code>.</p>\n<p>Use the backtick in MySQL syntax <code>SELECT `column` FROM whatever</code>.</p>\n<p>A single backtick in a code span: <code>`</code></p>\n<p>A backtick-delimited string in a code span: <code>`foo`</code></p>\n<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n<p><code>&amp;#8212;</code> is the decimal-encoded equivalent of <code>&amp;mdash;</code>.</p>\n<p>this <code>inline **code** has ___magic___</code> chars</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-code.md",
    "content": "Create a new `function`.\n\nUse the backtick in MySQL syntax ``SELECT `column` FROM whatever``.\n\nA single backtick in a code span: `` ` ``\n\nA backtick-delimited string in a code span: `` `foo` ``\n\nPlease don't use any `<blink>` tags.\n\n`&#8212;` is the decimal-encoded equivalent of `&mdash;`.\n\nthis `inline **code** has ___magic___` chars\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-escaped-chars.html",
    "content": "<p>Hello.this_is_a_variable\n  and.this.is.another_one</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-escaped-chars.md",
    "content": "Hello.this\\_is\\_a\\_variable\nand.this.is.another_one\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-style-tag.html",
    "content": "<style>\n  p { line-height: 20px; }\n</style>\n<p>An exciting sentence.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/inline-style-tag.md",
    "content": "<style>\n    p { line-height: 20px; }\n</style>\n\nAn exciting sentence.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/lazy-blockquote.html",
    "content": "<blockquote>\n  <p>This is a multi line blockquote test</p>\n  <p>With more than one line.</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/lazy-blockquote.md",
    "content": "  > This is a multi line blockquote test\n\n  > With more than one line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/line-starts-with-html.html",
    "content": "<p><a href=\"foo\">some text</a> words</p>\n<p><br> words</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/line-starts-with-html.md",
    "content": "<a href=\"foo\">some text</a> words\n\n<br> words\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-followed-by-blockquote.html",
    "content": "<h1 id=\"sometitle\">some title</h1>\n<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n</ol>\n<blockquote>\n    <p>some text in a blockquote</p>\n</blockquote>\n<ul>\n    <li>another list item 1</li>\n    <li>another list item 2</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-followed-by-blockquote.md",
    "content": "# some title\n\n1. list item 1\n2. list item 2\n\n> some text in a blockquote\n\n* another list item 1\n* another list item 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-followed-by-ghcode.html",
    "content": "<h1 id=\"sometitle\">some title</h1>\n<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n</ol>\n<pre><code>some code\n\n    and some other line of code\n</code></pre>\n<ul>\n    <li>another list item 1</li>\n    <li>another list item 2</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-followed-by-ghcode.md",
    "content": "# some title\n\n1. list item 1\n2. list item 2\n\n```\nsome code\n\nand some other line of code\n```\n\n* another list item 1\n* another list item 2\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-with-blockquote.html",
    "content": "<ul>\n  <li><p>A list item with a blockquote:</p>\n    <blockquote>\n      <p>This is a blockquote\n        inside a list item.</p>\n    </blockquote></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-with-blockquote.md",
    "content": "*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-with-code.html",
    "content": "<ul>\n  <li><p>A list item with code:</p>\n    <pre><code>alert('Hello world!');\n    </code></pre></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/list-with-code.md",
    "content": "*   A list item with code:\n\n        alert('Hello world!');\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/literal-html-tags.html",
    "content": "<p><code>some **code** yeah</code></p>\n<p>some <code>inline **code** block</code></p>\n<p><code>some inline **code**</code> block</p>\n<p>yo dawg <code start=\"true\">some &lt;code start=\"false\"&gt;code&lt;/code&gt; inception</code></p>\n<div>some **div** yeah</div>"
  },
  {
    "path": "test/functional/makehtml/cases/standard/literal-html-tags.md",
    "content": "<code>some **code** yeah</code>\n\nsome <code>inline **code** block</code>\n\n<code>some inline **code**</code> block\n\nyo dawg <code start=\"true\">some <code start=\"false\">code</code> inception</code>\n\n<div>some **div** yeah</div>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/multi-paragraph-list.html",
    "content": "<ol>\n  <li><p>This is a major bullet point.</p>\n    <p>That contains multiple paragraphs.</p></li>\n  <li><p>And another line</p></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/multi-paragraph-list.md",
    "content": " 1.  This is a major bullet point.\n\n    That contains multiple paragraphs.\n\n 2.  And another line\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/multiline-unordered-list.html",
    "content": "<ul>\n  <li>This line spans\n    more than one line and is lazy</li>\n  <li>Similar to this line</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/multiline-unordered-list.md",
    "content": " - This line spans\n more than one line and is lazy\n - Similar to this line\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/nested-blockquote.html",
    "content": "<blockquote>\n  <p>This is a multi line blockquote test</p>\n  <blockquote>\n    <p>And nesting!</p>\n  </blockquote>\n  <p>With more than one line.</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/nested-blockquote.md",
    "content": "  > This is a multi line blockquote test\n  >\n  > > And nesting!\n  >\n  > With more than one line.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/nested-gh-codeblocks.html",
    "content": "<pre><code>1. some code idented 4 spaces\n\n    ```\n    var foobar = 'foo';\n    ```\n\n2. another line\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/nested-gh-codeblocks.md",
    "content": "```\n1. some code idented 4 spaces\n\n    ```\n    var foobar = 'foo';\n    ```\n\n2. another line\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/obfuscated-emails.html",
    "content": ""
  },
  {
    "path": "test/functional/makehtml/cases/standard/obfuscated-emails.md",
    "content": ""
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-same-number.html",
    "content": "<ol>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-same-number.md",
    "content": " 1.  Red\n 1.  Green\n 1.  Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-starting-number.html",
    "content": "<ol start=\"5\">\n    <li>foo</li>\n    <li>bar</li>\n    <li>baz</li>\n</ol>\n<hr />\n<ol start=\"3\">\n    <li>a</li>\n    <li>b</li>\n    <li>c</li>\n    <li>d</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-starting-number.md",
    "content": "5. foo\n6. bar\n7. baz\n\n---\n\n3.  a\n2.  b\n7.  c\n23. d\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-wrong-numbers.html",
    "content": "<ol>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list-wrong-numbers.md",
    "content": " 1.  Red\n 1.  Green\n 1.  Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list.html",
    "content": "<ol>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/ordered-list.md",
    "content": " 1.  Red\n 2.  Green\n 3.  Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/paragraphed-list-with-sublists.html",
    "content": "<ul>\n  <li><p>foo</p>\n    <ul>\n      <li><p>bazinga</p></li>\n      <li><p>yeah</p></li></ul></li>\n  <li><p>bar</p>\n    <ol>\n      <li><p>damn</p></li>\n      <li><p>so many paragraphs</p></li></ol></li>\n  <li><p>baz</p></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/paragraphed-list-with-sublists.md",
    "content": " - foo\n \n    - bazinga\n    \n    - yeah\n \n - bar\n \n    1. damn\n    \n    2. so many paragraphs\n \n - baz\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/pre-code-tags-inside-code-block.html",
    "content": "<p>code inception</p>\n<pre><code>&lt;pre&gt;&lt;code&gt;\n&lt;div&gt;some html code inside code html tags inside a fenced code block&lt;/div&gt;\n&lt;/code&gt;&lt;/pre&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/pre-code-tags-inside-code-block.md",
    "content": "code inception\n\n```\n<pre><code>\n<div>some html code inside code html tags inside a fenced code block</div>\n</code></pre>\n```\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/pre-code-tags.html",
    "content": "<pre>\n<code>\nfoobar\n</code>\n</pre>\n<p>blabla</p>\n<pre nhaca=\"zulu\"><code bla=\"bla\">\nfoobar\n</code>\n</pre>\n<pre><code>\n&lt;div&gt;some html code&lt;/div&gt;\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/pre-code-tags.md",
    "content": "<pre>\n<code>\nfoobar\n</code>\n</pre>\n\nblabla\n\n<pre nhaca=\"zulu\"><code bla=\"bla\">\nfoobar\n</code>\n</pre>\n\n<pre><code>\n<div>some html code</div>\n</code></pre>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/relative-anchors.html",
    "content": "<p>See my <a href=\"/about/\">About</a> page for details.</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/relative-anchors.md",
    "content": "See my [About](/about/) page for details.\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/repeated-headers.html",
    "content": "<h1 id=\"sametitle\">Same Title</h1>\n<p>some text</p>\n<h1 id=\"sametitle-1\">Same Title</h1>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/repeated-headers.md",
    "content": "# Same Title\n\nsome text\n\n# Same Title\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/simple-paragraph.html",
    "content": "<p>Hello, world!</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/simple-paragraph.md",
    "content": "Hello, world!\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/strip-references.html",
    "content": ""
  },
  {
    "path": "test/functional/makehtml/cases/standard/strip-references.md",
    "content": "[1]: http://www.google.co.uk\n\n[http://www.google.co.uk]: http://www.google.co.uk\n\n\n\n\n\n[1]: http://dsurl.stuff/something.jpg\n\n[1]:http://www.google.co.uk\n\n [1]:http://www.google.co.uk\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/strong.html",
    "content": "<p><strong>important</strong></p>\n<p><strong>important</strong></p>\n<p>really <strong>freaking</strong>strong</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/strong.md",
    "content": "**important**\n\n__important__\n\nreally **freaking**strong\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-asterisk.html",
    "content": "<ul>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-asterisk.md",
    "content": " * Red\n * Green\n * Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-minus.html",
    "content": "<ul>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-minus.md",
    "content": " - Red\n - Green\n - Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-plus.html",
    "content": "<ul>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/unordered-list-plus.md",
    "content": " + Red\n + Green\n + Blue\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/url-with-parenthesis.html",
    "content": "<p>There's an <a href=\"http://en.memory-alpha.org/wiki/Darmok_(episode)\">episode</a> of Star Trek: The Next Generation</p>\n"
  },
  {
    "path": "test/functional/makehtml/cases/standard/url-with-parenthesis.md",
    "content": "There's an [episode](http://en.memory-alpha.org/wiki/Darmok_(episode)) of Star Trek: The Next Generation\n"
  },
  {
    "path": "test/functional/makehtml/makehtml.bootstrap.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\n\n//jscs:disable requireCamelCaseOrUpperCaseIdentifiers\n(function () {\n  'use strict';\n\n  require('source-map-support').install();\n  require('chai').should();\n  let fs = require('fs');\n\n  function getTestSuite (dir) {\n    return fs.readdirSync(dir)\n      .filter(filter())\n      .map(map(dir));\n  }\n\n  function getJsonTestSuite (file) {\n    let json = JSON.parse(fs.readFileSync(file, 'utf8'));\n    return mapJson(json, file);\n  }\n\n  function filter () {\n    return function (file) {\n      let ext = file.slice(-3);\n      return (ext === '.md');\n    };\n  }\n\n  function map (dir) {\n    return function (file) {\n      let oFile = 'file://' + process.cwd().replace(/\\\\/g, '/') + dir + file,\n          name = file.replace('.md', ''),\n          htmlPath = dir + name + '.html',\n          html = fs.readFileSync(htmlPath, 'utf8'),\n          mdPath = dir + name + '.md',\n          md = fs.readFileSync(mdPath, 'utf8');\n\n      return {\n        name:     name,\n        input:    md,\n        expected: html,\n        file: oFile\n      };\n    };\n  }\n\n  function mapJson (jsonArray, file) {\n    let tcObj = {};\n    for (let i = 0; i < jsonArray.length; ++i) {\n      let section = jsonArray[i].section;\n      let name = jsonArray[i].section + '_' + jsonArray[i].example;\n      let md = jsonArray[i].markdown;\n      let html = jsonArray[i].html;\n      if (!tcObj.hasOwnProperty(section)) {\n        tcObj[section] = [];\n      }\n      tcObj[section].push({\n        name: name,\n        input: md,\n        expected: html,\n        file: process.cwd().replace(/\\\\/g, '/') + file\n      });\n    }\n    return tcObj;\n  }\n\n\n  function assertion (testCase, converter) {\n    return function () {\n      testCase.actual = converter.makeHtml(testCase.input);\n      testCase = normalize(testCase);\n\n      // Compare\n      testCase.actual.should.equal(testCase.expected, testCase.file);\n    };\n  }\n\n  //Normalize input/output\n  function normalize (testCase) {\n\n    // Normalize line returns\n    testCase.expected = testCase.expected.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n    testCase.actual = testCase.actual.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n\n    // Ignore all leading/trailing whitespace\n    testCase.expected = testCase.expected.split('\\n').map(function (x) {\n      return x.trim();\n    }).join('\\n');\n    testCase.actual = testCase.actual.split('\\n').map(function (x) {\n      return x.trim();\n    }).join('\\n');\n\n    // Remove extra lines\n    testCase.expected = testCase.expected.trim();\n    testCase.actual = testCase.actual.trim();\n\n    //Beautify\n    //testCase.expected = beautify(testCase.expected, beauOptions);\n    //testCase.actual = beautify(testCase.actual, beauOptions);\n\n    // Normalize line returns\n    testCase.expected = testCase.expected.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n    testCase.actual = testCase.actual.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n\n    return testCase;\n  }\n\n  module.exports = {\n    getTestSuite: getTestSuite,\n    getJsonTestSuite: getJsonTestSuite,\n    assertion: assertion,\n    normalize: normalize,\n    showdown: require('../../../.build/showdown.js')\n  };\n})();\n\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.commonmark.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\n\n// jshint ignore: start\n/*\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter(),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getJsonTestSuite('test/functional/makehtml/cases/commonmark.testsuite.json');\n\ndescribe('makeHtml() commonmark testsuite', function () {\n  'use strict';\n\n  for (var section in testsuite) {\n    if (testsuite.hasOwnProperty(section)) {\n      describe(section, function () {\n        for (var i = 0; i < testsuite[section].length; ++i) {\n          it(testsuite[section][i].name, assertion(testsuite[section][i], converter));\n        }\n      });\n    }\n  }\n});\n*/\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.features.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    showdown = bootstrap.showdown,\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/'),\n    tableSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/tables/'),\n    simplifiedAutoLinkSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/simplifiedAutoLink/'),\n    openLinksInNewWindowSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/openLinksInNewWindow/'),\n    disableForced4SpacesIndentedSublistsSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/disableForced4SpacesIndentedSublists/'),\n    rawHeaderIdSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/rawHeaderId/'),\n    rawPrefixHeaderIdSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/rawPrefixHeaderId/'),\n    emojisSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/emojis/'),\n    underlineSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/underline/'),\n    ellipsisSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/ellipsis/'),\n    literalMidWordUnderscoresSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/literalMidWordUnderscores/'),\n    //literalMidWordAsterisksSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/literalMidWordAsterisks/'),\n    completeHTMLOutputSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/completeHTMLOutput/'),\n    metadataSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/metadata/'),\n    splitAdjacentBlockquotesSuite = bootstrap.getTestSuite('test/functional/makehtml/cases/features/splitAdjacentBlockquotes/'),\n    moreStyling = bootstrap.getTestSuite('test/functional/makehtml/cases/features/moreStyling/'),\n    http = require('http'),\n    https = require('https'),\n    expect = require('chai').expect;\n\ndescribe('makeHtml() features testsuite', function () {\n  'use strict';\n\n  describe('issues', function () {\n    for (var i = 0; i < testsuite.length; ++i) {\n      var converter;\n      if (testsuite[i].name === '#143.support-image-dimensions') {\n        converter = new showdown.Converter({parseImgDimensions: true});\n      } else if (testsuite[i].name === '#69.header-level-start') {\n        converter = new showdown.Converter({headerLevelStart: 3});\n      } else if (testsuite[i].name === '#164.1.simple-autolink' || testsuite[i].name === '#204.certain-links-with-at-and-dot-break-url') {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      } else if (testsuite[i].name === 'literalMidWordUnderscores') {\n        converter = new showdown.Converter({literalMidWordUnderscores: true});\n      } else if (testsuite[i].name === '#164.2.disallow-underscore-emphasis-mid-word') {\n        converter = new showdown.Converter({literalMidWordUnderscores: true});\n      } else if (testsuite[i].name === '#164.3.strikethrough' || testsuite[i].name === '#214.escaped-markdown-chars-break-strikethrough') {\n        converter = new showdown.Converter({strikethrough: true});\n      } else if (testsuite[i].name === 'disable-gh-codeblocks') {\n        converter = new showdown.Converter({ghCodeBlocks: false});\n      } else if (testsuite[i].name === '#164.4.tasklists') {\n        converter = new showdown.Converter({tasklists: true});\n      } else if (testsuite[i].name === '#198.literalMidWordUnderscores-changes-behavior-of-asterisk') {\n        converter = new showdown.Converter({literalMidWordUnderscores: true});\n      } else if (testsuite[i].name === '#259.es6-template-strings-indentation-issues') {\n        converter = new showdown.Converter({smartIndentationFix: true});\n      } else if (testsuite[i].name === '#284.simplifiedAutoLink-does-not-match-GFM-style') {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      } else if (testsuite[i].name === 'disableForced4SpacesIndentedSublists') {\n        converter = new showdown.Converter({disableForced4SpacesIndentedSublists: true});\n      } else if (testsuite[i].name === '#206.treat-single-line-breaks-as-br') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === 'simpleLineBreaks2') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === '#316.new-simpleLineBreaks-option-breaks-lists') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === '#323.simpleLineBreaks-breaks-with-strong') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === '#318.simpleLineBreaks-does-not-work-with-chinese-characters') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === 'simpleLineBreaks-handle-html-pre') {\n        converter = new showdown.Converter({simpleLineBreaks: true});\n      } else if (testsuite[i].name === 'excludeTrailingPunctuationFromURLs-option') {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      } else if (testsuite[i].name === 'requireSpaceBeforeHeadingText') {\n        converter = new showdown.Converter({requireSpaceBeforeHeadingText: true});\n      } else if (testsuite[i].name === '#320.github-compatible-generated-header-id') {\n        converter = new showdown.Converter({ghCompatibleHeaderId: true});\n      } else if (testsuite[i].name === 'ghMentions') {\n        converter = new showdown.Converter({ghMentions: true});\n      } else if (testsuite[i].name === 'disable-email-encoding') {\n        converter = new showdown.Converter({encodeEmails: false});\n      } else if (testsuite[i].name === '#330.simplifiedAutoLink-drops-character-before-and-after-linked-mail') {\n        converter = new showdown.Converter({encodeEmails: false, simplifiedAutoLink: true});\n      } else if (testsuite[i].name === '#331.allow-escaping-of-tilde') {\n        converter = new showdown.Converter({strikethrough: true});\n      } else if (testsuite[i].name === 'prefixHeaderId-simple') {\n        converter = new showdown.Converter({prefixHeaderId: true});\n      } else if (testsuite[i].name === 'prefixHeaderId-string') {\n        converter = new showdown.Converter({prefixHeaderId: 'my-prefix-'});\n      } else if (testsuite[i].name === 'prefixHeaderId-string-and-ghCompatibleHeaderId') {\n        converter = new showdown.Converter({prefixHeaderId: 'my-prefix-', ghCompatibleHeaderId: true});\n      } else if (testsuite[i].name === 'prefixHeaderId-string-and-ghCompatibleHeaderId2') {\n        converter = new showdown.Converter({prefixHeaderId: 'my prefix ', ghCompatibleHeaderId: true});\n      } else if (testsuite[i].name === 'simplifiedAutoLink') {\n        converter = new showdown.Converter({simplifiedAutoLink: true, strikethrough: true});\n      } else if (testsuite[i].name === 'customizedHeaderId-simple') {\n        converter = new showdown.Converter({customizedHeaderId: true});\n      } else if (testsuite[i].name === '#378.simplifiedAutoLinks-with-excludeTrailingPunctuationFromURLs') {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      } else if (testsuite[i].name === '#374.escape-html-tags') {\n        converter = new showdown.Converter({backslashEscapesHTMLTags: true});\n      } else if (testsuite[i].name === '#379.openLinksInNewWindow-breaks-em-markdup') {\n        converter = new showdown.Converter({openLinksInNewWindow: true});\n      } else if (testsuite[i].name === '#355.simplifiedAutoLink-URLs-inside-parenthesis-followed-by-another-character-are-not-parsed-correctly') {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      } else if (testsuite[i].name === '#709.allow-whitespaces-after-end-in-metadata') {\n        converter = new showdown.Converter({metadata: true});\n      } else if (testsuite[i].name === 'relativePathBaseUrl') {\n        converter = new showdown.Converter({relativePathBaseUrl: 'http://my.site.com/'});\n      } else {\n        converter = new showdown.Converter();\n      }\n      it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n    }\n  });\n\n  /** test Table Syntax Support **/\n  describe('table support', function () {\n    var converter,\n        suite = tableSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'basic-with-header-ids') {\n        converter = new showdown.Converter({tables: true, tablesHeaderId: true});\n      } else if (suite[i].name === '#179.parse-md-in-table-ths') {\n        converter = new showdown.Converter({tables: true, strikethrough: true});\n      } else {\n        converter = new showdown.Converter({tables: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test simplifiedAutoLink Support **/\n  describe('simplifiedAutoLink support in', function () {\n    var converter,\n        suite = simplifiedAutoLinkSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'emphasis-and-strikethrough') {\n        converter = new showdown.Converter({simplifiedAutoLink: true, strikethrough: true});\n      } else if (suite[i].name === 'disallow-underscores') {\n        converter = new showdown.Converter({literalMidWordUnderscores: true, simplifiedAutoLink: true});\n      } else if (suite[i].name === 'disallow-asterisks') {\n        converter = new showdown.Converter({literalMidWordAsterisks: true, simplifiedAutoLink: true});\n      } else {\n        converter = new showdown.Converter({simplifiedAutoLink: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test openLinksInNewWindow support **/\n  describe('openLinksInNewWindow support in', function () {\n    var converter,\n        suite = openLinksInNewWindowSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'simplifiedAutoLink') {\n        converter = new showdown.Converter({openLinksInNewWindow: true, simplifiedAutoLink: true});\n      } else {\n        converter = new showdown.Converter({openLinksInNewWindow: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test disableForced4SpacesIndentedSublists support **/\n  describe('disableForced4SpacesIndentedSublists support in', function () {\n    var converter,\n        suite = disableForced4SpacesIndentedSublistsSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({disableForced4SpacesIndentedSublists: true});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test rawHeaderId support **/\n  describe('rawHeaderId support', function () {\n    var converter,\n        suite = rawHeaderIdSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'with-prefixHeaderId') {\n        converter = new showdown.Converter({rawHeaderId: true, prefixHeaderId: '/prefix/'});\n      } else {\n        converter = new showdown.Converter({rawHeaderId: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test rawPrefixHeaderId support **/\n  describe('rawPrefixHeaderId support', function () {\n    var converter,\n        suite = rawPrefixHeaderIdSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({rawPrefixHeaderId: true, prefixHeaderId: '/prefix/'});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test emojis support **/\n  describe('emojis support', function () {\n    var converter,\n        suite = emojisSuite,\n        imgSrcRegexp = /<img[^>]+src=(\"https?:\\/\\/[^\"]+\"|'https?:\\/\\/[^']+')/g;\n\n    function testImageUrlExists (imgUrl) {\n      // Strip the quotes\n      imgUrl = imgUrl.slice(1, -1);\n      return function (done) {\n        (imgUrl.startsWith('http://') ? http : https).get(imgUrl, function (res) {\n          expect(res.statusCode).to.equal(200);\n          // Make sure we get some data and that it's a png\n          expect(parseInt(res.headers['content-length'], 10)).to.be.above(0);\n          expect(res.headers['content-type']).to.equal('image/png');\n\n          // Discard the data (but fetch it)\n          res.on('data', function () {});\n\n          res.on('end', function () {\n            done();\n          });\n        }).on('error', function (e) {\n          throw e;\n        });\n      };\n    }\n\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'simplifiedautolinks') {\n        converter = new showdown.Converter({emoji: true, simplifiedAutoLink: true});\n      } else {\n        converter = new showdown.Converter({emoji: true});\n      }\n\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n\n      var imgUrl = imgSrcRegexp.exec(suite[i].expected);\n      if (imgUrl) {\n        it('should use a working emoji URL', testImageUrlExists(imgUrl[1]));\n      }\n    }\n  });\n\n  /** test underline support **/\n  describe('underline support', function () {\n    var converter,\n        suite = underlineSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'simplifiedautolinks') {\n        converter = new showdown.Converter({underline: true, simplifiedAutoLink: true});\n      } else {\n        converter = new showdown.Converter({underline: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test ellipsis option **/\n  describe('ellipsis option', function () {\n    var converter,\n        suite = ellipsisSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({ellipsis: false});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test literalMidWordUnderscores option **/\n  describe('literalMidWordUnderscores option', function () {\n    var converter,\n        suite = literalMidWordUnderscoresSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({literalMidWordUnderscores: true});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test literalMidWordAsterisks option **/\n  /*\n  describe('literalMidWordAsterisks option', function () {\n    var converter,\n        suite = literalMidWordAsterisksSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({literalMidWordAsterisks: true});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n  */\n\n  /** test completeHTMLDocument option **/\n  describe('completeHTMLDocument option', function () {\n    var converter,\n        suite = completeHTMLOutputSuite;\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({completeHTMLDocument: true});\n\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test metadata option **/\n  describe('metadata option', function () {\n    var converter,\n        suite = metadataSuite;\n\n    for (var i = 0; i < suite.length; ++i) {\n      if (suite[i].name === 'embeded-in-output' ||\n        suite[i].name === 'embeded-two-consecutive-metadata-blocks' ||\n        suite[i].name === 'embeded-two-consecutive-metadata-blocks-different-symbols') {\n        converter = new showdown.Converter({metadata: true, completeHTMLDocument: true});\n      } else if (suite[i].name === 'ignore-metadata') {\n        converter = new showdown.Converter({metadata: false});\n      } else {\n        converter = new showdown.Converter({metadata: true});\n      }\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test metadata option **/\n  describe('splitAdjacentBlockquotes option', function () {\n    var converter,\n        suite = splitAdjacentBlockquotesSuite;\n\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({splitAdjacentBlockquotes: true});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n  /** test moreStyling option **/\n  describe('moreStyling option', function () {\n    var converter,\n        suite = moreStyling;\n\n    for (var i = 0; i < suite.length; ++i) {\n      converter = new showdown.Converter({moreStyling: true, tasklists: true});\n      it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));\n    }\n  });\n\n});\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.ghost.js",
    "content": "/**\n * Created by Estevao on 14-07-2015.\n */\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter({\n      strikethrough:             true,\n      literalMidWordUnderscores: true,\n      simplifiedAutoLink:        true,\n      tables:                    true,\n      parseImgDimensions:        true, //extra\n      tasklists:                 true  //extra\n    }),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makehtml/cases/ghost/');\n\n//MD-Testsuite (borrowed from karlcow/markdown-testsuite)\ndescribe('makeHtml() ghost testsuite', function () {\n  'use strict';\n  for (var i = 0; i < testsuite.length; ++i) {\n    it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n  }\n});\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.issues.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter(),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makehtml/cases/issues/');\n\ndescribe('makeHtml() issues testsuite', function () {\n  'use strict';\n  for (var i = 0; i < testsuite.length; ++i) {\n    it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n  }\n});\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.karlcow.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\n\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter({noHeaderId: true}),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makehtml/cases/karlcow/');\n\n//MD-Testsuite (borrowed from karlcow/markdown-testsuite)\ndescribe('makeHtml() karlcow testsuite', function () {\n  'use strict';\n  for (var i = 0; i < testsuite.length; ++i) {\n    it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n  }\n});\n"
  },
  {
    "path": "test/functional/makehtml/testsuite.standard.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\n\nvar bootstrap = require('./makehtml.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter(),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makehtml/cases/standard/');\n\ndescribe('makeHtml() standard testsuite', function () {\n  'use strict';\n  for (var i = 0; i < testsuite.length; ++i) {\n    it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n  }\n});\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/features/ghMentions/github.html",
    "content": "<p><a class=\"bazinga user-mention foo bar baz\" href=\"https://github.com/tivie\">@tivie</a></p>\n<p><a class=\"not-user-mention\" href=\"https://www.google.com\">@something</a></p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/features/ghMentions/github.md",
    "content": "@tivie\n\n[@something](<https://www.google.com>)\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/features/issues/tasklists.html",
    "content": "<h1 id=\"mythings\">my things</h1>\n<ul>\n    <li>foo</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"> bar</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"> baz</li>\n    <li class=\"task-list-item\" style=\"list-style-type: none;\"><input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\" checked> bazinga</li>\n</ul>\n<p>otherthings</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/features/issues/tasklists.md",
    "content": "# my things\n\n- foo\n- [ ] bar\n- [ ] baz\n- [x] bazinga\n\notherthings\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/anchors-relative.html",
    "content": "<p>See my <a href=\"/about/\">About</a> page for details.</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/anchors-relative.md",
    "content": "See my [About](</about/>) page for details.\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/anchors.html",
    "content": "<p>This is <a href=\"http://example.com/\" title=\"Title\">an example</a> inline link.</p>\n<p><a href=\"http://example.net/\">This link</a> has no title attribute.</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/anchors.md",
    "content": "This is [an example](<http://example.com/> \"Title\") inline link.\n\n[This link](<http://example.net/>) has no title attribute.\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote-followed-by-code.html",
    "content": "<blockquote>\n    <p>a blockquote\nwith a 4 space indented line (not code)</p>\n</blockquote>\n<p>sep</p>\n<blockquote>\n    <p>a blockquote</p>\n</blockquote>\n<pre><code>with some code after</code></pre>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote-followed-by-code.md",
    "content": "> a blockquote with a 4 space indented line (not code)\n\nsep\n\n> a blockquote\n\n```\nwith some code after\n```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote-nested-markdown.html",
    "content": "<blockquote>\n  <h2 id=\"thisisaheader\">This is a header.</h2>\n  <ol>\n    <li>This is the first list item.</li>\n    <li>This is the second list item.</li>\n  </ol>\n  <p>Here's some example code:</p>\n    <pre><code>return shell_exec(\"echo $input | $markdown_script\");\n    </code></pre>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote-nested-markdown.md",
    "content": "> ## This is a header.\n> \n> 1. This is the first list item.\n> 2. This is the second list item.\n> \n> Here's some example code:\n> \n> ```\n> return shell_exec(\"echo $input | $markdown_script\");\n> ```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote.html",
    "content": "<blockquote>\n<p>This is a multi line blockquote test</p>\n<p>With more than one line.</p>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/blockquote.md",
    "content": "> This is a multi line blockquote test\n> \n> With more than one line.\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/breaks.html",
    "content": "first line<br />and the second\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/breaks.md",
    "content": "first line  \nand the second \n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis-double.html",
    "content": "<p>a <strong><em>strong and em</em></strong> thingy</p>\n<p>bar<strong><em>bazinga</em></strong>bar</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis-double.md",
    "content": "a ***strong and em*** thingy\n\nbar***bazinga***bar\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis-inside-inline-code.html",
    "content": "<p>some text <code>**foo**</code></p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis-inside-inline-code.md",
    "content": "some text `**foo**`\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis.html",
    "content": "<p><em>single asterisks</em></p>\n<p><em>single underscores</em></p>\n<p><strong>double asterisks</strong></p>\n<p><strong>double underscores</strong></p>\n<p>text <em>with italic sentence</em> in middle</p>\n<p>text <strong>with bold sentence</strong> in middle</p>\n<p>text with <strong>bold text that\n  spans across multiple</strong> lines</p>\n<p>underscored_word</p>\n<p>doubleunderscore__word</p>\n<p>asterix*word</p>\n<p>doubleasterix**word</p>\n<p>line with_underscored word</p>\n<p>line with__doubleunderscored word</p>\n<p>line with*asterixed word</p>\n<p>line with**doubleasterixed word</p>\n<p>some line<em>with</em>inner underscores</p>\n<p>some line<strong>with</strong>inner double underscores</p>\n<p>some line<em>with</em>inner asterixs</p>\n<p>some line<strong>with</strong>inner double asterixs</p>\n<p>another line with just _one underscore</p>\n<p>another line with just __one double underscore</p>\n<p>another line with just *one asterix</p>\n<p>another line with just **one double asterix</p>\n<p>a sentence with<em>underscore and another</em>underscore</p>\n<p>a sentence with<strong>doubleunderscore and another</strong>doubleunderscore</p>\n<p>a sentence with<em>asterix and another</em>asterix</p>\n<p>a sentence with<strong>doubleasterix and another</strong>doubleasterix</p>\n<p>escaped word_with_underscores</p>\n<p>escaped word__with__double underscores</p>\n<p>escaped word<em>_with_</em>single italic underscore</p>\n<p>escaped word*with*asterixs</p>\n<p>escaped word**with**asterixs</p>\n<p>escaped word<strong>*with*</strong>bold asterixs</p>\n<p>foo<strong>bar</strong>baz</p>\n<p>foo<strong>bar</strong>baz</p>\n<p>this is <strong><a href=\"//google.com\">imbued link with strong</a></strong></p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/emphasis.md",
    "content": "*single asterisks*\n\n*single underscores*\n\n**double asterisks**\n\n**double underscores**\n\ntext *with italic sentence* in middle\n\ntext **with bold sentence** in middle\n\ntext with **bold text that spans across multiple** lines\n\nunderscored\\_word\n\ndoubleunderscore\\_\\_word\n\nasterix\\*word\n\ndoubleasterix\\*\\*word\n\nline with\\_underscored word\n\nline with\\_\\_doubleunderscored word\n\nline with\\*asterixed word\n\nline with\\*\\*doubleasterixed word\n\nsome line*with*inner underscores\n\nsome line**with**inner double underscores\n\nsome line*with*inner asterixs\n\nsome line**with**inner double asterixs\n\nanother line with just \\_one underscore\n\nanother line with just \\_\\_one double underscore\n\nanother line with just \\*one asterix\n\nanother line with just \\*\\*one double asterix\n\na sentence with*underscore and another*underscore\n\na sentence with**doubleunderscore and another**doubleunderscore\n\na sentence with*asterix and another*asterix\n\na sentence with**doubleasterix and another**doubleasterix\n\nescaped word\\_with\\_underscores\n\nescaped word\\_\\_with\\_\\_double underscores\n\nescaped word*\\_with\\_*single italic underscore\n\nescaped word\\*with\\*asterixs\n\nescaped word\\*\\*with\\*\\*asterixs\n\nescaped word**\\*with\\***bold asterixs\n\nfoo**bar**baz\n\nfoo**bar**baz\n\nthis is **[imbued link with strong](<//google.com>)**\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/escaping-html-entities.html",
    "content": "<p>a &quot;quoted&quot; string</p>\n<p>duarte&amp;companhia</p>\n<p>1 &lt; 2</p>\n<p>2 &gt; 1</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/escaping-html-entities.md",
    "content": "a \"quoted\" string\n\nduarte&companhia\n\n1 < 2\n\n2 > 1\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/escaping.html",
    "content": "<p>[a false reference]: must be escaped</p>\n<p> - a list item</p>\n<p>*</p>\n<p>~</p>\n<p>|</p>\n<p>[a faux](link)</p>\n<p># at start</p>\n<p>in the # middle is ok</p>\n<p>> at start</p>\n<p>in the middle > is ok</p>\n<p>---</p>\n<p>1. must be escaped</p>\n<p>but. this should not</p>\n<p>. nor this</p>\n<p>or this.</p>\n<p>    4 spaces at the beginning of line are removed</p>\n<p>multiple spaces    are colapsed to 1</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/escaping.md",
    "content": "\\[a false reference]: must be escaped\n\n\\- a list item\n\n\\*\n\n\\~\n\n\\|\n\n[a faux\\]\\(link)\n\n\\# at start\n\nin the # middle is ok\n\n\\> at start\n\nin the middle > is ok\n\n\\---\n\n1\\. must be escaped\n\nbut. this should not\n\n. nor this\n\nor this.\n\n4 spaces at the beginning of line are removed\n\nmultiple spaces are colapsed to 1\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-at-start.html",
    "content": "<pre><code>\nfunction MyFunc(a) {\n  // ...\n}\n</code></pre>\n<p>That is some code!</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-at-start.md",
    "content": "```\nfunction MyFunc(a) {\n  // ...\n}\n```\n\nThat is some code!\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-codeblock-inside-quote.html",
    "content": "<blockquote>\n<p>Define a function in javascript:</p>\n<pre><code>\nfunction MyFunc(a) {\n    var s = '`';\n}\n</code></pre>\n<blockquote>\n<p>And some nested quote</p>\n<pre><code class=\"html language-html\">&lt;div&gt;HTML!&lt;/div&gt;\n</code></pre>\n</blockquote>\n</blockquote>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-codeblock-inside-quote.md",
    "content": "> Define a function in javascript:\n> \n> ```\n> function MyFunc(a) {\n>     var s = '`';\n> }\n> ```\n> \n> > And some nested quote\n> > \n> > ```html\n> > <div>HTML!</div>\n> > ```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-codeblock.html",
    "content": "<p>Define a function in javascript:</p>\n<pre><code>function MyFunc(a) {\n    var s = '`';\n}\n</code></pre>\n<p>And some HTML</p>\n<pre><code class=\"html language-html\">&lt;div&gt;HTML!&lt;/div&gt;\n</code></pre>\n<pre><code data-language=\"javascript\">\nfunction foo() {\n    return 'bar';\n}\n</code></pre>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-codeblock.md",
    "content": "\nDefine a function in javascript:\n\n```\nfunction MyFunc(a) {\n    var s = '`';\n}\n```\n\nAnd some HTML\n\n```html\n<div>HTML!</div>\n```\n\n```javascript\nfunction foo() {\n    return 'bar';\n}\n```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-linebreaks.html",
    "content": "<pre><code>code can go here\nthis is rendered on a second line\n</code></pre>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/github-style-linebreaks.md",
    "content": "```\ncode can go here\nthis is rendered on a second line\n```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h1-with-single-hash.html",
    "content": "<h1 id=\"thisisanh1\">This is an H1</h1>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h1-with-single-hash.md",
    "content": "# This is an H1\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h2-with-single-hash.html",
    "content": "<h2 id=\"thisisanh2\">This is an H2</h2>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h2-with-single-hash.md",
    "content": "## This is an H2\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h3-with-single-hash.html",
    "content": "<h3 id=\"thisisanh3\">This is an H3</h3>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h3-with-single-hash.md",
    "content": "### This is an H3\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h4-with-single-hash.html",
    "content": "<h4 id=\"thisisanh4\">This is an H4</h4>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h4-with-single-hash.md",
    "content": "#### This is an H4\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h5-with-single-hash.html",
    "content": "<h5 id=\"thisisanh5\">This is an H5</h5>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h5-with-single-hash.md",
    "content": "##### This is an H5\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h6-with-single-hash.html",
    "content": "<h6 id=\"thisisanh6\">This is an H6</h6>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/h6-with-single-hash.md",
    "content": "###### This is an H6\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/horizontal-rules.html",
    "content": "<hr />\n<hr>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/horizontal-rules.md",
    "content": "---\n\n---\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html-comments.html",
    "content": "<!-- a comment -->\n<!-- a comment with *bogus* __markdown__ inside -->\n<!-- comment -->\n<p>words</p>\n   <!-- comment -->\n<pre><code>&lt;!-- comment --&gt;\n</code></pre>\n<p>&lt;!----------------------------------------------------------------------------------------------------------------------------------------------------</p>\n<!-------------------------------------------------------------------->\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html-comments.md",
    "content": "<!-- a comment -->\n\n<!-- a comment with *bogus* __markdown__ inside -->\n\n<!-- comment -->\n\nwords\n\n<!-- comment -->\n\n```\n<!-- comment -->\n```\n\n<!----------------------------------------------------------------------------------------------------------------------------------------------------\n\n<!-------------------------------------------------------------------->\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html.html",
    "content": "<div>\n    some text\n</div>\n\n<span>an inline element</span>\n\n<div>\n    <span>a span inside a div</span>\n</div>\n\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html.md",
    "content": "<div> some text </div>\n\n<span>an inline element</span>\n\n<div><span>a span inside a div</span></div>\n\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html5-strutural-tags.html",
    "content": "<p>These HTML5 tags should pass through just fine.</p>\n<section>hello</section>\n<header>head</header>\n<footer>footsies</footer>\n<nav>navigation</nav>\n<article>read me</article>\n<aside>ignore me</aside>\n<article>read\n  me</article>\n<aside>\n  ignore me\n</aside>\n<p>the end</p>\n<audio class=\"podcastplayer\" controls>\n  <source src=\"foobar.mp3\" type=\"audio/mp3\" preload=\"none\"></source>\n  <source src=\"foobar.off\" type=\"audio/ogg\" preload=\"none\"></source>\n</audio>\n<video src=\"foo.ogg\">\n  <track kind=\"subtitles\" src=\"foo.en.vtt\" srclang=\"en\" label=\"English\">\n  <track kind=\"subtitles\" src=\"foo.sv.vtt\" srclang=\"sv\" label=\"Svenska\">\n</video>\n<address>My street</address>\n<canvas id=\"canvas\" width=\"300\" height=\"300\">\n  Sorry, your browser doesn't support the &lt;canvas&gt; element.\n</canvas>\n<figure>\n  <img src=\"mypic.png\" alt=\"An awesome picture\">\n  <figcaption>Caption for the awesome picture</figcaption>\n</figure>\n<hgroup>\n  <h1>Main title</h1>\n  <h2>Secondary title</h2>\n</hgroup>\n<output name=\"result\"></output>\n<details>\n  <summary>Summarise me</summary>\n  <p>Explain the details</p>\n</details>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/html5-strutural-tags.md",
    "content": "These HTML5 tags should pass through just fine.\n\n<section>hello</section>\n\n<header>head</header>\n\n<footer>footsies</footer>\n\n<nav>navigation</nav>\n\n<article>read me</article>\n\n<aside>ignore me</aside>\n\n<article>read me</article>\n\n<aside> ignore me </aside>\n\nthe end\n\n<audio class=\"podcastplayer\" controls=\"\"><source src=\"foobar.mp3\" type=\"audio/mp3\" preload=\"none\"><source src=\"foobar.off\" type=\"audio/ogg\" preload=\"none\"></audio>\n\n<video src=\"foo.ogg\"><track kind=\"subtitles\" src=\"foo.en.vtt\" srclang=\"en\" label=\"English\"><track kind=\"subtitles\" src=\"foo.sv.vtt\" srclang=\"sv\" label=\"Svenska\"></video>\n\n<address>My street</address>\n\n<canvas id=\"canvas\" width=\"300\" height=\"300\"> Sorry, your browser doesn't support the &lt;canvas&gt; element. </canvas>\n\n<figure><img src=\"mypic.png\" alt=\"An awesome picture\"><figcaption>Caption for the awesome picture</figcaption></figure>\n\n<hgroup><h1>Main title</h1><h2>Secondary title</h2></hgroup>\n\n<output name=\"result\"></output>\n\n<details><summary>Summarise me</summary><p>Explain the details</p></details>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/images-followed-by-brackets.html",
    "content": "<p><img src=\"./image/cat1.png\" alt=\"image link\" />(some text between brackets)</p>\n<p><img src=\"./image/cat(1).png\" alt=\"image link\" />(some text between brackets)</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/images-followed-by-brackets.md",
    "content": "![image link](<./image/cat1.png>)(some text between brackets)\n\n![image link](<./image/cat(1).png>)(some text between brackets)\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/images.html",
    "content": "<p><img src=\"/path/to/img.jpg\" alt=\"Alt text\" /></p>\n<p><img src=\"/path/to/img.jpg\" alt=\"Alt text\" title=\"Optional title\" /></p>\n<p><img src=\"url/to/image.jpg\" alt=\"Alt text\" title=\"Optional title attribute\" /></p>\n<p><img src=\"url/to/image2.jpg\" alt=\"My Image\" title=\"Optional title attribute\" /></p>\n<p>![leave me alone]</p>\n<p>![leave me alone][]</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/images.md",
    "content": "![Alt text](</path/to/img.jpg>)\n\n![Alt text](</path/to/img.jpg> \"Optional title\")\n\n![Alt text](<url/to/image.jpg> \"Optional title attribute\")\n\n![My Image](<url/to/image2.jpg> \"Optional title attribute\")\n\n![leave me alone]\n\n![leave me alone][]\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-doubleline.html",
    "content": "<ul>\n  <li><p>Bird</p></li>\n  <li><p>Magic</p></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-doubleline.md",
    "content": "- Bird\n\n- Magic\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-followed-by-blockquote.html",
    "content": "<h1 id=\"sometitle\">some title</h1>\n<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n</ol>\n<blockquote>\n    <p>some text in a blockquote</p>\n</blockquote>\n<ul>\n    <li>another list item 1</li>\n    <li>another list item 2</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-followed-by-blockquote.md",
    "content": "# some title\n\n1. list item 1\n2. list item 2\n\n> some text in a blockquote\n\n- another list item 1\n- another list item 2\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-followed-by-ghcode.html",
    "content": "<h1 id=\"sometitle\">some title</h1>\n<ol>\n    <li>list item 1</li>\n    <li>list item 2</li>\n</ol>\n<pre><code>some code\n\nand some other line of code\n</code></pre>\n<ul>\n    <li>another list item 1</li>\n    <li>another list item 2</li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-followed-by-ghcode.md",
    "content": "# some title\n\n1. list item 1\n2. list item 2\n\n```\nsome code\n\nand some other line of code\n```\n\n- another list item 1\n- another list item 2\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-with-blockquote.html",
    "content": "<ul>\n  <li><p>A list item with a blockquote:</p>\n    <blockquote>\n      <p>This is a blockquote\n        inside a list item.</p>\n    </blockquote></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-with-blockquote.md",
    "content": "- A list item with a blockquote:\n\n    > This is a blockquote inside a list item.\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-with-code.html",
    "content": "<ul>\n  <li><p>A list item with code:</p>\n    <pre><code>alert('Hello world!');\n    </code></pre></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/list-with-code.md",
    "content": "- A list item with code:\n\n    ```\n    alert('Hello world!');\n    ```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/multi-paragraph-list.html",
    "content": "<ol>\n  <li><p>This is a major bullet point.</p>\n    <p>That contains multiple paragraphs.</p></li>\n  <li><p>And another line</p></li>\n</ol>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/multi-paragraph-list.md",
    "content": "1. This is a major bullet point.\n\n    That contains multiple paragraphs.\n\n2. And another line\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/nested-gh-codeblocks.html",
    "content": "<pre><code>1. some code idented 4 spaces\n\n    ```\n    var foobar = 'foo';\n    ```\n\n2. another line\n</code></pre>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/nested-gh-codeblocks.md",
    "content": "```\n1. some code idented 4 spaces\n\n    ```\n    var foobar = 'foo';\n    ```\n\n2. another line\n```\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/ordered-list-starting-number.html",
    "content": "<ol start=\"5\">\n    <li>foo</li>\n    <li>bar</li>\n    <li>baz</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/ordered-list-starting-number.md",
    "content": "5. foo\n6. bar\n7. baz\n\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/ordered-list.html",
    "content": "<ol>\n  <li>Red</li>\n  <li>Green</li>\n  <li>Blue</li>\n</ol>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/ordered-list.md",
    "content": "1. Red\n2. Green\n3. Blue\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/paragraph-simple.html",
    "content": "<p>Hello, world!</p>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/paragraph-simple.md",
    "content": "Hello, world!\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/paragraphed-list-with-sublists.html",
    "content": "<ul>\n  <li><p>foo</p>\n    <ul>\n      <li><p>bazinga</p></li>\n      <li><p>yeah</p></li></ul></li>\n  <li><p>bar</p>\n    <ol>\n      <li><p>damn</p></li>\n      <li><p>so many paragraphs</p></li></ol></li>\n  <li><p>baz</p></li>\n</ul>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/paragraphed-list-with-sublists.md",
    "content": "- foo\n\n    - bazinga\n\n    - yeah\n\n- bar\n\n    1. damn\n\n    2. so many paragraphs\n\n- baz\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-complex.html",
    "content": "<table>\n    <caption>some table</caption>\n    <colgroup>\n        <col span=\"2\" style=\"background-color:red\">\n        <col style=\"background-color:yellow\">\n    </colgroup>\n    <thead>\n        <tr>\n            <th scope=\"col\">head 1</th>\n            <th scope=\"col\">head 2</th>\n            <th scope=\"col\">head 3</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>row 1: col 1</td>\n            <td>row 1: col 2</td>\n            <td>row 1: col 3</td>\n        </tr>\n        <tr>\n            <td>row 2: col 1</td>\n            <td>row 2: col 2</td>\n            <td>row 2: col 3</td>\n        </tr>\n    </tbody>\n    <tfoot>\n        <tr>\n            <td>footer 1</td>\n            <td>footer 2</td>\n            <td>footer 3</td>\n        </tr>\n        <tr>\n            <td>footer 4</td>\n            <td>footer 5</td>\n            <td>footer 6</td>\n        </tr>\n    </tfoot>\n</table>\n\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-complex.md",
    "content": "| head 1       | head 2       | head 3       |\n| ------------ | ------------ | ------------ |\n| row 1: col 1 | row 1: col 2 | row 1: col 3 |\n| row 2: col 1 | row 2: col 2 | row 2: col 3 |\n| footer 1     | footer 2     | footer 3     |\n| footer 4     | footer 5     | footer 6     |\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-header-only.html",
    "content": "<table>\n    <thead>\n        <tr>\n            <th>foo</th>\n            <th>bar</th>\n        </tr>\n    </thead>\n</table>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-header-only.md",
    "content": "| foo | bar |\n| --- | --- |\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-mix-malformed.html",
    "content": "<table></table>\n\n<table>\n  <caption>some stuff</caption>\n</table>\n\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-mix-malformed.md",
    "content": ""
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-no-header.html",
    "content": "<table>\n  <thead>\n    <tr>\n      <td></td>\n      <td></td>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>foo</td>\n      <td>bar</td>\n    </tr>\n    <tr>\n      <td>barista</td>\n      <td>yes</td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-no-header.md",
    "content": "|         |         |\n| ------- | ------- |\n| foo     | bar     |\n| barista | yes     |\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-simple.html",
    "content": "<table>\n    <tr>\n        <td>head 1</td>\n        <td>head 2</td>\n        <td>head 3</td>\n    </tr>\n    <tr>\n        <td>row 1: col 1</td>\n        <td>row 1: col 2</td>\n        <td>row 1: col 3</td>\n    </tr>\n    <tr>\n        <td>row 2: col 1</td>\n        <td>row 2: col 2</td>\n        <td>row 2: col 3</td>\n    </tr>\n</table>\n"
  },
  {
    "path": "test/functional/makemarkdown/cases/standard/table-simple.md",
    "content": "| head 1       | head 2       | head 3       |\n| ------------ | ------------ | ------------ |\n| row 1: col 1 | row 1: col 2 | row 1: col 3 |\n| row 2: col 1 | row 2: col 2 | row 2: col 3 |\n"
  },
  {
    "path": "test/functional/makemarkdown/makemarkdown.bootstrap.js",
    "content": "/**\n * Created by Estevao on 22-12-2017.\n */\n\n//jscs:disable requireCamelCaseOrUpperCaseIdentifiers\n(function () {\n  'use strict';\n\n  require('source-map-support').install();\n  require('chai').should();\n  var fs = require('fs');\n\n  function getTestSuite (dir) {\n    return fs.readdirSync(dir)\n      .filter(filter())\n      .map(map(dir));\n  }\n\n  function filter () {\n    return function (file) {\n      var ext = file.slice(-3);\n      return (ext === '.md');\n    };\n  }\n\n  function map (dir) {\n    return function (file) {\n      var name = file.replace('.md', ''),\n          htmlPath = dir + name + '.html',\n          html = fs.readFileSync(htmlPath, 'utf8'),\n          mdPath = dir + name + '.md',\n          md = fs.readFileSync(mdPath, 'utf8');\n\n      return {\n        name:     name,\n        input:    html,\n        expected: md\n      };\n    };\n  }\n\n  function assertion (testCase, converter) {\n    return function () {\n      testCase.actual = converter.makeMarkdown(testCase.input);\n      testCase = normalize(testCase);\n\n      // Compare\n      testCase.actual.should.equal(testCase.expected);\n    };\n  }\n\n  //Normalize input/output\n  function normalize (testCase) {\n\n    // Normalize line returns\n    testCase.expected = testCase.expected.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n    testCase.actual = testCase.actual.replace(/(\\r\\n)|\\n|\\r/g, '\\n');\n\n    // Remove extra lines\n    testCase.expected = testCase.expected.replace(/^\\n+/, '').replace(/\\n+$/, '');\n    testCase.actual = testCase.actual.replace(/^\\n+/, '').replace(/\\n+$/, '');\n\n    return testCase;\n  }\n\n  module.exports = {\n    getTestSuite: getTestSuite,\n    assertion: assertion,\n    normalize: normalize,\n    showdown: require('../../../.build/showdown.js')\n  };\n})();\n\n"
  },
  {
    "path": "test/functional/makemarkdown/testsuite.features.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\nvar bootstrap = require('./makemarkdown.bootstrap.js'),\n    showdown = bootstrap.showdown,\n    assertion = bootstrap.assertion,\n    issues = bootstrap.getTestSuite('test/functional/makemarkdown/cases/features/issues/'),\n    ghMentions = bootstrap.getTestSuite('test/functional/makemarkdown/cases/features/ghMentions/');\n\ndescribe('makeMarkdown() features testsuite', function () {\n  'use strict';\n\n  describe('issues', function () {\n    for (var i = 0; i < issues.length; ++i) {\n      var converter;\n      if (issues[i].name === '#164.4.tasklists') {\n        converter = new showdown.Converter({tasklists: true});\n      } else {\n        converter = new showdown.Converter();\n      }\n      it(issues[i].name.replace(/-/g, ' '), assertion(issues[i], converter));\n    }\n  });\n\n  describe('ghMentions', function () {\n    var converter = new showdown.Converter({ ghMentions: true });\n    for (var i = 0; i < ghMentions.length; ++i) {\n      it(ghMentions[i].name.replace(/-/g, ' '), assertion(ghMentions[i], converter));\n    }\n  });\n});\n"
  },
  {
    "path": "test/functional/makemarkdown/testsuite.standard.js",
    "content": "/**\n * Created by Estevao on 08-06-2015.\n */\n\nvar bootstrap = require('./makemarkdown.bootstrap.js'),\n    converter = new bootstrap.showdown.Converter(),\n    assertion = bootstrap.assertion,\n    testsuite = bootstrap.getTestSuite('test/functional/makemarkdown/cases/standard/');\n\ndescribe('makeMarkdown() standard testsuite', function () {\n  'use strict';\n  for (var i = 0; i < testsuite.length; ++i) {\n    it(testsuite[i].name.replace(/-/g, ' '), assertion(testsuite[i], converter));\n  }\n});\n"
  },
  {
    "path": "test/mocks/mock-extension.js",
    "content": "var showdown = require('../../.build/showdown.js');\n\nvar ext = {\n  type: 'lang',\n  regex: /foo/g,\n  replace: 'bar'\n};\n\nshowdown.extension('mockextension', function () {\n  'use strict';\n  return [ext];\n});\n\nmodule.exports = ext;\n"
  },
  {
    "path": "test/optionswp.js",
    "content": "/* jshint ignore:start */\nvar fs = require('fs'),\n    filedata;\nfiledata = fs.readFileSync('src/options.js', 'utf8');\neval(filedata);\nmodule.exports = {\n  getDefaultOpts: getDefaultOpts\n};\n/* jshint ignore:end */\n"
  },
  {
    "path": "test/performance/lib/performance.lib.js",
    "content": "/**\n * Created by Tivie on 21/12/2016.\n */\n'use strict';\nvar now = require('performance-now'),\n    fs = require('fs'),\n    semverSort = require('semver-sort'),\n    performance = {\n      version: '',\n      libraryName: '',\n      MDFile: 'performance.log.md',\n      logFile: 'performance.json',\n      testSuites: [],\n      silent: false,\n      githubLink: ''\n    };\n\nperformance.setVersion = function (version) {\n  performance.version = version;\n};\n\nperformance.setLibraryName = function (name) {\n  performance.libraryName = name;\n};\n\nperformance.setGithubLink = function (url) {\n  performance.githubLink = url;\n};\n\nperformance.generateLog = function (filename, MDFilename, asTable) {\n  filename = filename || performance.logFile;\n  MDFilename = MDFilename || performance.MDFile;\n  asTable = !!asTable;\n\n  fs.closeSync(fs.openSync(filename, 'a'));\n\n  var json = fs.readFileSync(filename),\n      jsonParsed;\n\n  try {\n    jsonParsed = JSON.parse(json);\n  } catch (err) {\n    jsonParsed = {};\n  }\n\n  var jData = [];\n\n  for (var i = 0; i < performance.testSuites.length; ++i) {\n    // Suite\n    var suiteName = performance.testSuites[i].getSuiteName(),\n        cycles = performance.testSuites[i].getOption('cycles'),\n        subJData = {\n          suiteName: suiteName,\n          cycles: cycles,\n          tests: []\n        },\n        testSuite = performance.testSuites[i].getTests();\n    //make sure tests have ran first\n    if (!performance.testSuites[i].hasRun()) {\n      performance.testSuites[i].run();\n    }\n\n    // loop through tests\n    for (var ii = 0; ii < testSuite.length; ++ii) {\n      // Test\n      var test = testSuite[ii];\n      subJData.tests.push({\n        name: test.name,\n        time: test.time,\n        maxTime: test.maxTime,\n        minTime: test.minTime\n      });\n    }\n    jData.push(subJData);\n  }\n  jsonParsed[performance.version] = jData;\n\n  //Sort jsonParsed\n  var versions = [];\n  for (var version in jsonParsed) {\n    if (jsonParsed.hasOwnProperty(version)) {\n      versions.push(version);\n    }\n  }\n\n  semverSort.desc(versions);\n\n  var finalJsonObj = {};\n\n  for (i = 0; i < versions.length; ++i) {\n    if (jsonParsed.hasOwnProperty(versions[i])) {\n      finalJsonObj[versions[i]] = jsonParsed[versions[i]];\n    }\n  }\n\n  fs.writeFileSync(filename, JSON.stringify(finalJsonObj));\n\n  generateMD(MDFilename, finalJsonObj, asTable);\n};\n\nfunction generateMD (filename, obj, asTable) {\n  fs.closeSync(fs.openSync(filename, 'w'));\n  asTable = !!asTable;\n\n  // generate MD\n  var otp = '# Performance Tests for ' + performance.libraryName + '\\n\\n\\n';\n\n  for (var version in obj) {\n    if (obj.hasOwnProperty(version)) {\n      otp += '## [version ' + version + '](' + performance.githubLink + version + ')\\n\\n';\n      var testSuite = obj[version];\n      for (var i = 0; i < testSuite.length; ++i) {\n        otp += '### Test Suite: ' + testSuite[i].suiteName + ' (' + testSuite[i].cycles + ' cycles)\\n';\n        var tests = testSuite[i].tests;\n        if (asTable) {\n          otp += '| test | avgTime | max | min |\\n';\n          otp += '|:-----|--------:|----:|----:|\\n';\n        }\n        for (var ii = 0; ii < tests.length; ++ii) {\n          var time = parseFloat(tests[ii].time).toFixed(3),\n              maxTime = parseFloat(tests[ii].maxTime).toFixed(3),\n              minTime = parseFloat(tests[ii].minTime).toFixed(3);\n          if (asTable) {\n            otp += '|' + tests[ii].name + '|' + time + '|' + maxTime + '|' + minTime + '|\\n';\n          } else {\n            otp += ' - **' + tests[ii].name + ':** took ' + time + 'ms (*max: ' + maxTime + 'ms; min: ' + minTime + 'ms*)\\n';\n          }\n        }\n        otp += '\\n';\n      }\n      otp += '\\n';\n    }\n  }\n  fs.writeFileSync(filename, otp);\n}\n\nperformance.Suite = function (name) {\n  var suiteName = name || '',\n      tests = [],\n      hasRunFlag = false,\n      options = {\n        cycles: 20\n      };\n\n  this.setOption = function (key, val) {\n    options[key] = val;\n    return this;\n  };\n\n  this.getOption = function (key) {\n    return options[key];\n  };\n\n  this.add = function (name, obj) {\n    if (typeof obj === 'function') {\n      obj = {\n        prepare: function () {},\n        test: obj,\n        teardown: function () {}\n      };\n    }\n\n    if (!obj.hasOwnProperty('test')) {\n      throw 'obj must have a property called test';\n    }\n\n    if (typeof obj.test !== 'function') {\n      throw 'obj test property must be a function';\n    }\n\n    if (!obj.hasOwnProperty('prepare')) {\n      obj.prepare = function () {};\n    }\n\n    if (!obj.hasOwnProperty('teardown')) {\n      obj.teardown = function () {};\n    }\n\n    if (typeof obj.prepare !== 'function') {\n      throw 'obj prepare property must be a function';\n    }\n\n    if (typeof obj.teardown !== 'function') {\n      throw 'obj teardown property must be a function';\n    }\n\n    tests.push({\n      name: name,\n      obj: obj,\n      time: 0,\n      maxTime: 0,\n      minTime: 0\n    });\n    return this;\n  };\n\n  this.run = function run () {\n    var nn = options.cycles;\n    console.log('running tests: ' + nn + ' cycles each.');\n    for (var i = 0; i < tests.length; ++i) {\n      var times = [],\n          passVar = tests[i].obj.prepare();\n      for (var ii = 0; ii < nn; ++ii) {\n        var before = now();\n        tests[i].obj.test(passVar);\n        var after = now();\n        times.push(after - before);\n      }\n      var total = times.reduce(function (a, b) {return a + b;}, 0);\n      tests[i].time = total / options.cycles;\n      tests[i].minTime = Math.min.apply(null, times);\n      tests[i].maxTime = Math.max.apply(null, times);\n      if (!options.silent) {\n        console.log(tests[i].name + ' took an average of ' + tests[i].time + 'ms (min: ' + tests[i].minTime + 'ms; max: ' + tests[i].maxTime + 'ms');\n      }\n    }\n    hasRunFlag = true;\n    return this;\n  };\n\n  this.hasRun = function () {\n    return hasRunFlag;\n  };\n\n  this.getSuiteName = function () {\n    return suiteName;\n  };\n\n  this.getTests = function () {\n    return tests;\n  };\n\n  performance.testSuites.push(this);\n};\n\nmodule.exports = performance;\n"
  },
  {
    "path": "test/performance/performance.js",
    "content": "/**\n * Created by Tivie on 21/12/2016.\n */\n'use strict';\nvar fs = require('fs'),\n    showdown = require('../../.build/showdown.js'),\n    converter = new showdown.Converter(),\n    pkg = require('../../package.json'),\n    performance = require('./lib/performance.lib.js');\n\nperformance.setLibraryName(pkg.name);\nperformance.setVersion(pkg.version);\nperformance.setGithubLink('https://github.com/showdownjs/showdown/tree/');\n\nvar globals = {\n      gHtmlBlocks:     [],\n      gHtmlMdBlocks:   [],\n      gHtmlSpans:      [],\n      gUrls:           {},\n      gTitles:         {},\n      gDimensions:     {},\n      gListLevel:      0,\n      hashLinkCounts:  {},\n      langExtensions:  [],\n      outputModifiers: [],\n      converter:       converter,\n      ghCodeBlocks:    []\n    },\n    options = showdown.getOptions();\n\nfunction runTests () {\n  var testMDFile = fs.readFileSync('test/performance.testfile.md', 'utf8');\n  new performance.Suite('Basic')\n    .setOption('cycles', 50)\n    .add('Simple \"Hello World\"', function () {\n      converter.makeHtml('*Hello* **World**!');\n    })\n    .add('performance.testfile.md', {\n      prepare: function () {\n        return testMDFile;\n      },\n      test: function (mdText) {\n        converter.makeHtml(mdText);\n      }\n    });\n  new performance.Suite('subParsers')\n    .setOption('cycles', 20)\n    .add('hashHTMLBlocks', function () {\n      showdown.subParser('makehtml.hashHTMLBlocks')(testMDFile, options, globals);\n    })\n    .add('anchors', function () {\n      showdown.subParser('makehtml.links')(testMDFile, options, globals);\n    })\n    .add('blockQuotes', function () {\n      showdown.subParser('makehtml.blockQuotes')(testMDFile, options, globals);\n    })\n    .add('codeBlocks', function () {\n      showdown.subParser('makehtml.codeBlocks')(testMDFile, options, globals);\n    })\n    .add('codeSpans', function () {\n      showdown.subParser('makehtml.codeSpans')(testMDFile, options, globals);\n    })\n    .add('detab', function () {\n      showdown.subParser('makehtml.detab')(testMDFile, options, globals);\n    })\n    .add('encodeAmpsAndAngles', function () {\n      showdown.subParser('makehtml.encodeAmpsAndAngles')(testMDFile, options, globals);\n    })\n    .add('encodeBackslashEscapes', function () {\n      showdown.subParser('makehtml.encodeBackslashEscapes')(testMDFile, options, globals);\n    })\n    .add('encodeCode', function () {\n      showdown.subParser('makehtml.encodeCode')(testMDFile, options, globals);\n    })\n    .add('escapeSpecialCharsWithinTagAttributes', function () {\n      showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes')(testMDFile, options, globals);\n    })\n    .add('githubCodeBlocks', function () {\n      showdown.subParser('makehtml.githubCodeBlocks')(testMDFile, options, globals);\n    })\n    .add('hashBlock', function () {\n      showdown.subParser('makehtml.hashBlock')(testMDFile, options, globals);\n    })\n    .add('hashElement', function () {\n      showdown.subParser('makehtml.hashElement')(testMDFile, options, globals);\n    })\n    .add('hashHTMLSpans', function () {\n      showdown.subParser('makehtml.hashHTMLSpans')(testMDFile, options, globals);\n    })\n    .add('hashPreCodeTags', function () {\n      showdown.subParser('makehtml.hashPreCodeTags')(testMDFile, options, globals);\n    })\n    .add('headers', function () {\n      showdown.subParser('makehtml.headers')(testMDFile, options, globals);\n    })\n    .add('horizontalRule', function () {\n      showdown.subParser('makehtml.horizontalRule')(testMDFile, options, globals);\n    })\n    .add('images', function () {\n      showdown.subParser('makehtml.images')(testMDFile, options, globals);\n    })\n    .add('italicsAndBold', function () {\n      showdown.subParser('makehtml.italicsAndBold')(testMDFile, options, globals);\n    })\n    .add('lists', function () {\n      showdown.subParser('makehtml.lists')(testMDFile, options, globals);\n    })\n    .add('outdent', function () {\n      showdown.subParser('makehtml.outdent')(testMDFile, options, globals);\n    })\n    .add('paragraphs', function () {\n      showdown.subParser('makehtml.paragraphs')(testMDFile, options, globals);\n    })\n    .add('spanGamut', function () {\n      showdown.subParser('makehtml.spanGamut')(testMDFile, options, globals);\n    })\n    .add('strikethrough', function () {\n      showdown.subParser('makehtml.strikethrough')(testMDFile, options, globals);\n    })\n    .add('stripLinkDefinitions', function () {\n      showdown.subParser('makehtml.stripLinkDefinitions')(testMDFile, options, globals);\n    })\n    .add('tables', function () {\n      showdown.subParser('makehtml.tables')(testMDFile, options, globals);\n    })\n    .add('unescapeSpecialChars', function () {\n      showdown.subParser('makehtml.unescapeSpecialChars')(testMDFile, options, globals);\n    });\n}\n\nfunction generateLogs () {\n  performance.generateLog(null, null, true);\n}\n\nmodule.exports = {\n  runTests: runTests,\n  generateLogs: generateLogs\n};\n"
  },
  {
    "path": "test/performance.testfile.md",
    "content": "\nThis is [an example][id] reference-style link.\nThis is [another] [foo] reference-style link.\nThis is [a third][bar] reference-style link.\nThis is [a fourth][4] reference-style link.\n\n  [id]: http://example.com/  \"Optional Title Here\"\n  [foo]: http://example.com/  (Optional Title Here)\n  [bar]: http://example.com/  (Optional Title Here)\n  [4]: <http://example.com/>\n    \"Optional Title Here\"\n  \r\n \r\n\n<http://example.com/>\n  \r\n \r\n> a blockquote\n    with a 4 space indented line (not code)\n\nsep\n\n> a blockquote\n\n    with some code after\n  \r\n \r\n    > this is a pseudo blockquote\n    > inside a code block\n\nfoo\n\n    > this is another bq\n    inside code\n  \r\n \r\n> ## This is a header.\n>\n> 1.   This is the first list item.\n> 2.   This is the second list item.\n>\n> Here's some example code:\n>\n>     return shell_exec(\"echo $input | $markdown_script\");\n  \r\n \r\n  \n  > This is a multi line blockquote test\n  >\n  > With more than one line.\n  \r\n \r\n\nThis is some HTML:\n\n    <h1>Heading</h1>\n  \r\n \r\n\nThis is a normal paragraph:\n\n    This is a code block.\n  \r\n \r\n\n *  Bird\n\n *  Magic\n  \r\n \r\n*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__\n\ntext *with italic sentence* in middle\n\ntext __with bold sentence__ in middle\n\ntext with __bold text that\nspans across multiple__ lines\n\nunderscored_word\n\ndoubleunderscore__word\n\nasterix*word\n\ndoubleasterix**word\n\nline with_underscored word\n\nline with__doubleunderscored word\n\nline with*asterixed word\n\nline with**doubleasterixed word\n\nsome line_with_inner underscores\n\nsome line__with__inner double underscores\n\nsome line*with*inner asterixs\n\nsome line**with**inner double asterixs\n\nanother line with just _one underscore\n\nanother line with just __one double underscore\n\nanother line with just *one asterix\n\nanother line with just **one double asterix\n\na sentence with_underscore and another_underscore\n\na sentence with__doubleunderscore and another__doubleunderscore\n\na sentence with*asterix and another*asterix\n\na sentence with**doubleasterix and another**doubleasterix\n\nescaped word\\_with\\_underscores\n\nescaped word\\_\\_with\\_\\_double underscores\n\nescaped word_\\_with\\__single italic underscore\n\nescaped word\\*with*asterixs\n\nescaped word\\*\\*with\\*\\*asterixs\n\nescaped word**\\*with\\***bold asterixs\n  \r\n \r\nIt happened in 1986\\. What a great season.\n  \r\n \r\n\nThese should all be escaped:\n\n\\\\\n\n\\`\n\n\\*\n\n\\_\n\n\\{\n\n\\}\n\n\\[\n\n\\]\n\n\\(\n\n\\)\n\n\\#\n\n\\+\n\n\\-\n\n\\.\n\n\\!\n  \r\n \r\n```\nfunction MyFunc(a) {\n    // ...\n}\n```\n\nThat is some code!\n  \r\n \r\n> Define a function in javascript:\n>\n> ```\n> function MyFunc(a) {\n>     var s = '`';\n> }\n> ```\n>\n>> And some nested quote\n>>\n>> ```html\n>> <div>HTML!</div>\n>> ```\n  \r\n \r\n\nDefine a function in javascript:\n\n```\nfunction MyFunc(a) {\n    var s = '`';\n}\n```\n\nAnd some HTML\n\n```html\n<div>HTML!</div>\n```\n  \r\n \r\n```\ncode can go here\nthis is rendered on a second line\n```\n  \r\n \r\n# This is an H1 #\n  \r\n \r\nThis is an H1\n=============\n  \r\n \r\n# This is an H1\n  \r\n \r\nThis is an H2\n-------------\n  \r\n \r\n## This is an H2 ##\n  \r\n \r\n## This is an H2\n  \r\n \r\n### This is an H3 ###\n  \r\n \r\n### This is an H3\n  \r\n \r\n#### This is an H4\n  \r\n \r\n##### This is an H5\n  \r\n \r\n###### This is an H6\n  \r\n \r\n\n* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n  \r\n \r\n<!-- a comment -->\n\n<!-- a comment with *bogus* __markdown__ inside -->\n\nwords <!-- a comment --> words\n\n<!-- comment --> words\n\n   <!-- comment -->\n\n    <!-- comment -->\n  \r\n \r\n  - list item 1\n\n    ```html\n    <a href=\"www.google.com\">google</a>\n    <div>\n      <div>some div</div>\n    </div>\n    ```\n  \r\n \r\n\nThese HTML5 tags should pass through just fine.\n\n<section>hello</section>\n<header>head</header>\n<footer>footsies</footer>\n<nav>navigation</nav>\n<article>read me</article>\n<aside>ignore me</aside>\n<article>read\nme</article>\n<aside>\nignore me\n</aside>\n\nthe end\n\n<table class=\"test\">\n    <tr>\n        <td>Foo</td>\n    </tr>\n    <tr>\n        <td>Bar</td>\n    </tr>\n</table>\n\n<table class=\"test\">\n    <thead>\n        <tr>\n            <td>Foo</td>\n        </tr>\n    </thead>\n    <tr>\n        <td>Bar</td>\n    </tr>\n    <tfoot>\n        <tr>\n            <td>Bar</td>\n        </tr>\n    </tfoot>\n</table>\n\n<audio class=\"podcastplayer\" controls>\n    <source src=\"foobar.mp3\" type=\"audio/mp3\" preload=\"none\"></source>\n    <source src=\"foobar.off\" type=\"audio/ogg\" preload=\"none\"></source>\n</audio>\n\n<video src=\"foo.ogg\">\n    <track kind=\"subtitles\" src=\"foo.en.vtt\" srclang=\"en\" label=\"English\">\n    <track kind=\"subtitles\" src=\"foo.sv.vtt\" srclang=\"sv\" label=\"Svenska\">\n</video>\n\n<address>My street</address>\n\n<canvas id=\"canvas\" width=\"300\" height=\"300\">\n    Sorry, your browser doesn't support the &lt;canvas&gt; element.\n</canvas>\n\n<figure>\n    <img src=\"mypic.png\" alt=\"An awesome picture\">\n    <figcaption>Caption for the awesome picture</figcaption>\n</figure>\n\n<hgroup>\n  <h1>Main title</h1>\n  <h2>Secondary title</h2>\n</hgroup>\n\n<output name=\"result\"></output>\n  \r\n \r\n\n![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \"Optional title\")\n\n![Alt text][id]\n\n  [id]: url/to/image  \"Optional title attribute\"\n  \r\n \r\n\nSearch the web at [Google][] or [Daring Fireball][].\n\n  [Google]: http://google.com/\n  [Daring Fireball]: http://daringfireball.net/\n  \r\n \r\n\nThis is [an example](http://example.com/ \"Title\") inline link.\n\n[This link](http://example.net/) has no title attribute.\n  \r\n \r\n\nCreate a new `function`.\n\nUse the backtick in MySQL syntax ``SELECT `column` FROM whatever``.\n\nA single backtick in a code span: `` ` ``\n\nA backtick-delimited string in a code span: `` `foo` ``\n\nPlease don't use any `<blink>` tags.\n\n`&#8212;` is the decimal-encoded equivalent of `&mdash;`.\n  \r\n \r\n\nHello.this\\_is\\_a\\_variable\nand.this.is.another_one\n  \r\n \r\n\n<style>\n    p { line-height: 20px; }\n</style>\n\nAn exciting sentence.\n  \r\n \r\n\n  > This is a multi line blockquote test\n\n  > With more than one line.\n  \r\n \r\n<a href=\"foo\">some text</a> words\n\n<br> words\n  \r\n \r\n# some title\n\n1. list item 1\n2. list item 2\n\n> some text in a blockquote\n\n* another list item 1\n* another list item 2\n  \r\n \r\n# some title\n\n1. list item 1\n2. list item 2\n\n```\nsome code\n\nand some other line of code\n```\n\n* another list item 1\n* another list item 2\n  \r\n \r\n*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.\n  \r\n \r\n*   A list item with code:\n\n        alert('Hello world!');\n  \r\n \r\n<code>some **code** yeah</code>\n\nsome <code>inline **code** block</code>\n\n<code>some inline **code**</code> block\n\nyo dawg <code start=\"true\">some <code start=\"false\">code</code> inception</code>\n\n<div>some **div** yeah</div>\n  \r\n \r\n\n 1.  This is a major bullet point.\n\n    That contains multiple paragraphs.\n\n 2.  And another line\n  \r\n \r\n\n - This line spans\n more than one line and is lazy\n - Similar to this line\n  \r\n \r\n\n  > This is a multi line blockquote test\n  >\n  > > And nesting!\n  >\n  > With more than one line.\n  \r\n \r\n\n 1.  Red\n 1.  Green\n 1.  Blue\n  \r\n \r\n\n 8.  Red\n 1.  Green\n 3.  Blue\n  \r\n \r\n\n 1.  Red\n 2.  Green\n 3.  Blue\n  \r\n \r\n - foo\n \n    - bazinga\n    \n    - yeah\n \n - bar\n \n    1. damn\n    \n    2. so many paragraphs\n \n - baz\n  \r\n \r\ncode inception\n\n```\n<pre><code>\n<div>some html code inside code html tags inside a fenced code block</div>\n</code></pre>\n```\n  \r\n \r\n<pre>\n<code>\nfoobar\n</code>\n</pre>\n\nblabla\n\n<pre nhaca=\"zulu\"><code bla=\"bla\">\nfoobar\n</code>\n</pre>\n\n<pre><code>\n<div>some html code</div>\n</code></pre>\n  \r\n \r\n\nSee my [About](/about/) page for details.\n  \r\n \r\n# Same Title\n\nsome text\n\n# Same Title\n  \r\n \r\n\nHello, world!\n  \r\n \r\n\n**important**\n\n__important__\n\nreally **freaking**strong\n  \r\n \r\n\n * Red\n * Green\n * Blue\n  \r\n \r\n\n - Red\n - Green\n - Blue\n  \r\n \r\n\n + Red\n + Green\n + Blue\n  \r\n \r\nThere's an [episode](http://en.memory-alpha.org/wiki/Darmok_(episode)) of Star Trek: The Next Generation\n  \r\n \r\n# some title\n\nTest **bold** and _italic_\n  \r\n \r\n![my image](./pic/pic1_50.png =100pxx20px)\n\n![my image2][1]\n\n[1]: ./pic/pic1_50.png =100pxx20px\n  \r\n \r\nfoo.bar\n\nwww.foobar\n\nwww.foobar.com\n\nhttp://foobar.com\n\nhttps://www.foobar.com/baz?bazinga=nhecos;\n\n<a href=\"http://www.google.com/\">http://www.google.com</a>\n  \r\n \r\nthis is a sentence_with_mid underscores\n\nthis is a sentence with just_one underscore\n\nthis _should be parsed_ as emphasis\n\nthis is double__underscore__mid word\n\nthis has just__one double underscore\n\nthis __should be parsed__ as bold\n\nemphasis at _end of sentence_\n\n_emphasis at_ line start\n\nmulti _line emphasis\nyeah it is_ yeah\n  \r\n \r\na ~~strikethrough~~ word\n\nthis should~~not be parsed\n\n~~strike-through text~~\n  \r\n \r\n# my things\n\n -  foo\n - [] bar\n - [ ] baz\n - [x] bazinga\n\notherthings\n  \r\n \r\n# some markdown\n\nblabla\n<div>This is **not parsed**</div>\n<div markdown=\"1\">This is **parsed**</div>\n<div>This is **not parsed**</div>\n  \r\n \r\n​pointer *ptr *thing\n\nsomething _else _bla\n\nsomething __else __bla\n  \r\n \r\nhttp://website.com/img@x2.jpg\n\nhttp://website.com/img-x2.jpg\n\nhttp://website.com/img@x2\n\nhttp://website.com/img@.jpg\n  \r\n \r\na simple\nwrapped line\n  \r\n \r\nYour friend ~~[**test\\***](www.google.com)~~ (~~[*@test*](www.google.com)~~) updated his/her description\n  \r\n \r\n      ## markdown doc\n      \n      you can use markdown for card documentation\n        - foo\n        - bar\n  \r\n \r\nthis is a link to www.github.com\n\nthis is a link to <www.google.com>\n  \r\n \r\n1. One\n2. Two\n    - A\n    - B\n3. Three\n\n> this has\n> simple linebreaks\n\n    testing\n    some\n    code\n\n 1. paragraphed list\n\n    this belongs\n    to the first list item\n    \n 2. This text\n    also\n\nsimple\ntext\n\n - a list\n   item\n - another\n   list item\n\nsimple\ntext\n\n  - some item\n \n    another\n    paragraph\n   \n      - And\n        now\n     \n        paragraph\n        sublist\n     \n          - and\n            even\n       \n            another\n            one\n\n - foo\n\n  \r\n \r\nfoo烫\nbar\n\nfoo\nbar\n  \r\n \r\n# some header\n\n# some header with &+$,/:;=?@\\\"#{}|^~[]`\\\\*()%.!' chars\n\n# another header > with < chars\n  \r\n \r\n**Nom :** aaaa\n**Nom :** aaa\n  \r\n \r\nJust an example info@example.com ok?​\n  \r\n \r\n#Given\n\n#When\n\n#Then\n\nfoo\n===\n\nbar\n---\n  \r\n \r\nhttp://en.wikipedia.org/wiki/Tourism_in_Germany\n  \r\n \r\nthis email <foobar@example.com> should not be encoded\n  \r\n \r\nthis is some text\n\n```php\nfunction thisThing() {\n  echo \"some weird formatted code!\";\n}\n```\n\nsome other text\n  \r\n \r\n* foo\n  * bar\n\n...\n\n* baz\n  1. bazinga\n  \r\n \r\nurl http://www.google.com.\n\nurl http://www.google.com!\n\nurl http://www.google.com? foo\n\nurl (http://www.google.com) bazinga\n  \r\n \r\nhello @tivie how are you?\n\nthis email foo@gmail.com is not parsed\n\nthis \\@mentions is not parsed also\n  \r\n \r\n# header\n\n#header\n  \r\n \r\n 1. One\n 2. Two\n    foo\n    \n    bar\n    bazinga\n    \n    \n    \n    \n    nhecos\n    \n 3. Three\n    \n    - foo\n    \n    - bar\n     \r\n \r\n| *foo* | **bar** | ~~baz~~ |\n|-------|---------|---------|\n| 100   | blabla  |  aaa    |\n  \r\n \r\n|key|value|\n|--|--| \n|My Key|My Value|\n  \r\n \r\n| First Header  | Second Header |\n| :------------ | :------------ |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n  \r\n \r\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n  \r\n \r\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n  \r\n \r\nFirst Header  | Second Header|Third Header\n------------- | -------------|---\nContent Cell  | Content Cell|C\nContent Cell  | Content Cell|C\n  \r\n \r\n| First Header  | Second Header | Third Header  | Fourth Header |\n| :------------ |: ----------- :| ------------ :| ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  | Row 1 Cell 3  | Row 1 Cell 4  |\n| Row 2 Cell 1  | Row 2 Cell 2  | Row 2 Cell 3  | Row 2 Cell 4  |\n| Row 3 Cell 1  | Row 3 Cell 2  | Row 3 Cell 3  | Row 3 Cell 4  |\n| Row 4 Cell 1  | Row 4 Cell 2  | Row 4 Cell 3  | Row 4 Cell 4  |\n| Row 5 Cell 1  | Row 5 Cell 2  | Row 5 Cell 3  | Row 5 Cell 4  |\n  \r\n \r\n| First Header  | Second Header | Third Header  | Fourth Header |\n| ------------- | ------------- | ------------  | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  | Row 1 Cell 3  | Row 1 Cell 4  |\n| Row 2 Cell 1  | Row 2 Cell 2  | Row 2 Cell 3  | Row 2 Cell 4  |\n| Row 3 Cell 1  | Row 3 Cell 2  | Row 3 Cell 3  | Row 3 Cell 4  |\n| Row 4 Cell 1  | Row 4 Cell 2  | Row 4 Cell 3  | Row 4 Cell 4  |\n| Row 5 Cell 1  | Row 5 Cell 2  | Row 5 Cell 3  | Row 5 Cell 4  |\n  \r\n \r\n| Left-Aligned  |    Center-Aligned    | Right-Aligned |\n| :------------ |:--------------------:| -------------:|\n| col 3 is      | some wordy paragraph |         $1600 |\n| col 2 is      |       centered       |           $12 |\n| zebra stripes |       are neat       |            $1 |\n  \r\n \r\nTable Test\n============\n\nsection 1\n------------\n\n|header1    |header2    |header3|\n|-----------|-----------|---------|\n|Value1     |Value2     |Value3   |\n\n\nsection 2\n-----------\n\n|headerA    |headerB    |headerC|\n|-----------|-----------|---------|\n|ValueA     |ValueB     |ValueC   |\n  \r\n \r\nsome text\n\n\n    | Tables        | Are           | Cool  |\n    | ------------- |:-------------:| -----:|\n    | **col 3 is**  | right-aligned | $1600 |\n    | col 2 is      | *centered*    |   $12 |\n    | zebra stripes | ~~are neat~~  |    $1 |\n  \r\n \r\n\n### Stats\n\n\nStatus | AGENT1 | AGENT2 | AGENT3 | AGENT4 | AGENT5 | AGENT6 | AGENT7 | AGENT8 | AGENT9 | TOTAL |\n--- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\nAGENT ERROR | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\nAPPROVED | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n  \r\n \r\n| First Header  | Second Header |\n| ============= | ============= |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n  \r\n \r\n| First Header  | Second Header     |\n| ------------- | ----------------- |\n| **bold**      | ![img](foo.jpg)   |\n| _italic_      | [link](bla.html)  |\n| `some code`   | [google][1]       |\n| <www.foo.com> | normal            |\n\n\n  [1]: www.google.com\n  \r\n \r\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nisi est, \nullamcorper euismod iaculis sed, tristique at neque. Nullam metus risus, \nmalesuada vitae imperdiet ac, tincidunt eget lacus. Proin ullamcorper \nvulputate dictum. Vestibulum consequat ultricies nibh, sed tempus nisl mattis a.\n\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Row 1 Cell 1  | Row 1 Cell 2  |\n| Row 2 Cell 1  | Row 2 Cell 2  |\n\nPhasellus ac porttitor quam. Integer cursus accumsan mauris nec interdum. \nEtiam iaculis urna vitae risus facilisis faucibus eu quis risus. Sed aliquet \nrutrum dictum. Vivamus pulvinar malesuada ultricies. Pellentesque in commodo \nnibh. Maecenas justo erat, sodales vel bibendum a, dignissim in orci. Duis \nblandit ornare mi non facilisis. Aliquam rutrum fringilla lacus in semper. \nSed vel pretium lorem.\n  \r\n \r\n| First Header  | Second Header |\n| ------------- | ------------- |\n  \r\n \r\n| First Header  | Second Header |\n  \r\n \r\n### Automatic Links\n\n```\nhttps://ghost.org\n```\n\nhttps://ghost.org\n\n### Markdown Footnotes\n\n```\nThe quick brown fox[^1] jumped over the lazy dog[^2].\n\n[^1]: Foxes are red\n[^2]: Dogs are usually not red\n```\n\nThe quick brown fox[^1] jumped over the lazy dog[^2].\n\n\n### Syntax Highlighting\n\n    ```language-javascript\n       [...]\n    ```\n\nCombined with [Prism.js](http://prismjs.com/) in the Ghost theme:\n\n```language-javascript\n// # Notifications API\n// RESTful API for creating notifications\nvar Promise            = require('bluebird'),\n    _                  = require('lodash'),\n    canThis            = require('../permissions').canThis,\n    errors             = require('../errors'),\n    utils              = require('./utils'),\n\n    // Holds the persistent notifications\n    notificationsStore = [],\n    // Holds the last used id\n    notificationCounter = 0,\n    notifications;\n```\n  \r\n \r\nfoo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n_baz_bar_foo_\n\n__baz_bar_foo__\n\n___baz_bar_foo___\n\nbaz bar foo _baz_bar_foo foo bar baz_ and foo\n\nfoo\\_bar\\_baz foo\\_bar\\_baz\\_bar\\_foo \\_foo\\_bar baz\\_bar\\_ baz\\_foo\n\n`foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo`\n\n\n    foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n\n```html\nfoo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n```\n\n<pre>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</pre>\n\n<pre><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n\n<pre class=\"lang-html\"><code class=\"language-html\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></pre>\n\n<script>\nvar strike = \"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\";\nvar foo_bar_baz_bar_foo = \"foo_bar_\";\n</script>\n\n[foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo](http://myurl.com/foo_bar_baz_bar_foo)\n\n<a href=\"http://myurl.com/foo_bar_baz_bar_foo\" title=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\">foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</a>\n\n<img src=\"http://myurl.com/foo_bar_baz_bar_foo\" alt=\"foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\">\n\nfoo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n-----\n\n### foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n1. foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n2. foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n> blockquote foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n* foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n* foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo\n\n-------\n\nhttp://en.wikipedia.org/wiki/Tourism_in_Germany\n\n[an example] [wiki]\n\nAnother [example][wiki] of a link\n\n[wiki]: http://en.wikipedia.org/wiki/Tourism_in_Germany\n\n<p><code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code></p>\n\n<!-- These two cases still have bad <ems> because showdown handles them incorrectly -->\n\n<code>foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo</code>\n\n![foo_bar_baz foo_bar_baz_bar_foo _foo_bar baz_bar_ baz_foo](http://myurl.com/foo_bar_baz_bar_foo)\n\nhttp://myurl.com/foo_bar_baz_bar_foo\n\n<http://myurl.com/foo_bar_baz_bar_foo>\n\n_italics_.\n\n_italics_   .\n  \r\n \r\nescaped word\\_with\\_underscores\n\nescaped word\\_\\_with\\_\\_double underscores\n\nescaped word_\\_with\\__single italic underscore\n\nescaped word\\*with*asterixs\n\nescaped word\\*\\*with\\*\\*asterixs\n\nescaped word**\\*with\\***bold asterixs\n  \r\n \r\n* Item 1\n* Item 2\n\n1. Item 1\n2. Item 2\n\n- Item 1\n- Item 2\n  \r\n \r\n2015-10-04\n  \r\n \r\n1. Hi, I am a thing\n\n   ```sh\n    \n   $ git clone thing.git\n   \n   dfgdfg\n   ```\n\n1. I am another thing!\n\n   ```sh\n   \n   $ git clone other-thing.git\n\n   foobar\n   ```\n  \r\n \r\n> a blockquote\n# followed by an heading\n  \r\n \r\nTest pre in a list\n\n- & <\n- `& <`\n    - & <\n    - `& <`\n        - & <\n        - `& <`\n            - & <\n            - `& <`\n  \r\n \r\nTitle 1\n-------\n\n<div></div>\n\n\n# Title 2\n\n\n<div>\n</div>\n  \r\n \r\n<pre lang=\"no-highlight\"><code>\nfoo\n\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\nbar\n</code></pre>\n\nthis is a long paragraph\n\nthis is another long paragraph\n\n<pre lang=\"no-highlight\"><code>```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n</code></pre>\n  \r\n \r\n<pre lang=\"no-highlight\"><code>\n```javascript\nvar s = \"JavaScript syntax highlighting\";\nalert(s);\n```\n\n```python\ns = \"Python syntax highlighting\"\nprint s\n```\n\n```\nNo language indicated, so no syntax highlighting.\nBut let's throw in a <b>tag</b>.\n```\n</code></pre>\n  \r\n \r\n<pre lang=\"no-highlight\"><code>```python\nvar s;\n```\n</code></pre>\n\nthis is a long paragraph\n\n<pre lang=\"no-highlight\"><code>\n```javascript\nvar s;\n```\n</code></pre>\n  \r\n \r\n![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) [sd-ref][sd-logo]\n\nfoo\n\n[sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) ![sd-ref][sd-logo]\n\nfoo\n\n![sd-ref][sd-logo] [sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\nfoo\n\n[sd-ref][sd-logo] ![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\nfoo\n\n[![sd-ref][sd-logo]](http://www.google.com/)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n  \r\n \r\n![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) ![sd-ref][sd-logo]\n\nfoo\n\n![sd-ref][sd-logo] ![sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n  \r\n \r\n[sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png) [sd-ref][sd-logo]\n\nfoo\n\n[sd-ref][sd-logo] [sd-inline](https://raw.githubusercontent.com/showdownjs/logo/master/dist/logo.readme.png)\n\n[sd-logo]: https://www.google.pt/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png\n  \r\n \r\n* list item 1\n\n    ```\n    <parent>\n    <child>child1</child>\n    <!-- This is a comment -->\n    <child>child2</child>\n    <child>some text <!-- a comment --></child>\n    </parent>\n    ```\n\n* list item 2\n\n```\n<parent>\n<child>child1</child>\n<!-- This is a comment -->\n<child>child2</child>\n<child>some text <!-- a comment --></child>\n</parent>\n```\n  \r\n \r\n * one\n 1. two\n\nfoo\n\n  * one\n  1. two\n\nfoo\n\n   * one\n   1. two\n\nfoo\n\n   * one\n     1. two\n\nfoo\n\n * one\n * two\n\nfoo\n\n  * one\n  * two\n\nfoo\n\n   * one\n   * two\n\nfoo\n\n   * one\n* two\n\nfoo\n\n   * one\n    * two\n  \r\n \r\n * one long paragraph of\ntext\n 1. two\n\nfoo\n\n  * one long paragraph of\ntext\n   1. two\n  \r\n \r\n* one\n1. two\n\nfoo\n\n* one\n 1. two\n\nfoo\n\n* one\n  1. two\n\nfoo\n\n* one\n   1. two\n\nfoo\n\n* uli one\n* uli two\n\nfoo\n\n* uli one\n * uli two\n\nfoo\n\n* uli one\n  * uli two\n\nfoo\n\n* uli one\n   * uli two\n  \r\n \r\n- - - a\n\na\n\n+ - * - - + a\n\na\n\n1. 2. 3. 4. 5.\n\na\n\n1. 2. 3. 4. 5. a\n  \r\n \r\n- - - a\n\n+ - * - - + a\n\n1. 2. 3. 4. 5.\n\n1. 2. 3. 4. 5. a\n  \r\n \r\n- - \na\n\n\nfooo\n\n\n- - - aaaaa\n\n   bbbbb\n  \r\n \r\n- - - - -- - - - - - - -- - - - - - - - - - -    - - - - - - - - -  abcd\n  \r\n \r\n   ---\n\n   - - -\n  \r\n \r\nplain text link http://test.com/this_has/one.html with underscores\n\nlegit·word_with·1·underscore\n\na word_with_2underscores (gets em)\n  \r\n \r\nthis is a underscore_test ![my cat](http://myserver.com/my_kitty.jpg)\n\nanother ![my cat](http://myserver.com/my_kitty.jpg) underscore_test bla\n  \r\n \r\nThis is a first paragraph,\non multiple lines.\n     \nThis is a second paragraph.\nThere are spaces in between the two.\n  \r\n \r\nThis is a first paragraph,\non multiple lines.\n\nThis is a second paragraph\nwhich has multiple lines too.\n  \r\n \r\nA first paragraph.\n\n\n\nA second paragraph after 3 CR (carriage return).\n  \r\n \r\nThis a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n     \nA few spaces and a new long long long long long long long long long long long long long long long long paragraph on 1 line.\n  \r\n \r\nThis a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n\t\n1 tab to separate them and a new long long long long long long long long long long long long long long long long paragraph on 1 line.\n  \r\n \r\nThis a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n\nA new long long long long long long long long long long long long long long long long paragraph on 1 line.\n  \r\n \r\nAn ampersand & in the text flow is escaped as an html entity.\n  \r\n \r\nThere is an [ampersand](http://validator.w3.org/check?uri=http://www.w3.org/&verbose=1) in the URI.\n  \r\n \r\nThis is \\*an asterisk which should stay as is.\n  \r\n \r\nThis is * an asterisk which should stay as is.\n  \r\n \r\n\\\\   backslash\n\\`   backtick\n\\*   asterisk\n\\_   underscore\n\\{\\}  curly braces\n\\[\\]  square brackets\n\\(\\)  parentheses\n\\#   hash mark\n\\+   plus sign\n\\-   minus sign (hyphen)\n\\.   dot\n\\!   exclamation mark\n  \r\n \r\n> # heading level 1\n> \n> paragraph\n  \r\n \r\n>A blockquote with a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.\n\n>and a second very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.\n  \r\n \r\n>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a blockquote.\n  \r\n \r\n> A blockquote\n> on multiple lines\n> like this.\n  \r\n \r\n>A blockquote \n>on multiple lines \n>like this. \n  \r\n \r\n>A blockquote\n>on multiple lines\n>like this.\n>\n>But it has\n>two paragraphs.\n  \r\n \r\n>A blockquote\n>on multiple lines\n>like this\n  \r\n \r\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n  \r\n \r\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n  \r\n \r\n> This is the first level of quoting.\n> > This is nested blockquote.\n> Back to the first level.\n  \r\n \r\n> This is the first level of quoting.\n> > This is nested blockquote.\n  \r\n \r\n\t10 PRINT HELLO INFINITE\n\t20 GOTO 10\n  \r\n \r\n    10 PRINT < > &\n    20 GOTO 10\n  \r\n \r\n    10 PRINT HELLO INFINITE\n    20 GOTO 10\n  \r\n \r\nas*te*risks\n  \r\n \r\n*single asterisks*\n  \r\n \r\n_single underscores_\n  \r\n \r\nHTML entities are written using ampersand notation: &copy;\n  \r\n \r\nThese lines all end with end of line (EOL) sequences.\n\nSeriously, they really do.\n\nIf you don't believe me: HEX EDIT!\n\n  \r\n \r\nThese lines all end with end of line (EOL) sequences.\r\rSeriously, they really do.\r\rIf you don't believe me: HEX EDIT!\r\r  \r\n \r\nThese lines all end with end of line (EOL) sequences.\n\nSeriously, they really do.\n\nIf you don't believe me: HEX EDIT!\n\n  \r\n \r\nThis is an H1\n=============\n  \r\n \r\n# This is an H1 #\n  \r\n \r\n # This is an H1\n   \r\n \r\n# this is an h1 with two trailing spaces  \nA new paragraph.\n  \r\n \r\n# This is an H1\n  \r\n \r\nThis is an H2\n-------------\n  \r\n \r\n## This is an H2 ##\n  \r\n \r\n## This is an H2\n  \r\n \r\n### This is an H3 ###\n  \r\n \r\n### This is an H3\n  \r\n \r\n#### This is an H4 ####\n  \r\n \r\n#### This is an H4\n  \r\n \r\n##### This is an H5 #####\n  \r\n \r\n##### This is an H5\n  \r\n \r\n###### This is an H6  ######\n  \r\n \r\n###### This is an H6\n  \r\n \r\n- - -\n  \r\n \r\n---\n  \r\n \r\n***\n  \r\n \r\n___\n  \r\n \r\n-------\n  \r\n \r\n![HTML5][h5]\n\n[h5]: http://www.w3.org/html/logo/img/mark-word-icon.png \"HTML5 for everyone\"\n  \r\n \r\n![HTML5][h5]\n\n[h5]: http://www.w3.org/html/logo/img/mark-word-icon.png\n  \r\n \r\n![HTML5](http://www.w3.org/html/logo/img/mark-word-icon.png \"HTML5 logo for everyone\")\n  \r\n \r\n![HTML5](http://www.w3.org/html/logo/img/mark-word-icon.png)\n  \r\n \r\nWe love `<code> and &` for everything\n  \r\n \r\n``We love `code` for everything``\n  \r\n \r\n``We love `code` for everything``\n  \r\n \r\nA first sentence  \nand a line break.\n  \r\n \r\nA first sentence     \nand a line break.\n  \r\n \r\nThis is an automatic link <http://www.w3.org/>\n  \r\n \r\n[W3C](http://www.w3.org/ \"Discover w3c\")\n  \r\n \r\n[W3C](http://www.w3.org/)\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: <http://www.w3.org/>\n  \r\n \r\n[World Wide Web Consortium][]\n\n[World Wide Web Consortium]: http://www.w3.org/\n  \r\n \r\n[w3c][]\n\n[w3c]: http://www.w3.org/\n  \r\n \r\n[World Wide Web Consortium] [w3c]\n\n[w3c]: http://www.w3.org/\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/\n   \"Discover W3C\"\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ (Discover w3c)\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ 'Discover w3c'\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/ \"Discover w3c\"\n  \r\n \r\n[World Wide Web Consortium][w3c]\n\n[w3c]: http://www.w3.org/\n  \r\n \r\n*   a list containing a blockquote\n\n    > this the blockquote in the list\n  \r\n \r\n*   a list containing a block of code\n\n\t    10 PRINT HELLO INFINITE\n\t    20 GOTO 10\n  \r\n \r\n*   This is a list item with two paragraphs. Lorem ipsum dolor\n\tsit amet, consectetuer adipiscing elit. Aliquam hendrerit\n\tmi posuere lectus.\n\n\tVestibulum enim wisi, viverra nec, fringilla in, laoreet\n\tvitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n\tsit amet velit.\n\n*   Suspendisse id sem consectetuer libero luctus adipiscing.\n  \r\n \r\n*   This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n*   Suspendisse id sem consectetuer libero luctus adipiscing.\n  \r\n \r\n1\\. ordered list escape\n  \r\n \r\n1. 1\n\n    - inner par list\n\n2. 2\n  \r\n \r\n1. list item 1\n8. list item 2\n1. list item 3\n  \r\n \r\n1. list item 1\n2. list item 2\n3. list item 3\n  \r\n \r\nThis is a paragraph\non multiple lines\nwith hard return.\n  \r\n \r\nThis a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.\n  \r\n \r\n This is a paragraph with a trailing and leading space. \n  \r\n \r\nThis is a paragraph with 1 trailing tab.\t\n  \r\n \r\n  This is a paragraph with 2 leading spaces.\n  \r\n \r\n   This is a paragraph with 3 leading spaces.\n  \r\n \r\n This is a paragraph with 1 leading space.\n  \r\n \r\nThis is a paragraph with a trailing space.   \r\n \r\nas**te**risks\n  \r\n \r\n**double asterisks**\n  \r\n \r\n__double underscores__\n  \r\n \r\n* list item 1\n* list item 2\n* list item 3\n  \r\n \r\n- list item 1\n- list item 2\n- list item 3\n  \r\n \r\n * list item 1\n * list item 2\n * list item 3\n  \r\n \r\n  * list item 1\n  * list item 2\n  * list item 3\n  \r\n \r\n   * list item 1\n   * list item 2\n   * list item 3\n  \r\n \r\n+ list item 1\n+ list item 2\n+ list item 3\n  \r\n \r\n* list item in paragraph\n\n* another list item in paragraph\n  \r\n \r\n*   This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a list.\n*   and yet another long long long long long long long long long long long long long long long long long long long long long long line.\n  \r\n \r\n*   This is a list item\n    with the content on\n    multiline and indented.\n*   And this another list item\n    with the same principle.\n  \r\n \r\n"
  },
  {
    "path": "test/unit/cli.js",
    "content": "var fs = require('fs'),\n    path = require('path'),\n    chai = require('chai'),\n    expect = chai.expect,\n    chaiMatch = require('chai-match'),\n    execSync = require('child_process').execSync,\n    spawnSync = require('child_process').spawnSync,\n    cmd = 'node src/cli/cli.js',\n    packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));\n\nrequire('sinon');\nchai.should();\nchai.use(chaiMatch);\n\n/**\n * Spawns a CLI process synchrously\n * @param {string|null} command\n * @param {string[]} args\n * @param {{}} [options]\n * @returns {{output: *, stdout: string, stderr: string, status: number}}\n */\nfunction spawnCLI (command, args, options) {\n  'use strict';\n  var nargs = ['src/cli/cli.js'];\n  if (command) { nargs.push(command);}\n  args = nargs.concat(args);\n  var otp = spawnSync('node', args, options),\n      stdout = otp.stdout.toString(),\n      stderr = otp.stderr.toString(),\n      output = otp.output[0],\n      status = otp.status;\n\n  return {stdout: stdout, stderr: stderr, output: output, status: status};\n}\n\ndescribe('showdown cli', function () {\n  'use strict';\n\n  describe('without commands', function () {\n\n    it('should display help if no commands are specified', function () {\n      var proc = spawnCLI(null, [], {});\n      proc.status.should.equal(1);\n      proc.stderr.should.contain('CLI to Showdownjs markdown parser');\n      proc.stderr.should.contain('Usage:');\n      proc.stderr.should.contain('Options:');\n      proc.stderr.should.contain('Commands:');\n      proc.stdout.should.equal('');\n    });\n\n    describe('-h', function () {\n      it('should display help', function () {\n        var proc = spawnCLI(null, ['-h'], {});\n        proc.status.should.equal(0);\n        proc.stdout.should.contain('CLI to Showdownjs markdown parser');\n        proc.stdout.should.contain('Usage:');\n        proc.stdout.should.contain('Options:');\n        proc.stdout.should.contain('Commands:');\n        proc.stderr.should.equal('');\n      });\n    });\n\n    describe('-v', function () {\n      it('should display version', function () {\n        let proc = spawnCLI(null, ['-V'], {}),\n            verRegex = /^(\\d{1,2}\\.\\d{1,3}\\.\\d{1,3}(?:-(alpha)|(beta)|(rc-\\d{1,2})))?/;\n        proc.status.should.equal(0);\n        proc.stdout.should.match(verRegex);\n        proc.stdout.should.match(verRegex).and.capture(0).equals(packageJson.version);\n        proc.stderr.should.equal('');\n      });\n    });\n  });\n\n  describe('makehtml command', function () {\n\n    describe('makehtml without flags', function () {\n      it('should read from stdin and output to stdout', function () {\n        var proc = spawnCLI('makehtml', [], {\n          input: '**foo**',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.not.equal('');\n      });\n    });\n\n    describe('makehtml -p', function () {\n\n      it('should enable a flavor', function () {\n        var proc = spawnCLI('makehtml', ['-p', 'github'], {\n          input: 'this is a :smile:', // test the emoji option as a proxy\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stderr.should.contain('Enabling flavor github...');\n        proc.stdout.should.equal('<p>this is a 😄</p>');\n        //'Here in London'.should.match(/(here|there) in (\\w+)/i).and.capture(1).equals('London');\n      });\n\n      it('should give an error if a flavor is not recognised', function () {\n        var proc = spawnCLI('makehtml', ['-p', 'foobar'], {\n          input: '**foo**',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(1);\n      });\n    });\n\n    describe('makehtml -c', function () {\n      it('should not parse emoji if config option is not passed', function () {\n        var proc = spawnCLI('makehtml', [], {\n          input: 'this is a :smile:',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stderr.should.not.contain('Enabling option emoji');\n        proc.stdout.should.equal('<p>this is a :smile:</p>');\n      });\n\n      it('should enable a showdown option', function () {\n        var proc = spawnCLI('makehtml', ['-c', 'emoji'], {\n          input: 'this is a :smile:',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stderr.should.contain('Enabling option emoji');\n        proc.stdout.should.equal('<p>this is a 😄</p>');\n      });\n\n      it('should ignore unrecognized options', function () {\n        var proc = spawnCLI('makehtml', ['-c', 'foobar'], {\n          input: 'foo',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stderr.should.contain('Enabling option foobar');\n        proc.stdout.should.equal('<p>foo</p>');\n      });\n\n    });\n\n    describe('makehtml -m', function () {\n\n      it('should mute information', function () {\n        var proc = spawnCLI('makehtml', ['-m', '-i'], {input: '**foo**'});\n        proc.status.should.equal(0);\n        expect(proc.output).to.be.null; // jshint ignore:line\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.equal('');\n      });\n\n      it('should mute everything, even errors', function () {\n        var proc = spawnCLI('makehtml', ['-m', '-i']);\n        //proc.status.should.equal(0);\n        expect(proc.output).to.be.null; // jshint ignore:line\n        proc.stdout.should.equal('');\n        proc.stderr.should.equal('');\n      });\n\n      it('should not mute parsed html', function () {\n        var proc = spawnCLI('makehtml', ['-m', '-i'], {\n          input: '**foo**',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.equal('');\n      });\n    });\n\n    describe('makehtml -q', function () {\n\n      it('should not display information', function () {\n        var proc = spawnCLI('makehtml', ['-q', '-i'], {input: '**foo**'});\n        proc.status.should.equal(0);\n        expect(proc.output).to.be.null; // jshint ignore:line\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.match(/^\\s*DONE!\\s*$/);\n      });\n\n      it('should display errors', function () {\n        var proc = spawnCLI('makehtml', ['-q', '-i', '-e', 'foo'], {input: 'f'});\n        proc.status.should.equal(1);\n        expect(proc.output).to.be.null; // jshint ignore:line\n        proc.stdout.should.equal('');\n        proc.stderr.should.match(/^ERROR:/);\n      });\n\n      it('should not mute parsed html', function () {\n        var proc = spawnCLI('makehtml', ['-q', '-i'], {\n          input: '**foo**',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.match(/^\\s*DONE!\\s*$/);\n      });\n    });\n\n    describe('makehtml -i -o', function () {\n      it('should read from stdin and output to stdout', function () {\n        var proc = spawnCLI('makehtml', ['-i', '-o'], {\n          input: '**foo**',\n          encoding: 'utf-8'\n        });\n        proc.status.should.equal(0);\n        proc.stdout.should.equal('<p><strong>foo</strong></p>');\n        proc.stderr.should.not.equal('');\n      });\n    });\n\n    describe('makehtml -i <file> -o', function () {\n      it('should read from a file and output to stdout', function () {\n        var expectedOtp = fs.readFileSync('test/cli/basic.html', 'utf8').toString().trim(),\n            proc = spawnCLI('makehtml', ['-i', 'test/cli/basic.md'], {encoding: 'utf-8'});\n\n        proc.status.should.equal(0);\n        proc.stdout.should.equal(expectedOtp);\n        proc.stderr.should.not.equal('');\n      });\n    });\n\n    describe('makehtml -i -o <file>', function () {\n      it('should read from stdin and output to a file', function () {\n        execSync(cmd + ' makehtml -m -i -o .build/io1.html', {\n          encoding: 'utf8',\n          input: '**foo**'\n        });\n        var otp = fs.readFileSync('.build/io1.html', 'utf8').toString().trim(),\n            expectedOtp = '<p><strong>foo</strong></p>';\n\n        otp.trim().should.equal(expectedOtp);\n      });\n    });\n\n    describe('makehtml -i <file> -o <file>', function () {\n      it('should read from a file and output to a file', function () {\n        var expectedOtp = fs.readFileSync('test/cli/basic.html', 'utf8').toString().trim(),\n            proc = spawnCLI('makehtml', ['-i', 'test/cli/basic.md', '-o', '.build/io2.html'], {encoding: 'utf-8'}),\n            otp = fs.readFileSync('.build/io2.html', 'utf8').toString().trim();\n\n        otp.trim().should.equal(expectedOtp);\n        proc.stdout.should.not.equal(expectedOtp);\n        proc.stderr.should.equal('');\n        proc.status.should.equal(0);\n      });\n    });\n\n    describe('makehtml -a', function () {\n      it('should read from stdin and append to a file', function () {\n        fs.writeFileSync('.build/io3.html', '<p>foo</p>');\n\n        var expectedOtp = '<p>foo</p><p><strong>foo</strong></p>',\n            proc = spawnCLI('makehtml', ['-i', '-o', '.build/io3.html', '-a'], {\n              encoding: 'utf8',\n              input: '**foo**'\n            }),\n            otp = fs.readFileSync('.build/io3.html', 'utf8').toString().trim();\n\n        proc.status.should.equal(0);\n        otp.trim().should.equal(expectedOtp);\n        // since the output is to a file, messages are logged to stdout\n        proc.stdout.should.not.equal(expectedOtp);\n        // stderr should be empty\n        proc.stderr.should.equal('');\n      });\n\n      it('should ignore -a flag if -o <file> is missing', function () {\n\n        var expectedOtp = '<p><strong>foo</strong></p>',\n            proc = spawnCLI('makehtml', ['-a'], {encoding: 'utf8', input: '**foo**'});\n        proc.status.should.equal(0);\n        proc.stderr.should.not.equal('');\n        proc.stdout.should.equal(expectedOtp);\n      });\n    });\n\n    describe('makehtml -e', function () {\n      it('should load the extension', function () {\n        var expectedOtp = '<p><strong>bar</strong></p>',\n            extPath = path.resolve(__dirname + '/../mocks/mock-extension.js'),\n            proc = spawnCLI('makehtml', ['-i', '-o', '-e', extPath], {\n              encoding: 'utf8',\n              input: '**foo**'\n            });\n        proc.status.should.equal(0, 'Process exited with error state');\n        proc.stdout.trim().should.equal(expectedOtp);\n      });\n    });\n\n  });\n});\n"
  },
  {
    "path": "test/unit/showdown.Converter.js",
    "content": "/**\n * Created by Estevao on 31-05-2015.\n */\n//let showdown = require('../../.build/showdown.js') || require('showdown');\nchai.should();\n\n\ndescribe('showdown.Converter', function () {\n  'use strict';\n\n  describe('option methods', function () {\n    let converter = new showdown.Converter();\n\n    it('setOption() should set option foo=baz', function () {\n      converter.setOption('foo', 'baz');\n    });\n\n    it('getOption() should get option foo to equal baz', function () {\n      converter.getOption('foo').should.equal('baz');\n    });\n\n    it('getOptions() should contain foo=baz', function () {\n      let options = converter.getOptions();\n      options.should.have.ownProperty('foo');\n      options.foo.should.equal('baz');\n    });\n  });\n\n  describe('metadata methods', function () {\n    let converter = new showdown.Converter();\n\n    it('_setMetadataPair() should set foo to bar', function () {\n      converter._setMetadataPair('foo', 'bar');\n      converter.getMetadata().should.eql({foo: 'bar'});\n    });\n\n    it('_setMetadata should set metadata to {baz: bazinga}', function () {\n      converter._setMetadataRaw('{baz: bazinga}');\n      converter.getMetadata(true).should.eql('{baz: bazinga}');\n    });\n  });\n\n  describe('converter.setFlavor()', function () {\n\n    /**\n     * Test setFlavor('github')\n     */\n    describe('github', function () {\n      let converter = new showdown.Converter(),\n          ghOpts = showdown.getFlavorOptions('github');\n\n      converter.setFlavor('github');\n\n      for (let opt in ghOpts) {\n        if (ghOpts.hasOwnProperty(opt)) {\n          check(opt, ghOpts[opt]);\n        }\n      }\n      function check (key, val) {\n        it('should set ' + key + ' to ' + val, function () {\n          converter.getOption(key).should.equal(val);\n        });\n      }\n    });\n  });\n\n  describe('getFlavor method', function () {\n\n    // reset showdown\n    showdown.setFlavor('vanilla');\n\n    describe('flavor', function () {\n      it('should be vanilla by default', function () {\n        let converter = new showdown.Converter();\n        converter.getFlavor().should.equal('vanilla');\n      });\n\n      it('should be changed if global option is changed', function () {\n        showdown.setFlavor('github');\n        let converter = new showdown.Converter();\n        converter.getFlavor().should.equal('github');\n        showdown.setFlavor('vanilla');\n      });\n\n      it('should not be changed if converter is initialized before global change', function () {\n        let converter = new showdown.Converter();\n        showdown.setFlavor('github');\n        converter.getFlavor().should.equal('vanilla');\n        showdown.setFlavor('vanilla');\n      });\n    });\n  });\n\n  describe('extension methods', function () {\n    let extObjMock = {\n          type: 'lang',\n          filter: function () {}\n        },\n        extObjFunc = function () {\n          return extObjMock;\n        };\n\n    it('addExtension() should add an extension Object', function () {\n      let converter = new showdown.Converter();\n      converter.addExtension(extObjMock);\n      converter.getAllExtensions().language.should.contain(extObjMock);\n    });\n\n    it('addExtension() should unwrap an extension wrapped in a function', function () {\n      let converter = new showdown.Converter();\n\n      converter.addExtension(extObjFunc);\n      converter.getAllExtensions().language.should.contain(extObjMock);\n    });\n\n    it('useExtension() should use a previous registered extension in showdown', function () {\n      showdown.extension('foo', extObjMock);\n      let converter = new showdown.Converter();\n\n      converter.useExtension('foo');\n      converter.getAllExtensions().language.should.contain(extObjMock);\n      showdown.resetExtensions();\n    });\n\n    it('removeExtension() should remove an added extension', function () {\n      let converter = new showdown.Converter();\n      converter.addExtension(extObjMock);\n\n      converter.removeExtension(extObjMock);\n      converter.getAllExtensions().language.should.not.contain(extObjMock);\n    });\n  });\n\n  describe('events', function () {\n    let events = [\n      'makehtml.anchors',\n      'makehtml.autoLinks',\n      'makehtml.blockGamut',\n      'makehtml.blockQuotes',\n      'makehtml.codeBlocks',\n      'makehtml.codeSpans',\n      'makehtml.githubCodeBlocks',\n      'makehtml.headers',\n      'makehtml.images',\n      'makehtml.italicsAndBold',\n      'makehtml.lists',\n      'makehtml.paragraph',\n      'makehtml.spanGamut'\n      //'strikeThrough',\n      //'tables'\n    ];\n\n    for (let i = 0; i < events.length; ++i) {\n      runListener(events[i] + '.before');\n      runListener(events[i] + '.after');\n    }\n\n    function runListener (name) {\n      it('should listen to ' + name, function () {\n        let converter = new showdown.Converter();\n        converter.listen(name, function (event) {\n          let evtName = event.getName();\n          let text = event.getCapturedText();\n          evtName.should.equal(name.toLowerCase());\n          text.should.match(/^[\\s\\S]*foo[\\s\\S]*$/);\n          return text;\n        })\n          .makeHtml('foo');\n      });\n    }\n  });\n});\n"
  },
  {
    "path": "test/unit/showdown.Converter.makeHtml.js",
    "content": "/**\n * Created by Tivie on 15-01-2015.\n */\n//let showdown = require('../../.build/showdown.js') || require('showdown');\nchai.should();\n\n\ndescribe('showdown.Converter', function () {\n  'use strict';\n\n  describe('Converter.options extensions', function () {\n    let runCount;\n    showdown.extension('testext', function () {\n      return [{\n        type: 'output',\n        filter: function (text) {\n          runCount = runCount + 1;\n          return text;\n        }\n      }];\n    });\n\n    let converter = new showdown.Converter({extensions: ['testext']});\n\n    it('output extensions should run once', function () {\n      runCount = 0;\n      converter.makeHtml('# testext');\n      runCount.should.equal(1);\n    });\n  });\n\n  describe('makeHtml() with option omitExtraWLInCodeBlocks', function () {\n    let converter = new showdown.Converter({omitExtraWLInCodeBlocks: true}),\n        text = 'var foo = bar;',\n        html = converter.makeHtml('    ' + text);\n    it('should omit extra line after code tag', function () {\n      let expectedHtml = '<pre><code>' + text + '</code></pre>';\n      html.should.equal(expectedHtml);\n    });\n  });\n\n  describe('makeHtml() with option prefixHeaderId', function () {\n    let converter = new showdown.Converter(),\n        text = 'foo header';\n\n    it('should prefix header id with \"section\"', function () {\n      converter.setOption('prefixHeaderId', true);\n      let html = converter.makeHtml('# ' + text),\n          expectedHtml = '<h1 id=\"sectionfooheader\">' + text + '</h1>';\n      html.should.equal(expectedHtml);\n    });\n\n    it('should prefix header id with custom string', function () {\n      converter.setOption('prefixHeaderId', 'blabla');\n      let html = converter.makeHtml('# ' + text),\n          expectedHtml = '<h1 id=\"blablafooheader\">' + text + '</h1>';\n      html.should.equal(expectedHtml);\n    });\n  });\n\n  describe('makeHtml() with option metadata', function () {\n    let converter = new showdown.Converter(),\n        text1 =\n          '---SIMPLE\\n' +\n          'foo: bar\\n' +\n          'baz: bazinga\\n' +\n          '---\\n',\n        text2 =\n          '---TIVIE\\n' +\n          'a: b\\n' +\n          'c: 123\\n' +\n          '---\\n';\n\n    it('should correctly set metadata', function () {\n      converter.setOption('metadata', true);\n\n      let expectedHtml = '',\n          expectedObj = {foo: 'bar', baz: 'bazinga'},\n          expectedRaw = 'foo: bar\\nbaz: bazinga',\n          expectedFormat = 'SIMPLE';\n      converter.makeHtml(text1).should.equal(expectedHtml);\n      converter.getMetadata().should.eql(expectedObj);\n      converter.getMetadata(true).should.equal(expectedRaw);\n      converter.getMetadataFormat().should.equal(expectedFormat);\n    });\n\n    it('consecutive calls should reset metadata', function () {\n      converter.makeHtml(text2);\n      let expectedObj = {a: 'b', c: '123'},\n          expectedRaw = 'a: b\\nc: 123',\n          expectedFormat = 'TIVIE';\n      converter.getMetadata().should.eql(expectedObj);\n      converter.getMetadata(true).should.equal(expectedRaw);\n      converter.getMetadataFormat().should.equal(expectedFormat);\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/showdown.Converter.makeMarkdown.js",
    "content": "/**\n * Created by Estevao on 15-01-2015.\n */\n//let showdown = require('../../.build/showdown.js') || require('showdown');\nchai.should();\n\ndescribe('showdown.Converter', function () {\n  'use strict';\n\n\n  describe('makeMarkdown()', function () {\n    let converter = new showdown.Converter();\n\n    it('should parse a simple html string', function () {\n      let html = '<a href=\"/somefoo.html\">a link</a>\\n';\n      let md   = '[a link](</somefoo.html>)';\n\n      converter.makeMarkdown(html).should.equal(md);\n    });\n\n  });\n});\n"
  },
  {
    "path": "test/unit/showdown.helpers.js",
    "content": "/**\n * Created by Tivie on 27/01/2017.\n */\nchai.should();\n/*jshint expr: true*/\n/*jshint -W053 */\n/*jshint -W010 */\n/*jshint -W009 */\n\ndescribe('encodeEmailAddress()', function () {\n  'use strict';\n  let encoder = showdown.helper.encodeEmailAddress,\n      email = 'foobar@example.com',\n      encodedEmail = encoder(email),\n      encodedEmail2 = encoder(email);\n\n  it('should encode email', function () {\n    encodedEmail.should.not.equal(email);\n  });\n\n  it('should encode email determinated', function () {\n    encodedEmail.should.equal(encodedEmail2);\n  });\n\n  it('should decode to original email', function () {\n    let decodedEmail = encodedEmail.replace(/&#(.+?);/g, function (wm, cc) {\n      if (cc.charAt(0) === 'x') {\n        //hex\n        return String.fromCharCode('0' + cc);\n      } else {\n        //dec\n        return String.fromCharCode(cc);\n      }\n    });\n    decodedEmail.should.equal(email);\n  });\n});\n\ndescribe('isString()', function () {\n  'use strict';\n  let isString = showdown.helper.isString;\n\n  it('should return true for new String Object', function () {\n    isString(new String('some string')).should.be.true;\n  });\n\n  it('should return true for String Object', function () {\n    isString(String('some string')).should.be.true;\n  });\n\n  it('should return true for string literal', function () {\n    isString('some string').should.be.true;\n  });\n\n  it('should return false for integers', function () {\n    isString(5).should.be.false;\n  });\n\n  it('should return false for random objects', function () {\n    isString({foo: 'bar'}).should.be.false;\n  });\n\n  it('should return false for arrays', function () {\n    isString(['bar']).should.be.false;\n  });\n});\n\ndescribe('isFunction()', function () {\n  'use strict';\n  let isFunction = showdown.helper.isFunction;\n\n  it('should return true for closures', function () {\n    isFunction(function () {}).should.be.true;\n  });\n\n  it('should return true for defined functions', function () {\n    function foo () {}\n    isFunction(foo).should.be.true;\n  });\n\n  it('should return true for function letiables', function () {\n    let bar = function () {};\n    isFunction(bar).should.be.true;\n  });\n\n  it('should return false for hash objects', function () {\n    isFunction({}).should.be.false;\n  });\n\n  it('should return false for objects', function () {\n    isFunction(new Object ()).should.be.false;\n  });\n\n  it('should return false for string primitives', function () {\n    isFunction('foo').should.be.false;\n  });\n});\n\ndescribe('isArray()', function () {\n  'use strict';\n  let isArray = showdown.helper.isArray;\n\n  it('should return true for short syntax arrays', function () {\n    isArray([]).should.be.true;\n  });\n\n  it('should return true for array objects', function () {\n    let myArr = new Array();\n    isArray(myArr).should.be.true;\n  });\n\n  it('should return false for functions', function () {\n    isArray(function () {}).should.be.false;\n    function baz () {}\n    isArray(baz).should.be.false;\n  });\n\n  it('should return false for objects', function () {\n    isArray({}).should.be.false;\n    isArray(new Object ()).should.be.false;\n  });\n\n  it('should return false for strings', function () {\n    isArray('foo').should.be.false;\n    isArray(new String('foo')).should.be.false;\n  });\n});\n\ndescribe('isUndefined()', function () {\n  'use strict';\n  let isUndefined = showdown.helper.isUndefined;\n\n  it('should return true if nothing is passed', function () {\n    isUndefined().should.be.true;\n  });\n\n  it('should return true if a letiable is initialized but not defined', function () {\n    let myVar;\n    isUndefined(myVar).should.be.true;\n  });\n\n  it('should return false for null', function () {\n    isUndefined(null).should.be.false;\n  });\n\n  it('should return false for 0', function () {\n    isUndefined(0).should.be.false;\n  });\n\n  it('should return false for empty string', function () {\n    isUndefined('').should.be.false;\n  });\n\n  it('should return false for empty booleans false or true', function () {\n    isUndefined(false).should.be.false;\n    isUndefined(true).should.be.false;\n  });\n\n  it('should return false for anything not undefined', function () {\n    isUndefined('foo').should.be.false;\n    isUndefined(2).should.be.false;\n    isUndefined({}).should.be.false;\n  });\n});\n\ndescribe('stdExtName()', function () {\n  'use strict';\n  let stdExtName = showdown.helper.stdExtName;\n\n  it('should remove certain chars', function () {\n    let str = 'bla_-  \\nbla';\n    //[_?*+\\/\\\\.^-]\n    stdExtName(str).should.not.match(/[_?*+\\/\\\\.^-]/g);\n  });\n  it('should make everything lowercase', function () {\n    let str = 'BLABLA';\n    //[_?*+\\/\\\\.^-]\n    stdExtName(str).should.equal('blabla');\n  });\n});\n\ndescribe('forEach()', function () {\n  'use strict';\n  let forEach = showdown.helper.forEach;\n\n  it('should throw an error if first parameter is undefined', function () {\n    (function () {forEach();}).should.throw('obj param is required');\n  });\n\n  it('should throw an error if second parameter is undefined', function () {\n    (function () {forEach([]);}).should.throw('callback param is required');\n  });\n\n  it('should throw an error if second parameter is not a function', function () {\n    (function () {forEach([], 'foo');}).should.throw('callback param must be a function/closure');\n  });\n\n  it('should throw an error if first parameter is not an object or an array', function () {\n    (function () {forEach('foo', function () {});}).should.throw('obj does not seem to be an array or an iterable object');\n  });\n\n  it('should not throw even if object is empty', function () {\n    (function () {forEach({}, function () {});}).should.not.throw();\n  });\n\n  it('should iterate array items', function () {\n    let myArray = ['banana', 'orange', 'grape'];\n    forEach(myArray, function (val, key, obj) {\n      key.should.be.a('number');\n      (key % 1).should.equal(0);\n      val.should.equal(myArray[key]);\n      obj.should.equal(myArray);\n    });\n  });\n\n  it('should iterate over object properties', function () {\n    let myObj = {foo: 'banana', bar: 'orange', baz: 'grape'};\n    forEach(myObj, function (val, key, obj) {\n      myObj.should.have.ownProperty(key);\n      val.should.equal(myObj[key]);\n      obj.should.equal(myObj);\n    });\n  });\n\n  it('should iterate only over object own properties', function () {\n    let Obj1 = {foo: 'banana'},\n        myObj = Object.create(Obj1);\n    myObj.bar = 'orange';\n    myObj.baz = 'grape';\n\n    myObj.should.have.ownProperty('bar');\n    myObj.should.have.ownProperty('baz');\n    myObj.should.not.have.ownProperty('foo');\n\n    forEach(myObj, function (val, key) {\n      key.should.not.equal('foo');\n    });\n  });\n});\n\ndescribe('matchRecursiveRegExp()', function () {\n  'use strict';\n\n  let rRegExp = showdown.helper.matchRecursiveRegExp;\n\n  it('should match nested elements', function () {\n    let result = rRegExp('<div><div>a</div></div>', '<div\\\\b[^>]*>', '</div>', 'gim');\n    result.should.deep.equal([['<div><div>a</div></div>', '<div>a</div>', '<div>', '</div>']]);\n  });\n\n});\n\ndescribe('repeat()', function () {\n  'use strict';\n  it('work produce the same output as String.prototype.repeat()', function () {\n    if (typeof String.prototype.repeat !== 'undefined') {\n      let str = 'foo',\n          expected = str.repeat(100),\n          actual = showdown.helper.repeat(str, 100);\n      expected.should.equal(actual);\n    }\n  });\n});\n"
  },
  {
    "path": "test/unit/showdown.js",
    "content": "/**\n * Created by Tivie on 27/01/2017.\n */\n//let showdown = require('../../.build/showdown.js') || require('showdown');\n\ndescribe('showdown.options', function () {\n  'use strict';\n\n  describe('setOption() and getOption()', function () {\n    it('should set option foo=bar', function () {\n      showdown.setOption('foo', 'bar');\n      showdown.getOption('foo').should.equal('bar');\n      showdown.resetOptions();\n      (typeof showdown.getOption('foo')).should.equal('undefined');\n    });\n  });\n\n  describe('getDefaultOptions()', function () {\n    it('should get default options', function () {\n      let opts = getDefaultOpts(true);\n      expect(showdown.getDefaultOptions()).to.be.eql(opts);\n    });\n  });\n});\n\ndescribe('showdown.extension()', function () {\n  'use strict';\n\n  let extObjMock = {\n        type: 'lang',\n        filter: function () {}\n      },\n      extObjFunc = function () {\n        return extObjMock;\n      };\n\n  /*\n  // very flimsy test\n  describe('file loading', function () {\n\n    beforeEach(function () {\n      this.extension = require('../mocks/mock-extension');\n    });\n\n    it('should register an extension from a file', function () {\n      showdown.extension('mockextension').should.be.an('array');\n      showdown.extension('mockextension').should.eql([this.extension]);\n    });\n\n    afterEach(function () {\n      showdown.resetExtensions();\n    });\n\n  });\n  */\n\n  describe('objects', function () {\n    it('should register an extension object', function () {\n      showdown.extension('foo', extObjMock);\n      showdown.extension('foo').should.eql([extObjMock]);\n    });\n\n    it('should register an extension function', function () {\n      showdown.extension('bar', extObjFunc);\n      showdown.extension('bar').should.eql([extObjMock]);\n    });\n\n    it('should register a listener extension', function () {\n      showdown.extension('baz', {\n        type: 'listener',\n        listeners: {\n          foo: function (name, txt) {\n            return txt;\n          }\n        }\n      });\n    });\n\n    it('should refuse to register a generic object', function () {\n      let fn = function () {\n        showdown.extension('foo', {});\n      };\n      expect(fn).to.throw();\n    });\n\n    it('should refuse to register an extension with invalid type', function () {\n      let fn = function () {\n        showdown.extension('foo', {\n          type: 'foo'\n        });\n      };\n      expect(fn).to.throw(/type .+? is not recognized\\. Valid values: \"lang\\/language\", \"output\\/html\" or \"listener\"/);\n    });\n\n    it('should refuse to register an extension without regex or filter', function () {\n      let fn = function () {\n        showdown.extension('foo', {\n          type: 'lang'\n        });\n      };\n      expect(fn).to.throw(/extensions must define either a \"regex\" property or a \"filter\" method/);\n    });\n\n    it('should refuse to register a listener extension without a listeners property', function () {\n      let fn = function () {\n        showdown.extension('foo', {\n          type: 'listener'\n        });\n      };\n      expect(fn).to.throw(/Extensions of type \"listener\" must have a property called \"listeners\"/);\n    });\n\n    afterEach(function () {\n      showdown.resetExtensions();\n    });\n\n  });\n\n});\n\ndescribe('showdown.getAllExtensions()', function () {\n  'use strict';\n  let extObjMock = {\n    type: 'lang',\n    filter: function () {}\n  };\n\n  it('should return all extensions', function () {\n    showdown.extension('bar', extObjMock);\n    showdown.getAllExtensions().should.eql({bar: [extObjMock]});\n  });\n});\n\ndescribe('showdown.setFlavor()', function () {\n  'use strict';\n  it('should set flavor to github', function () {\n    showdown.setFlavor('github');\n    showdown.getFlavor().should.equal('github');\n    showdown.setFlavor('vanilla');\n  });\n\n  it('should set options correctly', function () {\n    showdown.setFlavor('github');\n    let ghOpts = showdown.getFlavorOptions('github'),\n        shOpts = showdown.getOptions();\n    for (let opt in ghOpts) {\n      if (ghOpts.hasOwnProperty(opt)) {\n        shOpts.should.have.property(opt);\n        shOpts[opt].should.equal(ghOpts[opt]);\n      }\n    }\n    showdown.setFlavor('vanilla');\n  });\n\n  it('should switch between flavors correctly', function () {\n    showdown.setFlavor('github');\n    let ghOpts = showdown.getFlavorOptions('github'),\n        shOpts = showdown.getOptions(),\n        dfOpts = showdown.getDefaultOptions();\n    for (let opt in dfOpts) {\n      if (ghOpts.hasOwnProperty(opt)) {\n        shOpts[opt].should.equal(ghOpts[opt]);\n      } else {\n        shOpts[opt].should.equal(dfOpts[opt]);\n      }\n    }\n    showdown.setFlavor('original');\n    let orOpts = showdown.getFlavorOptions('original');\n    shOpts = showdown.getOptions();\n    for (let opt in dfOpts) {\n      if (orOpts.hasOwnProperty(opt)) {\n        shOpts[opt].should.equal(orOpts[opt]);\n      } else {\n        shOpts[opt].should.equal(dfOpts[opt]);\n      }\n    }\n    showdown.setFlavor('vanilla');\n  });\n});\n"
  }
]